summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Makoto Onuki <omakoto@google.com> 2016-08-04 19:29:25 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2016-08-04 19:29:27 +0000
commit0fd8670fd548d801c96e5e51efc30bb3722f622d (patch)
treec09b335d0544dc81c33d4d261633a6f0e8a3a872
parent85e3fee7d388ad2d43bed97b3f7604ba463f6cbf (diff)
parent33525d2f1a8116820f58fc90941cb53bcba54805 (diff)
Merge "ShortcutManager: Update foreground check." into nyc-mr1-dev
-rw-r--r--core/java/android/app/ActivityManagerInternal.java8
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java5
-rw-r--r--services/core/java/com/android/server/pm/ShortcutService.java15
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java4
4 files changed, 30 insertions, 2 deletions
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index 83e2678c37c2..0ba937a3f16b 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -171,4 +171,12 @@ public abstract class ActivityManagerInternal {
*/
public abstract int startActivitiesAsPackage(String packageName,
int userId, Intent[] intents, Bundle bOptions);
+
+ /**
+ * Get the procstate for the UID. The return value will be between
+ * {@link ActivityManager#MIN_PROCESS_STATE} and {@link ActivityManager#MAX_PROCESS_STATE}.
+ * Note if the UID doesn't exist, it'll return {@link ActivityManager#PROCESS_STATE_NONEXISTENT}
+ * (-1).
+ */
+ public abstract int getUidProcessState(int uid);
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 87036cf54601..5cd0255f1cb3 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -21942,6 +21942,11 @@ public final class ActivityManagerService extends ActivityManagerNative
/*resultTo*/ null, bOptions, userId);
}
}
+
+ @Override
+ public int getUidProcessState(int uid) {
+ return getUidState(uid);
+ }
}
private final class SleepTokenImpl extends SleepToken {
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 8d400b5ed38b..558467b2ef85 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -20,6 +20,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
+import android.app.ActivityManagerInternal;
import android.app.ActivityManagerNative;
import android.app.AppGlobals;
import android.app.IUidObserver;
@@ -284,6 +285,7 @@ public class ShortcutService extends IShortcutService.Stub {
private final PackageManagerInternal mPackageManagerInternal;
private final UserManager mUserManager;
private final UsageStatsManagerInternal mUsageStatsManagerInternal;
+ private final ActivityManagerInternal mActivityManagerInternal;
@GuardedBy("mLock")
final SparseIntArray mUidState = new SparseIntArray();
@@ -372,6 +374,8 @@ public class ShortcutService extends IShortcutService.Stub {
mUserManager = Preconditions.checkNotNull(context.getSystemService(UserManager.class));
mUsageStatsManagerInternal = Preconditions.checkNotNull(
LocalServices.getService(UsageStatsManagerInternal.class));
+ mActivityManagerInternal = Preconditions.checkNotNull(
+ LocalServices.getService(ActivityManagerInternal.class));
if (onlyForPackageManagerApis) {
return; // Don't do anything further. For unit tests only.
@@ -456,7 +460,8 @@ public class ShortcutService extends IShortcutService.Stub {
}
private boolean isProcessStateForeground(int processState) {
- return processState <= PROCESS_STATE_FOREGROUND_THRESHOLD;
+ return (processState != ActivityManager.PROCESS_STATE_NONEXISTENT)
+ && (processState <= PROCESS_STATE_FOREGROUND_THRESHOLD);
}
boolean isUidForegroundLocked(int uid) {
@@ -465,7 +470,13 @@ public class ShortcutService extends IShortcutService.Stub {
// so it's foreground anyway.
return true;
}
- return isProcessStateForeground(mUidState.get(uid, ActivityManager.MAX_PROCESS_STATE));
+ // First, check with the local cache.
+ if (isProcessStateForeground(mUidState.get(uid, ActivityManager.MAX_PROCESS_STATE))) {
+ return true;
+ }
+ // If the cache says background, reach out to AM. Since it'll internally need to hold
+ // the AM lock, we use it as a last resort.
+ return isProcessStateForeground(mActivityManagerInternal.getUidProcessState(uid));
}
long getUidLastForegroundElapsedTimeLocked(int uid) {
diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
index d003e5647c03..e7f33457bb5f 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -36,6 +36,7 @@ import static org.mockito.Mockito.when;
import android.annotation.NonNull;
import android.annotation.UserIdInt;
import android.app.Activity;
+import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.IUidObserver;
import android.app.usage.UsageStatsManagerInternal;
@@ -715,6 +716,9 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
return b(mRunningUsers.get(userId)) && b(mUnlockedUsers.get(userId));
}));
+ when(mMockActivityManagerInternal.getUidProcessState(anyInt())).thenReturn(
+ ActivityManager.PROCESS_STATE_CACHED_EMPTY);
+
// User 0 and P0 are always running
mRunningUsers.put(USER_0, true);
mRunningUsers.put(USER_10, false);