summaryrefslogtreecommitdiffstats
path: root/src_shortcuts_overrides
diff options
context:
space:
mode:
authorRajeev Kumar <rajekumar@google.com>2018-10-31 12:54:15 -0700
committerRajeev Kumar <rajekumar@google.com>2018-10-31 13:52:38 -0700
commit51ca603ac4a4b170e41ea3afc6e3cdd29290b396 (patch)
tree5e83d288f24f24aef575455448cd7d24d99b7eb8 /src_shortcuts_overrides
parent51ffcae523d3a788e6edfeafd7f609ade4236d51 (diff)
downloadandroid_packages_apps_Trebuchet-51ca603ac4a4b170e41ea3afc6e3cdd29290b396.tar.gz
android_packages_apps_Trebuchet-51ca603ac4a4b170e41ea3afc6e3cdd29290b396.tar.bz2
android_packages_apps_Trebuchet-51ca603ac4a4b170e41ea3afc6e3cdd29290b396.zip
Create a deep shortcuts override.
This change disables deep shortcuts on Android Go devices. Bug: 112904271 Test: Manual test Change-Id: I6150a3500f67d8a8412b51796cc442e3384c2cbb
Diffstat (limited to 'src_shortcuts_overrides')
-rw-r--r--src_shortcuts_overrides/com/android/launcher3/shortcuts/DeepShortcutManager.java254
1 files changed, 254 insertions, 0 deletions
diff --git a/src_shortcuts_overrides/com/android/launcher3/shortcuts/DeepShortcutManager.java b/src_shortcuts_overrides/com/android/launcher3/shortcuts/DeepShortcutManager.java
new file mode 100644
index 000000000..e70aac68f
--- /dev/null
+++ b/src_shortcuts_overrides/com/android/launcher3/shortcuts/DeepShortcutManager.java
@@ -0,0 +1,254 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.shortcuts;
+
+import android.annotation.TargetApi;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.LauncherApps;
+import android.content.pm.LauncherApps.ShortcutQuery;
+import android.content.pm.ShortcutInfo;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.util.Log;
+
+import com.android.launcher3.ItemInfo;
+import com.android.launcher3.LauncherSettings;
+import com.android.launcher3.Utilities;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Performs operations related to deep shortcuts, such as querying for them, pinning them, etc.
+ */
+public class DeepShortcutManager {
+ private static final String TAG = "DeepShortcutManager";
+
+ private static final int FLAG_GET_ALL = ShortcutQuery.FLAG_MATCH_DYNAMIC
+ | ShortcutQuery.FLAG_MATCH_MANIFEST | ShortcutQuery.FLAG_MATCH_PINNED;
+
+ private static DeepShortcutManager sInstance;
+ private static final Object sInstanceLock = new Object();
+
+ public static DeepShortcutManager getInstance(Context context) {
+ synchronized (sInstanceLock) {
+ if (sInstance == null) {
+ sInstance = new DeepShortcutManager(context.getApplicationContext());
+ }
+ return sInstance;
+ }
+ }
+
+ private final LauncherApps mLauncherApps;
+ private boolean mWasLastCallSuccess;
+
+ private DeepShortcutManager(Context context) {
+ mLauncherApps = (LauncherApps) context.getSystemService(Context.LAUNCHER_APPS_SERVICE);
+ }
+
+ public static boolean supportsShortcuts(ItemInfo info) {
+ boolean isItemPromise = info instanceof com.android.launcher3.ShortcutInfo
+ && ((com.android.launcher3.ShortcutInfo) info).hasPromiseIconUi();
+ return info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION
+ && !info.isDisabled() && !isItemPromise;
+ }
+
+ public boolean wasLastCallSuccess() {
+ return mWasLastCallSuccess;
+ }
+
+ public void onShortcutsChanged(List<ShortcutInfoCompat> shortcuts) {
+ // mShortcutCache.removeShortcuts(shortcuts);
+ }
+
+ /**
+ * Queries for the shortcuts with the package name and provided ids.
+ *
+ * This method is intended to get the full details for shortcuts when they are added or updated,
+ * because we only get "key" fields in onShortcutsChanged().
+ */
+ public List<ShortcutInfoCompat> queryForFullDetails(String packageName,
+ List<String> shortcutIds, UserHandle user) {
+ return query(FLAG_GET_ALL, packageName, null, shortcutIds, user);
+ }
+
+ /**
+ * Gets all the manifest and dynamic shortcuts associated with the given package and user,
+ * to be displayed in the shortcuts container on long press.
+ */
+ @TargetApi(25)
+ public List<ShortcutInfoCompat> queryForShortcutsContainer(ComponentName activity,
+ UserHandle user) {
+ return query(ShortcutQuery.FLAG_MATCH_MANIFEST | ShortcutQuery.FLAG_MATCH_DYNAMIC,
+ activity.getPackageName(), activity, null, user);
+ }
+
+ /**
+ * Removes the given shortcut from the current list of pinned shortcuts.
+ * (Runs on background thread)
+ */
+ @TargetApi(25)
+ public void unpinShortcut(final ShortcutKey key) {
+ if (Utilities.ATLEAST_NOUGAT_MR1) {
+ String packageName = key.componentName.getPackageName();
+ String id = key.getId();
+ UserHandle user = key.user;
+ List<String> pinnedIds = extractIds(queryForPinnedShortcuts(packageName, user));
+ pinnedIds.remove(id);
+ try {
+ mLauncherApps.pinShortcuts(packageName, pinnedIds, user);
+ mWasLastCallSuccess = true;
+ } catch (SecurityException|IllegalStateException e) {
+ Log.w(TAG, "Failed to unpin shortcut", e);
+ mWasLastCallSuccess = false;
+ }
+ }
+ }
+
+ /**
+ * Adds the given shortcut to the current list of pinned shortcuts.
+ * (Runs on background thread)
+ */
+ @TargetApi(25)
+ public void pinShortcut(final ShortcutKey key) {
+ if (Utilities.ATLEAST_NOUGAT_MR1) {
+ String packageName = key.componentName.getPackageName();
+ String id = key.getId();
+ UserHandle user = key.user;
+ List<String> pinnedIds = extractIds(queryForPinnedShortcuts(packageName, user));
+ pinnedIds.add(id);
+ try {
+ mLauncherApps.pinShortcuts(packageName, pinnedIds, user);
+ mWasLastCallSuccess = true;
+ } catch (SecurityException|IllegalStateException e) {
+ Log.w(TAG, "Failed to pin shortcut", e);
+ mWasLastCallSuccess = false;
+ }
+ }
+ }
+
+ @TargetApi(25)
+ public void startShortcut(String packageName, String id, Rect sourceBounds,
+ Bundle startActivityOptions, UserHandle user) {
+ if (Utilities.ATLEAST_NOUGAT_MR1) {
+ try {
+ mLauncherApps.startShortcut(packageName, id, sourceBounds,
+ startActivityOptions, user);
+ mWasLastCallSuccess = true;
+ } catch (SecurityException|IllegalStateException e) {
+ Log.e(TAG, "Failed to start shortcut", e);
+ mWasLastCallSuccess = false;
+ }
+ }
+ }
+
+ @TargetApi(25)
+ public Drawable getShortcutIconDrawable(ShortcutInfoCompat shortcutInfo, int density) {
+ if (Utilities.ATLEAST_NOUGAT_MR1) {
+ try {
+ Drawable icon = mLauncherApps.getShortcutIconDrawable(
+ shortcutInfo.getShortcutInfo(), density);
+ mWasLastCallSuccess = true;
+ return icon;
+ } catch (SecurityException|IllegalStateException e) {
+ Log.e(TAG, "Failed to get shortcut icon", e);
+ mWasLastCallSuccess = false;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Returns the id's of pinned shortcuts associated with the given package and user.
+ *
+ * If packageName is null, returns all pinned shortcuts regardless of package.
+ */
+ public List<ShortcutInfoCompat> queryForPinnedShortcuts(String packageName, UserHandle user) {
+ return queryForPinnedShortcuts(packageName, null, user);
+ }
+
+ public List<ShortcutInfoCompat> queryForPinnedShortcuts(String packageName,
+ List<String> shortcutIds, UserHandle user) {
+ return query(ShortcutQuery.FLAG_MATCH_PINNED, packageName, null, shortcutIds, user);
+ }
+
+ public List<ShortcutInfoCompat> queryForAllShortcuts(UserHandle user) {
+ return query(FLAG_GET_ALL, null, null, null, user);
+ }
+
+ private List<String> extractIds(List<ShortcutInfoCompat> shortcuts) {
+ List<String> shortcutIds = new ArrayList<>(shortcuts.size());
+ for (ShortcutInfoCompat shortcut : shortcuts) {
+ shortcutIds.add(shortcut.getId());
+ }
+ return shortcutIds;
+ }
+
+ /**
+ * Query the system server for all the shortcuts matching the given parameters.
+ * If packageName == null, we query for all shortcuts with the passed flags, regardless of app.
+ *
+ * TODO: Use the cache to optimize this so we don't make an RPC every time.
+ */
+ @TargetApi(25)
+ private List<ShortcutInfoCompat> query(int flags, String packageName,
+ ComponentName activity, List<String> shortcutIds, UserHandle user) {
+ if (Utilities.ATLEAST_NOUGAT_MR1) {
+ ShortcutQuery q = new ShortcutQuery();
+ q.setQueryFlags(flags);
+ if (packageName != null) {
+ q.setPackage(packageName);
+ q.setActivity(activity);
+ q.setShortcutIds(shortcutIds);
+ }
+ List<ShortcutInfo> shortcutInfos = null;
+ try {
+ shortcutInfos = mLauncherApps.getShortcuts(q, user);
+ mWasLastCallSuccess = true;
+ } catch (SecurityException|IllegalStateException e) {
+ Log.e(TAG, "Failed to query for shortcuts", e);
+ mWasLastCallSuccess = false;
+ }
+ if (shortcutInfos == null) {
+ return Collections.EMPTY_LIST;
+ }
+ List<ShortcutInfoCompat> shortcutInfoCompats = new ArrayList<>(shortcutInfos.size());
+ for (ShortcutInfo shortcutInfo : shortcutInfos) {
+ shortcutInfoCompats.add(new ShortcutInfoCompat(shortcutInfo));
+ }
+ return shortcutInfoCompats;
+ } else {
+ return Collections.EMPTY_LIST;
+ }
+ }
+
+ @TargetApi(25)
+ public boolean hasHostPermission() {
+ if (Utilities.ATLEAST_NOUGAT_MR1) {
+ try {
+ return mLauncherApps.hasShortcutHostPermission();
+ } catch (SecurityException|IllegalStateException e) {
+ Log.e(TAG, "Failed to make shortcut manager call", e);
+ }
+ }
+ return false;
+ }
+}