Commit 50c0d8d3 authored by Yaron Friedman's avatar Yaron Friedman Committed by Commit Bot

Simplify Native App install banners.

As part of abuse mitigation, we'll no longer perform inline app
installs overlaid on top of chrome.

This change simplifies the app banner machinery greatly as we're now
just intenting out to Play and no longer need support for dynamism in
the UI.

BUG=904566

Change-Id: I1ca74b1d8602f5e1911c1e75ec62e5a81e776beb
Reviewed-on: https://chromium-review.googlesource.com/c/1338337
Commit-Queue: Yaron Friedman <yfriedman@chromium.org>
Reviewed-by: default avatarDominick Ng <dominickn@chromium.org>
Cr-Commit-Position: refs/heads/master@{#609729}
parent 94d37b86
...@@ -31,6 +31,22 @@ public class PackageUtils { ...@@ -31,6 +31,22 @@ public class PackageUtils {
return versionCode; return versionCode;
} }
/**
* Checks if the app has been installed on the system.
* @return true if the PackageManager reports that the app is installed, false otherwise.
* @param context Any context.
* @param packageName Name of the package to check.
*/
public static boolean isPackageInstalled(Context context, String packageName) {
PackageManager pm = context.getPackageManager();
try {
pm.getPackageInfo(packageName, 0);
} catch (PackageManager.NameNotFoundException e) {
return false;
}
return true;
}
private PackageUtils() { private PackageUtils() {
// Hide constructor // Hide constructor
} }
......
...@@ -4,11 +4,15 @@ ...@@ -4,11 +4,15 @@
package org.chromium.chrome.browser.banners; package org.chromium.chrome.browser.banners;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.os.Looper;
import org.chromium.base.ContextUtils;
import org.chromium.base.Log;
import org.chromium.base.PackageUtils;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNIAdditionalImport;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.webapps.AddToHomescreenDialog; import org.chromium.chrome.browser.webapps.AddToHomescreenDialog;
...@@ -18,15 +22,12 @@ import org.chromium.chrome.browser.webapps.AddToHomescreenDialog; ...@@ -18,15 +22,12 @@ import org.chromium.chrome.browser.webapps.AddToHomescreenDialog;
* is created by and owned by the native AppBannerUiDelegate. * is created by and owned by the native AppBannerUiDelegate.
*/ */
@JNINamespace("banners") @JNINamespace("banners")
@JNIAdditionalImport(InstallerDelegate.class) public class AppBannerUiDelegateAndroid implements AddToHomescreenDialog.Delegate {
public class AppBannerUiDelegateAndroid private static final String TAG = "AppBannerUi";
implements AddToHomescreenDialog.Delegate, InstallerDelegate.Observer {
/** Pointer to the native AppBannerUiDelegateAndroid. */ /** Pointer to the native AppBannerUiDelegateAndroid. */
private long mNativePointer; private long mNativePointer;
/** Delegate which does the actual monitoring of an in-progress installation. */
private InstallerDelegate mInstallerDelegate;
private Tab mTab; private Tab mTab;
private AddToHomescreenDialog mDialog; private AddToHomescreenDialog mDialog;
...@@ -61,31 +62,9 @@ public class AppBannerUiDelegateAndroid ...@@ -61,31 +62,9 @@ public class AppBannerUiDelegateAndroid
} }
mDialog = null; mDialog = null;
mInstallerDelegate = null;
mAddedToHomescreen = false; mAddedToHomescreen = false;
} }
@Override
public void onInstallIntentCompleted(InstallerDelegate delegate, boolean isInstalling) {
// Do nothing.
}
@Override
public void onInstallFinished(InstallerDelegate delegate, boolean success) {
// Do nothing.
}
@Override
public void onApplicationStateChanged(InstallerDelegate delegate, int newState) {
// Do nothing.
}
/** Creates the installer delegate with the specified observer. */
@CalledByNative
public void createInstallerDelegate(InstallerDelegate.Observer observer) {
mInstallerDelegate = new InstallerDelegate(Looper.getMainLooper(), observer);
}
@CalledByNative @CalledByNative
private AddToHomescreenDialog getDialogForTesting() { private AddToHomescreenDialog getDialogForTesting() {
return mDialog; return mDialog;
...@@ -93,17 +72,29 @@ public class AppBannerUiDelegateAndroid ...@@ -93,17 +72,29 @@ public class AppBannerUiDelegateAndroid
@CalledByNative @CalledByNative
private void destroy() { private void destroy() {
if (mInstallerDelegate != null) {
mInstallerDelegate.destroy();
}
mInstallerDelegate = null;
mNativePointer = 0; mNativePointer = 0;
mAddedToHomescreen = false; mAddedToHomescreen = false;
} }
@CalledByNative @CalledByNative
private boolean installOrOpenNativeApp(AppData appData, String referrer) { private boolean installOrOpenNativeApp(AppData appData) {
return mInstallerDelegate.installOrOpenNativeApp(mTab, appData, referrer); Context context = ContextUtils.getApplicationContext();
Intent launchIntent;
if (PackageUtils.isPackageInstalled(context, appData.packageName())) {
launchIntent =
context.getPackageManager().getLaunchIntentForPackage(appData.packageName());
} else {
launchIntent = appData.installIntent();
}
if (launchIntent != null && mTab.getActivity() != null) {
try {
mTab.getActivity().startActivity(launchIntent);
} catch (ActivityNotFoundException e) {
Log.e(TAG, "Failed to install or open app : %s!", appData.packageName(), e);
return false;
}
}
return true;
} }
@CalledByNative @CalledByNative
...@@ -113,7 +104,6 @@ public class AppBannerUiDelegateAndroid ...@@ -113,7 +104,6 @@ public class AppBannerUiDelegateAndroid
@CalledByNative @CalledByNative
private boolean showNativeAppDialog(String title, Bitmap iconBitmap, AppData appData) { private boolean showNativeAppDialog(String title, Bitmap iconBitmap, AppData appData) {
createInstallerDelegate(this);
mDialog = new AddToHomescreenDialog(mTab.getActivity(), this); mDialog = new AddToHomescreenDialog(mTab.getActivity(), this);
mDialog.show(); mDialog.show();
mDialog.onUserTitleAvailable(title, appData.installButtonText(), appData.rating()); mDialog.onUserTitleAvailable(title, appData.installButtonText(), appData.rating());
...@@ -130,11 +120,6 @@ public class AppBannerUiDelegateAndroid ...@@ -130,11 +120,6 @@ public class AppBannerUiDelegateAndroid
return true; return true;
} }
@CalledByNative
private int determineInstallState(String packageName) {
return mInstallerDelegate.determineInstallState(packageName);
}
@CalledByNative @CalledByNative
private static AppBannerUiDelegateAndroid create(long nativePtr, Tab tab) { private static AppBannerUiDelegateAndroid create(long nativePtr, Tab tab) {
return new AppBannerUiDelegateAndroid(nativePtr, tab); return new AppBannerUiDelegateAndroid(nativePtr, tab);
......
...@@ -13,11 +13,11 @@ import android.widget.Button; ...@@ -13,11 +13,11 @@ import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
import org.chromium.base.PackageUtils;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.banners.AppBannerManager; import org.chromium.chrome.browser.banners.AppBannerManager;
import org.chromium.chrome.browser.banners.AppData; import org.chromium.chrome.browser.banners.AppData;
import org.chromium.chrome.browser.banners.InstallerDelegate;
import org.chromium.chrome.browser.widget.DualControlLayout; import org.chromium.chrome.browser.widget.DualControlLayout;
/** /**
...@@ -34,7 +34,6 @@ public class AppBannerInfoBarAndroid extends ConfirmInfoBar implements View.OnCl ...@@ -34,7 +34,6 @@ public class AppBannerInfoBarAndroid extends ConfirmInfoBar implements View.OnCl
// Data for native app installs. // Data for native app installs.
private final AppData mAppData; private final AppData mAppData;
private @InstallerDelegate.InstallState int mInstallState;
// Data for web app installs. // Data for web app installs.
private final String mAppUrl; private final String mAppUrl;
...@@ -45,7 +44,6 @@ public class AppBannerInfoBarAndroid extends ConfirmInfoBar implements View.OnCl ...@@ -45,7 +44,6 @@ public class AppBannerInfoBarAndroid extends ConfirmInfoBar implements View.OnCl
mAppTitle = appTitle; mAppTitle = appTitle;
mAppData = data; mAppData = data;
mAppUrl = null; mAppUrl = null;
mInstallState = InstallerDelegate.InstallState.NOT_INSTALLED;
} }
// Banner for web apps. // Banner for web apps.
...@@ -54,7 +52,6 @@ public class AppBannerInfoBarAndroid extends ConfirmInfoBar implements View.OnCl ...@@ -54,7 +52,6 @@ public class AppBannerInfoBarAndroid extends ConfirmInfoBar implements View.OnCl
mAppTitle = appTitle; mAppTitle = appTitle;
mAppData = null; mAppData = null;
mAppUrl = url; mAppUrl = url;
mInstallState = InstallerDelegate.InstallState.NOT_INSTALLED;
} }
@Override @Override
...@@ -115,45 +112,23 @@ public class AppBannerInfoBarAndroid extends ConfirmInfoBar implements View.OnCl ...@@ -115,45 +112,23 @@ public class AppBannerInfoBarAndroid extends ConfirmInfoBar implements View.OnCl
} }
} }
@Override
public void onButtonClicked(boolean isPrimaryButton) {
if (isPrimaryButton && mInstallState == InstallerDelegate.InstallState.INSTALLING) {
setControlsEnabled(true);
updateButton();
return;
}
super.onButtonClicked(isPrimaryButton);
}
@CalledByNative
public void onInstallStateChanged(int newState) {
setControlsEnabled(true);
mInstallState = newState;
updateButton();
}
private void updateButton() { private void updateButton() {
if (mButton == null || mAppData == null) return; if (mButton == null || mAppData == null) return;
String text; String text;
String accessibilityText = null; String accessibilityText = null;
boolean enabled = true;
Context context = getContext(); Context context = getContext();
if (mInstallState == InstallerDelegate.InstallState.NOT_INSTALLED) { if (PackageUtils.isPackageInstalled(context, mAppData.packageName())) {
text = context.getString(R.string.app_banner_open);
} else {
text = mAppData.installButtonText(); text = mAppData.installButtonText();
accessibilityText = context.getString( accessibilityText = context.getString(
R.string.app_banner_view_native_app_install_accessibility, text); R.string.app_banner_view_native_app_install_accessibility, text);
} else if (mInstallState == InstallerDelegate.InstallState.INSTALLING) {
text = context.getString(R.string.app_banner_installing);
mButton.announceForAccessibility(text);
enabled = false;
} else {
text = context.getString(R.string.app_banner_open);
} }
mButton.setText(text); mButton.setText(text);
mButton.setContentDescription(accessibilityText); mButton.setContentDescription(accessibilityText);
mButton.setEnabled(enabled); mButton.setEnabled(true);
} }
@Override @Override
......
// 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.infobar;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.chrome.browser.banners.InstallerDelegate;
/**
* Handles the promotion and installation of an app specified by the current web page. This object
* is created by and owned by the native AppBannerInfoBarDelegateAndroid.
*/
@JNINamespace("banners")
public class AppBannerInfoBarDelegateAndroid implements InstallerDelegate.Observer {
/** Pointer to the native AppBannerInfoBarDelegateAndroid. */
private long mNativePointer;
private AppBannerInfoBarDelegateAndroid(long nativePtr) {
mNativePointer = nativePtr;
}
@Override
public void onInstallIntentCompleted(InstallerDelegate delegate, boolean isInstalling) {
if (mNativePointer != 0) nativeOnInstallIntentReturned(mNativePointer, isInstalling);
}
@Override
public void onInstallFinished(InstallerDelegate delegate, boolean success) {
if (mNativePointer != 0) nativeOnInstallFinished(mNativePointer, success);
}
@Override
public void onApplicationStateChanged(InstallerDelegate delegate, int newState) {
if (mNativePointer != 0) nativeUpdateInstallState(mNativePointer);
}
@CalledByNative
private void destroy() {
mNativePointer = 0;
}
@CalledByNative
private static AppBannerInfoBarDelegateAndroid create(long nativePtr) {
return new AppBannerInfoBarDelegateAndroid(nativePtr);
}
private native void nativeOnInstallIntentReturned(
long nativeAppBannerInfoBarDelegateAndroid, boolean isInstalling);
private native void nativeOnInstallFinished(
long nativeAppBannerInfoBarDelegateAndroid, boolean success);
private native void nativeUpdateInstallState(long nativeAppBannerInfoBarDelegateAndroid);
}
...@@ -4,15 +4,14 @@ ...@@ -4,15 +4,14 @@
package org.chromium.chrome.browser.webapps; package org.chromium.chrome.browser.webapps;
import android.content.pm.PackageManager;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
import org.chromium.base.PackageUtils;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.task.AsyncTask; import org.chromium.base.task.AsyncTask;
import org.chromium.chrome.browser.AppHooks; import org.chromium.chrome.browser.AppHooks;
import org.chromium.chrome.browser.banners.InstallerDelegate;
import org.chromium.chrome.browser.metrics.WebApkUma; import org.chromium.chrome.browser.metrics.WebApkUma;
import org.chromium.webapk.lib.common.WebApkConstants; import org.chromium.webapk.lib.common.WebApkConstants;
...@@ -149,8 +148,7 @@ public class WebApkInstaller { ...@@ -149,8 +148,7 @@ public class WebApkInstaller {
} }
private boolean isWebApkInstalled(String packageName) { private boolean isWebApkInstalled(String packageName) {
PackageManager packageManager = ContextUtils.getApplicationContext().getPackageManager(); return PackageUtils.isPackageInstalled(ContextUtils.getApplicationContext(), packageName);
return InstallerDelegate.isInstalled(packageManager, packageName);
} }
private native void nativeOnInstallFinished( private native void nativeOnInstallFinished(
......
...@@ -6,14 +6,13 @@ package org.chromium.chrome.browser.webapps; ...@@ -6,14 +6,13 @@ package org.chromium.chrome.browser.webapps;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.text.TextUtils; import android.text.TextUtils;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
import org.chromium.base.PackageUtils;
import org.chromium.base.VisibleForTesting; import org.chromium.base.VisibleForTesting;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.task.AsyncTask; import org.chromium.base.task.AsyncTask;
import org.chromium.chrome.browser.banners.InstallerDelegate;
import org.chromium.chrome.browser.browsing_data.UrlFilter; import org.chromium.chrome.browser.browsing_data.UrlFilter;
import org.chromium.chrome.browser.browsing_data.UrlFilterBridge; import org.chromium.chrome.browser.browsing_data.UrlFilterBridge;
import org.chromium.webapk.lib.common.WebApkConstants; import org.chromium.webapk.lib.common.WebApkConstants;
...@@ -178,12 +177,11 @@ public class WebappRegistry { ...@@ -178,12 +177,11 @@ public class WebappRegistry {
* */ * */
public List<String> findWebApksWithPendingUpdate() { public List<String> findWebApksWithPendingUpdate() {
ArrayList<String> webApkIdsWithPendingUpdate = new ArrayList<String>(); ArrayList<String> webApkIdsWithPendingUpdate = new ArrayList<String>();
PackageManager packageManager = ContextUtils.getApplicationContext().getPackageManager();
for (HashMap.Entry<String, WebappDataStorage> entry : mStorages.entrySet()) { for (HashMap.Entry<String, WebappDataStorage> entry : mStorages.entrySet()) {
WebappDataStorage storage = entry.getValue(); WebappDataStorage storage = entry.getValue();
if (!TextUtils.isEmpty(storage.getPendingUpdateRequestPath()) if (!TextUtils.isEmpty(storage.getPendingUpdateRequestPath())
&& InstallerDelegate.isInstalled( && PackageUtils.isPackageInstalled(ContextUtils.getApplicationContext(),
packageManager, storage.getWebApkPackageName())) { storage.getWebApkPackageName())) {
webApkIdsWithPendingUpdate.add(entry.getKey()); webApkIdsWithPendingUpdate.add(entry.getKey());
} }
} }
...@@ -233,7 +231,8 @@ public class WebappRegistry { ...@@ -233,7 +231,8 @@ public class WebappRegistry {
// deprecated naming scheme and that the WebApk is still installed. The former is // deprecated naming scheme and that the WebApk is still installed. The former is
// necessary as we migrate away from the old naming scheme and garbage collect. // necessary as we migrate away from the old naming scheme and garbage collect.
if (entry.getKey().startsWith(WebApkConstants.WEBAPK_ID_PREFIX) if (entry.getKey().startsWith(WebApkConstants.WEBAPK_ID_PREFIX)
&& isWebApkInstalled(webApkPackage)) { && PackageUtils.isPackageInstalled(
ContextUtils.getApplicationContext(), webApkPackage)) {
continue; continue;
} }
} else if ((currentTime - storage.getLastUsedTimeMs()) } else if ((currentTime - storage.getLastUsedTimeMs())
...@@ -300,14 +299,6 @@ public class WebappRegistry { ...@@ -300,14 +299,6 @@ public class WebappRegistry {
urlFilter.destroy(); urlFilter.destroy();
} }
/**
* Returns true if the given WebAPK is installed.
*/
private boolean isWebApkInstalled(String webApkPackage) {
PackageManager packageManager = ContextUtils.getApplicationContext().getPackageManager();
return InstallerDelegate.isInstalled(packageManager, webApkPackage);
}
private static SharedPreferences openSharedPreferences() { private static SharedPreferences openSharedPreferences() {
return ContextUtils.getApplicationContext().getSharedPreferences( return ContextUtils.getApplicationContext().getSharedPreferences(
REGISTRY_FILE_NAME, Context.MODE_PRIVATE); REGISTRY_FILE_NAME, Context.MODE_PRIVATE);
......
...@@ -2177,9 +2177,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p ...@@ -2177,9 +2177,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
</message> </message>
<!-- App banner strings --> <!-- App banner strings -->
<message name="IDS_APP_BANNER_INSTALLING" desc="Button text indicating that an application is being installed. [CHAR-LIMIT=25]">
Installing…
</message>
<message name="IDS_APP_BANNER_OPEN" desc="Text that indicates that clicking on the button will launch an application. [CHAR-LIMIT=25]"> <message name="IDS_APP_BANNER_OPEN" desc="Text that indicates that clicking on the button will launch an application. [CHAR-LIMIT=25]">
Open Open
</message> </message>
......
...@@ -144,7 +144,6 @@ chrome_java_sources = [ ...@@ -144,7 +144,6 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/banners/AppBannerUiDelegateAndroid.java", "java/src/org/chromium/chrome/browser/banners/AppBannerUiDelegateAndroid.java",
"java/src/org/chromium/chrome/browser/banners/AppData.java", "java/src/org/chromium/chrome/browser/banners/AppData.java",
"java/src/org/chromium/chrome/browser/banners/AppDetailsDelegate.java", "java/src/org/chromium/chrome/browser/banners/AppDetailsDelegate.java",
"java/src/org/chromium/chrome/browser/banners/InstallerDelegate.java",
"java/src/org/chromium/chrome/browser/banners/SwipableOverlayView.java", "java/src/org/chromium/chrome/browser/banners/SwipableOverlayView.java",
"java/src/org/chromium/chrome/browser/browsing_data/UrlFilter.java", "java/src/org/chromium/chrome/browser/browsing_data/UrlFilter.java",
"java/src/org/chromium/chrome/browser/browsing_data/UrlFilterBridge.java", "java/src/org/chromium/chrome/browser/browsing_data/UrlFilterBridge.java",
...@@ -738,7 +737,6 @@ chrome_java_sources = [ ...@@ -738,7 +737,6 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/incognito/IncognitoTabSnapshotController.java", "java/src/org/chromium/chrome/browser/incognito/IncognitoTabSnapshotController.java",
"java/src/org/chromium/chrome/browser/incognito/IncognitoUtils.java", "java/src/org/chromium/chrome/browser/incognito/IncognitoUtils.java",
"java/src/org/chromium/chrome/browser/infobar/AppBannerInfoBarAndroid.java", "java/src/org/chromium/chrome/browser/infobar/AppBannerInfoBarAndroid.java",
"java/src/org/chromium/chrome/browser/infobar/AppBannerInfoBarDelegateAndroid.java",
"java/src/org/chromium/chrome/browser/infobar/AutofillCreditCardFillingInfoBar.java", "java/src/org/chromium/chrome/browser/infobar/AutofillCreditCardFillingInfoBar.java",
"java/src/org/chromium/chrome/browser/infobar/AutofillSaveCardInfoBar.java", "java/src/org/chromium/chrome/browser/infobar/AutofillSaveCardInfoBar.java",
"java/src/org/chromium/chrome/browser/infobar/CardDetail.java", "java/src/org/chromium/chrome/browser/infobar/CardDetail.java",
...@@ -1863,7 +1861,6 @@ chrome_test_java_sources = [ ...@@ -1863,7 +1861,6 @@ chrome_test_java_sources = [
"javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessoryIntegrationTest.java", "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessoryIntegrationTest.java",
"javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessorySheetViewTest.java", "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessorySheetViewTest.java",
"javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java", "javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java",
"javatests/src/org/chromium/chrome/browser/banners/InstallerDelegateTest.java",
"javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkBridgeTest.java", "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkBridgeTest.java",
"javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkModelTest.java", "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkModelTest.java",
"javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoTest.java", "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoTest.java",
......
...@@ -11,7 +11,6 @@ import android.app.Instrumentation.ActivityResult; ...@@ -11,7 +11,6 @@ import android.app.Instrumentation.ActivityResult;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.support.test.InstrumentationRegistry; import android.support.test.InstrumentationRegistry;
...@@ -29,9 +28,7 @@ import org.junit.Before; ...@@ -29,9 +28,7 @@ import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.ArgumentMatchers;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule; import org.mockito.junit.MockitoRule;
import org.mockito.quality.Strictness; import org.mockito.quality.Strictness;
...@@ -190,7 +187,6 @@ public class AppBannerManagerTest { ...@@ -190,7 +187,6 @@ public class AppBannerManagerTest {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
AppBannerManager.setIsSupported(true); AppBannerManager.setIsSupported(true);
InstallerDelegate.setPackageManagerForTesting(mPackageManager);
ShortcutHelper.setDelegateForTests(new ShortcutHelper.Delegate() { ShortcutHelper.setDelegateForTests(new ShortcutHelper.Delegate() {
@Override @Override
public void addShortcutToHomescreen(String title, Bitmap icon, Intent shortcutIntent) { public void addShortcutToHomescreen(String title, Bitmap icon, Intent shortcutIntent) {
...@@ -280,11 +276,6 @@ public class AppBannerManagerTest { ...@@ -280,11 +276,6 @@ public class AppBannerManagerTest {
private void runFullNativeInstallPathway( private void runFullNativeInstallPathway(
String url, String expectedReferrer, String expectedTitle) throws Exception { String url, String expectedReferrer, String expectedTitle) throws Exception {
// Say that the package isn't installed.
Mockito.when(mPackageManager.getPackageInfo(
ArgumentMatchers.anyString(), ArgumentMatchers.anyInt()))
.thenThrow(new PackageManager.NameNotFoundException());
// Visit a site that requests a banner. // Visit a site that requests a banner.
Tab tab = mTabbedActivityTestRule.getActivity().getActivityTab(); Tab tab = mTabbedActivityTestRule.getActivity().getActivityTab();
resetEngagementForUrl(url, 0); resetEngagementForUrl(url, 0);
...@@ -314,39 +305,10 @@ public class AppBannerManagerTest { ...@@ -314,39 +305,10 @@ public class AppBannerManagerTest {
InstrumentationRegistry.getInstrumentation().addMonitor(activityMonitor); InstrumentationRegistry.getInstrumentation().addMonitor(activityMonitor);
TouchCommon.singleClickView(button); TouchCommon.singleClickView(button);
// Wait for the infobar to register that the app is installing.
final String installingText = InstrumentationRegistry.getTargetContext().getString(
R.string.app_banner_installing);
CriteriaHelper.pollInstrumentationThread(new Criteria() {
@Override
public boolean isSatisfied() {
return InstrumentationRegistry.getInstrumentation().checkMonitorHit(
activityMonitor, 1)
&& TextUtils.equals(button.getText(), installingText);
}
});
// If we expect an update of the page title via JavaScript, wait until the change happens. // If we expect an update of the page title via JavaScript, wait until the change happens.
if (expectedTitle != null) { if (expectedTitle != null) {
new TabTitleObserver(tab, expectedTitle).waitForTitleUpdate(3); new TabTitleObserver(tab, expectedTitle).waitForTitleUpdate(3);
} }
// Say that the package is installed. Infobar should say that the app is ready to open.
Mockito.reset(mPackageManager);
PackageInfo info = new PackageInfo();
info.packageName = NATIVE_APP_PACKAGE;
Mockito.when(mPackageManager.getPackageInfo(
ArgumentMatchers.anyString(), ArgumentMatchers.anyInt()))
.thenReturn(info);
final String openText =
InstrumentationRegistry.getTargetContext().getString(R.string.app_banner_open);
CriteriaHelper.pollInstrumentationThread(new Criteria() {
@Override
public boolean isSatisfied() {
return TextUtils.equals(button.getText(), openText);
}
});
} }
private void triggerWebAppBanner(ChromeActivityTestRule<? extends ChromeActivity> rule, private void triggerWebAppBanner(ChromeActivityTestRule<? extends ChromeActivity> rule,
...@@ -561,9 +523,10 @@ public class AppBannerManagerTest { ...@@ -561,9 +523,10 @@ public class AppBannerManagerTest {
"call_stashed_prompt_on_click_verify_appinstalled"), "call_stashed_prompt_on_click_verify_appinstalled"),
NATIVE_APP_BLANK_REFERRER, true); NATIVE_APP_BLANK_REFERRER, true);
// The appinstalled event should fire (and cause the title to change). // The userChoice promise should resolve (and cause the title to change). appinstalled is
new TabTitleObserver(mTabbedActivityTestRule.getActivity().getActivityTab(), // not fired for native apps
"Got appinstalled: listener, attr") new TabTitleObserver(
mTabbedActivityTestRule.getActivity().getActivityTab(), "Got userChoice: accepted")
.waitForTitleUpdate(3); .waitForTitleUpdate(3);
} }
...@@ -731,8 +694,8 @@ public class AppBannerManagerTest { ...@@ -731,8 +694,8 @@ public class AppBannerManagerTest {
public void testFullNativeInstallPathwayFromUrl() throws Exception { public void testFullNativeInstallPathwayFromUrl() throws Exception {
runFullNativeInstallPathway( runFullNativeInstallPathway(
WebappTestPage.getNonServiceWorkerUrlWithManifestAndAction( WebappTestPage.getNonServiceWorkerUrlWithManifestAndAction(
mTestServer, NATIVE_APP_MANIFEST_WITH_URL, "verify_appinstalled"), mTestServer, NATIVE_APP_MANIFEST_WITH_URL, "call_prompt_delayed"),
NATIVE_APP_REFERRER, "Got appinstalled: listener, attr"); NATIVE_APP_REFERRER, "Got userChoice: accepted");
} }
@Test @Test
......
// Copyright 2014 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.banners;
import android.content.pm.PackageInfo;
import android.os.HandlerThread;
import android.support.test.filters.SmallTest;
import android.test.mock.MockPackageManager;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.base.test.BaseJUnit4ClassRunner;
import org.chromium.base.test.util.RetryOnFailure;
import org.chromium.content_public.browser.test.util.Criteria;
import org.chromium.content_public.browser.test.util.CriteriaHelper;
/**
* Tests the InstallerDelegate to make sure that it functions correctly and responds to changes
* in the PackageManager.
*/
@RunWith(BaseJUnit4ClassRunner.class)
public class InstallerDelegateTest implements InstallerDelegate.Observer {
private static final String MOCK_PACKAGE_NAME = "mock.package.name";
/**
* Returns a mocked set of installed packages.
*/
public static class TestPackageManager extends MockPackageManager {
public boolean isInstalled;
@Override
public PackageInfo getPackageInfo(String packageName, int flags)
throws NameNotFoundException {
if (!isInstalled) {
throw new NameNotFoundException();
}
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = MOCK_PACKAGE_NAME;
return packageInfo;
}
}
private TestPackageManager mPackageManager;
private InstallerDelegate mTestDelegate;
private HandlerThread mThread;
// Variables for tracking the result.
private boolean mResultFinished;
private InstallerDelegate mResultDelegate;
private boolean mResultSuccess;
private boolean mInstallStarted;
@Override
public void onInstallIntentCompleted(InstallerDelegate delegate, boolean isInstalling) {
Assert.assertTrue(isInstalling);
}
@Override
public void onInstallFinished(InstallerDelegate delegate, boolean success) {
mResultDelegate = delegate;
mResultSuccess = success;
mResultFinished = true;
Assert.assertTrue(mInstallStarted);
}
@Override
public void onApplicationStateChanged(InstallerDelegate delegate, int newState) {}
@Before
public void setUp() throws Exception {
mPackageManager = new TestPackageManager();
InstallerDelegate.setPackageManagerForTesting(mPackageManager);
// Create a thread for the InstallerDelegate to run on. We need this thread because the
// InstallerDelegate's handler fails to be processed otherwise.
mThread = new HandlerThread("InstallerDelegateTest thread");
mThread.start();
mTestDelegate = new InstallerDelegate(mThread.getLooper(), this);
// Clear out the results from last time.
mResultDelegate = null;
mResultSuccess = false;
mResultFinished = false;
}
@After
public void tearDown() throws Exception {
mThread.quit();
}
private void startMonitoring() {
mTestDelegate.startMonitoring(MOCK_PACKAGE_NAME);
mInstallStarted = true;
}
private void checkResults(boolean expectedResult) {
CriteriaHelper.pollInstrumentationThread(new Criteria() {
@Override
public boolean isSatisfied() {
return !mTestDelegate.isRunning() && mResultFinished;
}
});
Assert.assertEquals(expectedResult, mResultSuccess);
Assert.assertEquals(mTestDelegate, mResultDelegate);
}
/**
* Tests what happens when the InstallerDelegate detects that the package has successfully
* been installed.
*/
@Test
@SmallTest
public void testInstallSuccessful() {
mTestDelegate.setTimingForTests(1, 5000);
startMonitoring();
Assert.assertFalse(mResultSuccess);
Assert.assertNull(mResultDelegate);
Assert.assertFalse(mResultFinished);
mPackageManager.isInstalled = true;
checkResults(true);
}
/**
* Tests what happens when the InstallerDelegate task is canceled.
*/
@Test
@SmallTest
public void testInstallWaitUntilCancel() {
mTestDelegate.setTimingForTests(1, 5000);
startMonitoring();
Assert.assertFalse(mResultSuccess);
Assert.assertNull(mResultDelegate);
Assert.assertFalse(mResultFinished);
mTestDelegate.cancel();
checkResults(false);
}
/**
* Tests what happens when the InstallerDelegate times out.
*/
@Test
@SmallTest
public void testInstallTimeout() {
mTestDelegate.setTimingForTests(1, 50);
startMonitoring();
checkResults(false);
}
/**
* Makes sure that the runnable isn't called until returning from start().
*/
@Test
@SmallTest
@RetryOnFailure
public void testRunnableRaceCondition() {
mPackageManager.isInstalled = true;
mTestDelegate.setTimingForTests(1, 5000);
startMonitoring();
checkResults(true);
}
}
...@@ -4707,7 +4707,6 @@ if (is_android) { ...@@ -4707,7 +4707,6 @@ if (is_android) {
"../android/java/src/org/chromium/chrome/browser/historyreport/HistoryReportJniBridge.java", "../android/java/src/org/chromium/chrome/browser/historyreport/HistoryReportJniBridge.java",
"../android/java/src/org/chromium/chrome/browser/infobar/AdsBlockedInfoBar.java", "../android/java/src/org/chromium/chrome/browser/infobar/AdsBlockedInfoBar.java",
"../android/java/src/org/chromium/chrome/browser/infobar/AppBannerInfoBarAndroid.java", "../android/java/src/org/chromium/chrome/browser/infobar/AppBannerInfoBarAndroid.java",
"../android/java/src/org/chromium/chrome/browser/infobar/AppBannerInfoBarDelegateAndroid.java",
"../android/java/src/org/chromium/chrome/browser/infobar/AutofillCreditCardFillingInfoBar.java", "../android/java/src/org/chromium/chrome/browser/infobar/AutofillCreditCardFillingInfoBar.java",
"../android/java/src/org/chromium/chrome/browser/infobar/AutofillSaveCardInfoBar.java", "../android/java/src/org/chromium/chrome/browser/infobar/AutofillSaveCardInfoBar.java",
"../android/java/src/org/chromium/chrome/browser/infobar/ConfirmInfoBar.java", "../android/java/src/org/chromium/chrome/browser/infobar/ConfirmInfoBar.java",
......
...@@ -6,12 +6,10 @@ ...@@ -6,12 +6,10 @@
#include <utility> #include <utility>
#include "base/android/jni_android.h"
#include "chrome/browser/banners/app_banner_ui_delegate_android.h" #include "chrome/browser/banners/app_banner_ui_delegate_android.h"
#include "chrome/browser/infobars/infobar_service.h" #include "chrome/browser/infobars/infobar_service.h"
#include "chrome/browser/ui/android/infobars/app_banner_infobar_android.h" #include "chrome/browser/ui/android/infobars/app_banner_infobar_android.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "jni/AppBannerInfoBarDelegateAndroid_jni.h"
namespace banners { namespace banners {
...@@ -27,9 +25,6 @@ bool AppBannerInfoBarDelegateAndroid::Create( ...@@ -27,9 +25,6 @@ bool AppBannerInfoBarDelegateAndroid::Create(
AppBannerInfoBarDelegateAndroid::~AppBannerInfoBarDelegateAndroid() { AppBannerInfoBarDelegateAndroid::~AppBannerInfoBarDelegateAndroid() {
ui_delegate_.reset(); ui_delegate_.reset();
Java_AppBannerInfoBarDelegateAndroid_destroy(
base::android::AttachCurrentThread(), java_delegate_);
java_delegate_.Reset();
} }
const AppBannerUiDelegateAndroid* const AppBannerUiDelegateAndroid*
...@@ -37,43 +32,6 @@ AppBannerInfoBarDelegateAndroid::GetUiDelegate() const { ...@@ -37,43 +32,6 @@ AppBannerInfoBarDelegateAndroid::GetUiDelegate() const {
return ui_delegate_.get(); return ui_delegate_.get();
} }
void AppBannerInfoBarDelegateAndroid::UpdateInstallState(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
if (ui_delegate_->GetType() != AppBannerUiDelegateAndroid::AppType::NATIVE)
return;
static_cast<AppBannerInfoBarAndroid*>(infobar())->OnInstallStateChanged(
ui_delegate_->GetInstallState());
}
void AppBannerInfoBarDelegateAndroid::OnInstallIntentReturned(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jboolean jis_installing) {
DCHECK(infobar());
content::WebContents* web_contents =
InfoBarService::WebContentsFromInfoBar(infobar());
if (jis_installing)
ui_delegate_->OnNativeAppInstallStarted(web_contents);
UpdateInstallState(env, obj);
}
void AppBannerInfoBarDelegateAndroid::OnInstallFinished(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jboolean success) {
DCHECK(infobar());
ui_delegate_->OnNativeAppInstallFinished(success);
if (success)
UpdateInstallState(env, obj);
else
infobar()->RemoveSelf();
}
bool AppBannerInfoBarDelegateAndroid::Accept() { bool AppBannerInfoBarDelegateAndroid::Accept() {
return ui_delegate_->InstallApp( return ui_delegate_->InstallApp(
InfoBarService::WebContentsFromInfoBar(infobar())); InfoBarService::WebContentsFromInfoBar(infobar()));
...@@ -88,14 +46,6 @@ base::string16 AppBannerInfoBarDelegateAndroid::GetMessageText() const { ...@@ -88,14 +46,6 @@ base::string16 AppBannerInfoBarDelegateAndroid::GetMessageText() const {
AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid( AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid(
std::unique_ptr<AppBannerUiDelegateAndroid> ui_delegate) std::unique_ptr<AppBannerUiDelegateAndroid> ui_delegate)
: ui_delegate_(std::move(ui_delegate)) { : ui_delegate_(std::move(ui_delegate)) {
CreateJavaDelegate(base::android::AttachCurrentThread());
ui_delegate_->CreateInstallerDelegate(
base::android::ScopedJavaLocalRef<jobject>(java_delegate_));
}
void AppBannerInfoBarDelegateAndroid::CreateJavaDelegate(JNIEnv* env) {
java_delegate_.Reset(Java_AppBannerInfoBarDelegateAndroid_create(
env, reinterpret_cast<intptr_t>(this)));
} }
infobars::InfoBarDelegate::InfoBarIdentifier infobars::InfoBarDelegate::InfoBarIdentifier
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#include <memory> #include <memory>
#include "base/android/scoped_java_ref.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "components/infobars/core/confirm_infobar_delegate.h" #include "components/infobars/core/confirm_infobar_delegate.h"
...@@ -32,21 +31,6 @@ class AppBannerInfoBarDelegateAndroid : public ConfirmInfoBarDelegate { ...@@ -32,21 +31,6 @@ class AppBannerInfoBarDelegateAndroid : public ConfirmInfoBarDelegate {
const AppBannerUiDelegateAndroid* GetUiDelegate() const; const AppBannerUiDelegateAndroid* GetUiDelegate() const;
// Called when the AppBannerInfoBarAndroid's button needs to be updated.
void UpdateInstallState(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
// Called when the native app installation Intent has been handled and focus
// has been returned to Chrome.
void OnInstallIntentReturned(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jboolean jis_installing);
// Called when the native app InstallerDelegate task has finished.
void OnInstallFinished(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jboolean success);
// ConfirmInfoBarDelegate: // ConfirmInfoBarDelegate:
bool Accept() override; bool Accept() override;
base::string16 GetMessageText() const override; base::string16 GetMessageText() const override;
...@@ -55,8 +39,6 @@ class AppBannerInfoBarDelegateAndroid : public ConfirmInfoBarDelegate { ...@@ -55,8 +39,6 @@ class AppBannerInfoBarDelegateAndroid : public ConfirmInfoBarDelegate {
AppBannerInfoBarDelegateAndroid( AppBannerInfoBarDelegateAndroid(
std::unique_ptr<AppBannerUiDelegateAndroid> ui_delegate); std::unique_ptr<AppBannerUiDelegateAndroid> ui_delegate);
void CreateJavaDelegate(JNIEnv* env);
// ConfirmInfoBarDelegate: // ConfirmInfoBarDelegate:
infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override; infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override;
void InfoBarDismissed() override; void InfoBarDismissed() override;
...@@ -64,7 +46,6 @@ class AppBannerInfoBarDelegateAndroid : public ConfirmInfoBarDelegate { ...@@ -64,7 +46,6 @@ class AppBannerInfoBarDelegateAndroid : public ConfirmInfoBarDelegate {
bool LinkClicked(WindowOpenDisposition disposition) override; bool LinkClicked(WindowOpenDisposition disposition) override;
std::unique_ptr<AppBannerUiDelegateAndroid> ui_delegate_; std::unique_ptr<AppBannerUiDelegateAndroid> ui_delegate_;
base::android::ScopedJavaGlobalRef<jobject> java_delegate_;
DISALLOW_COPY_AND_ASSIGN(AppBannerInfoBarDelegateAndroid); DISALLOW_COPY_AND_ASSIGN(AppBannerInfoBarDelegateAndroid);
}; };
......
...@@ -283,7 +283,7 @@ void AppBannerManagerAndroid::ShowBannerUi(WebappInstallSource install_source) { ...@@ -283,7 +283,7 @@ void AppBannerManagerAndroid::ShowBannerUi(WebappInstallSource install_source) {
ui_delegate_ = AppBannerUiDelegateAndroid::Create( ui_delegate_ = AppBannerUiDelegateAndroid::Create(
GetWeakPtr(), native_app_title_, GetWeakPtr(), native_app_title_,
base::android::ScopedJavaLocalRef<jobject>(native_app_data_), base::android::ScopedJavaLocalRef<jobject>(native_app_data_),
primary_icon_, native_app_package_, referrer_); primary_icon_, native_app_package_);
} }
bool banner_shown = false; bool banner_shown = false;
......
...@@ -47,11 +47,10 @@ std::unique_ptr<AppBannerUiDelegateAndroid> AppBannerUiDelegateAndroid::Create( ...@@ -47,11 +47,10 @@ std::unique_ptr<AppBannerUiDelegateAndroid> AppBannerUiDelegateAndroid::Create(
const base::string16& app_title, const base::string16& app_title,
const base::android::ScopedJavaLocalRef<jobject>& native_app_data, const base::android::ScopedJavaLocalRef<jobject>& native_app_data,
const SkBitmap& icon, const SkBitmap& icon,
const std::string& native_app_package_name, const std::string& native_app_package_name) {
const std::string& referrer) {
return std::unique_ptr<AppBannerUiDelegateAndroid>( return std::unique_ptr<AppBannerUiDelegateAndroid>(
new AppBannerUiDelegateAndroid(weak_manager, app_title, native_app_data, new AppBannerUiDelegateAndroid(weak_manager, app_title, native_app_data,
icon, native_app_package_name, referrer)); icon, native_app_package_name));
} }
AppBannerUiDelegateAndroid::~AppBannerUiDelegateAndroid() { AppBannerUiDelegateAndroid::~AppBannerUiDelegateAndroid() {
...@@ -86,14 +85,6 @@ AppBannerUiDelegateAndroid::GetNativeAppData() const { ...@@ -86,14 +85,6 @@ AppBannerUiDelegateAndroid::GetNativeAppData() const {
return base::android::ScopedJavaLocalRef<jobject>(native_app_data_); return base::android::ScopedJavaLocalRef<jobject>(native_app_data_);
} }
int AppBannerUiDelegateAndroid::GetInstallState() const {
JNIEnv* env = base::android::AttachCurrentThread();
base::android::ScopedJavaLocalRef<jstring> jpackage_name(
base::android::ConvertUTF8ToJavaString(env, package_name_));
return Java_AppBannerUiDelegateAndroid_determineInstallState(
env, java_delegate_, jpackage_name);
}
const SkBitmap& AppBannerUiDelegateAndroid::GetPrimaryIcon() const { const SkBitmap& AppBannerUiDelegateAndroid::GetPrimaryIcon() const {
return primary_icon_; return primary_icon_;
} }
...@@ -270,14 +261,12 @@ AppBannerUiDelegateAndroid::AppBannerUiDelegateAndroid( ...@@ -270,14 +261,12 @@ AppBannerUiDelegateAndroid::AppBannerUiDelegateAndroid(
const base::string16& app_title, const base::string16& app_title,
const base::android::ScopedJavaLocalRef<jobject>& native_app_data, const base::android::ScopedJavaLocalRef<jobject>& native_app_data,
const SkBitmap& icon, const SkBitmap& icon,
const std::string& native_app_package_name, const std::string& native_app_package_name)
const std::string& referrer)
: weak_manager_(weak_manager), : weak_manager_(weak_manager),
app_title_(app_title), app_title_(app_title),
native_app_data_(native_app_data), native_app_data_(native_app_data),
primary_icon_(icon), primary_icon_(icon),
package_name_(native_app_package_name), package_name_(native_app_package_name),
referrer_(referrer),
type_(AppType::NATIVE), type_(AppType::NATIVE),
has_user_interaction_(false) { has_user_interaction_(false) {
DCHECK(!native_app_data_.is_null()); DCHECK(!native_app_data_.is_null());
...@@ -285,14 +274,6 @@ AppBannerUiDelegateAndroid::AppBannerUiDelegateAndroid( ...@@ -285,14 +274,6 @@ AppBannerUiDelegateAndroid::AppBannerUiDelegateAndroid(
CreateJavaDelegate(); CreateJavaDelegate();
} }
void AppBannerUiDelegateAndroid::CreateInstallerDelegate(
base::android::ScopedJavaLocalRef<jobject> jobserver) {
DCHECK(!java_delegate_.is_null());
Java_AppBannerUiDelegateAndroid_createInstallerDelegate(
base::android::AttachCurrentThread(), java_delegate_, jobserver);
}
void AppBannerUiDelegateAndroid::CreateJavaDelegate() { void AppBannerUiDelegateAndroid::CreateJavaDelegate() {
TabAndroid* tab = TabAndroid::FromWebContents(weak_manager_->web_contents()); TabAndroid* tab = TabAndroid::FromWebContents(weak_manager_->web_contents());
...@@ -306,11 +287,8 @@ bool AppBannerUiDelegateAndroid::InstallOrOpenNativeApp() { ...@@ -306,11 +287,8 @@ bool AppBannerUiDelegateAndroid::InstallOrOpenNativeApp() {
TrackUserResponse(USER_RESPONSE_NATIVE_APP_ACCEPTED); TrackUserResponse(USER_RESPONSE_NATIVE_APP_ACCEPTED);
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = base::android::AttachCurrentThread();
base::android::ScopedJavaLocalRef<jstring> jreferrer(
base::android::ConvertUTF8ToJavaString(env, referrer_));
bool was_opened = Java_AppBannerUiDelegateAndroid_installOrOpenNativeApp( bool was_opened = Java_AppBannerUiDelegateAndroid_installOrOpenNativeApp(
env, java_delegate_, native_app_data_, jreferrer); env, java_delegate_, native_app_data_);
if (was_opened) if (was_opened)
TrackDismissEvent(DISMISS_EVENT_APP_OPEN); TrackDismissEvent(DISMISS_EVENT_APP_OPEN);
...@@ -351,13 +329,13 @@ void AppBannerUiDelegateAndroid::SendBannerAccepted() { ...@@ -351,13 +329,13 @@ void AppBannerUiDelegateAndroid::SendBannerAccepted() {
weak_manager_->SendBannerAccepted(); weak_manager_->SendBannerAccepted();
// Send the appinstalled event and perform install time logging. Note that // Send the appinstalled event and perform install time logging. Note that
// this is fired *before* the installation actually takes place (which can be // this is only done for webapps as native apps just intent to the Play store.
// a significant amount of time later, especially if using WebAPKs). // Also this event is fired *before* the installation actually takes place
// (which can be a significant amount of time later, especially if using
// WebAPKs).
// TODO(mgiuca): Fire the event *after* the installation is completed. // TODO(mgiuca): Fire the event *after* the installation is completed.
bool is_native = IsForNativeApp(); if (!IsForNativeApp())
weak_manager_->OnInstall(is_native, is_native weak_manager_->OnInstall(/*is_native=*/false, shortcut_info_->display);
? blink::kWebDisplayModeUndefined
: shortcut_info_->display);
} }
} // namespace banners } // namespace banners
...@@ -52,8 +52,7 @@ class AppBannerUiDelegateAndroid { ...@@ -52,8 +52,7 @@ class AppBannerUiDelegateAndroid {
const base::string16& app_title, const base::string16& app_title,
const base::android::ScopedJavaLocalRef<jobject>& native_app_data, const base::android::ScopedJavaLocalRef<jobject>& native_app_data,
const SkBitmap& icon, const SkBitmap& icon,
const std::string& native_app_package_name, const std::string& native_app_package_name);
const std::string& referrer);
~AppBannerUiDelegateAndroid(); ~AppBannerUiDelegateAndroid();
...@@ -61,16 +60,10 @@ class AppBannerUiDelegateAndroid { ...@@ -61,16 +60,10 @@ class AppBannerUiDelegateAndroid {
base::android::ScopedJavaLocalRef<jobject> GetJavaObject(); base::android::ScopedJavaLocalRef<jobject> GetJavaObject();
const base::android::ScopedJavaLocalRef<jobject> GetNativeAppData() const; const base::android::ScopedJavaLocalRef<jobject> GetNativeAppData() const;
int GetInstallState() const;
const SkBitmap& GetPrimaryIcon() const; const SkBitmap& GetPrimaryIcon() const;
AppType GetType() const; AppType GetType() const;
const GURL& GetWebAppUrl() const; const GURL& GetWebAppUrl() const;
// Creates the Java-side InstallerDelegate, passing |jobserver| to receive
// progress updates on the installation of a native app.
void CreateInstallerDelegate(
base::android::ScopedJavaLocalRef<jobject> jobserver);
// Called through the JNI to add the app described by this class to home // Called through the JNI to add the app described by this class to home
// screen. // screen.
void AddToHomescreen(JNIEnv* env, void AddToHomescreen(JNIEnv* env,
...@@ -127,8 +120,7 @@ class AppBannerUiDelegateAndroid { ...@@ -127,8 +120,7 @@ class AppBannerUiDelegateAndroid {
const base::string16& app_title, const base::string16& app_title,
const base::android::ScopedJavaLocalRef<jobject>& native_app_data, const base::android::ScopedJavaLocalRef<jobject>& native_app_data,
const SkBitmap& icon, const SkBitmap& icon,
const std::string& native_app_package_name, const std::string& native_app_package_name);
const std::string& referrer);
bool IsForNativeApp() const { return GetType() == AppType::NATIVE; } bool IsForNativeApp() const { return GetType() == AppType::NATIVE; }
...@@ -154,7 +146,6 @@ class AppBannerUiDelegateAndroid { ...@@ -154,7 +146,6 @@ class AppBannerUiDelegateAndroid {
const SkBitmap badge_icon_; const SkBitmap badge_icon_;
std::string package_name_; std::string package_name_;
std::string referrer_;
AppType type_; AppType type_;
WebappInstallSource install_source_; WebappInstallSource install_source_;
......
...@@ -54,12 +54,6 @@ AppBannerInfoBarAndroid::CreateRenderInfoBar(JNIEnv* env) { ...@@ -54,12 +54,6 @@ AppBannerInfoBarAndroid::CreateRenderInfoBar(JNIEnv* env) {
return infobar; return infobar;
} }
void AppBannerInfoBarAndroid::OnInstallStateChanged(int new_state) {
JNIEnv* env = base::android::AttachCurrentThread();
Java_AppBannerInfoBarAndroid_onInstallStateChanged(env, java_infobar_,
new_state);
}
banners::AppBannerInfoBarDelegateAndroid* banners::AppBannerInfoBarDelegateAndroid*
AppBannerInfoBarAndroid::GetDelegate() { AppBannerInfoBarAndroid::GetDelegate() {
return static_cast<banners::AppBannerInfoBarDelegateAndroid*>(delegate()); return static_cast<banners::AppBannerInfoBarDelegateAndroid*>(delegate());
......
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