chromium/ios/chrome/browser/screenshot/model/screenshot_metrics_recorder.mm

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "ios/chrome/browser/screenshot/model/screenshot_metrics_recorder.h"

#import <UIKit/UIKit.h>

#import "base/metrics/user_metrics.h"
#import "base/metrics/user_metrics_action.h"

namespace {
// UMA metric name for single screen screenshot captures.
char const* kSingleScreenUserActionName = "MobileSingleScreenScreenshot";
}  // namespace

@implementation ScreenshotMetricsRecorder

#pragma mark - Public

- (void)startRecordingMetrics {
  [[NSNotificationCenter defaultCenter]
      addObserver:self
         selector:@selector(collectMetricFromNotification:)
             name:@"UIApplicationUserDidTakeScreenshotNotification"
           object:nil];
}

#pragma mark - Private

- (void)collectMetricFromNotification:(NSNotification*)notification {
  // If the device does not support multiple scenes or if the iOS version is
  // bellow iOS13 it will record the SingleScreenUserActionName metric.
  // Otherwise it will record the SingleScreenUserActionName metric only if
  // there is a single window in the foreground.
  UIApplication* sharedApplication = [UIApplication sharedApplication];
  NSInteger countForegroundScenes = 1;
  if (sharedApplication.supportsMultipleScenes) {
    countForegroundScenes =
        [self countForegroundScenes:[sharedApplication connectedScenes]];
  }

  // Only register screenshots taken of chrome in a single screen in the
  // foreground.
  if (countForegroundScenes == 1) {
    base::RecordAction(base::UserMetricsAction(kSingleScreenUserActionName));
  }
}

#pragma mark - Private

- (NSInteger)countForegroundScenes:(NSSet<UIScene*>*)scenes
    NS_AVAILABLE_IOS(13.0) {
  // Inspect the connectScenes and return the number of scenes
  // in the foreground.
  NSInteger foregroundSceneCount = 0;
  for (UIScene* scene in scenes) {
    switch (scene.activationState) {
      case UISceneActivationStateForegroundInactive:
      case UISceneActivationStateForegroundActive:
        foregroundSceneCount++;
        break;
      default:
        // Catch for UISceneActivationStateUnattached
        // and UISceneActivationStateBackground.
        // TODO (crbug.com/1091818): Add state inpection to identify other
        // scenarios.
        break;
    }
  }
  return foregroundSceneCount;
}
@end