summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/MountService.java41
1 files changed, 38 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java
index 14f8a00..96821c7 100644
--- a/services/core/java/com/android/server/MountService.java
+++ b/services/core/java/com/android/server/MountService.java
@@ -28,12 +28,15 @@ import static org.xmlpull.v1.XmlPullParser.START_TAG;
import android.Manifest;
import android.app.ActivityManagerNative;
import android.app.AppOpsManager;
+import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.IPackageMoveObserver;
import android.content.pm.PackageManager;
+import android.content.pm.UserInfo;
import android.content.res.Configuration;
import android.content.res.ObbInfo;
import android.mtp.MtpStorage;
@@ -619,6 +622,26 @@ class MountService extends IMountService.Stub
private final Handler mHandler;
+ private BroadcastReceiver mUserReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
+
+ try {
+ if (Intent.ACTION_USER_ADDED.equals(action)) {
+ final UserManager um = mContext.getSystemService(UserManager.class);
+ final int userSerialNumber = um.getUserSerialNumber(userId);
+ mConnector.execute("volume", "user_added", userId, userSerialNumber);
+ } else if (Intent.ACTION_USER_REMOVED.equals(action)) {
+ mConnector.execute("volume", "user_removed", userId);
+ }
+ } catch (NativeDaemonConnectorException e) {
+ Slog.w(TAG, "Failed to send user details to vold", e);
+ }
+ }
+ };
+
@Override
public void waitForAsecScan() {
waitForLatch(mAsecsScanned, "mAsecsScanned");
@@ -674,8 +697,15 @@ class MountService extends IMountService.Stub
try {
mConnector.execute("volume", "reset");
+
+ // Tell vold about all existing and started users
+ final UserManager um = mContext.getSystemService(UserManager.class);
+ final List<UserInfo> users = um.getUsers();
+ for (UserInfo user : users) {
+ mConnector.execute("volume", "user_added", user.id, user.serialNumber);
+ }
for (int userId : mStartedUsers) {
- mConnector.execute("volume", "start_user", userId);
+ mConnector.execute("volume", "user_started", userId);
}
} catch (NativeDaemonConnectorException e) {
Slog.w(TAG, "Failed to reset vold", e);
@@ -690,7 +720,7 @@ class MountService extends IMountService.Stub
// staging area is ready so it's ready for zygote-forked apps to
// bind mount against.
try {
- mConnector.execute("volume", "start_user", userId);
+ mConnector.execute("volume", "user_started", userId);
} catch (NativeDaemonConnectorException ignored) {
}
@@ -715,7 +745,7 @@ class MountService extends IMountService.Stub
Slog.d(TAG, "onCleanupUser " + userId);
try {
- mConnector.execute("volume", "cleanup_user", userId);
+ mConnector.execute("volume", "user_stopped", userId);
} catch (NativeDaemonConnectorException ignored) {
}
@@ -1209,6 +1239,11 @@ class MountService extends IMountService.Stub
Thread crypt_thread = new Thread(mCryptConnector, CRYPTD_TAG);
crypt_thread.start();
+ final IntentFilter userFilter = new IntentFilter();
+ userFilter.addAction(Intent.ACTION_USER_ADDED);
+ userFilter.addAction(Intent.ACTION_USER_REMOVED);
+ mContext.registerReceiver(mUserReceiver, userFilter, null, mHandler);
+
// Add ourself to the Watchdog monitors if enabled.
if (WATCHDOG_ENABLE) {
Watchdog.getInstance().addMonitor(this);