| OLD | NEW | 
|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 package org.chromium.chrome.browser.firstrun; | 5 package org.chromium.chrome.browser.firstrun; | 
| 6 | 6 | 
| 7 import android.app.Activity; | 7 import android.app.Activity; | 
| 8 import android.app.Fragment; | 8 import android.app.Fragment; | 
| 9 import android.app.PendingIntent; | 9 import android.app.PendingIntent; | 
| 10 import android.app.PendingIntent.CanceledException; | 10 import android.app.PendingIntent.CanceledException; | 
| 11 import android.content.Intent; | 11 import android.content.Intent; | 
| 12 import android.os.Bundle; | 12 import android.os.Bundle; | 
| 13 import android.text.TextUtils; | 13 import android.text.TextUtils; | 
| 14 | 14 | 
| 15 import org.chromium.base.ApplicationStatus; | 15 import org.chromium.base.ApplicationStatus; | 
| 16 import org.chromium.base.Log; | 16 import org.chromium.base.Log; | 
| 17 import org.chromium.base.VisibleForTesting; | 17 import org.chromium.base.VisibleForTesting; | 
| 18 import org.chromium.base.metrics.CachedMetrics.EnumeratedHistogramSample; | 18 import org.chromium.base.metrics.CachedMetrics.EnumeratedHistogramSample; | 
| 19 import org.chromium.chrome.R; | 19 import org.chromium.chrome.R; | 
| 20 import org.chromium.chrome.browser.ChromeApplication; | 20 import org.chromium.chrome.browser.ChromeApplication; | 
| 21 import org.chromium.chrome.browser.customtabs.CustomTabActivity; | 21 import org.chromium.chrome.browser.customtabs.CustomTabActivity; | 
| 22 import org.chromium.chrome.browser.customtabs.CustomTabsConnection; | 22 import org.chromium.chrome.browser.customtabs.CustomTabsConnection; | 
| 23 import org.chromium.chrome.browser.document.ChromeLauncherActivity; | 23 import org.chromium.chrome.browser.document.ChromeLauncherActivity; | 
| 24 import org.chromium.chrome.browser.init.AsyncInitializationActivity; | 24 import org.chromium.chrome.browser.init.AsyncInitializationActivity; | 
| 25 import org.chromium.chrome.browser.metrics.UmaUtils; | 25 import org.chromium.chrome.browser.metrics.UmaUtils; | 
| 26 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings; | 26 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings; | 
| 27 import org.chromium.chrome.browser.preferences.datareduction.DataReductionPromoU
     tils; | 27 import org.chromium.chrome.browser.preferences.datareduction.DataReductionPromoU
     tils; | 
| 28 import org.chromium.chrome.browser.preferences.datareduction.DataReductionProxyU
     ma; | 28 import org.chromium.chrome.browser.preferences.datareduction.DataReductionProxyU
     ma; | 
