Commit e116db81 authored by Peter Kotwicz's avatar Peter Kotwicz Committed by Commit Bot

Merge WebappActivity and SingleTabActivity

WebappActivity is the only class which extends SingleTabActivity.

BUG=1022819

Change-Id: I1f837d2251f45e97b8dec8cbde2a53056867cb04
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1906312
Commit-Queue: Peter Kotwicz <pkotwicz@chromium.org>
Reviewed-by: default avatarYaron Friedman <yfriedman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#714017}
parent 12e8577d
...@@ -52,7 +52,6 @@ chrome_java_sources = [ ...@@ -52,7 +52,6 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/SearchGeolocationDisclosureTabHelper.java", "java/src/org/chromium/chrome/browser/SearchGeolocationDisclosureTabHelper.java",
"java/src/org/chromium/chrome/browser/ServiceTabLauncher.java", "java/src/org/chromium/chrome/browser/ServiceTabLauncher.java",
"java/src/org/chromium/chrome/browser/ShortcutHelper.java", "java/src/org/chromium/chrome/browser/ShortcutHelper.java",
"java/src/org/chromium/chrome/browser/SingleTabActivity.java",
"java/src/org/chromium/chrome/browser/SnackbarActivity.java", "java/src/org/chromium/chrome/browser/SnackbarActivity.java",
"java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java", "java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java",
"java/src/org/chromium/chrome/browser/SynchronousInitializationActivity.java", "java/src/org/chromium/chrome/browser/SynchronousInitializationActivity.java",
......
per-file ChromeApplication.java=agrieve@chromium.org per-file ChromeApplication.java=agrieve@chromium.org
per-file ShortcutHelper.java=dominickn@chromium.org per-file ShortcutHelper.java=dominickn@chromium.org
per-file SingleTabActivity.java=dominickn@chromium.org
# This is For simple changes of adding/removing features. For more structural # This is For simple changes of adding/removing features. For more structural
# changes, use the normal OWNERS rules. # changes, use the normal OWNERS rules.
......
// 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.
package org.chromium.chrome.browser;
import android.os.Bundle;
import android.util.Pair;
import org.chromium.chrome.browser.dependency_injection.ChromeActivityComponent;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabBuilder;
import org.chromium.chrome.browser.tab.TabDelegateFactory;
import org.chromium.chrome.browser.tab.TabState;
import org.chromium.chrome.browser.tabmodel.SingleTabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabLaunchType;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabSelectionType;
import org.chromium.chrome.browser.tabmodel.document.TabDelegate;
/**
* Base class for task-focused activities that need to display a single tab.
* @param <C> - type of associated Dagger component.
*
* Example applications that might use this Activity would be webapps and streaming media
* activities - anything where maintaining multiple tabs is unnecessary.
*/
public abstract class SingleTabActivity<C extends ChromeActivityComponent>
extends ChromeActivity<C> {
protected static final String BUNDLE_TAB_ID = "tabId";
@Override
protected TabModelSelector createTabModelSelector() {
return new SingleTabModelSelector(this, this, false);
}
@Override
protected Pair<? extends TabCreator, ? extends TabCreator> createTabCreators() {
return Pair.create(createNormalTabCreator(), null);
}
/** Creates TabDelegates for opening new Tabs. */
protected TabCreator createNormalTabCreator() {
return new TabDelegate(false /* incognito */);
}
@Override
public void initializeState() {
super.initializeState();
createAndShowTab();
}
protected void createAndShowTab() {
Tab tab = createTab();
getTabModelSelector().setTab(tab);
tab.show(TabSelectionType.FROM_NEW);
}
@Override
public SingleTabModelSelector getTabModelSelector() {
return (SingleTabModelSelector) super.getTabModelSelector();
}
/**
* Creates the {@link Tab} used by the {@link SingleTabActivity}.
* If the {@code savedInstanceState} exists, then the user did not intentionally close the app
* by swiping it away in the recent tasks list. In that case, we try to restore the tab from
* disk.
*/
protected Tab createTab() {
Tab tab = null;
TabState tabState = null;
int tabId = Tab.INVALID_TAB_ID;
Bundle savedInstanceState = getSavedInstanceState();
if (savedInstanceState != null) {
tabId = savedInstanceState.getInt(BUNDLE_TAB_ID, Tab.INVALID_TAB_ID);
if (tabId != Tab.INVALID_TAB_ID) {
tabState = restoreTabState(savedInstanceState, tabId);
}
}
boolean unfreeze = tabId != Tab.INVALID_TAB_ID && tabState != null;
if (unfreeze) {
tab = TabBuilder.createFromFrozenState()
.setId(tabId)
.setWindow(getWindowAndroid())
.setDelegateFactory(createTabDelegateFactory())
.setTabState(tabState)
.setUnfreeze(unfreeze)
.build();
} else {
tab = new TabBuilder()
.setWindow(getWindowAndroid())
.setLaunchType(TabLaunchType.FROM_CHROME_UI)
.setDelegateFactory(createTabDelegateFactory())
.setTabState(tabState)
.setUnfreeze(unfreeze)
.build();
}
return tab;
}
/**
* @return {@link TabDelegateFactory} to be used while creating the associated {@link Tab}.
*/
protected abstract TabDelegateFactory createTabDelegateFactory();
/**
* Restore {@link TabState} from a given {@link Bundle} and tabId.
* @param saveInstanceState The saved bundle for the last recorded state.
* @param tabId ID of the tab restored from.
*/
protected abstract TabState restoreTabState(Bundle savedInstanceState, int tabId);
@Override
protected boolean handleBackPressed() {
Tab tab = getActivityTab();
if (tab == null) return false;
if (exitFullscreenIfShowing()) return true;
if (tab.canGoBack()) {
tab.goBack();
return true;
}
return false;
}
@Override
public void onUpdateStateChanged() {}
}
...@@ -17,6 +17,7 @@ import android.os.Build; ...@@ -17,6 +17,7 @@ import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.StrictMode; import android.os.StrictMode;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Pair;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
...@@ -33,7 +34,6 @@ import org.chromium.chrome.R; ...@@ -33,7 +34,6 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.ChromeApplication; import org.chromium.chrome.browser.ChromeApplication;
import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.SingleTabActivity;
import org.chromium.chrome.browser.WarmupManager; import org.chromium.chrome.browser.WarmupManager;
import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegate; import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegate;
import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider.CustomTabsUiType; import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider.CustomTabsUiType;
...@@ -48,9 +48,14 @@ import org.chromium.chrome.browser.metrics.WebApkUma; ...@@ -48,9 +48,14 @@ import org.chromium.chrome.browser.metrics.WebApkUma;
import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.EmptyTabObserver;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabBrowserControlsState; import org.chromium.chrome.browser.tab.TabBrowserControlsState;
import org.chromium.chrome.browser.tab.TabBuilder;
import org.chromium.chrome.browser.tab.TabDelegateFactory; import org.chromium.chrome.browser.tab.TabDelegateFactory;
import org.chromium.chrome.browser.tab.TabObserver; import org.chromium.chrome.browser.tab.TabObserver;
import org.chromium.chrome.browser.tab.TabState; import org.chromium.chrome.browser.tab.TabState;
import org.chromium.chrome.browser.tabmodel.SingleTabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabLaunchType;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabSelectionType;
import org.chromium.chrome.browser.ui.widget.TintedDrawable; import org.chromium.chrome.browser.ui.widget.TintedDrawable;
import org.chromium.chrome.browser.usage_stats.UsageStatsService; import org.chromium.chrome.browser.usage_stats.UsageStatsService;
import org.chromium.chrome.browser.util.AndroidTaskUtils; import org.chromium.chrome.browser.util.AndroidTaskUtils;
...@@ -72,13 +77,15 @@ import java.util.HashMap; ...@@ -72,13 +77,15 @@ import java.util.HashMap;
/** /**
* Displays a webapp in a nearly UI-less Chrome (InfoBars still appear). * Displays a webapp in a nearly UI-less Chrome (InfoBars still appear).
*/ */
public class WebappActivity extends SingleTabActivity<WebappActivityComponent> { public class WebappActivity extends ChromeActivity<WebappActivityComponent> {
public static final String WEBAPP_SCHEME = "webapp"; public static final String WEBAPP_SCHEME = "webapp";
private static final String TAG = "WebappActivity"; private static final String TAG = "WebappActivity";
private static final String HISTOGRAM_NAVIGATION_STATUS = "Webapp.NavigationStatus"; private static final String HISTOGRAM_NAVIGATION_STATUS = "Webapp.NavigationStatus";
private static final long MS_BEFORE_NAVIGATING_BACK_FROM_INTERSTITIAL = 1000; private static final long MS_BEFORE_NAVIGATING_BACK_FROM_INTERSTITIAL = 1000;
protected static final String BUNDLE_TAB_ID = "tabId";
private WebappInfo mWebappInfo; private WebappInfo mWebappInfo;
private CustomTabToolbarCoordinator mToolbarCoordinator; private CustomTabToolbarCoordinator mToolbarCoordinator;
...@@ -194,6 +201,8 @@ public class WebappActivity extends SingleTabActivity<WebappActivityComponent> { ...@@ -194,6 +201,8 @@ public class WebappActivity extends SingleTabActivity<WebappActivityComponent> {
@Override @Override
public void initializeState() { public void initializeState() {
super.initializeState(); super.initializeState();
createAndShowTab();
mTabController.setInitialTab(getActivityTab()); mTabController.setInitialTab(getActivityTab());
initializeUI(getSavedInstanceState()); initializeUI(getSavedInstanceState());
} }
...@@ -393,8 +402,12 @@ public class WebappActivity extends SingleTabActivity<WebappActivityComponent> { ...@@ -393,8 +402,12 @@ public class WebappActivity extends SingleTabActivity<WebappActivityComponent> {
} }
} }
@Override /**
protected TabState restoreTabState(Bundle savedInstanceState, int tabId) { * Restore {@link TabState} from a given {@link Bundle} and tabId.
* @param saveInstanceState The saved bundle for the last recorded state.
* @param tabId ID of the tab restored from.
*/
private TabState restoreTabState(Bundle savedInstanceState, int tabId) {
return TabState.restoreTabState(savedInstanceState); return TabState.restoreTabState(savedInstanceState);
} }
...@@ -768,14 +781,15 @@ public class WebappActivity extends SingleTabActivity<WebappActivityComponent> { ...@@ -768,14 +781,15 @@ public class WebappActivity extends SingleTabActivity<WebappActivityComponent> {
return null; return null;
} }
@Override /**
protected TabDelegateFactory createTabDelegateFactory() { * @return {@link TabDelegateFactory} to be used while creating the associated {@link Tab}.
*/
private TabDelegateFactory createTabDelegateFactory() {
mWebappDelegateFactory = new WebappDelegateFactory(this); mWebappDelegateFactory = new WebappDelegateFactory(this);
return mWebappDelegateFactory; return mWebappDelegateFactory;
} }
@Override private TabCreator createNormalTabCreator() {
protected TabCreator createNormalTabCreator() {
return new WebappTabDelegate(false /* incognito */, mWebappInfo); return new WebappTabDelegate(false /* incognito */, mWebappInfo);
} }
...@@ -847,4 +861,66 @@ public class WebappActivity extends SingleTabActivity<WebappActivityComponent> { ...@@ -847,4 +861,66 @@ public class WebappActivity extends SingleTabActivity<WebappActivityComponent> {
protected void removeSplashscreenObserver(SplashscreenObserver observer) { protected void removeSplashscreenObserver(SplashscreenObserver observer) {
mSplashController.removeObserver(observer); mSplashController.removeObserver(observer);
} }
@Override
protected TabModelSelector createTabModelSelector() {
return new SingleTabModelSelector(this, this, false);
}
@Override
protected Pair<? extends TabCreator, ? extends TabCreator> createTabCreators() {
return Pair.create(createNormalTabCreator(), null);
}
protected void createAndShowTab() {
Tab tab = createTab();
getTabModelSelector().setTab(tab);
tab.show(TabSelectionType.FROM_NEW);
}
@Override
public SingleTabModelSelector getTabModelSelector() {
return (SingleTabModelSelector) super.getTabModelSelector();
}
/**
* Creates the {@link Tab} used by the {@link SingleTabActivity}.
* If the {@code savedInstanceState} exists, then the user did not intentionally close the app
* by swiping it away in the recent tasks list. In that case, we try to restore the tab from
* disk.
*/
protected Tab createTab() {
Tab tab = null;
TabState tabState = null;
int tabId = Tab.INVALID_TAB_ID;
Bundle savedInstanceState = getSavedInstanceState();
if (savedInstanceState != null) {
tabId = savedInstanceState.getInt(BUNDLE_TAB_ID, Tab.INVALID_TAB_ID);
if (tabId != Tab.INVALID_TAB_ID) {
tabState = restoreTabState(savedInstanceState, tabId);
}
}
boolean unfreeze = tabId != Tab.INVALID_TAB_ID && tabState != null;
if (unfreeze) {
tab = TabBuilder.createFromFrozenState()
.setId(tabId)
.setWindow(getWindowAndroid())
.setDelegateFactory(createTabDelegateFactory())
.setTabState(tabState)
.setUnfreeze(unfreeze)
.build();
} else {
tab = new TabBuilder()
.setWindow(getWindowAndroid())
.setLaunchType(TabLaunchType.FROM_CHROME_UI)
.setDelegateFactory(createTabDelegateFactory())
.setTabState(tabState)
.setUnfreeze(unfreeze)
.build();
}
return tab;
}
@Override
public void onUpdateStateChanged() {}
} }
...@@ -9,7 +9,6 @@ import android.os.Build; ...@@ -9,7 +9,6 @@ import android.os.Build;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
import org.chromium.chrome.browser.ShortcutHelper; import org.chromium.chrome.browser.ShortcutHelper;
import org.chromium.chrome.browser.SingleTabActivity;
import org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator; import org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator;
import org.chromium.chrome.browser.contextmenu.ContextMenuPopulator; import org.chromium.chrome.browser.contextmenu.ContextMenuPopulator;
import org.chromium.chrome.browser.fullscreen.ComposedBrowserControlsVisibilityDelegate; import org.chromium.chrome.browser.fullscreen.ComposedBrowserControlsVisibilityDelegate;
...@@ -26,7 +25,7 @@ import org.chromium.webapk.lib.client.WebApkNavigationClient; ...@@ -26,7 +25,7 @@ import org.chromium.webapk.lib.client.WebApkNavigationClient;
/** /**
* A {@link TabDelegateFactory} class to be used in all {@link Tab} instances owned by a * A {@link TabDelegateFactory} class to be used in all {@link Tab} instances owned by a
* {@link SingleTabActivity}. * {@link WebappActivity}.
*/ */
public class WebappDelegateFactory extends TabDelegateFactoryImpl { public class WebappDelegateFactory extends TabDelegateFactoryImpl {
private static class WebappWebContentsDelegateAndroid private static class WebappWebContentsDelegateAndroid
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment