Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(100)

Unified Diff: ios/chrome/browser/metrics/size_class_recorder.mm

Issue 2585233003: Upstream Chrome on iOS source code [2/11]. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « ios/chrome/browser/metrics/size_class_recorder.h ('k') | ios/chrome/browser/metrics/size_class_recorder_private.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698