| Index: chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java
|
| index 9c0f77544e87e5b82ba3e380ff7833e10d3cd6b0..ea653ce93892e4a0bf37f0c5178fb7f60a99b632 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java
|
| @@ -4,26 +4,14 @@
|
|
|
| package org.chromium.chrome.browser.webapps;
|
|
|
| -import android.content.Context;
|
| -import android.content.Intent;
|
| import android.content.pm.PackageManager;
|
| -import android.net.Uri;
|
| -import android.os.Build;
|
| -import android.os.Looper;
|
|
|
| -import org.chromium.base.ApplicationState;
|
| -import org.chromium.base.ApplicationStatus;
|
| import org.chromium.base.Callback;
|
| -import org.chromium.base.ContentUriUtils;
|
| import org.chromium.base.ContextUtils;
|
| import org.chromium.base.annotations.CalledByNative;
|
| import org.chromium.chrome.browser.AppHooks;
|
| -import org.chromium.chrome.browser.ShortcutHelper;
|
| import org.chromium.chrome.browser.banners.InstallerDelegate;
|
| import org.chromium.chrome.browser.metrics.WebApkUma;
|
| -import org.chromium.chrome.browser.util.IntentUtils;
|
| -
|
| -import java.io.File;
|
|
|
| /**
|
| * Java counterpart to webapk_installer.h
|
| @@ -33,27 +21,15 @@ import java.io.File;
|
| public class WebApkInstaller {
|
| private static final String TAG = "WebApkInstaller";
|
|
|
| - /** The WebAPK's package name. */
|
| - private String mWebApkPackageName;
|
| -
|
| - /** Monitors for application state changes. */
|
| - private ApplicationStatus.ApplicationStateListener mListener;
|
| -
|
| - /** Monitors installation progress. */
|
| - private InstallerDelegate mInstallTask;
|
| -
|
| - /** Whether a homescreen shortcut should be added on success. */
|
| - private boolean mAddHomescreenShortcut;
|
| -
|
| /** Weak pointer to the native WebApkInstaller. */
|
| private long mNativePointer;
|
|
|
| /** Talks to Google Play to install WebAPKs. */
|
| - private GooglePlayWebApkInstallDelegate mGooglePlayWebApkInstallDelegate;
|
| + private final GooglePlayWebApkInstallDelegate mInstallDelegate;
|
|
|
| private WebApkInstaller(long nativePtr) {
|
| mNativePointer = nativePtr;
|
| - mGooglePlayWebApkInstallDelegate = AppHooks.get().getGooglePlayWebApkInstallDelegate();
|
| + mInstallDelegate = AppHooks.get().getGooglePlayWebApkInstallDelegate();
|
| }
|
|
|
| @CalledByNative
|
| @@ -63,42 +39,11 @@ public class WebApkInstaller {
|
|
|
| @CalledByNative
|
| private void destroy() {
|
| - if (mListener != null) {
|
| - ApplicationStatus.unregisterApplicationStateListener(mListener);
|
| - }
|
| - mListener = null;
|
| mNativePointer = 0;
|
| }
|
|
|
| /**
|
| - * Installs WebAPK via "unsigned sources" using APK downloaded to {@link filePath}.
|
| - * @param filePath File to install.
|
| - * @param packageName Package name to install WebAPK at.
|
| - */
|
| - @CalledByNative
|
| - private void installDownloadedWebApkAsync(String filePath, String packageName) {
|
| - mAddHomescreenShortcut = true;
|
| - mWebApkPackageName = packageName;
|
| -
|
| - // Start monitoring the installation.
|
| - PackageManager packageManager = ContextUtils.getApplicationContext().getPackageManager();
|
| - mInstallTask = new InstallerDelegate(Looper.getMainLooper(), packageManager,
|
| - createInstallerDelegateObserver(), mWebApkPackageName);
|
| - mInstallTask.start();
|
| - // Start monitoring the application state changes.
|
| - mListener = createApplicationStateListener();
|
| - ApplicationStatus.registerApplicationStateListener(mListener);
|
| -
|
| - // Notify native only if the intent could not be delivered. If the intent was delivered
|
| - // successfully, notify native once InstallerDelegate has determined whether the install
|
| - // was successful.
|
| - if (!installOrUpdateDownloadedWebApkImpl(filePath)) {
|
| - notify(WebApkInstallResult.FAILURE);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Installs a WebAPK from Google Play and monitors the installation.
|
| + * Installs a WebAPK and monitors the installation.
|
| * @param packageName The package name of the WebAPK to install.
|
| * @param version The version of WebAPK to install.
|
| * @param title The title of the WebAPK to display during installation.
|
| @@ -106,7 +51,7 @@ public class WebApkInstaller {
|
| * @param url The start URL of the WebAPK to install.
|
| */
|
| @CalledByNative
|
| - private void installWebApkFromGooglePlayAsync(
|
| + private void installWebApkAsync(
|
| String packageName, int version, String title, String token, String url) {
|
| // Check whether the WebAPK package is already installed. The WebAPK may have been installed
|
| // by another Chrome version (e.g. Chrome Dev). We have to do this check because the Play
|
| @@ -116,7 +61,7 @@ public class WebApkInstaller {
|
| return;
|
| }
|
|
|
| - if (mGooglePlayWebApkInstallDelegate == null) {
|
| + if (mInstallDelegate == null) {
|
| notify(WebApkInstallResult.FAILURE);
|
| WebApkUma.recordGooglePlayInstallResult(
|
| WebApkUma.GOOGLE_PLAY_INSTALL_FAILED_NO_DELEGATE);
|
| @@ -129,43 +74,17 @@ public class WebApkInstaller {
|
| WebApkInstaller.this.notify(result);
|
| }
|
| };
|
| - mGooglePlayWebApkInstallDelegate.installAsync(
|
| - packageName, version, title, token, url, callback);
|
| + mInstallDelegate.installAsync(packageName, version, title, token, url, callback);
|
| }
|
|
|
| private void notify(@WebApkInstallResult.WebApkInstallResultEnum int result) {
|
| - if (mListener != null) {
|
| - ApplicationStatus.unregisterApplicationStateListener(mListener);
|
| - mListener = null;
|
| - }
|
| - mInstallTask = null;
|
| if (mNativePointer != 0) {
|
| nativeOnInstallFinished(mNativePointer, result);
|
| }
|
| - if (mAddHomescreenShortcut && result == WebApkInstallResult.SUCCESS) {
|
| - ShortcutHelper.addWebApkShortcut(
|
| - ContextUtils.getApplicationContext(), mWebApkPackageName);
|
| - }
|
| }
|
|
|
| /**
|
| - * Updates WebAPK via "unsigned sources" using APK downloaded to {@link filePath}.
|
| - * @param filePath File to update.
|
| - */
|
| - @CalledByNative
|
| - private void updateUsingDownloadedWebApkAsync(String filePath) {
|
| - if (!installOrUpdateDownloadedWebApkImpl(filePath)) {
|
| - notify(WebApkInstallResult.FAILURE);
|
| - return;
|
| - }
|
| -
|
| - // We can't use InstallerDelegate to detect whether updates are successful. If there was no
|
| - // error in delivering the intent, assume that the update will be successful.
|
| - notify(WebApkInstallResult.SUCCESS);
|
| - }
|
| -
|
| - /**
|
| - * Updates a WebAPK using Google Play.
|
| + * Updates a WebAPK installation.
|
| * @param packageName The package name of the WebAPK to install.
|
| * @param version The version of WebAPK to install.
|
| * @param title The title of the WebAPK to display during installation.
|
| @@ -173,9 +92,9 @@ public class WebApkInstaller {
|
| * @param url The start URL of the WebAPK to install.
|
| */
|
| @CalledByNative
|
| - private void updateAsyncFromGooglePlay(
|
| + private void updateAsync(
|
| String packageName, int version, String title, String token, String url) {
|
| - if (mGooglePlayWebApkInstallDelegate == null) {
|
| + if (mInstallDelegate == null) {
|
| notify(WebApkInstallResult.FAILURE);
|
| return;
|
| }
|
| @@ -186,65 +105,7 @@ public class WebApkInstaller {
|
| WebApkInstaller.this.notify(result);
|
| }
|
| };
|
| - mGooglePlayWebApkInstallDelegate.updateAsync(
|
| - packageName, version, title, token, url, callback);
|
| - }
|
| -
|
| - /**
|
| - * Sends intent to Android to show prompt to install or update downloaded WebAPK.
|
| - * @param filePath File to install.
|
| - */
|
| - private boolean installOrUpdateDownloadedWebApkImpl(String filePath) {
|
| - Context context = ContextUtils.getApplicationContext();
|
| - Intent intent;
|
| - File pathToInstall = new File(filePath);
|
| -
|
| - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
|
| - intent = new Intent(Intent.ACTION_VIEW);
|
| - Uri fileUri = Uri.fromFile(pathToInstall);
|
| - intent.setDataAndType(fileUri, "application/vnd.android.package-archive");
|
| - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
| - } else {
|
| - Uri source = ContentUriUtils.getContentUriFromFile(pathToInstall);
|
| - intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
|
| - intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
| - intent.setData(source);
|
| - }
|
| - return IntentUtils.safeStartActivity(context, intent);
|
| - }
|
| -
|
| - private InstallerDelegate.Observer createInstallerDelegateObserver() {
|
| - return new InstallerDelegate.Observer() {
|
| - @Override
|
| - public void onInstallFinished(InstallerDelegate task, boolean success) {
|
| - if (mInstallTask != task) return;
|
| - // TODO(pkotwicz): Return WebApkInstallResult.PROBABLE_FAILURE if the install
|
| - // timed out.
|
| - WebApkInstaller.this.notify(
|
| - success ? WebApkInstallResult.SUCCESS : WebApkInstallResult.FAILURE);
|
| - }
|
| - };
|
| - }
|
| -
|
| - private ApplicationStatus.ApplicationStateListener createApplicationStateListener() {
|
| - return new ApplicationStatus.ApplicationStateListener() {
|
| - @Override
|
| - public void onApplicationStateChange(int newState) {
|
| - if (!ApplicationStatus.hasVisibleActivities()) return;
|
| - /**
|
| - * Currently WebAPKs aren't installed by Play. A user can cancel the installation
|
| - * when the Android native installation dialog shows. The only way to detect the
|
| - * user cancelling the installation is to check whether the WebAPK is installed
|
| - * when Chrome is resumed. The monitoring of application state changes will be
|
| - * removed once WebAPKs are installed by Play.
|
| - */
|
| - if (newState == ApplicationState.HAS_RUNNING_ACTIVITIES
|
| - && !isWebApkInstalled(mWebApkPackageName)) {
|
| - WebApkInstaller.this.notify(WebApkInstallResult.PROBABLE_FAILURE);
|
| - return;
|
| - }
|
| - }
|
| - };
|
| + mInstallDelegate.updateAsync(packageName, version, title, token, url, callback);
|
| }
|
|
|
| private boolean isWebApkInstalled(String packageName) {
|
|
|