Merge "Send added user serial numbers to vold." into mnc-dev
diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java
index 9dbd8e7..aa7d1f8 100644
--- a/services/core/java/com/android/server/MountService.java
+++ b/services/core/java/com/android/server/MountService.java
@@ -28,12 +28,15 @@
 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;
@@ -618,6 +621,26 @@
 
     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");
@@ -673,8 +696,15 @@
 
             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);
@@ -689,7 +719,7 @@
         // 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) {
         }
 
@@ -714,7 +744,7 @@
         Slog.d(TAG, "onCleanupUser " + userId);
 
         try {
-            mConnector.execute("volume", "cleanup_user", userId);
+            mConnector.execute("volume", "user_stopped", userId);
         } catch (NativeDaemonConnectorException ignored) {
         }
 
@@ -1208,6 +1238,11 @@
         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);