text: // Copyright (c) Microsoft Corporation. All rights reserved.
  // Licensed under the MIT License.
  
  #pragma once
  
  namespace CalculatorApp
  {
      class AppLifecycleLogger
      {
      public:
          AppLifecycleLogger(AppLifecycleLogger const&) = delete;
          AppLifecycleLogger const & operator= (AppLifecycleLogger const&) = delete;
          ~AppLifecycleLogger();
          static AppLifecycleLogger& GetInstance();
          bool GetTraceLoggingProviderEnabled() const;
  
          void LaunchUIResponsive() const;
          void LaunchVisibleComplete() const;
          void ResumeUIResponsive() const;
          void ResumeVisibleComplete() const;
  
          void ResizeUIResponsive() const;
          void ResizeVisibleComplete() const;
          void ResizeUIResponsive(int32_t viewId) const;
          void ResizeVisibleComplete(int32_t viewId) const;
  
      private:
          // Make the object construction private to allow singleton access to this class
          AppLifecycleLogger();
  
          // Any new Log method should
          // a) decide the level of logging. This will help us in limiting recording of events only up to a certain level. See this link for guidance https://msdn.microsoft.com/en-us/library/windows/desktop/aa363742(v=vs.85).aspx
          // We're using Verbose level for events that are called frequently and needed only for debugging or capturing perf for specific scenarios 
          // b) should decide whether or not to log to  telemetry and pass TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY) accordingly
          // c) Should accept a variable number of additional data arguments if needed
          void LogAppLifecycleEvent(winrt::hstring const& eventName, winrt::Windows::Foundation::Diagnostics::LoggingFields const& fields) const;
          void PopulateAppInfo(winrt::Windows::Foundation::Diagnostics::LoggingFields& fields) const;
  
          winrt::Windows::Foundation::Diagnostics::LoggingChannel m_appLifecycleProvider;
      };
  }
  