| 29 import org.chromium.chrome.browser.profiles.Profile; | 29 import org.chromium.chrome.browser.profiles.Profile; | 
| 30 import org.chromium.chrome.browser.searchwidget.SearchWidgetProvider; |  | 
| 31 import org.chromium.chrome.browser.util.IntentUtils; | 30 import org.chromium.chrome.browser.util.IntentUtils; | 
| 32 | 31 | 
| 33 import java.lang.ref.WeakReference; | 32 import java.lang.ref.WeakReference; | 
| 34 import java.lang.reflect.Constructor; | 33 import java.lang.reflect.Constructor; | 
| 35 import java.util.ArrayList; | 34 import java.util.ArrayList; | 
| 36 import java.util.HashSet; | 35 import java.util.HashSet; | 
| 37 import java.util.List; | 36 import java.util.List; | 
| 38 import java.util.Set; | 37 import java.util.Set; | 
| 39 import java.util.concurrent.Callable; | 38 import java.util.concurrent.Callable; | 
| 40 | 39 | 
| 41 /** | 40 /** | 
| 42  * Handles the First Run Experience sequences shown to the user launching Chrome
      for the first time. | 41  * Handles the First Run Experience sequences shown to the user launching Chrome
      for the first time. | 
| 43  * It supports only a simple format of FRE: | 42  * It supports only a simple format of FRE: | 
| 44  *   [Welcome] | 43  *   [Welcome] | 
| 45  *   [Intro pages...] | 44  *   [Intro pages...] | 
| 46  *   [Sign-in page] | 45  *   [Sign-in page] | 
| 47  * The activity might be run more than once, e.g. 1) for ToS and sign-in, and 2)
      for intro. | 46  * The activity might be run more than once, e.g. 1) for ToS and sign-in, and 2)
      for intro. | 
| 48  */ | 47  */ | 
| 49 public class FirstRunActivity extends AsyncInitializationActivity implements Fir
     stRunPageDelegate { | 48 public class FirstRunActivity extends AsyncInitializationActivity implements Fir
     stRunPageDelegate { | 
| 50     /** Alerted about various events when FirstRunActivity performs them. */ |  | 
| 51     public interface FirstRunActivityObserver { |  | 
| 52         /** See {@link #onFlowIsKnown}. */ |  | 
| 53         void onFlowIsKnown(); |  | 
| 54 |  | 
| 55         /** See {@link #acceptTermsOfService}. */ |  | 
| 56         void onAcceptTermsOfService(); |  | 
| 57 |  | 
| 58         /** See {@link #jumpToPage}. */ |  | 
| 59         void onJumpToPage(int position); |  | 
| 60 |  | 
| 61         /** Called when First Run is completed. */ |  | 
| 62         void onUpdateCachedEngineName(); |  | 
| 63 |  | 
| 64         /** See {@link #abortFirstRunExperience}. */ |  | 
| 65         void onAbortFirstRunExperience(); |  | 
| 66     } |  | 
| 67 |  | 
| 68     protected static final String TAG = "FirstRunActivity"; | 49     protected static final String TAG = "FirstRunActivity"; | 
| 69 | 50 | 
| 70     // Incoming parameters: | 51     // Incoming parameters: | 
| 71     public static final String EXTRA_COMING_FROM_CHROME_ICON = "Extra.ComingFrom
     ChromeIcon"; | 52     public static final String EXTRA_COMING_FROM_CHROME_ICON = "Extra.ComingFrom
     ChromeIcon"; | 
| 72     public static final String EXTRA_USE_FRE_FLOW_SEQUENCER = "Extra.UseFreFlowS
     equencer"; | 53     public static final String EXTRA_USE_FRE_FLOW_SEQUENCER = "Extra.UseFreFlowS
     equencer"; | 
| 73     public static final String EXTRA_START_LIGHTWEIGHT_FRE = "Extra.StartLightwe
     ightFRE"; | 54     public static final String EXTRA_START_LIGHTWEIGHT_FRE = "Extra.StartLightwe
     ightFRE"; | 
| 74     public static final String EXTRA_CHROME_LAUNCH_INTENT = "Extra.FreChromeLaun
     chIntent"; | 55     public static final String EXTRA_CHROME_LAUNCH_INTENT = "Extra.FreChromeLaun
     chIntent"; | 
| 75     public static final String EXTRA_FINISH_ON_TOUCH_OUTSIDE = "Extra.FreFinishO
     nTouchOutside"; | 56     public static final String EXTRA_FINISH_ON_TOUCH_OUTSIDE = "Extra.FreFinishO
     nTouchOutside"; | 
| 76 | 57 | 
| 77     static final String SHOW_WELCOME_PAGE = "ShowWelcome"; | 58     static final String SHOW_WELCOME_PAGE = "ShowWelcome"; | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
| 107     private static final int FRE_PROGRESS_COMPLETED_NOT_SIGNED_IN = 5; | 88     private static final int FRE_PROGRESS_COMPLETED_NOT_SIGNED_IN = 5; | 
| 108     private static final int FRE_PROGRESS_MAX = 6; | 89     private static final int FRE_PROGRESS_MAX = 6; | 
| 109     private static final EnumeratedHistogramSample sMobileFreProgressMainIntentH
     istogram = | 90     private static final EnumeratedHistogramSample sMobileFreProgressMainIntentH
     istogram = | 
| 110             new EnumeratedHistogramSample("MobileFre.Progress.MainIntent", FRE_P
     ROGRESS_MAX); | 91             new EnumeratedHistogramSample("MobileFre.Progress.MainIntent", FRE_P
     ROGRESS_MAX); | 
| 111     private static final EnumeratedHistogramSample sMobileFreProgressViewIntentH
     istogram = | 92     private static final EnumeratedHistogramSample sMobileFreProgressViewIntentH
     istogram = | 
| 112             new EnumeratedHistogramSample("MobileFre.Progress.ViewIntent", FRE_P
     ROGRESS_MAX); | 93             new EnumeratedHistogramSample("MobileFre.Progress.ViewIntent", FRE_P
     ROGRESS_MAX); | 
| 113 | 94 | 
| 114     @VisibleForTesting | 95     @VisibleForTesting | 
| 115     static FirstRunGlue sGlue = new FirstRunGlueImpl(); | 96     static FirstRunGlue sGlue = new FirstRunGlueImpl(); | 
| 116 | 97 | 
| 117     private static FirstRunActivityObserver sObserver; |  | 
| 118 |  | 
| 119     private boolean mShowWelcomePage = true; | 98     private boolean mShowWelcomePage = true; | 
| 120 | 99 | 
| 121     private String mResultSignInAccountName; | 100     private String mResultSignInAccountName; | 
| 122     private boolean mResultShowSignInSettings; | 101     private boolean mResultShowSignInSettings; | 
| 123 | 102 | 
| 124     private boolean mFlowIsKnown; | 103     private boolean mFlowIsKnown; | 
| 125     private boolean mPostNativePageSequenceCreated; | 104     private boolean mPostNativePageSequenceCreated; | 
| 126     private boolean mNativeSideIsInitialized; | 105     private boolean mNativeSideIsInitialized; | 
| 127     private Set<FirstRunPage> mPagesToNotifyOfNativeInit; | 106     private Set<FirstRunPage> mPagesToNotifyOfNativeInit; | 
| 128     private boolean mDeferredCompleteFRE; | 107     private boolean mDeferredCompleteFRE; | 
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 255 | 234 | 
| 256                 mPagerAdapter = | 235                 mPagerAdapter = | 
| 257                         new FirstRunPagerAdapter(getFragmentManager(), mPages, m
     FreProperties); | 236                         new FirstRunPagerAdapter(getFragmentManager(), mPages, m
     FreProperties); | 
| 258                 stopProgressionIfNotAcceptedTermsOfService(); | 237                 stopProgressionIfNotAcceptedTermsOfService(); | 
| 259                 mPager.setAdapter(mPagerAdapter); | 238                 mPager.setAdapter(mPagerAdapter); | 
| 260 | 239 | 
| 261                 if (mNativeSideIsInitialized) { | 240                 if (mNativeSideIsInitialized) { | 
| 262                     skipPagesIfNecessary(); | 241                     skipPagesIfNecessary(); | 
| 263                 } | 242                 } | 
| 264 | 243 | 
| 265                 if (sObserver != null) sObserver.onFlowIsKnown(); |  | 
| 266                 recordFreProgressHistogram(mFreProgressStates.get(0)); | 244                 recordFreProgressHistogram(mFreProgressStates.get(0)); | 
| 267             } | 245             } | 
| 268         }; | 246         }; | 
| 269         mFirstRunFlowSequencer.start(); | 247         mFirstRunFlowSequencer.start(); | 
| 270 | 248 | 
| 271         recordFreProgressHistogram(FRE_PROGRESS_STARTED); | 249         recordFreProgressHistogram(FRE_PROGRESS_STARTED); | 
| 272     } | 250     } | 
| 273 | 251 | 
| 274     @Override | 252     @Override | 
| 275     public void finishNativeInitialization() { | 253     public void finishNativeInitialization() { | 
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 406     } | 384     } | 
| 407 | 385 | 
| 408     @Override | 386     @Override | 
| 409     public void abortFirstRunExperience() { | 387     public void abortFirstRunExperience() { | 
| 410         Intent intent = new Intent(); | 388         Intent intent = new Intent(); | 
| 411         if (mFreProperties != null) intent.putExtras(mFreProperties); | 389         if (mFreProperties != null) intent.putExtras(mFreProperties); | 
| 412         intent.putExtra(RESULT_CLOSE_APP, true); | 390         intent.putExtra(RESULT_CLOSE_APP, true); | 
| 413         finishAllTheActivities(getLocalClassName(), Activity.RESULT_CANCELED, in
     tent); | 391         finishAllTheActivities(getLocalClassName(), Activity.RESULT_CANCELED, in
     tent); | 
| 414 | 392 | 
| 415         sendPendingIntentIfNecessary(false); | 393         sendPendingIntentIfNecessary(false); | 
| 416         if (sObserver != null) sObserver.onAbortFirstRunExperience(); |  | 
| 417     } | 394     } | 
| 418 | 395 | 
| 419     @Override | 396     @Override | 
| 420     public void completeFirstRunExperience() { | 397     public void completeFirstRunExperience() { | 
| 421         if (!mNativeSideIsInitialized) { | 398         if (!mNativeSideIsInitialized) { | 
| 422             mDeferredCompleteFRE = true; | 399             mDeferredCompleteFRE = true; | 
| 423             return; | 400             return; | 
| 424         } | 401         } | 
| 425         if (!TextUtils.isEmpty(mResultSignInAccountName)) { | 402         if (!TextUtils.isEmpty(mResultSignInAccountName)) { | 
| 426             boolean defaultAccountName = | 403             boolean defaultAccountName = | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 458                 DataReductionProxyUma | 435                 DataReductionProxyUma | 
| 459                         .dataReductionProxyUIAction(DataReductionProxyUma.ACTION
     _FRE_DISABLED); | 436                         .dataReductionProxyUIAction(DataReductionProxyUma.ACTION
     _FRE_DISABLED); | 
| 460                 DataReductionPromoUtils.saveFrePromoOptOut(true); | 437                 DataReductionPromoUtils.saveFrePromoOptOut(true); | 
| 461             } | 438             } | 
| 462         } | 439         } | 
| 463 | 440 | 
| 464         Intent resultData = new Intent(); | 441         Intent resultData = new Intent(); | 
| 465         resultData.putExtras(mFreProperties); | 442         resultData.putExtras(mFreProperties); | 
| 466         finishAllTheActivities(getLocalClassName(), Activity.RESULT_OK, resultDa
     ta); | 443         finishAllTheActivities(getLocalClassName(), Activity.RESULT_OK, resultDa
     ta); | 
