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

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/infobar/AppBannerInfoBarDelegateAndroid.java

Issue 2259553002: Make AppBannerInfoBar install WebAPK. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Move logic to WebApkInstaller. Created 4 years, 4 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 unified diff | Download patch
OLDNEW
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.infobar; 5 package org.chromium.chrome.browser.infobar;
6 6
7 import android.app.Activity; 7 import android.app.Activity;
8 import android.content.ContentResolver; 8 import android.content.ContentResolver;
9 import android.content.Context; 9 import android.content.Context;
10 import android.content.Intent; 10 import android.content.Intent;
11 import android.content.pm.PackageManager; 11 import android.content.pm.PackageManager;
12 import android.os.Looper; 12 import android.os.Looper;
13 13
14 import org.chromium.base.ApplicationStatus; 14 import org.chromium.base.ApplicationStatus;
15 import org.chromium.base.ContextUtils; 15 import org.chromium.base.ContextUtils;
16 import org.chromium.base.ThreadUtils;
16 import org.chromium.base.VisibleForTesting; 17 import org.chromium.base.VisibleForTesting;
17 import org.chromium.base.annotations.CalledByNative; 18 import org.chromium.base.annotations.CalledByNative;
18 import org.chromium.base.annotations.JNINamespace; 19 import org.chromium.base.annotations.JNINamespace;
20 import org.chromium.chrome.R;
19 import org.chromium.chrome.browser.banners.AppData; 21 import org.chromium.chrome.browser.banners.AppData;
20 import org.chromium.chrome.browser.banners.InstallerDelegate; 22 import org.chromium.chrome.browser.banners.InstallerDelegate;
21 import org.chromium.chrome.browser.tab.Tab; 23 import org.chromium.chrome.browser.tab.Tab;
22 import org.chromium.ui.base.WindowAndroid; 24 import org.chromium.ui.base.WindowAndroid;
25 import org.chromium.ui.widget.Toast;
23 26
24 /** 27 /**
25 * Handles the promotion and installation of an app specified by the current web page. This Java 28 * Handles the promotion and installation of an app specified by the current web page. This Java
26 * object is created by and owned by the native AppBannerInfoBarDelegateAndroid. 29 * object is created by and owned by the native AppBannerInfoBarDelegateAndroid.
27 */ 30 */
28 @JNINamespace("banners") 31 @JNINamespace("banners")
29 public class AppBannerInfoBarDelegateAndroid { 32 public class AppBannerInfoBarDelegateAndroid {
30 /** PackageManager to use in place of the real one. */ 33 /** PackageManager to use in place of the real one. */
31 private static PackageManager sPackageManagerForTests; 34 private static PackageManager sPackageManagerForTests;
32 35
33 /** Weak pointer to the native AppBannerInfoBarDelegateAndroid. */ 36 /** Weak pointer to the native AppBannerInfoBarDelegateAndroid. */
34 private long mNativePointer; 37 private long mNativePointer;
35 38
36 /** Monitors an installation in progress. */ 39 /** Monitors an installation in progress. */
37 private InstallerDelegate mInstallTask; 40 private InstallerDelegate mInstallTask;
38 41
39 /** Monitors for application state changes. */ 42 /** Monitors for application state changes. */
40 private final ApplicationStatus.ApplicationStateListener mListener; 43 private final ApplicationStatus.ApplicationStateListener mListener;
41 44
45 /**
46 * Indicates whether a request to install a WebPK has started. This flag is set before
47 * the package name of the WebAPK is available.
48 */
49 private boolean mIsWebApkInstalling = false;
50
51 /** The package name of the WebAPK. */
52 private String mWebApkPackage;
53
54 /** Indicates whether the banner is for installing a WebAPK. */
55 private boolean mIsWebApk;
56
42 /** Overrides the PackageManager for testing. */ 57 /** Overrides the PackageManager for testing. */
43 @VisibleForTesting 58 @VisibleForTesting
44 public static void setPackageManagerForTesting(PackageManager manager) { 59 public static void setPackageManagerForTesting(PackageManager manager) {
45 sPackageManagerForTests = manager; 60 sPackageManagerForTests = manager;
46 } 61 }
47 62
48 private AppBannerInfoBarDelegateAndroid(long nativePtr) { 63 private AppBannerInfoBarDelegateAndroid(long nativePtr, boolean isWebApk) {
49 mNativePointer = nativePtr; 64 mNativePointer = nativePtr;
50 mListener = createApplicationStateListener(); 65 mListener = createApplicationStateListener();
51 ApplicationStatus.registerApplicationStateListener(mListener); 66 ApplicationStatus.registerApplicationStateListener(mListener);
67 mIsWebApk = isWebApk;
pkotwicz 2016/08/25 22:23:15 We don't seem to use |mIsWebApk| anymore.
Xi Han 2016/08/26 17:04:17 Good catch, removed.
52 } 68 }
53 69
54 private ApplicationStatus.ApplicationStateListener createApplicationStateLis tener() { 70 private ApplicationStatus.ApplicationStateListener createApplicationStateLis tener() {
55 return new ApplicationStatus.ApplicationStateListener() { 71 return new ApplicationStatus.ApplicationStateListener() {
56 @Override 72 @Override
57 public void onApplicationStateChange(int newState) { 73 public void onApplicationStateChange(int newState) {
58 if (!ApplicationStatus.hasVisibleActivities()) return; 74 if (!ApplicationStatus.hasVisibleActivities()) return;
59 nativeUpdateInstallState(mNativePointer); 75 nativeUpdateInstallState(mNativePointer);
60 } 76 }
61 }; 77 };
(...skipping 10 matching lines...) Expand all
72 } 88 }
73 89
74 @CalledByNative 90 @CalledByNative
75 private boolean installOrOpenNativeApp(Tab tab, AppData appData, String refe rrer) { 91 private boolean installOrOpenNativeApp(Tab tab, AppData appData, String refe rrer) {
76 Context context = ContextUtils.getApplicationContext(); 92 Context context = ContextUtils.getApplicationContext();
77 String packageName = appData.packageName(); 93 String packageName = appData.packageName();
78 PackageManager packageManager = getPackageManager(context); 94 PackageManager packageManager = getPackageManager(context);
79 95
80 if (InstallerDelegate.isInstalled(packageManager, packageName)) { 96 if (InstallerDelegate.isInstalled(packageManager, packageName)) {
81 // Open the app. 97 // Open the app.
82 Intent launchIntent = packageManager.getLaunchIntentForPackage(packa geName); 98 return openApp(context, packageName);
83 if (launchIntent == null) return true;
84 context.startActivity(launchIntent);
85 return true;
86 } else { 99 } else {
87 // Try installing the app. If the installation was kicked off, retu rn false to prevent 100 // Try installing the app. If the installation was kicked off, retu rn false to prevent
88 // the infobar from disappearing. 101 // the infobar from disappearing.
89 // The supplied referrer is the URL of the page requesting the nativ e app banner. It 102 // The supplied referrer is the URL of the page requesting the nativ e app banner. It
90 // may be empty depending on that page's referrer policy. If it is n on-empty, attach it 103 // may be empty depending on that page's referrer policy. If it is n on-empty, attach it
91 // to the installation intent as Intent.EXTRA_REFERRER. 104 // to the installation intent as Intent.EXTRA_REFERRER.
92 Intent installIntent = appData.installIntent(); 105 Intent installIntent = appData.installIntent();
93 if (referrer.length() > 0) installIntent.putExtra(Intent.EXTRA_REFER RER, referrer); 106 if (referrer.length() > 0) installIntent.putExtra(Intent.EXTRA_REFER RER, referrer);
94 return !tab.getWindowAndroid().showIntent( 107 return !tab.getWindowAndroid().showIntent(
95 installIntent, createIntentCallback(appData), null); 108 installIntent, createIntentCallback(appData), null);
96 } 109 }
97 } 110 }
98 111
112 private boolean openApp(Context context, String packageName) {
pkotwicz 2016/08/25 22:23:15 This function always returns true. Can it be void
Xi Han 2016/08/26 17:04:17 Done.
113 Intent launchIntent = getPackageManager(context).getLaunchIntentForPacka ge(packageName);
114 if (launchIntent != null) {
dominickn 2016/08/25 04:25:56 Nit: make this a single line if statement.
Xi Han 2016/08/26 17:04:17 Done.
115 context.startActivity(launchIntent);
116 }
117 return true;
118 }
119
99 private WindowAndroid.IntentCallback createIntentCallback(final AppData appD ata) { 120 private WindowAndroid.IntentCallback createIntentCallback(final AppData appD ata) {
100 return new WindowAndroid.IntentCallback() { 121 return new WindowAndroid.IntentCallback() {
101 @Override 122 @Override
102 public void onIntentCompleted(WindowAndroid window, int resultCode, 123 public void onIntentCompleted(WindowAndroid window, int resultCode,
103 ContentResolver contentResolver, Intent data) { 124 ContentResolver contentResolver, Intent data) {
104 boolean isInstalling = resultCode == Activity.RESULT_OK; 125 boolean isInstalling = resultCode == Activity.RESULT_OK;
105 if (isInstalling) { 126 if (isInstalling) {
106 // Start monitoring the install. 127 // Start monitoring the install.
107 PackageManager pm = 128 PackageManager pm =
108 getPackageManager(ContextUtils.getApplicationContext ()); 129 getPackageManager(ContextUtils.getApplicationContext ());
(...skipping 13 matching lines...) Expand all
122 @Override 143 @Override
123 public void onInstallFinished(InstallerDelegate task, boolean succes s) { 144 public void onInstallFinished(InstallerDelegate task, boolean succes s) {
124 if (mInstallTask != task) return; 145 if (mInstallTask != task) return;
125 mInstallTask = null; 146 mInstallTask = null;
126 nativeOnInstallFinished(mNativePointer, success); 147 nativeOnInstallFinished(mNativePointer, success);
127 } 148 }
128 }; 149 };
129 } 150 }
130 151
131 @CalledByNative 152 @CalledByNative
153 private boolean openWebApk(String packageName) {
154 Context context = ContextUtils.getApplicationContext();
155 PackageManager packageManager = getPackageManager(context);
156
157 if (InstallerDelegate.isInstalled(packageManager, packageName)) {
158 // Open the WebApk.
dominickn 2016/08/25 04:25:56 Nit: remove this redundant comment
Xi Han 2016/08/26 17:04:17 Done.
159 mWebApkPackage = null;
160 return openApp(context, packageName);
161 }
162 return true;
163 }
164
165 @CalledByNative
132 private void showAppDetails(Tab tab, AppData appData) { 166 private void showAppDetails(Tab tab, AppData appData) {
133 tab.getWindowAndroid().showIntent(appData.detailsIntent(), null, null); 167 tab.getWindowAndroid().showIntent(appData.detailsIntent(), null, null);
134 } 168 }
135 169
136 @CalledByNative 170 @CalledByNative
137 private int determineInstallState(AppData data) { 171 private int determineInstallState(AppData data) {
138 if (mInstallTask != null) return AppBannerInfoBarAndroid.INSTALL_STATE_I NSTALLING; 172 if (mInstallTask != null || mIsWebApkInstalling) {
173 return AppBannerInfoBarAndroid.INSTALL_STATE_INSTALLING;
174 }
139 175
140 PackageManager pm = getPackageManager(ContextUtils.getApplicationContext ()); 176 PackageManager pm = getPackageManager(ContextUtils.getApplicationContext ());
141 boolean isInstalled = InstallerDelegate.isInstalled(pm, data.packageName ()); 177 String packageName = data != null ? data.packageName() : mWebApkPackage;
dominickn 2016/08/25 04:25:56 Nit: brackets around the conditional
Xi Han 2016/08/26 17:04:17 Done.
178 boolean isInstalled = InstallerDelegate.isInstalled(pm, packageName);
142 return isInstalled ? AppBannerInfoBarAndroid.INSTALL_STATE_INSTALLED 179 return isInstalled ? AppBannerInfoBarAndroid.INSTALL_STATE_INSTALLED
143 : AppBannerInfoBarAndroid.INSTALL_STATE_NOT_INSTALLED; 180 : AppBannerInfoBarAndroid.INSTALL_STATE_NOT_INSTALLED;
181 }
182
183 @CalledByNative
184 /** Set the flag of whether a installation process is started for the WebAPK . */
185 private void setWebApkInstallingState(boolean isInstalling) {
186 mIsWebApkInstalling = isInstalling;
187 }
188
189 @CalledByNative
190 /** Sets the WebAPK package name. */
191 private void setWebApkPackageName(String webApkPackage) {
192 mWebApkPackage = webApkPackage;
193 }
194
195 @CalledByNative
196 private static void showWebApkInstallFailureToast() {
197 ThreadUtils.runOnUiThread(new Runnable() {
198 @Override
199 public void run() {
200 Context applicationContext = ContextUtils.getApplicationContext( );
201 Toast toast = Toast.makeText(applicationContext, R.string.fail_t o_install_webapk,
202 Toast.LENGTH_SHORT);
203 toast.show();
204 }
205 });
144 } 206 }
145 207
146 private PackageManager getPackageManager(Context context) { 208 private PackageManager getPackageManager(Context context) {
147 if (sPackageManagerForTests != null) return sPackageManagerForTests; 209 if (sPackageManagerForTests != null) return sPackageManagerForTests;
148 return context.getPackageManager(); 210 return context.getPackageManager();
149 } 211 }
150 212
151 @CalledByNative 213 @CalledByNative
152 private static AppBannerInfoBarDelegateAndroid create(long nativePtr) { 214 private static AppBannerInfoBarDelegateAndroid create(long nativePtr, boolea n isWebApk) {
153 return new AppBannerInfoBarDelegateAndroid(nativePtr); 215 return new AppBannerInfoBarDelegateAndroid(nativePtr, isWebApk);
154 } 216 }
155 217
156 private native void nativeOnInstallIntentReturned( 218 private native void nativeOnInstallIntentReturned(
157 long nativeAppBannerInfoBarDelegateAndroid, boolean isInstalling); 219 long nativeAppBannerInfoBarDelegateAndroid, boolean isInstalling);
158 private native void nativeOnInstallFinished( 220 private native void nativeOnInstallFinished(
159 long nativeAppBannerInfoBarDelegateAndroid, boolean success); 221 long nativeAppBannerInfoBarDelegateAndroid, boolean success);
160 private native void nativeUpdateInstallState(long nativeAppBannerInfoBarDele gateAndroid); 222 private native void nativeUpdateInstallState(long nativeAppBannerInfoBarDele gateAndroid);
161 } 223 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698