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

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java

Issue 2561433002: Make FirstRunActivity extend AsyncInitializationActivity. (Closed)
Patch Set: Update UX. Created 3 years, 11 months 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: chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java
index 96908cc05d0578cabfc625c756bf745bb07d9e0d..7a1c7640d5f73acf3e914cc52095265c84029053 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java
@@ -10,21 +10,18 @@ import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException;
import android.content.Intent;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import org.chromium.base.ApplicationStatus;
import org.chromium.base.Log;
import org.chromium.base.VisibleForTesting;
-import org.chromium.base.library_loader.ProcessInitException;
import org.chromium.base.metrics.CachedMetrics.EnumeratedHistogramSample;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeApplication;
import org.chromium.chrome.browser.customtabs.CustomTabActivity;
import org.chromium.chrome.browser.customtabs.CustomTabsConnection;
import org.chromium.chrome.browser.document.ChromeLauncherActivity;
-import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
-import org.chromium.chrome.browser.init.EmptyBrowserParts;
+import org.chromium.chrome.browser.init.AsyncInitializationActivity;
import org.chromium.chrome.browser.metrics.UmaUtils;
import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
import org.chromium.chrome.browser.preferences.datareduction.DataReductionPromoUtils;
@@ -35,7 +32,9 @@ import org.chromium.chrome.browser.util.IntentUtils;
import java.lang.ref.WeakReference;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import java.util.concurrent.Callable;
/**
@@ -46,7 +45,7 @@ import java.util.concurrent.Callable;
* [Sign-in page]
* The activity might be run more than once, e.g. 1) for ToS and sign-in, and 2) for intro.
*/
-public class FirstRunActivity extends AppCompatActivity implements FirstRunPageDelegate {
+public class FirstRunActivity extends AsyncInitializationActivity implements FirstRunPageDelegate {
protected static final String TAG = "FirstRunActivity";
// Incoming parameters:
@@ -103,6 +102,8 @@ public class FirstRunActivity extends AppCompatActivity implements FirstRunPageD
private boolean mPostNativePageSequenceCreated;
private boolean mNativeSideIsInitialized;
+ private Set<FirstRunPage> mPagesToNotifyOfNativeInit;
+ private boolean mDeferredCompleteFRE;
private ProfileDataCache mProfileDataCache;
private FirstRunViewPager mPager;
@@ -131,12 +132,10 @@ public class FirstRunActivity extends AppCompatActivity implements FirstRunPageD
if (mShowWelcomePage) {
mPages.add(pageOf(ToSAndUMAFirstRunFragment.class));
mFreProgressStates.add(FRE_PROGRESS_WELCOME_SHOWN);
- } else {
- // Otherwise, if we're skipping past the welcome page, then init the
- // native process and determine if data reduction proxy and signin
- // pages should be shown - which both depend on native code.
- createPostNativePageSequence();
}
+
+ // Other pages will be created by createPostNativePageSequence() after
+ // native has been initialized.
}
private void createPostNativePageSequence() {
@@ -144,7 +143,6 @@ public class FirstRunActivity extends AppCompatActivity implements FirstRunPageD
// populates |mPages| which needs to be done even even if onNativeInitialized() was
// performed in a previous session.
if (mPostNativePageSequenceCreated) return;
- ensureBrowserProcessInitialized();
mFirstRunFlowSequencer.onNativeInitialized(mFreProperties);
boolean notifyAdapter = false;
@@ -168,14 +166,11 @@ public class FirstRunActivity extends AppCompatActivity implements FirstRunPageD
mPostNativePageSequenceCreated = true;
}
- // Activity:
+ // AsyncInitializationActivity:
@Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- ChromeBrowserInitializer.getInstance(this).handlePreNativeStartup(new EmptyBrowserParts());
-
+ public void setContentView() {
+ Bundle savedInstanceState = getSavedInstanceState();
if (savedInstanceState != null) {
mFreProperties = savedInstanceState;
} else if (getIntent() != null) {
@@ -225,8 +220,6 @@ public class FirstRunActivity extends AppCompatActivity implements FirstRunPageD
mPager.setAdapter(mPagerAdapter);
recordFreProgressHistogram(mFreProgressStates.get(0));
-
- skipPagesIfNecessary();
}
};
mFirstRunFlowSequencer.start();
@@ -235,13 +228,50 @@ public class FirstRunActivity extends AppCompatActivity implements FirstRunPageD
}
@Override
+ public void finishNativeInitialization() {
+ super.finishNativeInitialization();
+ mNativeSideIsInitialized = true;
+ if (mDeferredCompleteFRE) {
+ completeFirstRunExperience();
+ mDeferredCompleteFRE = false;
+ } else {
+ createPostNativePageSequence();
+ if (mPagesToNotifyOfNativeInit != null) {
+ for (FirstRunPage page : mPagesToNotifyOfNativeInit) {
+ page.onNativeInitialized();
+ }
+ }
+ mPagesToNotifyOfNativeInit = null;
+ skipPagesIfNecessary();
+ }
+ }
+
+ // Activity:
+
+ @Override
+ public void onAttachFragment(Fragment fragment) {
+ if (!(fragment instanceof FirstRunPage)) return;
+
+ FirstRunPage page = (FirstRunPage) fragment;
+ if (mNativeSideIsInitialized) {
+ page.onNativeInitialized();
+ return;
+ }
+
+ if (mPagesToNotifyOfNativeInit == null) {
+ mPagesToNotifyOfNativeInit = new HashSet<FirstRunPage>();
+ }
+ mPagesToNotifyOfNativeInit.add(page);
+ }
+
+ @Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putAll(mFreProperties);
}
@Override
- protected void onPause() {
+ public void onPause() {
super.onPause();
flushPersistentData();
}
@@ -253,7 +283,7 @@ public class FirstRunActivity extends AppCompatActivity implements FirstRunPageD
}
@Override
- protected void onStart() {
+ public void onStart() {
super.onStart();
// Since the FRE may be shown before any tab is shown, mark that this is the point at
// which Chrome went to foreground. This is needed as otherwise an assert will be hit
@@ -325,7 +355,10 @@ public class FirstRunActivity extends AppCompatActivity implements FirstRunPageD
@Override
public void completeFirstRunExperience() {
- ensureBrowserProcessInitialized();
+ if (!mNativeSideIsInitialized) {
+ mDeferredCompleteFRE = true;
+ return;
+ }
if (!TextUtils.isEmpty(mResultSignInAccountName)) {
boolean defaultAccountName =
sGlue.isDefaultAccountName(getApplicationContext(), mResultSignInAccountName);
@@ -396,13 +429,6 @@ public class FirstRunActivity extends AppCompatActivity implements FirstRunPageD
@Override
public void acceptTermsOfService(boolean allowCrashUpload) {
- // At this point, we're advancing past the first page, which has no native
- // dependencies to further pages in the sequence, if any. These require
- // native to be initialized and will be added by the call below if needed.
- // Additionally, the calls later in this function also require native
- // to be initialized.
- createPostNativePageSequence();
-
// If default is true then it corresponds to opt-out and false corresponds to opt-in.
UmaUtils.recordMetricsReportingDefaultOptIn(!DEFAULT_METRICS_AND_CRASH_REPORTING);
sGlue.acceptTermsOfService(allowCrashUpload);
@@ -504,28 +530,11 @@ public class FirstRunActivity extends AppCompatActivity implements FirstRunPageD
while (currentPageIndex < mPagerAdapter.getCount()) {
FirstRunPage currentPage = (FirstRunPage) mPagerAdapter.getItem(currentPageIndex);
if (!currentPage.shouldSkipPageOnCreate(getApplicationContext())) return;
- // If we're advancing to the next page, ensure to init the post native page
- // sequence - as every page except the first requires that to be initialized.
- // This is a no-op if it has already been done.
- createPostNativePageSequence();
if (!jumpToPage(currentPageIndex + 1)) return;
currentPageIndex = mPager.getCurrentItem();
}
}
- private void ensureBrowserProcessInitialized() {
- if (mNativeSideIsInitialized) return;
- try {
- ChromeBrowserInitializer.getInstance(this).handlePostNativeStartup(
- false, new EmptyBrowserParts());
- mNativeSideIsInitialized = true;
- } catch (ProcessInitException e) {
- Log.e(TAG, "Unable to load native library.", e);
- abortFirstRunExperience();
- return;
- }
- }
-
private void recordFreProgressHistogram(int state) {
if (mFreProperties.getBoolean(FirstRunActivity.EXTRA_COMING_FROM_CHROME_ICON)) {
sMobileFreProgressMainIntentHistogram.record(state);

Powered by Google App Engine
This is Rietveld 408576698