Index: chrome/android/java_staging/src/org/chromium/chrome/browser/webapps/WebappActivity.java |
diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/webapps/WebappActivity.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/webapps/WebappActivity.java |
deleted file mode 100644 |
index 1d2ea8a88b5a86cc76bf9db0a80929aa5a2c7993..0000000000000000000000000000000000000000 |
--- a/chrome/android/java_staging/src/org/chromium/chrome/browser/webapps/WebappActivity.java |
+++ /dev/null |
@@ -1,357 +0,0 @@ |
-// 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.webapps; |
- |
-import android.content.Context; |
-import android.content.Intent; |
-import android.graphics.Bitmap; |
-import android.net.Uri; |
-import android.os.AsyncTask; |
-import android.os.Bundle; |
-import android.text.TextUtils; |
-import android.util.Log; |
-import android.view.View; |
- |
-import org.chromium.base.ActivityState; |
-import org.chromium.base.ApiCompatibilityUtils; |
-import org.chromium.base.ApplicationStatus; |
-import org.chromium.base.VisibleForTesting; |
-import org.chromium.chrome.R; |
-import org.chromium.chrome.browser.EmptyTabObserver; |
-import org.chromium.chrome.browser.ShortcutHelper; |
-import org.chromium.chrome.browser.Tab; |
-import org.chromium.chrome.browser.TabObserver; |
-import org.chromium.chrome.browser.UrlUtilities; |
-import org.chromium.chrome.browser.document.DocumentUtils; |
-import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; |
-import org.chromium.chrome.browser.ssl.ConnectionSecurityLevel; |
-import org.chromium.chrome.browser.util.FeatureUtilities; |
-import org.chromium.content.browser.ScreenOrientationProvider; |
-import org.chromium.content_public.browser.LoadUrlParams; |
-import org.chromium.content_public.browser.WebContentsObserver; |
-import org.chromium.net.NetworkChangeNotifier; |
-import org.chromium.ui.base.PageTransition; |
- |
-import java.io.File; |
- |
-/** |
- * Displays a webapp in a nearly UI-less Chrome (InfoBars still appear). |
- */ |
-public class WebappActivity extends FullScreenActivity { |
- public static final String WEBAPP_SCHEME = "webapp"; |
- |
- private static final String TAG = "WebappActivity"; |
- private static final long MS_BEFORE_NAVIGATING_BACK_FROM_INTERSTITIAL = 1000; |
- |
- private final WebappInfo mWebappInfo; |
- private AsyncTask<Void, Void, Void> mCleanupTask; |
- |
- private WebContentsObserver mWebContentsObserver; |
- |
- private WebappUrlBar mUrlBar; |
- |
- private boolean mIsInitialized; |
- private Integer mBrandColor; |
- |
- /** |
- * Construct all the variables that shouldn't change. We do it here both to clarify when the |
- * objects are created and to ensure that they exist throughout the parallelized initialization |
- * of the WebappActivity. |
- */ |
- public WebappActivity() { |
- mWebappInfo = WebappInfo.createEmpty(); |
- } |
- |
- @Override |
- protected void onNewIntent(Intent intent) { |
- if (intent == null) return; |
- super.onNewIntent(intent); |
- |
- WebappInfo newWebappInfo = WebappInfo.create(intent); |
- if (newWebappInfo == null) { |
- Log.e(TAG, "Failed to parse new Intent: " + intent); |
- finish(); |
- } else if (!TextUtils.equals(mWebappInfo.id(), newWebappInfo.id())) { |
- mWebappInfo.copy(newWebappInfo); |
- resetSavedInstanceState(); |
- if (mIsInitialized) initializeUI(null); |
- } |
- } |
- |
- private void initializeUI(Bundle savedInstanceState) { |
- // We do not load URL when restoring from saved instance states. |
- if (savedInstanceState == null && mWebappInfo.isInitialized()) { |
- if (TextUtils.isEmpty(getActivityTab().getUrl())) { |
- getActivityTab().loadUrl(new LoadUrlParams( |
- mWebappInfo.uri().toString(), PageTransition.AUTO_TOPLEVEL)); |
- } |
- } else { |
- if (NetworkChangeNotifier.isOnline()) getActivityTab().reloadIgnoringCache(); |
- } |
- |
- mWebContentsObserver = createWebContentsObserver(); |
- getActivityTab().addObserver(createTabObserver()); |
- updateTaskDescription(); |
- removeWindowBackground(); |
- } |
- |
- @Override |
- public void preInflationStartup() { |
- WebappInfo info = WebappInfo.create(getIntent()); |
- if (info != null) mWebappInfo.copy(info); |
- mCleanupTask = new WebappDirectoryManager(getActivityDirectory(), |
- WEBAPP_SCHEME, FeatureUtilities.isDocumentModeEligible(this)); |
- |
- ScreenOrientationProvider.lockOrientation((byte) mWebappInfo.orientation(), this); |
- super.preInflationStartup(); |
- } |
- |
- @Override |
- public void finishNativeInitialization() { |
- if (!mWebappInfo.isInitialized()) finish(); |
- super.finishNativeInitialization(); |
- initializeUI(getSavedInstanceState()); |
- mIsInitialized = true; |
- } |
- |
- @Override |
- protected void onSaveInstanceState(Bundle outState) { |
- super.onSaveInstanceState(outState); |
- mWebappInfo.writeToBundle(outState); |
- if (getActivityTab() != null) getActivityTab().saveInstanceState(outState); |
- } |
- |
- @Override |
- public void onStartWithNative() { |
- super.onStartWithNative(); |
- if (mCleanupTask.getStatus() == AsyncTask.Status.PENDING) mCleanupTask.execute(); |
- } |
- |
- @Override |
- public void onStopWithNative() { |
- super.onStopWithNative(); |
- mCleanupTask.cancel(true); |
- if (getActivityTab() != null) getActivityTab().saveState(getActivityDirectory()); |
- if (getFullscreenManager() != null) { |
- getFullscreenManager().setPersistentFullscreenMode(false); |
- } |
- } |
- |
- @Override |
- public void onResume() { |
- if (!isFinishing() && getIntent() != null) { |
- // Avoid situations where Android starts two Activities with the same data. |
- DocumentUtils.finishOtherTasksWithData(getIntent().getData(), getTaskId()); |
- } |
- super.onResume(); |
- } |
- @Override |
- protected int getControlContainerLayoutId() { |
- return R.layout.webapp_control_container; |
- } |
- |
- @Override |
- public void postInflationStartup() { |
- super.postInflationStartup(); |
- WebappControlContainer controlContainer = |
- (WebappControlContainer) findViewById(R.id.control_container); |
- mUrlBar = (WebappUrlBar) controlContainer.findViewById(R.id.webapp_url_bar); |
- } |
- |
- /** |
- * @return Structure containing data about the webapp currently displayed. |
- */ |
- WebappInfo getWebappInfo() { |
- return mWebappInfo; |
- } |
- |
- private void updateUrlBar() { |
- Tab tab = getActivityTab(); |
- if (tab == null || mUrlBar == null) return; |
- mUrlBar.update(tab.getUrl(), tab.getSecurityLevel()); |
- } |
- |
- private WebContentsObserver createWebContentsObserver() { |
- // TODO: Move to TabObserver eventually. |
- return new WebContentsObserver(getActivityTab().getWebContents()) { |
- @Override |
- public void didNavigateMainFrame(String url, String baseUrl, |
- boolean isNavigationToDifferentPage, boolean isNavigationInPage, |
- int statusCode) { |
- updateUrlBar(); |
- } |
- |
- @Override |
- public void didAttachInterstitialPage() { |
- updateUrlBar(); |
- |
- int state = ApplicationStatus.getStateForActivity(WebappActivity.this); |
- if (state == ActivityState.PAUSED || state == ActivityState.STOPPED |
- || state == ActivityState.DESTROYED) { |
- return; |
- } |
- |
- // Kick the interstitial navigation to Chrome. |
- Intent intent = new Intent( |
- Intent.ACTION_VIEW, Uri.parse(getActivityTab().getUrl())); |
- intent.setPackage(getPackageName()); |
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); |
- startActivity(intent); |
- |
- // Pretend like the navigation never happened. We delay so that this happens while |
- // the Activity is in the background. |
- mHandler.postDelayed(new Runnable() { |
- @Override |
- public void run() { |
- getActivityTab().goBack(); |
- } |
- }, MS_BEFORE_NAVIGATING_BACK_FROM_INTERSTITIAL); |
- } |
- |
- @Override |
- public void didDetachInterstitialPage() { |
- updateUrlBar(); |
- } |
- }; |
- } |
- |
- private boolean isWebappDomain() { |
- return UrlUtilities.sameDomainOrHost( |
- getActivityTab().getUrl(), getWebappInfo().uri().toString(), true); |
- } |
- |
- protected TabObserver createTabObserver() { |
- return new EmptyTabObserver() { |
- @Override |
- public void onSSLStateUpdated(Tab tab) { |
- updateUrlBar(); |
- } |
- |
- @Override |
- public void onDidStartProvisionalLoadForFrame( |
- Tab tab, long frameId, long parentFrameId, boolean isMainFrame, |
- String validatedUrl, boolean isErrorPage, boolean isIframeSrcdoc) { |
- if (isMainFrame) updateUrlBar(); |
- } |
- |
- @Override |
- public void onDidChangeThemeColor(int color) { |
- if (!isWebappDomain()) return; |
- mBrandColor = color; |
- updateTaskDescription(); |
- } |
- |
- @Override |
- public void onTitleUpdated(Tab tab) { |
- if (!isWebappDomain()) return; |
- updateTaskDescription(); |
- } |
- |
- @Override |
- public void onFaviconUpdated(Tab tab) { |
- if (!isWebappDomain()) return; |
- updateTaskDescription(); |
- } |
- }; |
- } |
- |
- private void updateTaskDescription() { |
- String title = mWebappInfo.title() == null |
- ? getActivityTab().getTitle() : mWebappInfo.title(); |
- Bitmap icon = mWebappInfo.icon() == null |
- ? getActivityTab().getFavicon() : mWebappInfo.icon(); |
- int color = mBrandColor == null |
- ? getResources().getColor(R.color.default_primary_color) : mBrandColor; |
- |
- DocumentUtils.updateTaskDescription(this, title, icon, color, mBrandColor == null); |
- } |
- |
- /** |
- * Get the active directory by this web app. |
- * |
- * @return The directory used for the current web app. |
- */ |
- @Override |
- protected File getActivityDirectory() { |
- return WebappDirectoryManager.getWebappDirectory(mWebappInfo.id()); |
- } |
- |
- @VisibleForTesting |
- WebappUrlBar getUrlBarForTests() { |
- return mUrlBar; |
- } |
- |
- @VisibleForTesting |
- boolean isUrlBarVisible() { |
- return findViewById(R.id.control_container).getVisibility() == View.VISIBLE; |
- } |
- |
- @Override |
- protected final ChromeFullscreenManager createFullscreenManager(View controlContainer) { |
- return new ChromeFullscreenManager(this, controlContainer, getTabModelSelector(), |
- getControlContainerHeightResource(), false /* supportsBrowserOverride */); |
- } |
- |
- @Override |
- protected int getControlContainerHeightResource() { |
- return R.dimen.webapp_control_container_height; |
- } |
- |
- // Implements {@link FullScreenActivityTab.TopControlsVisibilityDelegate}. |
- @Override |
- public boolean shouldShowTopControls(String url, int securityLevel) { |
- boolean visible = false; // do not show top controls when URL is not ready yet. |
- if (!TextUtils.isEmpty(url)) { |
- boolean isSameWebsite = |
- UrlUtilities.sameDomainOrHost(mWebappInfo.uri().toString(), url, true); |
- visible = !isSameWebsite || securityLevel == ConnectionSecurityLevel.SECURITY_ERROR |
- || securityLevel == ConnectionSecurityLevel.SECURITY_WARNING; |
- } |
- |
- return visible; |
- } |
- |
- // We're temporarily disable CS on webapp since there are some issues. (http://crbug.com/471950) |
- // TODO(changwan): re-enable it once the issues are resolved. |
- @Override |
- protected boolean isContextualSearchAllowed() { |
- return false; |
- } |
- |
- /** |
- * Launches the URL in its own WebappActivity. |
- * @param context Context to use for launching the webapp. |
- * @param id ID of the webapp. |
- * @param url URL for the webapp. |
- * @param icon Base64 encoded Bitmap representing the webapp. |
- * @param title String to show in Recents. |
- * @param orientation Default orientation for the activity. |
- */ |
- public static void launchInstance(Context context, String id, String url, String icon, |
- String title, int orientation) { |
- String activityName = WebappActivity.class.getName(); |
- if (!FeatureUtilities.isDocumentModeEligible(context)) { |
- // Specifically assign the app to a particular WebappActivity instance. |
- int activityIndex = ActivityAssigner.instance(context).assign(id); |
- activityName += String.valueOf(activityIndex); |
- } |
- |
- // Fire an intent to launch the Webapp in an unmapped Activity. |
- Intent webappIntent = new Intent(); |
- webappIntent.setClassName(context, activityName); |
- webappIntent.putExtra(ShortcutHelper.EXTRA_ICON, icon); |
- webappIntent.putExtra(ShortcutHelper.EXTRA_ID, id); |
- webappIntent.putExtra(ShortcutHelper.EXTRA_URL, url); |
- webappIntent.putExtra(ShortcutHelper.EXTRA_TITLE, title); |
- webappIntent.putExtra(ShortcutHelper.EXTRA_ORIENTATION, orientation); |
- |
- // On L, firing intents with the exact same data should relaunch a particular Activity. |
- webappIntent.setAction(Intent.ACTION_VIEW); |
- webappIntent.setData(Uri.parse(WEBAPP_SCHEME + "://" + id)); |
- webappIntent.setFlags(ApiCompatibilityUtils.getActivityNewDocumentFlag()); |
- |
- context.startActivity(webappIntent); |
- } |
-} |