Index: ios/chrome/browser/metrics/size_class_recorder.mm |
diff --git a/ios/chrome/browser/metrics/size_class_recorder.mm b/ios/chrome/browser/metrics/size_class_recorder.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8e90ebe385272e53240142efafd4ce3392d0a1bc |
--- /dev/null |
+++ b/ios/chrome/browser/metrics/size_class_recorder.mm |
@@ -0,0 +1,134 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#import "ios/chrome/browser/metrics/size_class_recorder.h" |
+#import "ios/chrome/browser/metrics/size_class_recorder_private.h" |
+ |
+#include "base/logging.h" |
+#include "base/metrics/histogram_macros.h" |
+#import "ios/chrome/browser/ui/ui_util.h" |
+ |
+namespace ios_internal { |
+ |
+// Converts a UIKit size class to a size class for reporting. |
+SizeClassForReporting SizeClassForReportingForUIUserInterfaceSizeClass( |
+ UIUserInterfaceSizeClass sizeClass) { |
+ switch (sizeClass) { |
+ case UIUserInterfaceSizeClassUnspecified: |
+ return SizeClassForReporting::UNSPECIFIED; |
+ case UIUserInterfaceSizeClassCompact: |
+ return SizeClassForReporting::COMPACT; |
+ case UIUserInterfaceSizeClassRegular: |
+ return SizeClassForReporting::REGULAR; |
+ } |
+} |
+ |
+} // namespace ios_internal |
+ |
+using ios_internal::SizeClassForReporting; |
+using ios_internal::SizeClassForReportingForUIUserInterfaceSizeClass; |
+ |
+namespace { |
+ |
+// Reports the currently used horizontal size class. |
+void ReportHorizontalSizeClassUsed(UIUserInterfaceSizeClass sizeClass) { |
+ SizeClassForReporting sizeClassForReporting = |
+ SizeClassForReportingForUIUserInterfaceSizeClass(sizeClass); |
+ UMA_HISTOGRAM_ENUMERATION("Tab.HorizontalSizeClassUsed", |
+ sizeClassForReporting, |
+ SizeClassForReporting::COUNT); |
+} |
+ |
+} // namespace |
+ |
+@interface SizeClassRecorder () |
+@property(nonatomic, assign) BOOL applicationInBackground; |
+@property(nonatomic, assign) UIUserInterfaceSizeClass initialSizeClass; |
+@end |
+ |
+@implementation SizeClassRecorder |
+ |
+@synthesize applicationInBackground = _applicationInBackground; |
+@synthesize initialSizeClass = _initialSizeClass; |
+ |
+- (instancetype)initWithHorizontalSizeClass: |
+ (UIUserInterfaceSizeClass)sizeClass { |
+ // Size classes change tracking is only available on iPad devices. |
+ DCHECK(IsIPadIdiom()); |
+ self = [super init]; |
+ if (self) { |
+ // Store the initial size class for reporting after the application did |
+ // become active. Otherwise, if this initializer is called before the |
+ // metrics service is started, reporting metrics will fail for the entire |
+ // session. |
+ _initialSizeClass = sizeClass; |
+ [[NSNotificationCenter defaultCenter] |
+ addObserver:self |
+ selector:@selector(applicationDidBecomeActive:) |
+ name:UIApplicationDidBecomeActiveNotification |
+ object:nil]; |
+ [[NSNotificationCenter defaultCenter] |
+ addObserver:self |
+ selector:@selector(applicationDidEnterBackground:) |
+ name:UIApplicationDidEnterBackgroundNotification |
+ object:nil]; |
+ [[NSNotificationCenter defaultCenter] |
+ addObserver:self |
+ selector:@selector(applicationWillEnterForeground:) |
+ name:UIApplicationWillEnterForegroundNotification |
+ object:nil]; |
+ } |
+ return self; |
+} |
+ |
+- (instancetype)init { |
+ NOTREACHED(); |
+ return nil; |
+} |
+ |
+- (void)dealloc { |
+ [[NSNotificationCenter defaultCenter] removeObserver:self]; |
+ [super dealloc]; |
+} |
+ |
+- (void)horizontalSizeClassDidChange:(UIUserInterfaceSizeClass)newSizeClass { |
+ // iOS sometimes changes from Compact to Regular to Compact again when putting |
+ // the application in the background, to update the application screenshot. |
+ // Ignore those changes. |
+ if (self.applicationInBackground) |
+ return; |
+ ReportHorizontalSizeClassUsed(newSizeClass); |
+} |
+ |
+- (void)pageLoadedWithHorizontalSizeClass:(UIUserInterfaceSizeClass)sizeClass { |
+ SizeClassForReporting sizeClassForReporting = |
+ SizeClassForReporting(sizeClass); |
+ UMA_HISTOGRAM_ENUMERATION("Tab.PageLoadInHorizontalSizeClass", |
+ sizeClassForReporting, |
+ SizeClassForReporting::COUNT); |
+} |
+ |
+#pragma mark - Application state notifications handlers |
+ |
+- (void)applicationDidBecomeActive:(NSNotification*)notification { |
+ // This is only needed to report the initial size class. Deregister from this |
+ // notification on the first time it is received. |
+ [[NSNotificationCenter defaultCenter] |
+ removeObserver:self |
+ name:UIApplicationDidBecomeActiveNotification |
+ object:nil]; |
+ ReportHorizontalSizeClassUsed(self.initialSizeClass); |
+ // For good measure, set the initial size class to unspecified. |
+ self.initialSizeClass = UIUserInterfaceSizeClassUnspecified; |
+} |
+ |
+- (void)applicationDidEnterBackground:(NSNotification*)notification { |
+ self.applicationInBackground = YES; |
+} |
+ |
+- (void)applicationWillEnterForeground:(NSNotification*)notification { |
+ self.applicationInBackground = NO; |
+} |
+ |
+@end |