Loading core/java/android/content/pm/ILauncherApps.aidl +1 −1 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ import java.util.List; * {@hide} */ interface ILauncherApps { void addOnAppsChangedListener(in IOnAppsChangedListener listener); void addOnAppsChangedListener(String callingPackage, in IOnAppsChangedListener listener); void removeOnAppsChangedListener(in IOnAppsChangedListener listener); ParceledListSlice getLauncherActivities(String packageName, in UserHandle user); ResolveInfo resolveActivity(in Intent intent, in UserHandle user); Loading core/java/android/content/pm/LauncherApps.java +2 −1 Original line number Diff line number Diff line Loading @@ -565,7 +565,8 @@ public class LauncherApps { addCallbackLocked(callback, handler); if (addedFirstCallback) { try { mService.addOnAppsChangedListener(mAppsChangedListener); mService.addOnAppsChangedListener(mContext.getPackageName(), mAppsChangedListener); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); } Loading core/java/android/content/pm/ShortcutServiceInternal.java +1 −2 Original line number Diff line number Diff line Loading @@ -36,8 +36,7 @@ import java.util.List; */ public abstract class ShortcutServiceInternal { public interface ShortcutChangeListener { void onShortcutChanged(@NonNull String packageName, @NonNull List<ShortcutInfo> shortcuts, @UserIdInt int userId); void onShortcutChanged(@NonNull String packageName, @UserIdInt int userId); } public abstract List<ShortcutInfo> Loading services/core/java/com/android/server/pm/LauncherAppsService.java +90 −54 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.ILauncherApps; import android.content.pm.IOnAppsChangedListener; import android.content.pm.IPackageManager; import android.content.pm.LauncherApps.ShortcutQuery; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; Loading Loading @@ -74,9 +75,20 @@ public class LauncherAppsService extends SystemService { @Override public void onStart() { Binder.LOG_RUNTIME_EXCEPTION = true; publishBinderService(Context.LAUNCHER_APPS_SERVICE, mLauncherAppsImpl); } static class BroadcastCookie { public final UserHandle user; public final String packageName; BroadcastCookie(UserHandle userHandle, String packageName) { this.user = userHandle; this.packageName = packageName; } } @VisibleForTesting static class LauncherAppsImpl extends ILauncherApps.Stub { private static final boolean DEBUG = false; Loading Loading @@ -113,7 +125,8 @@ public class LauncherAppsService extends SystemService { * android.content.pm.IOnAppsChangedListener) */ @Override public void addOnAppsChangedListener(IOnAppsChangedListener listener) throws RemoteException { public void addOnAppsChangedListener(String callingPackage, IOnAppsChangedListener listener) throws RemoteException { synchronized (mListeners) { if (DEBUG) { Log.d(TAG, "Adding listener from " + Binder.getCallingUserHandle()); Loading @@ -125,7 +138,8 @@ public class LauncherAppsService extends SystemService { startWatchingPackageBroadcasts(); } mListeners.unregister(listener); mListeners.register(listener, Binder.getCallingUserHandle()); mListeners.register(listener, new BroadcastCookie(UserHandle.of(getCallingUserId()), callingPackage)); } } Loading Loading @@ -490,12 +504,9 @@ public class LauncherAppsService extends SystemService { } } private class MyPackageMonitor extends PackageMonitor implements ShortcutChangeListener { /** Checks if user is a profile of or same as listeningUser. * and the user is enabled. */ private boolean isEnabledProfileOf(UserHandle user, UserHandle listeningUser, boolean isEnabledProfileOf(UserHandle user, UserHandle listeningUser, String debugMsg) { if (user.getIdentifier() == listeningUser.getIdentifier()) { if (DEBUG) Log.d(TAG, "Delivering msg to same user " + debugMsg); Loading Loading @@ -526,6 +537,12 @@ public class LauncherAppsService extends SystemService { } } void postToPackageMonitor(Runnable r) { mPackageMonitor.getRegisteredHandler().post(r); } private class MyPackageMonitor extends PackageMonitor implements ShortcutChangeListener { // TODO Simplify with lambdas. @Override Loading @@ -534,8 +551,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, listeningUser, "onPackageAdded")) continue; BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, cookie.user, "onPackageAdded")) continue; try { listener.onPackageAdded(user, packageName); } catch (RemoteException re) { Loading @@ -553,8 +570,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, listeningUser, "onPackageRemoved")) continue; BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, cookie.user, "onPackageRemoved")) continue; try { listener.onPackageRemoved(user, packageName); } catch (RemoteException re) { Loading @@ -572,8 +589,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, listeningUser, "onPackageModified")) continue; BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, cookie.user, "onPackageModified")) continue; try { listener.onPackageChanged(user, packageName); } catch (RemoteException re) { Loading @@ -591,8 +608,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, listeningUser, "onPackagesAvailable")) continue; BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, cookie.user, "onPackagesAvailable")) continue; try { listener.onPackagesAvailable(user, packages, isReplacing()); } catch (RemoteException re) { Loading @@ -610,8 +627,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, listeningUser, "onPackagesUnavailable")) continue; BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, cookie.user, "onPackagesUnavailable")) continue; try { listener.onPackagesUnavailable(user, packages, isReplacing()); } catch (RemoteException re) { Loading @@ -629,8 +646,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, listeningUser, "onPackagesSuspended")) continue; BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, cookie.user, "onPackagesSuspended")) continue; try { listener.onPackagesSuspended(user, packages); } catch (RemoteException re) { Loading @@ -648,8 +665,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, listeningUser, "onPackagesUnsuspended")) continue; BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, cookie.user, "onPackagesUnsuspended")) continue; try { listener.onPackagesUnsuspended(user, packages); } catch (RemoteException re) { Loading @@ -663,20 +680,39 @@ public class LauncherAppsService extends SystemService { @Override public void onShortcutChanged(@NonNull String packageName, @NonNull List<ShortcutInfo> shortcuts, @UserIdInt int userId) { @UserIdInt int userId) { postToPackageMonitor(() -> onShortcutChangedInner(packageName, userId)); } private void onShortcutChangedInner(@NonNull String packageName, @UserIdInt int userId) { final UserHandle user = UserHandle.of(userId); final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, listeningUser, "onShortcutChanged")) continue; // STOPSHIP Skip if the receiver doesn't have the permission. BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, cookie.user, "onShortcutChanged")) continue; // Make sure the caller has the permission. if (!mShortcutServiceInternal.hasShortcutHostPermission(cookie.packageName, cookie.user.getIdentifier())) { continue; } // Each launcher has a different set of pinned shortcuts, so we need to do a // query in here. // (As of now, only one launcher has the permission at a time, so it's bit // moot, but we may change the permission model eventually.) final List<ShortcutInfo> list = mShortcutServiceInternal.getShortcuts(cookie.packageName, /* changedSince= */ 0, packageName, /* component= */ null, ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY | ShortcutQuery.FLAG_GET_PINNED | ShortcutQuery.FLAG_GET_DYNAMIC , userId); try { listener.onShortcutChanged(user, packageName, new ParceledListSlice<>(shortcuts)); new ParceledListSlice<>(list)); } catch (RemoteException re) { Slog.d(TAG, "Callback failed ", re); } Loading services/core/java/com/android/server/pm/ShortcutService.java +26 −13 Original line number Diff line number Diff line Loading @@ -814,7 +814,7 @@ public class ShortcutService extends IShortcutService.Stub { return; } final long token = Binder.clearCallingIdentity(); final long token = injectClearCallingIdentity(); try { // Clear icon info on the shortcut. shortcut.setIconResourceId(0); Loading Loading @@ -891,7 +891,7 @@ public class ShortcutService extends IShortcutService.Stub { shortcut.clearIcon(); } } finally { Binder.restoreCallingIdentity(token); injectRestoreCallingIdentity(token); } } Loading Loading @@ -992,6 +992,10 @@ public class ShortcutService extends IShortcutService.Stub { } } void postToHandler(Runnable r) { mHandler.post(r); } /** * Throw if {@code numShortcuts} is bigger than {@link #mMaxDynamicShortcuts}. */ Loading @@ -1011,17 +1015,16 @@ public class ShortcutService extends IShortcutService.Stub { } private void notifyListeners(@NonNull String packageName, @UserIdInt int userId) { postToHandler(() -> { final ArrayList<ShortcutChangeListener> copy; final List<ShortcutInfo> shortcuts = new ArrayList<>(); synchronized (mLock) { copy = new ArrayList<>(mListeners); getPackageShortcutsLocked(packageName, userId) .findAll(shortcuts, /* query =*/ null, ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO); } // Note onShortcutChanged() needs to be called with the system service permissions. for (int i = copy.size() - 1; i >= 0; i--) { copy.get(i).onShortcutChanged(packageName, shortcuts, userId); copy.get(i).onShortcutChanged(packageName, userId); } }); } /** Loading Loading @@ -1799,6 +1802,16 @@ public class ShortcutService extends IShortcutService.Stub { return UserHandle.getUserId(injectBinderCallingUid()); } // Injection point. long injectClearCallingIdentity() { return Binder.clearCallingIdentity(); } // Injection point. void injectRestoreCallingIdentity(long token) { Binder.restoreCallingIdentity(token); } File injectSystemDataPath() { return Environment.getDataSystemDirectory(); } Loading Loading
core/java/android/content/pm/ILauncherApps.aidl +1 −1 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ import java.util.List; * {@hide} */ interface ILauncherApps { void addOnAppsChangedListener(in IOnAppsChangedListener listener); void addOnAppsChangedListener(String callingPackage, in IOnAppsChangedListener listener); void removeOnAppsChangedListener(in IOnAppsChangedListener listener); ParceledListSlice getLauncherActivities(String packageName, in UserHandle user); ResolveInfo resolveActivity(in Intent intent, in UserHandle user); Loading
core/java/android/content/pm/LauncherApps.java +2 −1 Original line number Diff line number Diff line Loading @@ -565,7 +565,8 @@ public class LauncherApps { addCallbackLocked(callback, handler); if (addedFirstCallback) { try { mService.addOnAppsChangedListener(mAppsChangedListener); mService.addOnAppsChangedListener(mContext.getPackageName(), mAppsChangedListener); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); } Loading
core/java/android/content/pm/ShortcutServiceInternal.java +1 −2 Original line number Diff line number Diff line Loading @@ -36,8 +36,7 @@ import java.util.List; */ public abstract class ShortcutServiceInternal { public interface ShortcutChangeListener { void onShortcutChanged(@NonNull String packageName, @NonNull List<ShortcutInfo> shortcuts, @UserIdInt int userId); void onShortcutChanged(@NonNull String packageName, @UserIdInt int userId); } public abstract List<ShortcutInfo> Loading
services/core/java/com/android/server/pm/LauncherAppsService.java +90 −54 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.ILauncherApps; import android.content.pm.IOnAppsChangedListener; import android.content.pm.IPackageManager; import android.content.pm.LauncherApps.ShortcutQuery; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; Loading Loading @@ -74,9 +75,20 @@ public class LauncherAppsService extends SystemService { @Override public void onStart() { Binder.LOG_RUNTIME_EXCEPTION = true; publishBinderService(Context.LAUNCHER_APPS_SERVICE, mLauncherAppsImpl); } static class BroadcastCookie { public final UserHandle user; public final String packageName; BroadcastCookie(UserHandle userHandle, String packageName) { this.user = userHandle; this.packageName = packageName; } } @VisibleForTesting static class LauncherAppsImpl extends ILauncherApps.Stub { private static final boolean DEBUG = false; Loading Loading @@ -113,7 +125,8 @@ public class LauncherAppsService extends SystemService { * android.content.pm.IOnAppsChangedListener) */ @Override public void addOnAppsChangedListener(IOnAppsChangedListener listener) throws RemoteException { public void addOnAppsChangedListener(String callingPackage, IOnAppsChangedListener listener) throws RemoteException { synchronized (mListeners) { if (DEBUG) { Log.d(TAG, "Adding listener from " + Binder.getCallingUserHandle()); Loading @@ -125,7 +138,8 @@ public class LauncherAppsService extends SystemService { startWatchingPackageBroadcasts(); } mListeners.unregister(listener); mListeners.register(listener, Binder.getCallingUserHandle()); mListeners.register(listener, new BroadcastCookie(UserHandle.of(getCallingUserId()), callingPackage)); } } Loading Loading @@ -490,12 +504,9 @@ public class LauncherAppsService extends SystemService { } } private class MyPackageMonitor extends PackageMonitor implements ShortcutChangeListener { /** Checks if user is a profile of or same as listeningUser. * and the user is enabled. */ private boolean isEnabledProfileOf(UserHandle user, UserHandle listeningUser, boolean isEnabledProfileOf(UserHandle user, UserHandle listeningUser, String debugMsg) { if (user.getIdentifier() == listeningUser.getIdentifier()) { if (DEBUG) Log.d(TAG, "Delivering msg to same user " + debugMsg); Loading Loading @@ -526,6 +537,12 @@ public class LauncherAppsService extends SystemService { } } void postToPackageMonitor(Runnable r) { mPackageMonitor.getRegisteredHandler().post(r); } private class MyPackageMonitor extends PackageMonitor implements ShortcutChangeListener { // TODO Simplify with lambdas. @Override Loading @@ -534,8 +551,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, listeningUser, "onPackageAdded")) continue; BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, cookie.user, "onPackageAdded")) continue; try { listener.onPackageAdded(user, packageName); } catch (RemoteException re) { Loading @@ -553,8 +570,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, listeningUser, "onPackageRemoved")) continue; BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, cookie.user, "onPackageRemoved")) continue; try { listener.onPackageRemoved(user, packageName); } catch (RemoteException re) { Loading @@ -572,8 +589,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, listeningUser, "onPackageModified")) continue; BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, cookie.user, "onPackageModified")) continue; try { listener.onPackageChanged(user, packageName); } catch (RemoteException re) { Loading @@ -591,8 +608,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, listeningUser, "onPackagesAvailable")) continue; BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, cookie.user, "onPackagesAvailable")) continue; try { listener.onPackagesAvailable(user, packages, isReplacing()); } catch (RemoteException re) { Loading @@ -610,8 +627,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, listeningUser, "onPackagesUnavailable")) continue; BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, cookie.user, "onPackagesUnavailable")) continue; try { listener.onPackagesUnavailable(user, packages, isReplacing()); } catch (RemoteException re) { Loading @@ -629,8 +646,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, listeningUser, "onPackagesSuspended")) continue; BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, cookie.user, "onPackagesSuspended")) continue; try { listener.onPackagesSuspended(user, packages); } catch (RemoteException re) { Loading @@ -648,8 +665,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, listeningUser, "onPackagesUnsuspended")) continue; BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, cookie.user, "onPackagesUnsuspended")) continue; try { listener.onPackagesUnsuspended(user, packages); } catch (RemoteException re) { Loading @@ -663,20 +680,39 @@ public class LauncherAppsService extends SystemService { @Override public void onShortcutChanged(@NonNull String packageName, @NonNull List<ShortcutInfo> shortcuts, @UserIdInt int userId) { @UserIdInt int userId) { postToPackageMonitor(() -> onShortcutChangedInner(packageName, userId)); } private void onShortcutChangedInner(@NonNull String packageName, @UserIdInt int userId) { final UserHandle user = UserHandle.of(userId); final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, listeningUser, "onShortcutChanged")) continue; // STOPSHIP Skip if the receiver doesn't have the permission. BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); if (!isEnabledProfileOf(user, cookie.user, "onShortcutChanged")) continue; // Make sure the caller has the permission. if (!mShortcutServiceInternal.hasShortcutHostPermission(cookie.packageName, cookie.user.getIdentifier())) { continue; } // Each launcher has a different set of pinned shortcuts, so we need to do a // query in here. // (As of now, only one launcher has the permission at a time, so it's bit // moot, but we may change the permission model eventually.) final List<ShortcutInfo> list = mShortcutServiceInternal.getShortcuts(cookie.packageName, /* changedSince= */ 0, packageName, /* component= */ null, ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY | ShortcutQuery.FLAG_GET_PINNED | ShortcutQuery.FLAG_GET_DYNAMIC , userId); try { listener.onShortcutChanged(user, packageName, new ParceledListSlice<>(shortcuts)); new ParceledListSlice<>(list)); } catch (RemoteException re) { Slog.d(TAG, "Callback failed ", re); } Loading
services/core/java/com/android/server/pm/ShortcutService.java +26 −13 Original line number Diff line number Diff line Loading @@ -814,7 +814,7 @@ public class ShortcutService extends IShortcutService.Stub { return; } final long token = Binder.clearCallingIdentity(); final long token = injectClearCallingIdentity(); try { // Clear icon info on the shortcut. shortcut.setIconResourceId(0); Loading Loading @@ -891,7 +891,7 @@ public class ShortcutService extends IShortcutService.Stub { shortcut.clearIcon(); } } finally { Binder.restoreCallingIdentity(token); injectRestoreCallingIdentity(token); } } Loading Loading @@ -992,6 +992,10 @@ public class ShortcutService extends IShortcutService.Stub { } } void postToHandler(Runnable r) { mHandler.post(r); } /** * Throw if {@code numShortcuts} is bigger than {@link #mMaxDynamicShortcuts}. */ Loading @@ -1011,17 +1015,16 @@ public class ShortcutService extends IShortcutService.Stub { } private void notifyListeners(@NonNull String packageName, @UserIdInt int userId) { postToHandler(() -> { final ArrayList<ShortcutChangeListener> copy; final List<ShortcutInfo> shortcuts = new ArrayList<>(); synchronized (mLock) { copy = new ArrayList<>(mListeners); getPackageShortcutsLocked(packageName, userId) .findAll(shortcuts, /* query =*/ null, ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO); } // Note onShortcutChanged() needs to be called with the system service permissions. for (int i = copy.size() - 1; i >= 0; i--) { copy.get(i).onShortcutChanged(packageName, shortcuts, userId); copy.get(i).onShortcutChanged(packageName, userId); } }); } /** Loading Loading @@ -1799,6 +1802,16 @@ public class ShortcutService extends IShortcutService.Stub { return UserHandle.getUserId(injectBinderCallingUid()); } // Injection point. long injectClearCallingIdentity() { return Binder.clearCallingIdentity(); } // Injection point. void injectRestoreCallingIdentity(long token) { Binder.restoreCallingIdentity(token); } File injectSystemDataPath() { return Environment.getDataSystemDirectory(); } Loading