Merge "Add logging to debug HSUM in LauncherApps#pinShortcuts" into main
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index 023f765..ee15bec 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -92,6 +92,7 @@
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;
@@ -214,7 +215,7 @@
@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 =
@@ -495,8 +496,28 @@
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;
}
@@ -514,11 +535,25 @@
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) {
@@ -1341,6 +1376,10 @@
@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
@@ -1351,6 +1390,11 @@
}
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;
}
diff --git a/services/core/java/com/android/server/pm/ShortcutLauncher.java b/services/core/java/com/android/server/pm/ShortcutLauncher.java
index 045d4db..d65e30b 100644
--- a/services/core/java/com/android/server/pm/ShortcutLauncher.java
+++ b/services/core/java/com/android/server/pm/ShortcutLauncher.java
@@ -42,6 +42,7 @@
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
+import java.util.stream.Collectors;
/**
* Launcher information used by {@link ShortcutService}.
@@ -128,9 +129,15 @@
*/
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.
}
@@ -155,6 +162,10 @@
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()
@@ -174,6 +185,13 @@
}
}
}
+ if (ShortcutService.DEBUG) {
+ Slog.v(TAG, "ShortcutLauncher#pinShortcuts: "
+ + " newSet: " + newSet.stream().collect(
+ Collectors.joining(", ", "[", "]"))
+ + " floatingSet: " + floatingSet.stream().collect(
+ Collectors.joining(", ", "[", "]")));
+ }
mPinnedShortcuts.put(up, newSet);
}
}
diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java
index 60056eb..c9ad498 100644
--- a/services/core/java/com/android/server/pm/ShortcutPackage.java
+++ b/services/core/java/com/android/server/pm/ShortcutPackage.java
@@ -729,6 +729,11 @@
}
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) {
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index a3ff195..ea495c9 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -169,7 +169,7 @@
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;
@@ -3206,6 +3206,11 @@
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");
@@ -3230,6 +3235,11 @@
&& !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);
@@ -5448,6 +5458,17 @@
*/
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;