Index: chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java |
index c8356b73ffd55880f02a18bf3581ac97bab3d0c8..dac06697673f0c74635c5823fdecf9d1082d2981 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java |
@@ -4,7 +4,6 @@ |
package org.chromium.chrome.browser; |
-import android.annotation.SuppressLint; |
import android.app.ActivityManager; |
import android.content.Context; |
import android.content.Intent; |
@@ -12,7 +11,6 @@ import android.content.pm.ApplicationInfo; |
import android.content.pm.PackageInfo; |
import android.content.pm.PackageManager; |
import android.content.pm.PackageManager.NameNotFoundException; |
-import android.content.pm.ResolveInfo; |
import android.graphics.Bitmap; |
import android.graphics.BitmapFactory; |
import android.graphics.Canvas; |
@@ -35,6 +33,8 @@ import org.chromium.base.VisibleForTesting; |
import org.chromium.base.annotations.CalledByNative; |
import org.chromium.blink_public.platform.WebDisplayMode; |
import org.chromium.chrome.R; |
+import org.chromium.chrome.browser.util.IntentUtils; |
+import org.chromium.chrome.browser.webapps.ChromeShortcutManager; |
import org.chromium.chrome.browser.webapps.ChromeWebApkHost; |
import org.chromium.chrome.browser.webapps.WebApkInfo; |
import org.chromium.chrome.browser.webapps.WebappActivity; |
@@ -60,7 +60,7 @@ public class ShortcutHelper { |
public static final String EXTRA_ICON = "org.chromium.chrome.browser.webapp_icon"; |
public static final String EXTRA_ID = "org.chromium.chrome.browser.webapp_id"; |
public static final String EXTRA_MAC = "org.chromium.chrome.browser.webapp_mac"; |
- // EXTRA_TITLE is present for backward compatibility reasons |
+ // EXTRA_TITLE is present for backward compatibility reasons. |
public static final String EXTRA_TITLE = "org.chromium.chrome.browser.webapp_title"; |
public static final String EXTRA_NAME = "org.chromium.chrome.browser.webapp_name"; |
public static final String EXTRA_SHORT_NAME = "org.chromium.chrome.browser.webapp_short_name"; |
@@ -82,6 +82,10 @@ public class ShortcutHelper { |
public static final String EXTRA_WEBAPK_PACKAGE_NAME = |
"org.chromium.chrome.browser.webapk_package_name"; |
+ /** Used for the callback intent when using the new shortcut API. */ |
+ public static final String SHORTCUT_TOAST_CATEGORY = |
+ "com.google.intent.category.SHORTCUT_TOAST"; |
+ |
// When a new field is added to the intent, this version should be incremented so that it will |
// be correctly populated into the WebappRegistry/WebappDataStorage. |
public static final int WEBAPP_SHORTCUT_VERSION = 2; |
@@ -91,10 +95,6 @@ public class ShortcutHelper { |
private static final String TAG = "ShortcutHelper"; |
- // There is no public string defining this intent so if Home changes the value, we |
- // have to update this string. |
- private static final String INSTALL_SHORTCUT = "com.android.launcher.action.INSTALL_SHORTCUT"; |
- |
// The activity class used for launching a WebApk. |
private static final String WEBAPK_MAIN_ACTIVITY = "org.chromium.webapk.shell_apk.MainActivity"; |
@@ -106,15 +106,17 @@ public class ShortcutHelper { |
private static final float GENERATED_ICON_PADDING_RATIO = 1.0f / 12.0f; |
private static final float GENERATED_ICON_FONT_SIZE_RATIO = 1.0f / 3.0f; |
- /** Broadcasts Intents out Android for adding the shortcut. */ |
+ /** Helper for generating home screen shortcuts. */ |
public static class Delegate { |
/** |
- * Broadcasts an intent to all interested BroadcastReceivers. |
- * @param context The Context to use. |
- * @param intent The intent to broadcast. |
+ * Request Android to add a shortcut to the home screen. |
+ * @param title Title of the shortcut. |
+ * @param icon Image that represents the shortcut. |
+ * @param intent Intent to fire when the shortcut is activated. |
*/ |
- public void sendBroadcast(Context context, Intent intent) { |
- context.sendBroadcast(intent); |
+ public void addShortcutToHomescreen(String title, Bitmap icon, Intent shortcutIntent) { |
+ ChromeShortcutManager.getInstance().addShortcutToHomeScreen( |
+ title, icon, shortcutIntent); |
} |
/** |
@@ -165,9 +167,7 @@ public class ShortcutHelper { |
} |
@Override |
protected void onPostExecute(final Intent resultIntent) { |
- Context context = ContextUtils.getApplicationContext(); |
- sDelegate.sendBroadcast( |
- context, createAddToHomeIntent(userTitle, icon, resultIntent)); |
+ sDelegate.addShortcutToHomescreen(userTitle, icon, resultIntent); |
// Store the webapp data so that it is accessible without the intent. Once this |
// process is complete, call back to native code to start the splash image |
@@ -180,8 +180,9 @@ public class ShortcutHelper { |
nativeOnWebappDataStored(callbackPointer); |
} |
}); |
- |
- showAddedToHomescreenToast(userTitle); |
+ if (ChromeShortcutManager.getInstance().shouldShowToastWhenAddingShortcut()) { |
+ showAddedToHomescreenToast(userTitle); |
+ } |
} |
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); |
} |
@@ -198,7 +199,8 @@ public class ShortcutHelper { |
Intent i = new Intent(); |
i.setClassName(packageName, WEBAPK_MAIN_ACTIVITY); |
i.addCategory(Intent.CATEGORY_LAUNCHER); |
- context.sendBroadcast(createAddToHomeIntent(shortcutTitle, bitmap, i)); |
+ context.sendBroadcast( |
+ ChromeShortcutManager.createAddToHomeIntent(shortcutTitle, bitmap, i)); |
} catch (NameNotFoundException e) { |
e.printStackTrace(); |
} |
@@ -209,14 +211,17 @@ public class ShortcutHelper { |
*/ |
@SuppressWarnings("unused") |
@CalledByNative |
- private static void addShortcut(String url, String userTitle, Bitmap icon, int source) { |
+ private static void addShortcut( |
+ String id, String url, String userTitle, Bitmap icon, int source) { |
Context context = ContextUtils.getApplicationContext(); |
final Intent shortcutIntent = createShortcutIntent(url); |
+ shortcutIntent.putExtra(EXTRA_ID, id); |
shortcutIntent.putExtra(EXTRA_SOURCE, source); |
shortcutIntent.setPackage(context.getPackageName()); |
- sDelegate.sendBroadcast( |
- context, createAddToHomeIntent(userTitle, icon, shortcutIntent)); |
- showAddedToHomescreenToast(userTitle); |
+ sDelegate.addShortcutToHomescreen(userTitle, icon, shortcutIntent); |
+ if (ChromeShortcutManager.getInstance().shouldShowToastWhenAddingShortcut()) { |
+ showAddedToHomescreenToast(userTitle); |
+ } |
} |
/** |
@@ -229,6 +234,24 @@ public class ShortcutHelper { |
} |
/** |
+ * Show toast when getting the callback intent by the launcher after adding shortcut by using |
+ * the new shortcut API. |
+ */ |
+ public static void showAddedToHomescreenToastFromIntent(Intent intent) { |
+ String title = IntentUtils.safeGetStringExtra(intent, Intent.EXTRA_SHORTCUT_NAME); |
+ showAddedToHomescreenToast(title); |
+ } |
+ |
+ /** |
+ * Determine if it is a callback intent (which requests for a show-toast), used in the new |
+ * shortcut API. |
+ */ |
+ public static boolean isShowToastIntent(Intent intent) { |
+ if (intent == null || intent.getCategories() == null) return false; |
+ return intent.getCategories().contains(SHORTCUT_TOAST_CATEGORY); |
+ } |
+ |
+ /** |
* Shows toast notifying user that a WebAPK install is already in progress when user tries to |
* queue a new install for the same WebAPK. |
*/ |
@@ -273,22 +296,6 @@ public class ShortcutHelper { |
} |
/** |
- * Creates an intent that will add a shortcut to the home screen. |
- * @param title Title of the shortcut. |
- * @param icon Image that represents the shortcut. |
- * @param shortcutIntent Intent to fire when the shortcut is activated. |
- * @return Intent for the shortcut. |
- */ |
- public static Intent createAddToHomeIntent(String title, Bitmap icon, |
- Intent shortcutIntent) { |
- Intent i = new Intent(INSTALL_SHORTCUT); |
- i.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); |
- i.putExtra(Intent.EXTRA_SHORTCUT_NAME, title); |
- i.putExtra(Intent.EXTRA_SHORTCUT_ICON, icon); |
- return i; |
- } |
- |
- /** |
* Creates a shortcut to launch a web app on the home screen. |
* @param id Id of the web app. |
* @param action Intent action to open a full screen activity. |
@@ -358,22 +365,15 @@ public class ShortcutHelper { |
/** |
* Utility method to check if a shortcut can be added to the home screen. |
- * @param context Context used to get the package manager. |
* @return if a shortcut can be added to the home screen under the current profile. |
*/ |
- // TODO(crbug.com/635567): Fix this properly. |
- @SuppressLint("WrongConstant") |
- public static boolean isAddToHomeIntentSupported(Context context) { |
- PackageManager pm = context.getPackageManager(); |
- Intent i = new Intent(INSTALL_SHORTCUT); |
- List<ResolveInfo> receivers = pm.queryBroadcastReceivers( |
- i, PackageManager.GET_INTENT_FILTERS); |
- return !receivers.isEmpty(); |
+ public static boolean isAddToHomeIntentSupported() { |
+ return ChromeShortcutManager.getInstance().canAddShortcutToHomescreen(); |
} |
/** |
* Returns whether the given icon matches the size requirements to be used on the home screen. |
- * @param width Icon width, in pixels. |
+ * @param width Icon width, in pixels. |
* @param height Icon height, in pixels. |
* @return whether the given icon matches the size requirements to be used on the home screen. |
*/ |
@@ -436,10 +436,10 @@ public class ShortcutHelper { |
* Generates a generic icon to be used in the launcher. This is just a rounded rectangle with |
* a letter in the middle taken from the website's domain name. |
* |
- * @param url URL of the shortcut. |
- * @param red Red component of the dominant icon color. |
+ * @param url URL of the shortcut. |
+ * @param red Red component of the dominant icon color. |
* @param green Green component of the dominant icon color. |
- * @param blue Blue component of the dominant icon color. |
+ * @param blue Blue component of the dominant icon color. |
* @return Bitmap Either the touch-icon or the newly created favicon. |
*/ |
@CalledByNative |