summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenny Guy <kennyguy@google.com>2014-03-06 10:41:29 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-03-06 10:41:29 +0000
commit34a0992512a6b991cb9f98034437e205f8170be2 (patch)
tree5644dbfbfcd6801d35de6aa9eed9fc2ab688013d
parent97ae538554e5d894774ddd55c266434ce1d67492 (diff)
parent6143a02f96a5c6c7a0a84f5dbe70732998256a72 (diff)
downloadframeworks_base-34a0992512a6b991cb9f98034437e205f8170be2.zip
frameworks_base-34a0992512a6b991cb9f98034437e205f8170be2.tar.gz
frameworks_base-34a0992512a6b991cb9f98034437e205f8170be2.tar.bz2
Merge "Start related users on boot and user switch."
-rw-r--r--cmds/pm/src/com/android/commands/pm/Pm.java6
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java44
2 files changed, 47 insertions, 3 deletions
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index 9ad2e76..d513a10 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -18,6 +18,7 @@ package com.android.commands.pm;
import android.app.ActivityManager;
import android.app.ActivityManagerNative;
+import android.app.IActivityManager;
import android.content.ComponentName;
import android.content.pm.ApplicationInfo;
import android.content.pm.ContainerEncryptionParams;
@@ -1089,13 +1090,16 @@ public final class Pm {
public void runListUsers() {
try {
+ IActivityManager am = ActivityManagerNative.getDefault();
+
List<UserInfo> users = mUm.getUsers(false);
if (users == null) {
System.err.println("Error: couldn't get users");
} else {
System.out.println("Users:");
for (int i = 0; i < users.size(); i++) {
- System.out.println("\t" + users.get(i).toString());
+ String running = am.isUserRunning(users.get(i).id, false) ? " running" : "";
+ System.out.println("\t" + users.get(i).toString() + running);
}
}
} catch (RemoteException e) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 0b0b4ef..782868e 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -1073,6 +1073,7 @@ public final class ActivityManagerService extends ActivityManagerNative
static final int IMMERSIVE_MODE_LOCK_MSG = 37;
static final int PERSIST_URI_GRANTS_MSG = 38;
static final int REQUEST_ALL_PSS_MSG = 39;
+ static final int START_RELATED_USERS_MSG = 40;
static final int FIRST_ACTIVITY_STACK_MSG = 100;
static final int FIRST_BROADCAST_QUEUE_MSG = 200;
@@ -1686,6 +1687,12 @@ public final class ActivityManagerService extends ActivityManagerNative
requestPssAllProcsLocked(SystemClock.uptimeMillis(), true, false);
break;
}
+ case START_RELATED_USERS_MSG: {
+ synchronized (ActivityManagerService.this) {
+ startRelatedUsersLocked();
+ }
+ break;
+ }
}
}
};
@@ -5164,10 +5171,11 @@ public final class ActivityManagerService extends ActivityManagerNative
userId);
}
}
+ scheduleStartRelatedUsersLocked();
}
}
}
-
+
final void ensureBootCompleted() {
boolean booting;
boolean enableScreen;
@@ -5177,7 +5185,7 @@ public final class ActivityManagerService extends ActivityManagerNative
enableScreen = !mBooted;
mBooted = true;
}
-
+
if (booting) {
finishBooting();
}
@@ -16105,6 +16113,8 @@ public final class ActivityManagerService extends ActivityManagerNative
throw new SecurityException(msg);
}
+ if (DEBUG_MU) Slog.i(TAG_MU, "starting userid:" + userId + " fore:" + foreground);
+
final long ident = Binder.clearCallingIdentity();
try {
synchronized (this) {
@@ -16365,6 +16375,32 @@ public final class ActivityManagerService extends ActivityManagerNative
}
}
+ void scheduleStartRelatedUsersLocked() {
+ if (!mHandler.hasMessages(START_RELATED_USERS_MSG)) {
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(START_RELATED_USERS_MSG),
+ DateUtils.SECOND_IN_MILLIS);
+ }
+ }
+
+ void startRelatedUsersLocked() {
+ if (DEBUG_MU) Slog.i(TAG_MU, "startRelatedUsersLocked");
+ List<UserInfo> relatedUsers = getUserManagerLocked().getRelatedUsers(mCurrentUserId);
+ List<UserInfo> toStart = new ArrayList<UserInfo>(relatedUsers.size());
+ for (UserInfo relatedUser : relatedUsers) {
+ if ((relatedUser.flags & UserInfo.FLAG_INITIALIZED) == UserInfo.FLAG_INITIALIZED) {
+ toStart.add(relatedUser);
+ }
+ }
+ final int n = toStart.size();
+ int i = 0;
+ for (; i < n && i < (MAX_RUNNING_USERS - 1); ++i) {
+ startUserInBackground(toStart.get(i).id);
+ }
+ if (i < n) {
+ Slog.w(TAG_MU, "More related users than MAX_RUNNING_USERS");
+ }
+ }
+
void finishUserSwitch(UserStartedState uss) {
synchronized (this) {
if (uss.mState == UserStartedState.STATE_BOOTING
@@ -16379,6 +16415,9 @@ public final class ActivityManagerService extends ActivityManagerNative
android.Manifest.permission.RECEIVE_BOOT_COMPLETED, AppOpsManager.OP_NONE,
true, false, MY_PID, Process.SYSTEM_UID, userId);
}
+
+ startRelatedUsersLocked();
+
int num = mUserLru.size();
int i = 0;
while (num > MAX_RUNNING_USERS && i < mUserLru.size()) {
@@ -16430,6 +16469,7 @@ public final class ActivityManagerService extends ActivityManagerNative
}
private int stopUserLocked(final int userId, final IStopUserCallback callback) {
+ if (DEBUG_MU) Slog.i(TAG_MU, "stopUserLocked userId=" + userId);
if (mCurrentUserId == userId) {
return ActivityManager.USER_OP_IS_CURRENT;
}