Loading services/core/java/com/android/server/pm/LauncherAppsService.java +48 −4 Original line number Diff line number Diff line Loading @@ -92,6 +92,7 @@ import android.graphics.Rect; import android.multiuser.Flags; import android.net.Uri; import android.os.Binder; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IInterface; Loading Loading @@ -214,7 +215,7 @@ public class LauncherAppsService extends SystemService { @VisibleForTesting static class LauncherAppsImpl extends ILauncherApps.Stub { private static final boolean DEBUG = false; private static final boolean DEBUG = Build.IS_DEBUGGABLE; private static final String TAG = "LauncherAppsService"; private static final String NAMESPACE_MULTIUSER = "multiuser"; private static final String FLAG_NON_SYSTEM_ACCESS_TO_HIDDEN_PROFILES = Loading Loading @@ -495,8 +496,28 @@ public class LauncherAppsService extends SystemService { private boolean canAccessProfile(int callingUid, int callingUserId, int callingPid, int targetUserId, String message) { if (targetUserId == callingUserId) return true; if (DEBUG) { final AndroidPackage callingPackage = mPackageManagerInternal.getPackage(callingUid); final String callingPackageName = callingPackage == null ? null : callingPackage.getPackageName(); Slog.v(TAG, "canAccessProfile called by " + callingPackageName + " for user " + callingUserId + " requesting to access user " + targetUserId + " when invoking " + message); } if (targetUserId == callingUserId) { if (DEBUG) { Slog.v(TAG, message + " passed canAccessProfile for targetuser" + targetUserId + " because it is the same as the calling user"); } return true; } if (injectHasInteractAcrossUsersFullPermission(callingPid, callingUid)) { if (DEBUG) { Slog.v(TAG, message + " passed because calling process" + "has permission to interact across users"); } return true; } Loading @@ -514,11 +535,25 @@ public class LauncherAppsService extends SystemService { if (isHiddenProfile(UserHandle.of(targetUserId)) && !canAccessHiddenProfile(callingUid, callingPid)) { Slog.w(TAG, message + " for hidden profile user " + targetUserId + " from " + callingUserId + " not allowed"); return false; } return mUserManagerInternal.isProfileAccessible(callingUserId, targetUserId, message, true); final boolean ret = mUserManagerInternal.isProfileAccessible( callingUserId, targetUserId, message, true); if (DEBUG) { final AndroidPackage callingPackage = mPackageManagerInternal.getPackage(callingUid); final String callingPackageName = callingPackage == null ? null : callingPackage.getPackageName(); Slog.v(TAG, "canAccessProfile returned " + ret + " for " + callingPackageName + " for user " + callingUserId + " requesting to access user " + targetUserId + " when invoking " + message); } return ret; } private boolean isHiddenProfile(UserHandle targetUser) { Loading Loading @@ -1341,6 +1376,10 @@ public class LauncherAppsService extends SystemService { @Override public void pinShortcuts(String callingPackage, String packageName, List<String> ids, UserHandle targetUser) { if (DEBUG) { Slog.v(TAG, "pinShortcuts: " + callingPackage + " is pinning shortcuts from " + packageName + " for user " + targetUser); } if (!mShortcutServiceInternal .areShortcutsSupportedOnHomeScreen(targetUser.getIdentifier())) { // Requires strict ACCESS_SHORTCUTS permission for user-profiles with items Loading @@ -1351,6 +1390,11 @@ public class LauncherAppsService extends SystemService { } ensureShortcutPermission(callingPackage); if (!canAccessProfile(targetUser.getIdentifier(), "Cannot pin shortcuts")) { if (DEBUG) { Slog.v(TAG, "pinShortcuts: " + callingPackage + " is pinning shortcuts from " + packageName + " for user " + targetUser + " but cannot access profile"); } return; } Loading services/core/java/com/android/server/pm/ShortcutLauncher.java +18 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * Launcher information used by {@link ShortcutService}. Loading Loading @@ -128,9 +129,15 @@ class ShortcutLauncher extends ShortcutPackageItem { */ public void pinShortcuts(@UserIdInt int packageUserId, @NonNull String packageName, @NonNull List<String> ids, boolean forPinRequest) { if (ShortcutService.DEBUG) { Slog.v(TAG, "ShortcutLauncher#pinShortcuts: pin shortcuts from " + packageName + " with userId=" + packageUserId + " shortcutIds=" + ids.stream().collect(Collectors.joining(", ", "[", "]"))); } final ShortcutPackage packageShortcuts = mShortcutUser.getPackageShortcutsIfExists(packageName); if (packageShortcuts == null) { Slog.w(TAG, "ShortcutLauncher#pinShortcuts packageShortcuts is null"); return; // No need to instantiate. } Loading @@ -155,6 +162,10 @@ class ShortcutLauncher extends ShortcutPackageItem { final String id = ids.get(i); final ShortcutInfo si = packageShortcuts.findShortcutById(id); if (si == null) { if (ShortcutService.DEBUG) { Slog.w(TAG, "ShortcutLauncher#pinShortcuts: cannot pin " + id + " because it does not exist"); } continue; } if (si.isDynamic() || si.isLongLived() Loading @@ -174,6 +185,13 @@ class ShortcutLauncher extends ShortcutPackageItem { } } } if (ShortcutService.DEBUG) { Slog.v(TAG, "ShortcutLauncher#pinShortcuts: " + " newSet: " + newSet.stream().collect( Collectors.joining(", ", "[", "]")) + " floatingSet: " + floatingSet.stream().collect( Collectors.joining(", ", "[", "]"))); } mPinnedShortcuts.put(up, newSet); } } Loading services/core/java/com/android/server/pm/ShortcutPackage.java +5 −0 Original line number Diff line number Diff line Loading @@ -729,6 +729,11 @@ class ShortcutPackage extends ShortcutPackageItem { } pinnedShortcuts.addAll(pinned); }); if (ShortcutService.DEBUG) { Slog.v(TAG, "ShortcutPackage#refreshPinnedFlags: " + " pinnedShortcuts: " + pinnedShortcuts.stream().collect( Collectors.joining(", ", "[", "]"))); } // Secondly, update the pinned state if necessary. final List<ShortcutInfo> pinned = findAll(pinnedShortcuts); if (pinned != null) { Loading services/core/java/com/android/server/pm/ShortcutService.java +22 −1 Original line number Diff line number Diff line Loading @@ -169,7 +169,7 @@ import java.util.stream.Collectors; public class ShortcutService extends IShortcutService.Stub { static final String TAG = "ShortcutService"; static final boolean DEBUG = false; // STOPSHIP if true static final boolean DEBUG = Build.IS_DEBUGGABLE; // STOPSHIP if true static final boolean DEBUG_LOAD = false; // STOPSHIP if true static final boolean DEBUG_PROCSTATE = false; // STOPSHIP if true static final boolean DEBUG_REBOOT = Build.IS_DEBUGGABLE; Loading Loading @@ -3206,6 +3206,11 @@ public class ShortcutService extends IShortcutService.Stub { public void pinShortcuts(int launcherUserId, @NonNull String callingPackage, @NonNull String packageName, @NonNull List<String> shortcutIds, int userId) { if (DEBUG) { Slog.v(TAG, "pinShortcuts: " + callingPackage + ", with userId=" + launcherUserId + ", is trying to pin shortcuts from " + packageName + " with userId=" + userId); } // Calling permission must be checked by LauncherAppsImpl. Preconditions.checkStringNotEmpty(packageName, "packageName"); Objects.requireNonNull(shortcutIds, "shortcutIds"); Loading @@ -3230,6 +3235,11 @@ public class ShortcutService extends IShortcutService.Stub { && !si.isDeclaredInManifest(), ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO, callingPackage, launcherUserId, false); } else { if (DEBUG) { Slog.w(TAG, "specified package " + packageName + ", with userId=" + userId + ", doesn't exist."); } } // Get list of shortcuts that will get unpinned. ArraySet<String> oldPinnedIds = launcher.getPinnedShortcutIds(packageName, userId); Loading Loading @@ -5448,6 +5458,17 @@ public class ShortcutService extends IShortcutService.Stub { */ private List<ShortcutInfo> prepareChangedShortcuts(ArraySet<String> changedIds, ArraySet<String> newIds, List<ShortcutInfo> deletedList, final ShortcutPackage ps) { if (DEBUG) { Slog.v(TAG, "prepareChangedShortcuts: " + " changedIds=" + (changedIds == null ? "n/a" : changedIds.stream().collect(Collectors.joining(", ", "[", "]"))) + " newIds=" + (newIds == null ? "n/a" : newIds.stream().collect(Collectors.joining(", ", "[", "]"))) + " deletedList=" + (deletedList == null ? "n/a" : deletedList.stream().map(ShortcutInfo::getId).collect( Collectors.joining(", ", "[", "]"))) + " ps=" + (ps == null ? "n/a" : ps.getPackageName())); } if (ps == null) { // This can happen when package restore is not finished yet. return null; Loading Loading
services/core/java/com/android/server/pm/LauncherAppsService.java +48 −4 Original line number Diff line number Diff line Loading @@ -92,6 +92,7 @@ import android.graphics.Rect; import android.multiuser.Flags; import android.net.Uri; import android.os.Binder; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IInterface; Loading Loading @@ -214,7 +215,7 @@ public class LauncherAppsService extends SystemService { @VisibleForTesting static class LauncherAppsImpl extends ILauncherApps.Stub { private static final boolean DEBUG = false; private static final boolean DEBUG = Build.IS_DEBUGGABLE; private static final String TAG = "LauncherAppsService"; private static final String NAMESPACE_MULTIUSER = "multiuser"; private static final String FLAG_NON_SYSTEM_ACCESS_TO_HIDDEN_PROFILES = Loading Loading @@ -495,8 +496,28 @@ public class LauncherAppsService extends SystemService { private boolean canAccessProfile(int callingUid, int callingUserId, int callingPid, int targetUserId, String message) { if (targetUserId == callingUserId) return true; if (DEBUG) { final AndroidPackage callingPackage = mPackageManagerInternal.getPackage(callingUid); final String callingPackageName = callingPackage == null ? null : callingPackage.getPackageName(); Slog.v(TAG, "canAccessProfile called by " + callingPackageName + " for user " + callingUserId + " requesting to access user " + targetUserId + " when invoking " + message); } if (targetUserId == callingUserId) { if (DEBUG) { Slog.v(TAG, message + " passed canAccessProfile for targetuser" + targetUserId + " because it is the same as the calling user"); } return true; } if (injectHasInteractAcrossUsersFullPermission(callingPid, callingUid)) { if (DEBUG) { Slog.v(TAG, message + " passed because calling process" + "has permission to interact across users"); } return true; } Loading @@ -514,11 +535,25 @@ public class LauncherAppsService extends SystemService { if (isHiddenProfile(UserHandle.of(targetUserId)) && !canAccessHiddenProfile(callingUid, callingPid)) { Slog.w(TAG, message + " for hidden profile user " + targetUserId + " from " + callingUserId + " not allowed"); return false; } return mUserManagerInternal.isProfileAccessible(callingUserId, targetUserId, message, true); final boolean ret = mUserManagerInternal.isProfileAccessible( callingUserId, targetUserId, message, true); if (DEBUG) { final AndroidPackage callingPackage = mPackageManagerInternal.getPackage(callingUid); final String callingPackageName = callingPackage == null ? null : callingPackage.getPackageName(); Slog.v(TAG, "canAccessProfile returned " + ret + " for " + callingPackageName + " for user " + callingUserId + " requesting to access user " + targetUserId + " when invoking " + message); } return ret; } private boolean isHiddenProfile(UserHandle targetUser) { Loading Loading @@ -1341,6 +1376,10 @@ public class LauncherAppsService extends SystemService { @Override public void pinShortcuts(String callingPackage, String packageName, List<String> ids, UserHandle targetUser) { if (DEBUG) { Slog.v(TAG, "pinShortcuts: " + callingPackage + " is pinning shortcuts from " + packageName + " for user " + targetUser); } if (!mShortcutServiceInternal .areShortcutsSupportedOnHomeScreen(targetUser.getIdentifier())) { // Requires strict ACCESS_SHORTCUTS permission for user-profiles with items Loading @@ -1351,6 +1390,11 @@ public class LauncherAppsService extends SystemService { } ensureShortcutPermission(callingPackage); if (!canAccessProfile(targetUser.getIdentifier(), "Cannot pin shortcuts")) { if (DEBUG) { Slog.v(TAG, "pinShortcuts: " + callingPackage + " is pinning shortcuts from " + packageName + " for user " + targetUser + " but cannot access profile"); } return; } Loading
services/core/java/com/android/server/pm/ShortcutLauncher.java +18 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * Launcher information used by {@link ShortcutService}. Loading Loading @@ -128,9 +129,15 @@ class ShortcutLauncher extends ShortcutPackageItem { */ public void pinShortcuts(@UserIdInt int packageUserId, @NonNull String packageName, @NonNull List<String> ids, boolean forPinRequest) { if (ShortcutService.DEBUG) { Slog.v(TAG, "ShortcutLauncher#pinShortcuts: pin shortcuts from " + packageName + " with userId=" + packageUserId + " shortcutIds=" + ids.stream().collect(Collectors.joining(", ", "[", "]"))); } final ShortcutPackage packageShortcuts = mShortcutUser.getPackageShortcutsIfExists(packageName); if (packageShortcuts == null) { Slog.w(TAG, "ShortcutLauncher#pinShortcuts packageShortcuts is null"); return; // No need to instantiate. } Loading @@ -155,6 +162,10 @@ class ShortcutLauncher extends ShortcutPackageItem { final String id = ids.get(i); final ShortcutInfo si = packageShortcuts.findShortcutById(id); if (si == null) { if (ShortcutService.DEBUG) { Slog.w(TAG, "ShortcutLauncher#pinShortcuts: cannot pin " + id + " because it does not exist"); } continue; } if (si.isDynamic() || si.isLongLived() Loading @@ -174,6 +185,13 @@ class ShortcutLauncher extends ShortcutPackageItem { } } } if (ShortcutService.DEBUG) { Slog.v(TAG, "ShortcutLauncher#pinShortcuts: " + " newSet: " + newSet.stream().collect( Collectors.joining(", ", "[", "]")) + " floatingSet: " + floatingSet.stream().collect( Collectors.joining(", ", "[", "]"))); } mPinnedShortcuts.put(up, newSet); } } Loading
services/core/java/com/android/server/pm/ShortcutPackage.java +5 −0 Original line number Diff line number Diff line Loading @@ -729,6 +729,11 @@ class ShortcutPackage extends ShortcutPackageItem { } pinnedShortcuts.addAll(pinned); }); if (ShortcutService.DEBUG) { Slog.v(TAG, "ShortcutPackage#refreshPinnedFlags: " + " pinnedShortcuts: " + pinnedShortcuts.stream().collect( Collectors.joining(", ", "[", "]"))); } // Secondly, update the pinned state if necessary. final List<ShortcutInfo> pinned = findAll(pinnedShortcuts); if (pinned != null) { Loading
services/core/java/com/android/server/pm/ShortcutService.java +22 −1 Original line number Diff line number Diff line Loading @@ -169,7 +169,7 @@ import java.util.stream.Collectors; public class ShortcutService extends IShortcutService.Stub { static final String TAG = "ShortcutService"; static final boolean DEBUG = false; // STOPSHIP if true static final boolean DEBUG = Build.IS_DEBUGGABLE; // STOPSHIP if true static final boolean DEBUG_LOAD = false; // STOPSHIP if true static final boolean DEBUG_PROCSTATE = false; // STOPSHIP if true static final boolean DEBUG_REBOOT = Build.IS_DEBUGGABLE; Loading Loading @@ -3206,6 +3206,11 @@ public class ShortcutService extends IShortcutService.Stub { public void pinShortcuts(int launcherUserId, @NonNull String callingPackage, @NonNull String packageName, @NonNull List<String> shortcutIds, int userId) { if (DEBUG) { Slog.v(TAG, "pinShortcuts: " + callingPackage + ", with userId=" + launcherUserId + ", is trying to pin shortcuts from " + packageName + " with userId=" + userId); } // Calling permission must be checked by LauncherAppsImpl. Preconditions.checkStringNotEmpty(packageName, "packageName"); Objects.requireNonNull(shortcutIds, "shortcutIds"); Loading @@ -3230,6 +3235,11 @@ public class ShortcutService extends IShortcutService.Stub { && !si.isDeclaredInManifest(), ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO, callingPackage, launcherUserId, false); } else { if (DEBUG) { Slog.w(TAG, "specified package " + packageName + ", with userId=" + userId + ", doesn't exist."); } } // Get list of shortcuts that will get unpinned. ArraySet<String> oldPinnedIds = launcher.getPinnedShortcutIds(packageName, userId); Loading Loading @@ -5448,6 +5458,17 @@ public class ShortcutService extends IShortcutService.Stub { */ private List<ShortcutInfo> prepareChangedShortcuts(ArraySet<String> changedIds, ArraySet<String> newIds, List<ShortcutInfo> deletedList, final ShortcutPackage ps) { if (DEBUG) { Slog.v(TAG, "prepareChangedShortcuts: " + " changedIds=" + (changedIds == null ? "n/a" : changedIds.stream().collect(Collectors.joining(", ", "[", "]"))) + " newIds=" + (newIds == null ? "n/a" : newIds.stream().collect(Collectors.joining(", ", "[", "]"))) + " deletedList=" + (deletedList == null ? "n/a" : deletedList.stream().map(ShortcutInfo::getId).collect( Collectors.joining(", ", "[", "]"))) + " ps=" + (ps == null ? "n/a" : ps.getPackageName())); } if (ps == null) { // This can happen when package restore is not finished yet. return null; Loading