Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 13593607 authored by Amith Yamasani's avatar Amith Yamasani
Browse files

User management and switching

Broadcast intents that get sent out when users are added/removed/switched.

More work on generating user-specific information in package manager queries.
APIs to update user name and query a user by id.
Removed Package.mSetStopped and mSetEnabled, since they're not user specific.

User removal:
- Cleanup ActivityManager, PackageManager, WallpaperManager, AppWidgetService
  and AccountManager.
- Shutdown processes belonging to the user.

Don't show vibrate option in long-press power if there's no vibrator.

Lock the screen when switching users, to force unlocking.

Change-Id: Ib23a721cb75285eef5fd6ba8c7272462764038fa
parent 0c44525a
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -231,6 +231,14 @@ public class AccountManagerService
            }
        }, intentFilter);

        IntentFilter userFilter = new IntentFilter();
        userFilter.addAction(Intent.ACTION_USER_REMOVED);
        mContext.registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                onUserRemoved(intent);
            }
        }, userFilter);
    }

    private UserAccounts initUser(int userId) {
@@ -347,6 +355,28 @@ public class AccountManagerService
        }
    }

    private void onUserRemoved(Intent intent) {
        int userId = intent.getIntExtra(Intent.EXTRA_USERID, -1);
        if (userId < 1) return;

        UserAccounts accounts;
        synchronized (mUsers) {
            accounts = mUsers.get(userId);
            mUsers.remove(userId);
        }
        if (accounts == null) {
            File dbFile = new File(getDatabaseName(userId));
            dbFile.delete();
            return;
        }

        synchronized (accounts.cacheLock) {
            accounts.openHelper.close();
            File dbFile = new File(getDatabaseName(userId));
            dbFile.delete();
        }
    }

    private List<UserInfo> getAllUsers() {
        try {
            return AppGlobals.getPackageManager().getUsers();
+16 −1
Original line number Diff line number Diff line
@@ -1211,6 +1211,18 @@ final class ApplicationPackageManager extends PackageManager {
        }
    }

    /**
     * @hide
     */
    @Override
    public UserInfo getUser(int userId) {
        try {
            return mPM.getUser(userId);
        } catch (RemoteException re) {
            return null;
        }
    }

    /**
     * @hide
     */
@@ -1228,7 +1240,10 @@ final class ApplicationPackageManager extends PackageManager {
     */
    @Override
    public void updateUserName(int id, String name) {
        // TODO:
        try {
            mPM.updateUserName(id, name);
        } catch (RemoteException re) {
        }
    }

    /**
+31 −0
Original line number Diff line number Diff line
@@ -2141,6 +2141,30 @@ public class Intent implements Parcelable, Cloneable {
    public static final String ACTION_PRE_BOOT_COMPLETED =
            "android.intent.action.PRE_BOOT_COMPLETED";

    /**
     * Broadcast sent to the system when a user is added. Carries an extra EXTRA_USERID that has the
     * userid of the new user.
     * @hide
     */
    public static final String ACTION_USER_ADDED =
            "android.intent.action.USER_ADDED";

    /**
     * Broadcast sent to the system when a user is removed. Carries an extra EXTRA_USERID that has
     * the userid of the user.
     * @hide
     */
    public static final String ACTION_USER_REMOVED =
            "android.intent.action.USER_REMOVED";

    /**
     * Broadcast sent to the system when the user switches. Carries an extra EXTRA_USERID that has
     * the userid of the user to become the current one.
     * @hide
     */
    public static final String ACTION_USER_SWITCHED =
            "android.intent.action.USER_SWITCHED";

    // ---------------------------------------------------------------------
    // ---------------------------------------------------------------------
    // Standard intent categories (see addCategory()).
@@ -2682,6 +2706,13 @@ public class Intent implements Parcelable, Cloneable {
    public static final String EXTRA_LOCAL_ONLY =
        "android.intent.extra.LOCAL_ONLY";

    /**
     * The userid carried with broadcast intents related to addition, removal and switching of users
     * - {@link #ACTION_USER_ADDED}, {@link #ACTION_USER_REMOVED} and {@link #ACTION_USER_SWITCHED}.
     * @hide
     */
    public static final String EXTRA_USERID =
            "android.intent.extra.user_id";
    // ---------------------------------------------------------------------
    // ---------------------------------------------------------------------
    // Intent flags (see mFlags variable).
+23 −0
Original line number Diff line number Diff line
@@ -326,6 +326,13 @@ public class SyncManager implements OnAccountsUpdateListener {
        }
    };

    private BroadcastReceiver mUserIntentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            onUserRemoved(intent);
        }
    };

    private static final String ACTION_SYNC_ALARM = "android.content.syncmanager.SYNC_ALARM";
    private final SyncHandler mSyncHandler;

@@ -420,6 +427,10 @@ public class SyncManager implements OnAccountsUpdateListener {
        intentFilter.setPriority(100);
        context.registerReceiver(mShutdownIntentReceiver, intentFilter);

        intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_USER_REMOVED);
        mContext.registerReceiver(mUserIntentReceiver, intentFilter);

        if (!factoryTest) {
            mNotificationMgr = (NotificationManager)
                context.getSystemService(Context.NOTIFICATION_SERVICE);
@@ -905,6 +916,18 @@ public class SyncManager implements OnAccountsUpdateListener {
        }
    }

    private void onUserRemoved(Intent intent) {
        int userId = intent.getIntExtra(Intent.EXTRA_USERID, -1);
        if (userId == -1) return;

        // Clean up the storage engine database
        mSyncStorageEngine.doDatabaseCleanup(new Account[0], userId);
        onAccountsUpdated(null);
        synchronized (mSyncQueue) {
            mSyncQueue.removeUser(userId);
        }
    }

    /**
     * @hide
     */
+13 −0
Original line number Diff line number Diff line
@@ -117,6 +117,19 @@ public class SyncQueue {
        return true;
    }

    public void removeUser(int userId) {
        ArrayList<SyncOperation> opsToRemove = new ArrayList<SyncOperation>();
        for (SyncOperation op : mOperationsMap.values()) {
            if (op.userId == userId) {
                opsToRemove.add(op);
            }
        }

        for (SyncOperation op : opsToRemove) {
            remove(op);
        }
    }

    /**
     * Remove the specified operation if it is in the queue.
     * @param operation the operation to remove
Loading