Index: ios/chrome/browser/ui/first_run/welcome_to_chrome_view_controller.mm |
diff --git a/ios/chrome/browser/ui/first_run/welcome_to_chrome_view_controller.mm b/ios/chrome/browser/ui/first_run/welcome_to_chrome_view_controller.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..445438c6e588b55b55874d826cc6e5bca95faacd |
--- /dev/null |
+++ b/ios/chrome/browser/ui/first_run/welcome_to_chrome_view_controller.mm |
@@ -0,0 +1,184 @@ |
+// Copyright 2013 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. |
+ |
+#include "ios/chrome/browser/ui/first_run/welcome_to_chrome_view_controller.h" |
+ |
+#include "base/i18n/rtl.h" |
+#include "base/ios/weak_nsobject.h" |
+#include "base/logging.h" |
+#include "base/mac/bundle_locations.h" |
+#include "base/mac/foundation_util.h" |
+#include "base/mac/objc_property_releaser.h" |
+#include "base/mac/scoped_nsobject.h" |
+#include "base/strings/sys_string_conversions.h" |
+#include "components/metrics/metrics_pref_names.h" |
+#include "components/metrics/metrics_reporting_default_state.h" |
+#include "components/prefs/pref_service.h" |
+#include "ios/chrome/browser/application_context.h" |
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h" |
+#include "ios/chrome/browser/first_run/first_run_configuration.h" |
+#include "ios/chrome/browser/tabs/tab_model.h" |
+#include "ios/chrome/browser/ui/fancy_ui/primary_action_button.h" |
+#include "ios/chrome/browser/ui/file_locations.h" |
+#import "ios/chrome/browser/ui/first_run/first_run_chrome_signin_view_controller.h" |
+#include "ios/chrome/browser/ui/first_run/first_run_util.h" |
+#include "ios/chrome/browser/ui/first_run/static_file_view_controller.h" |
+#import "ios/chrome/browser/ui/first_run/welcome_to_chrome_view.h" |
+#include "ios/chrome/browser/ui/ui_util.h" |
+#import "ios/chrome/browser/ui/uikit_ui_util.h" |
+#include "ios/chrome/common/string_util.h" |
+#include "ios/chrome/grit/ios_chromium_strings.h" |
+#include "ios/public/provider/chrome/browser/chrome_browser_provider.h" |
+#import "ios/public/provider/chrome/browser/signin/chrome_identity_service.h" |
+#include "ui/base/l10n/l10n_util.h" |
+ |
+NSString* const kUMAMetricsButtonAccessibilityIdentifier = |
+ @"UMAMetricsButtonAccessibilityIdentifier"; |
+ |
+namespace { |
+ |
+const CGFloat kFadeOutAnimationDuration = 0.16f; |
+ |
+// Default value for metrics reporting state. "YES" corresponding to "opt-out" |
+// state. |
+const BOOL kDefaultStatsCheckboxValue = YES; |
+} |
+ |
+@interface WelcomeToChromeViewController ()<WelcomeToChromeViewDelegate> { |
+ ios::ChromeBrowserState* browserState_; // weak |
+ TabModel* tabModel_; // weak |
+ base::mac::ObjCPropertyReleaser |
+ propertyReleaser_WelcomeToChromeViewController_; |
+} |
+ |
+// The animation which occurs at launch has run. |
+@property(nonatomic, assign) BOOL ranLaunchAnimation; |
+ |
+@end |
+ |
+@implementation WelcomeToChromeViewController |
+ |
+@synthesize ranLaunchAnimation = _ranLaunchAnimation; |
+ |
++ (BOOL)defaultStatsCheckboxValue { |
+ // Record metrics reporting as opt-in/opt-out only once. |
+ static dispatch_once_t once; |
+ dispatch_once(&once, ^{ |
+ metrics::RecordMetricsReportingDefaultState( |
+ GetApplicationContext()->GetLocalState(), |
+ kDefaultStatsCheckboxValue ? metrics::EnableMetricsDefault::OPT_OUT |
+ : metrics::EnableMetricsDefault::OPT_IN); |
+ }); |
+ return kDefaultStatsCheckboxValue; |
+} |
+ |
+- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState |
+ tabModel:(TabModel*)tabModel { |
+ DCHECK(browserState); |
+ DCHECK(tabModel); |
+ self = [super initWithNibName:nil bundle:nil]; |
+ if (self) { |
+ browserState_ = browserState; |
+ tabModel_ = tabModel; |
+ propertyReleaser_WelcomeToChromeViewController_.Init( |
+ self, [WelcomeToChromeViewController class]); |
+ } |
+ return self; |
+} |
+ |
+- (instancetype)initWithNibName:(nullable NSString*)nibNameOrNil |
+ bundle:(nullable NSBundle*)nibBundleOrNil { |
+ NOTREACHED(); |
+ return nil; |
+} |
+ |
+- (instancetype)initWithCoder:(nonnull NSCoder*)aDecoder { |
+ NOTREACHED(); |
+ return nil; |
+} |
+ |
+- (void)loadView { |
+ base::scoped_nsobject<WelcomeToChromeView> welcomeToChromeView( |
+ [[WelcomeToChromeView alloc] initWithFrame:CGRectZero]); |
+ [welcomeToChromeView setDelegate:self]; |
+ [welcomeToChromeView |
+ setCheckBoxSelected:[[self class] defaultStatsCheckboxValue]]; |
+ self.view = welcomeToChromeView; |
+} |
+ |
+- (void)viewDidLoad { |
+ [super viewDidLoad]; |
+ [self.navigationController setNavigationBarHidden:YES]; |
+} |
+ |
+- (void)viewDidLayoutSubviews { |
+ [super viewDidLayoutSubviews]; |
+ if (self.ranLaunchAnimation) |
+ return; |
+ WelcomeToChromeView* view = |
+ base::mac::ObjCCastStrict<WelcomeToChromeView>(self.view); |
+ [view runLaunchAnimation]; |
+ self.ranLaunchAnimation = YES; |
+} |
+ |
+- (BOOL)prefersStatusBarHidden { |
+ return YES; |
+} |
+ |
+- (NSURL*)newTermsOfServiceUrl { |
+ std::string tos = GetTermsOfServicePath(); |
+ NSString* path = [[base::mac::FrameworkBundle() bundlePath] |
+ stringByAppendingPathComponent:base::SysUTF8ToNSString(tos)]; |
+ base::scoped_nsobject<NSURLComponents> components( |
+ [[NSURLComponents alloc] init]); |
+ [components setScheme:@"file"]; |
+ [components setHost:@""]; |
+ [components setPath:path]; |
+ return [[components URL] retain]; |
+} |
+ |
+// Displays the file at the given URL in a StaticFileViewController. |
+- (void)openStaticFileWithURL:(NSURL*)url title:(NSString*)title { |
+ base::scoped_nsobject<StaticFileViewController> staticViewController( |
+ [[StaticFileViewController alloc] initWithBrowserState:browserState_ |
+ URL:url]); |
+ [staticViewController setTitle:title]; |
+ [self.navigationController pushViewController:staticViewController |
+ animated:YES]; |
+} |
+ |
+#pragma mark - WelcomeToChromeViewDelegate |
+ |
+- (void)welcomeToChromeViewDidTapTOSLink:(WelcomeToChromeView*)view { |
+ NSString* title = l10n_util::GetNSString(IDS_IOS_FIRSTRUN_TERMS_TITLE); |
+ base::scoped_nsobject<NSURL> tosUrl([self newTermsOfServiceUrl]); |
+ [self openStaticFileWithURL:tosUrl title:title]; |
+} |
+ |
+- (void)welcomeToChromeViewDidTapOKButton:(WelcomeToChromeView*)view { |
+ GetApplicationContext()->GetLocalState()->SetBoolean( |
+ metrics::prefs::kMetricsReportingEnabled, view.checkBoxSelected); |
+ |
+ base::scoped_nsobject<FirstRunConfiguration> firstRunConfig( |
+ [[FirstRunConfiguration alloc] init]); |
+ bool hasSSOAccounts = ios::GetChromeBrowserProvider() |
+ ->GetChromeIdentityService() |
+ ->HasIdentities(); |
+ [firstRunConfig setHasSSOAccount:hasSSOAccounts]; |
+ base::scoped_nsobject<FirstRunChromeSigninViewController> signInController( |
+ [[FirstRunChromeSigninViewController alloc] |
+ initWithBrowserState:browserState_ |
+ tabModel:tabModel_ |
+ firstRunConfig:firstRunConfig |
+ signInIdentity:nil]); |
+ |
+ CATransition* transition = [CATransition animation]; |
+ transition.duration = kFadeOutAnimationDuration; |
+ transition.type = kCATransitionFade; |
+ [self.navigationController.view.layer addAnimation:transition |
+ forKey:kCATransition]; |
+ [self.navigationController pushViewController:signInController animated:NO]; |
+} |
+ |
+@end |