Merge "Making some shortcut manager calls protected by MR1 version check" into ub-launcher3-calgary

This commit is contained in:
Sunny Goyal
2016-06-23 21:56:25 +00:00
committed by Android (Google) Code Review
8 changed files with 92 additions and 197 deletions
+2 -2
View File
@@ -2801,8 +2801,8 @@ public class Launcher extends Activity
if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) {
String id = ((ShortcutInfo) info).getDeepShortcutId();
String packageName = intent.getPackage();
LauncherAppsCompat.getInstance(this).startShortcut(
packageName, id, intent.getSourceBounds(), optsBundle, info.user);
LauncherAppState.getInstance().getShortcutManager().startShortcut(
packageName, id, intent.getSourceBounds(), optsBundle, info.user);
} else {
// Could be launching some bookkeeping activity
startActivity(intent, optsBundle);
+3 -3
View File
@@ -1941,8 +1941,8 @@ public class LauncherModel extends BroadcastReceiver
}
}
incrementPinnedShortcutCount(key, shouldPin);
info = ShortcutInfo.fromDeepShortcutInfo(pinnedShortcut,
context, launcherApps);
info = ShortcutInfo.fromDeepShortcutInfo(
pinnedShortcut, context);
} else { // item type == ITEM_TYPE_SHORTCUT
info = getShortcutInfo(c, context, titleIndex, cursorIconInfo);
@@ -3317,7 +3317,7 @@ public class LauncherModel extends BroadcastReceiver
List<ShortcutInfo> shortcutInfos = idsToWorkspaceShortcutInfos
.get(fullDetails.getId());
for (ShortcutInfo shortcutInfo : shortcutInfos) {
shortcutInfo.updateFromDeepShortcutInfo(fullDetails, context, mLauncherApps);
shortcutInfo.updateFromDeepShortcutInfo(fullDetails, context);
updatedShortcutInfos.add(shortcutInfo);
}
}
+6 -6
View File
@@ -282,18 +282,17 @@ public class ShortcutInfo extends ItemInfo {
*/
@TargetApi(Build.VERSION_CODES.N)
public static ShortcutInfo fromDeepShortcutInfo(ShortcutInfoCompat shortcutInfo,
Context context, LauncherAppsCompat launcherApps) {
Context context) {
ShortcutInfo si = new ShortcutInfo();
si.user = shortcutInfo.getUserHandle();
si.itemType = LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT;
si.intent = shortcutInfo.makeIntent(context);
si.flags = 0;
si.updateFromDeepShortcutInfo(shortcutInfo, context, launcherApps);
si.updateFromDeepShortcutInfo(shortcutInfo, context);
return si;
}
public void updateFromDeepShortcutInfo(ShortcutInfoCompat shortcutInfo,
Context context, LauncherAppsCompat launcherApps) {
public void updateFromDeepShortcutInfo(ShortcutInfoCompat shortcutInfo, Context context) {
title = shortcutInfo.getShortLabel();
CharSequence label = shortcutInfo.getLongLabel();
@@ -304,8 +303,9 @@ public class ShortcutInfo extends ItemInfo {
.getBadgedLabelForUser(label, user);
LauncherAppState launcherAppState = LauncherAppState.getInstance();
Drawable unbadgedIcon = launcherApps.getShortcutIconDrawable(shortcutInfo, launcherAppState
.getInvariantDeviceProfile().fillResIconDpi);
Drawable unbadgedIcon = launcherAppState.getShortcutManager()
.getShortcutIconDrawable(shortcutInfo,
launcherAppState.getInvariantDeviceProfile().fillResIconDpi);
Bitmap icon = unbadgedIcon == null ? null
: Utilities.createBadgedIconBitmap(unbadgedIcon, user, context);
setIcon(icon != null ? icon : launcherAppState.getIconCache().getDefaultIcon(user));
+8
View File
@@ -44,8 +44,10 @@ import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.PaintDrawable;
import android.os.Build;
import android.os.Build.VERSION;
import android.os.Bundle;
import android.os.PowerManager;
import android.support.v4.os.BuildCompat;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
@@ -100,6 +102,12 @@ public final class Utilities {
private static final int[] sLoc0 = new int[2];
private static final int[] sLoc1 = new int[2];
public static boolean isNycMR1OrAbove() {
// TODO: Use the check from support lib
return !"REL".equals(VERSION.CODENAME)
&& "NMR1".compareTo(VERSION.CODENAME) <= 0;
}
// TODO: use Build.VERSION_CODES when available
public static final boolean ATLEAST_MARSHMALLOW = Build.VERSION.SDK_INT >= 23;
@@ -61,9 +61,7 @@ public abstract class LauncherAppsCompat {
public static LauncherAppsCompat getInstance(Context context) {
synchronized (sInstanceLock) {
if (sInstance == null) {
if (Utilities.isNycOrAbove()) {
sInstance = new LauncherAppsCompatVNMR1(context.getApplicationContext());
} else if (Utilities.ATLEAST_LOLLIPOP) {
if (Utilities.ATLEAST_LOLLIPOP) {
sInstance = new LauncherAppsCompatVL(context.getApplicationContext());
} else {
sInstance = new LauncherAppsCompatV16(context.getApplicationContext());
@@ -86,11 +84,4 @@ public abstract class LauncherAppsCompat {
public abstract boolean isActivityEnabledForProfile(ComponentName component,
UserHandleCompat user);
public abstract boolean isPackageSuspendedForProfile(String packageName, UserHandleCompat user);
public abstract List<ShortcutInfoCompat> getShortcuts(LauncherApps.ShortcutQuery q,
UserHandleCompat userHandle);
public abstract void pinShortcuts(String packageName, List<String> pinnedIds,
UserHandleCompat userHandle);
public abstract void startShortcut(String packageName, String id, Rect sourceBounds,
Bundle startActivityOptions, UserHandleCompat user);
public abstract Drawable getShortcutIconDrawable(ShortcutInfoCompat shortcutInfo, int density);
}
@@ -133,29 +133,6 @@ public class LauncherAppsCompatV16 extends LauncherAppsCompat {
return false;
}
@Override
public List<ShortcutInfoCompat> getShortcuts(LauncherApps.ShortcutQuery q,
UserHandleCompat userHandle) {
return null;
}
@Override
public void pinShortcuts(String packageName, List<String> pinnedIds,
UserHandleCompat userHandle) {
// Not supported, so do nothing.
}
@Override
public void startShortcut(String packageName, String id, Rect sourceBounds,
Bundle startActivityOptions, UserHandleCompat user) {
// Not supported, so do nothing.
}
@Override
public Drawable getShortcutIconDrawable(ShortcutInfoCompat shortcutInfo, int density) {
return null;
}
private void unregisterForPackageIntents() {
mContext.unregisterReceiver(mPackageMonitor);
}
@@ -1,123 +0,0 @@
/*
* 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.compat;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.pm.LauncherApps;
import android.content.pm.ShortcutInfo;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.os.UserHandle;
import com.android.launcher3.shortcuts.ShortcutInfoCompat;
import java.util.ArrayList;
import java.util.List;
@TargetApi(Build.VERSION_CODES.N)
public class LauncherAppsCompatVNMR1 extends LauncherAppsCompatVL {
LauncherAppsCompatVNMR1(Context context) {
super(context);
}
@Override
public List<ShortcutInfoCompat> getShortcuts(LauncherApps.ShortcutQuery q,
UserHandleCompat userHandle) {
List<ShortcutInfo> shortcutInfos = mLauncherApps.getShortcuts(q, userHandle.getUser());
if (shortcutInfos == null) {
return null;
}
List<ShortcutInfoCompat> shortcutInfoCompats = new ArrayList<>(shortcutInfos.size());
for (ShortcutInfo shortcutInfo : shortcutInfos) {
shortcutInfoCompats.add(new ShortcutInfoCompat(shortcutInfo));
}
return shortcutInfoCompats;
}
@Override
public void pinShortcuts(String packageName, List<String> pinnedIds,
UserHandleCompat userHandle) {
mLauncherApps.pinShortcuts(packageName, pinnedIds, userHandle.getUser());
}
@Override
public void startShortcut(String packageName, String id, Rect sourceBounds,
Bundle startActivityOptions, UserHandleCompat user) {
mLauncherApps.startShortcut(packageName, id, sourceBounds,
startActivityOptions, user.getUser());
}
@Override
public Drawable getShortcutIconDrawable(ShortcutInfoCompat shortcutInfo, int density) {
return mLauncherApps.getShortcutIconDrawable(shortcutInfo.getShortcutInfo(), density);
}
private static class WrappedCallback extends LauncherApps.Callback {
private OnAppsChangedCallbackCompat mCallback;
public WrappedCallback(OnAppsChangedCallbackCompat callback) {
mCallback = callback;
}
public void onPackageRemoved(String packageName, UserHandle user) {
mCallback.onPackageRemoved(packageName, UserHandleCompat.fromUser(user));
}
public void onPackageAdded(String packageName, UserHandle user) {
mCallback.onPackageAdded(packageName, UserHandleCompat.fromUser(user));
}
public void onPackageChanged(String packageName, UserHandle user) {
mCallback.onPackageChanged(packageName, UserHandleCompat.fromUser(user));
}
public void onPackagesAvailable(String[] packageNames, UserHandle user, boolean replacing) {
mCallback.onPackagesAvailable(packageNames, UserHandleCompat.fromUser(user), replacing);
}
public void onPackagesUnavailable(String[] packageNames, UserHandle user,
boolean replacing) {
mCallback.onPackagesUnavailable(packageNames, UserHandleCompat.fromUser(user),
replacing);
}
public void onPackagesSuspended(String[] packageNames, UserHandle user) {
mCallback.onPackagesSuspended(packageNames, UserHandleCompat.fromUser(user));
}
public void onPackagesUnsuspended(String[] packageNames, UserHandle user) {
mCallback.onPackagesUnsuspended(packageNames, UserHandleCompat.fromUser(user));
}
@Override
public void onShortcutsChanged(String packageName, List<ShortcutInfo> shortcuts,
UserHandle user) {
List<ShortcutInfoCompat> shortcutInfoCompats = new ArrayList<>(shortcuts.size());
for (ShortcutInfo shortcutInfo : shortcuts) {
shortcutInfoCompats.add(new ShortcutInfoCompat(shortcutInfo));
}
mCallback.onShortcutsChanged(packageName, shortcutInfoCompats,
UserHandleCompat.fromUser(user));
}
}
}
@@ -19,30 +19,37 @@ 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.os.Build;
import android.os.Process;
import android.util.Log;
import android.content.pm.ShortcutInfo;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import com.android.launcher3.compat.LauncherAppsCompat;
import com.android.launcher3.Utilities;
import com.android.launcher3.compat.UserHandleCompat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
* Performs operations related to deep shortcuts, such as querying for them, pinning them, etc.
*/
@TargetApi(Build.VERSION_CODES.N)
public class DeepShortcutManager {
private static final int FLAG_GET_ALL = ShortcutQuery.FLAG_GET_DYNAMIC
| ShortcutQuery.FLAG_GET_PINNED | ShortcutQuery.FLAG_GET_MANIFEST;
private final LauncherAppsCompat mLauncherApps;
// TODO: Replace this with platform constants when the new sdk is available.
public static final int FLAG_MATCH_DYNAMIC = 1 << 0;
public static final int FLAG_MATCH_MANIFEST = 1 << 3;
public static final int FLAG_MATCH_PINNED = 1 << 1;
private static final int FLAG_GET_ALL =
FLAG_MATCH_DYNAMIC | FLAG_MATCH_PINNED | FLAG_MATCH_MANIFEST;
private final LauncherApps mLauncherApps;
public DeepShortcutManager(Context context, ShortcutCache shortcutCache) {
mLauncherApps = LauncherAppsCompat.getInstance(context);
mLauncherApps = (LauncherApps) context.getSystemService(Context.LAUNCHER_APPS_SERVICE);
}
public void onShortcutsChanged(List<ShortcutInfoCompat> shortcuts) {
@@ -72,26 +79,48 @@ public class DeepShortcutManager {
* Removes the given shortcut from the current list of pinned shortcuts.
* (Runs on background thread)
*/
@TargetApi(25)
public void unpinShortcut(final ShortcutKey key) {
String packageName = key.componentName.getPackageName();
String id = key.id;
UserHandleCompat user = key.user;
List<String> pinnedIds = extractIds(queryForPinnedShortcuts(packageName, user));
pinnedIds.remove(id);
mLauncherApps.pinShortcuts(packageName, pinnedIds, user);
if (Utilities.isNycMR1OrAbove()) {
String packageName = key.componentName.getPackageName();
String id = key.id;
UserHandleCompat user = key.user;
List<String> pinnedIds = extractIds(queryForPinnedShortcuts(packageName, user));
pinnedIds.remove(id);
mLauncherApps.pinShortcuts(packageName, pinnedIds, user.getUser());
}
}
/**
* Adds the given shortcut to the current list of pinned shortcuts.
* (Runs on background thread)
*/
@TargetApi(25)
public void pinShortcut(final ShortcutKey key) {
String packageName = key.componentName.getPackageName();
String id = key.id;
UserHandleCompat user = key.user;
List<String> pinnedIds = extractIds(queryForPinnedShortcuts(packageName, user));
pinnedIds.add(id);
mLauncherApps.pinShortcuts(packageName, pinnedIds, user);
if (Utilities.isNycMR1OrAbove()) {
String packageName = key.componentName.getPackageName();
String id = key.id;
UserHandleCompat user = key.user;
List<String> pinnedIds = extractIds(queryForPinnedShortcuts(packageName, user));
pinnedIds.add(id);
mLauncherApps.pinShortcuts(packageName, pinnedIds, user.getUser());
}
}
@TargetApi(25)
public void startShortcut(String packageName, String id, Rect sourceBounds,
Bundle startActivityOptions, UserHandleCompat user) {
if (Utilities.isNycMR1OrAbove()) {
mLauncherApps.startShortcut(packageName, id, sourceBounds,
startActivityOptions, user.getUser());
}
}
@TargetApi(25)
public Drawable getShortcutIconDrawable(ShortcutInfoCompat shortcutInfo, int density) {
return Utilities.isNycMR1OrAbove()
? mLauncherApps.getShortcutIconDrawable(shortcutInfo.getShortcutInfo(), density)
: null;
}
/**
@@ -101,7 +130,7 @@ public class DeepShortcutManager {
*/
public List<ShortcutInfoCompat> queryForPinnedShortcuts(String packageName,
UserHandleCompat user) {
return query(ShortcutQuery.FLAG_GET_PINNED, packageName, null, null, user);
return query(FLAG_MATCH_PINNED, packageName, null, null, user);
}
public List<ShortcutInfoCompat> queryForAllShortcuts(UserHandleCompat user) {
@@ -122,15 +151,28 @@ public class DeepShortcutManager {
*
* 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, UserHandleCompat user) {
ShortcutQuery q = new ShortcutQuery();
q.setQueryFlags(flags);
if (packageName != null) {
q.setPackage(packageName);
q.setActivity(activity);
q.setShortcutIds(shortcutIds);
if (Utilities.isNycMR1OrAbove()) {
ShortcutQuery q = new ShortcutQuery();
q.setQueryFlags(flags);
if (packageName != null) {
q.setPackage(packageName);
q.setActivity(activity);
q.setShortcutIds(shortcutIds);
}
List<ShortcutInfo> shortcutInfos = mLauncherApps.getShortcuts(q, user.getUser());
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;
}
return mLauncherApps.getShortcuts(q, user);
}
}