| 467 | 444 | 
| 468         // Update the search engine name cached by the widget. |  | 
| 469         SearchWidgetProvider.updateCachedEngineName(); |  | 
| 470         if (sObserver != null) sObserver.onUpdateCachedEngineName(); |  | 
| 471 |  | 
| 472         sendPendingIntentIfNecessary(true); | 445         sendPendingIntentIfNecessary(true); | 
| 473     } | 446     } | 
| 474 | 447 | 
| 475     @Override | 448     @Override | 
| 476     public void refuseSignIn() { | 449     public void refuseSignIn() { | 
| 477         sSigninChoiceHistogram.record(SIGNIN_NO_THANKS); | 450         sSigninChoiceHistogram.record(SIGNIN_NO_THANKS); | 
| 478         mResultSignInAccountName = null; | 451         mResultSignInAccountName = null; | 
| 479         mResultShowSignInSettings = false; | 452         mResultShowSignInSettings = false; | 
| 480     } | 453     } | 
| 481 | 454 | 
| 482     @Override | 455     @Override | 
| 483     public void acceptSignIn(String accountName) { | 456     public void acceptSignIn(String accountName) { | 
| 484         mResultSignInAccountName = accountName; | 457         mResultSignInAccountName = accountName; | 
| 485     } | 458     } | 
| 486 | 459 | 
| 487     @Override | 460     @Override | 
| 488     public void askToOpenSignInSettings() { | 461     public void askToOpenSignInSettings() { | 
| 489         mResultShowSignInSettings = true; | 462         mResultShowSignInSettings = true; | 
| 490     } | 463     } | 
| 491 | 464 | 
| 492     @Override | 465     @Override | 
| 493     public boolean didAcceptTermsOfService() { | 466     public boolean didAcceptTermsOfService() { | 
| 494         boolean result = sGlue.didAcceptTermsOfService(getApplicationContext()); | 467         return sGlue.didAcceptTermsOfService(getApplicationContext()); | 
| 495         if (sObserver != null) sObserver.onAcceptTermsOfService(); |  | 
| 496         return result; |  | 
| 497     } | 468     } | 
| 498 | 469 | 
| 499     @Override | 470     @Override | 
| 500     public void acceptTermsOfService(boolean allowCrashUpload) { | 471     public void acceptTermsOfService(boolean allowCrashUpload) { | 
| 501         // If default is true then it corresponds to opt-out and false correspon
     ds to opt-in. | 472         // If default is true then it corresponds to opt-out and false correspon
     ds to opt-in. | 
| 502         UmaUtils.recordMetricsReportingDefaultOptIn(!DEFAULT_METRICS_AND_CRASH_R
     EPORTING); | 473         UmaUtils.recordMetricsReportingDefaultOptIn(!DEFAULT_METRICS_AND_CRASH_R
     EPORTING); | 
| 503         sGlue.acceptTermsOfService(allowCrashUpload); | 474         sGlue.acceptTermsOfService(allowCrashUpload); | 
| 504         FirstRunStatus.setSkipWelcomePage(true); | 475         FirstRunStatus.setSkipWelcomePage(true); | 
| 505         flushPersistentData(); | 476         flushPersistentData(); | 
| 506         stopProgressionIfNotAcceptedTermsOfService(); | 477         stopProgressionIfNotAcceptedTermsOfService(); | 
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 568             Log.e(TAG, "Unable to send PendingIntent.", e); | 539             Log.e(TAG, "Unable to send PendingIntent.", e); | 
| 569         } | 540         } | 
| 570     } | 541     } | 
| 571 | 542 | 
| 572     /** | 543     /** | 
| 573      * Transitions to a given page. | 544      * Transitions to a given page. | 
| 574      * @return Whether the transition to a given page was allowed. | 545      * @return Whether the transition to a given page was allowed. | 
| 575      * @param position A page index to transition to. | 546      * @param position A page index to transition to. | 
| 576      */ | 547      */ | 
| 577     private boolean jumpToPage(int position) { | 548     private boolean jumpToPage(int position) { | 
| 578         if (sObserver != null) sObserver.onJumpToPage(position); |  | 
| 579 |  | 
| 580         if (mShowWelcomePage && !didAcceptTermsOfService()) { | 549         if (mShowWelcomePage && !didAcceptTermsOfService()) { | 
| 581             return position == 0; | 550             return position == 0; | 
| 582         } | 551         } | 
| 583         if (position >= mPagerAdapter.getCount()) { | 552         if (position >= mPagerAdapter.getCount()) { | 
| 584             completeFirstRunExperience(); | 553             completeFirstRunExperience(); | 
| 585             return false; | 554             return false; | 
| 586         } | 555         } | 
| 587         mPager.setCurrentItem(position, false); | 556         mPager.setCurrentItem(position, false); | 
| 588         recordFreProgressHistogram(mFreProgressStates.get(position)); | 557         recordFreProgressHistogram(mFreProgressStates.get(position)); | 
| 589         return true; | 558         return true; | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 627                 return constructor.newInstance(); | 596                 return constructor.newInstance(); | 
| 628             } | 597             } | 
| 629         }; | 598         }; | 
| 630     } | 599     } | 
| 631 | 600 | 
| 632     @Override | 601     @Override | 
| 633     public void showInfoPage(int url) { | 602     public void showInfoPage(int url) { | 
| 634         CustomTabActivity.showInfoPage(this, getString(url)); | 603         CustomTabActivity.showInfoPage(this, getString(url)); | 
| 635     } | 604     } | 
| 636 | 605 | 
|  | 606     /** Returns whether or not First Run is ready for interaction. */ | 
| 637     @VisibleForTesting | 607     @VisibleForTesting | 
| 638     public static void setObserverForTest(FirstRunActivityObserver observer) { | 608     public boolean isPostNativePageSequenceCreated() { | 
| 639         assert sObserver == null; | 609         return mPostNativePageSequenceCreated; | 
| 640         sObserver = observer; |  | 
| 641     } | 610     } | 
| 642 } | 611 } | 
| OLD | NEW | 
|---|