chromium/ios/chrome/browser/permissions/ui_bundled/permission_metrics_util.mm

// Copyright 2022 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/permissions/ui_bundled/permission_metrics_util.h"
#import "base/metrics/histogram_functions.h"
#import "base/metrics/user_metrics.h"
#import "base/metrics/user_metrics_action.h"
#import "components/content_settings/core/browser/content_settings_uma_util.h"
#import "components/content_settings/core/common/content_settings_types.h"
#import "components/page_info/core/page_info_action.h"
#import "ios/chrome/browser/permissions/ui_bundled/permission_info.h"
#import "ios/chrome/browser/permissions/ui_bundled/permissions_constants.h"
#import "ios/web/public/permissions/permissions.h"

// Histogram names.
const char kModalPermissionEventsHistogram[] = "IOS.Permission.Modal.Events";
const char kPageInfoPermissionEventsHistogram[] =
    "IOS.Permission.PageInfo.Events";
const char kPermissionEventUserActionHistogram[] = "IOS.Permission.Toggled";
const char kOriginInfoPermissionChangedAllowedHistogram[] =
    "WebsiteSettings.OriginInfo.PermissionChanged.Allowed";
const char kPageInfoPermissionChangedUserActionHistogram[] =
    "PageInfo.Permission.Changed";

void RecordPermissionEventFromOrigin(PermissionInfo* permissionInfo,
                                     PermissionEventOrigin permissionOrigin) {
  PermissionEvent event;
  ContentSettingsType type;

  switch (permissionInfo.permission) {
    case web::PermissionCamera:
      event = permissionInfo.state == web::PermissionStateAllowed
                  ? PermissionEvent::cameraPermissionEnabled
                  : PermissionEvent::cameraPermissionDisabled;
      type = ContentSettingsType::MEDIASTREAM_CAMERA;
      break;
    case web::PermissionMicrophone:
      event = permissionInfo.state == web::PermissionStateAllowed
                  ? PermissionEvent::microphonePermissionEnabled
                  : PermissionEvent::microphonePermissionDisabled;
      type = ContentSettingsType::MEDIASTREAM_MIC;
      break;
  }

  switch (permissionOrigin) {
    case PermissionEventOrigin::PermissionEventOriginModalInfobar:
      base::UmaHistogramEnumeration(kModalPermissionEventsHistogram, event);
      break;
    case PermissionEventOrigin::PermissionEventOriginPageInfo:
      base::UmaHistogramEnumeration(kPageInfoPermissionEventsHistogram, event);
      base::UmaHistogramEnumeration(page_info::kWebsiteSettingsActionHistogram,
                                    page_info::PAGE_INFO_CHANGED_PERMISSION);
      base::RecordAction(base::UserMetricsAction(
          kPageInfoPermissionChangedUserActionHistogram));
      content_settings_uma_util::RecordContentSettingsHistogram(
          kOriginInfoPermissionChangedHistogram, type);
      content_settings_uma_util::RecordContentSettingsHistogram(
          permissionInfo.state == web::PermissionStateAllowed
              ? kOriginInfoPermissionChangedAllowedHistogram
              : kOriginInfoPermissionChangedBlockedHistogram,
          type);
      break;
  }
}

void RecordPermissionToogled() {
  base::RecordAction(
      base::UserMetricsAction(kPermissionEventUserActionHistogram));
}