Loading core/java/android/app/ActivityManagerNative.java +20 −0 Original line number Diff line number Diff line Loading @@ -1611,6 +1611,14 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } case GET_RUNNING_USER_IDS_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); int[] result = getRunningUserIds(); reply.writeNoException(); reply.writeIntArray(result); return true; } case REMOVE_SUB_TASK_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); Loading Loading @@ -3846,6 +3854,18 @@ class ActivityManagerProxy implements IActivityManager return result; } public int[] getRunningUserIds() throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); mRemote.transact(GET_RUNNING_USER_IDS_TRANSACTION, data, reply, 0); reply.readException(); int[] result = reply.createIntArray(); reply.recycle(); data.recycle(); return result; } public boolean removeSubTask(int taskId, int subTaskIndex) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); Loading core/java/android/app/IActivityManager.java +2 −0 Original line number Diff line number Diff line Loading @@ -327,6 +327,7 @@ public interface IActivityManager extends IInterface { public int stopUser(int userid, IStopUserCallback callback) throws RemoteException; public UserInfo getCurrentUser() throws RemoteException; public boolean isUserRunning(int userid) throws RemoteException; public int[] getRunningUserIds() throws RemoteException; public boolean removeSubTask(int taskId, int subTaskIndex) throws RemoteException; Loading Loading @@ -611,4 +612,5 @@ public interface IActivityManager extends IInterface { int STOP_USER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+153; int REGISTER_USER_SWITCH_OBSERVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+154; int UNREGISTER_USER_SWITCH_OBSERVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+155; int GET_RUNNING_USER_IDS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+156; } core/java/android/content/Intent.java +9 −0 Original line number Diff line number Diff line Loading @@ -2796,6 +2796,15 @@ public class Intent implements Parcelable, Cloneable { */ public static final String EXTRA_DATA_REMOVED = "android.intent.extra.DATA_REMOVED"; /** * @hide * Used as a boolean extra field in {@link android.content.Intent#ACTION_PACKAGE_REMOVED} * intents to indicate that at this point the package has been removed for * all users on the device. */ public static final String EXTRA_REMOVED_FOR_ALL_USERS = "android.intent.extra.REMOVED_FOR_ALL_USERS"; /** * Used as a boolean extra field in {@link android.content.Intent#ACTION_PACKAGE_REMOVED} * intents to indicate that this is a replacement of the package, so this Loading core/java/com/android/internal/content/PackageMonitor.java +44 −7 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.net.Uri; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.UserHandle; import java.util.HashSet; Loading Loading @@ -62,11 +63,17 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { String[] mAppearingPackages; String[] mModifiedPackages; int mChangeType; int mChangeUserId = UserHandle.USER_NULL; boolean mSomePackagesChanged; String[] mTempArray = new String[1]; public void register(Context context, Looper thread, boolean externalStorage) { register(context, thread, null, externalStorage); } public void register(Context context, Looper thread, UserHandle user, boolean externalStorage) { if (mRegisteredContext != null) { throw new IllegalStateException("Already registered"); } Loading @@ -84,12 +91,21 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { } else { mRegisteredHandler = new Handler(thread); } if (user != null) { context.registerReceiverAsUser(this, user, sPackageFilt, null, mRegisteredHandler); context.registerReceiverAsUser(this, user, sNonDataFilt, null, mRegisteredHandler); if (externalStorage) { context.registerReceiverAsUser(this, user, sExternalFilt, null, mRegisteredHandler); } } else { context.registerReceiver(this, sPackageFilt, null, mRegisteredHandler); context.registerReceiver(this, sNonDataFilt, null, mRegisteredHandler); if (externalStorage) { context.registerReceiver(this, sExternalFilt, null, mRegisteredHandler); } } } public Handler getRegisteredHandler() { return mRegisteredHandler; Loading Loading @@ -125,6 +141,13 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { public void onPackageRemoved(String packageName, int uid) { } /** * Called when a package is really removed (and not replaced) for * all users on the device. */ public void onPackageRemovedAllUsers(String packageName, int uid) { } public void onPackageUpdateStarted(String packageName, int uid) { } Loading Loading @@ -221,6 +244,10 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { public void onFinishPackageChanges() { } public int getChangingUserId() { return mChangeUserId; } String getPackageName(Intent intent) { Uri uri = intent.getData(); String pkg = uri != null ? uri.getSchemeSpecificPart() : null; Loading @@ -229,6 +256,12 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { mChangeUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL); if (mChangeUserId == UserHandle.USER_NULL) { throw new IllegalArgumentException( "Intent broadcast does not contain user handle: " + intent); } onBeginPackageChanges(); mDisappearingPackages = mAppearingPackages = null; Loading Loading @@ -281,6 +314,9 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { // it when it is re-added. mSomePackagesChanged = true; onPackageRemoved(pkg, uid); if (intent.getBooleanExtra(Intent.EXTRA_REMOVED_FOR_ALL_USERS, false)) { onPackageRemovedAllUsers(pkg, uid); } } onPackageDisappeared(pkg, mChangeType); } Loading Loading @@ -344,5 +380,6 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { } onFinishPackageChanges(); mChangeUserId = UserHandle.USER_NULL; } } services/java/com/android/server/WallpaperManagerService.java +29 −16 Original line number Diff line number Diff line Loading @@ -293,16 +293,17 @@ class WallpaperManagerService extends IWallpaperManager.Stub { @Override public void onPackageUpdateFinished(String packageName, int uid) { synchronized (mLock) { for (int i = 0; i < mWallpaperMap.size(); i++) { WallpaperData wallpaper = mWallpaperMap.valueAt(i); if (mCurrentUserId != getChangingUserId()) { return; } WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId); if (wallpaper != null) { if (wallpaper.wallpaperComponent != null && wallpaper.wallpaperComponent.getPackageName().equals(packageName)) { wallpaper.wallpaperUpdating = false; ComponentName comp = wallpaper.wallpaperComponent; clearWallpaperComponentLocked(wallpaper); // Do this only for the current user's wallpaper if (wallpaper.userId == mCurrentUserId && !bindWallpaperComponentLocked(comp, false, false, if (!bindWallpaperComponentLocked(comp, false, false, wallpaper, null)) { Slog.w(TAG, "Wallpaper no longer available; reverting to default"); clearWallpaperLocked(false, wallpaper.userId, null); Loading @@ -315,11 +316,14 @@ class WallpaperManagerService extends IWallpaperManager.Stub { @Override public void onPackageModified(String packageName) { synchronized (mLock) { for (int i = 0; i < mWallpaperMap.size(); i++) { WallpaperData wallpaper = mWallpaperMap.valueAt(i); if (mCurrentUserId != getChangingUserId()) { return; } WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId); if (wallpaper != null) { if (wallpaper.wallpaperComponent == null || !wallpaper.wallpaperComponent.getPackageName().equals(packageName)) { continue; return; } doPackagesChangedLocked(true, wallpaper); } Loading @@ -329,8 +333,11 @@ class WallpaperManagerService extends IWallpaperManager.Stub { @Override public void onPackageUpdateStarted(String packageName, int uid) { synchronized (mLock) { for (int i = 0; i < mWallpaperMap.size(); i++) { WallpaperData wallpaper = mWallpaperMap.valueAt(i); if (mCurrentUserId != getChangingUserId()) { return; } WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId); if (wallpaper != null) { if (wallpaper.wallpaperComponent != null && wallpaper.wallpaperComponent.getPackageName().equals(packageName)) { wallpaper.wallpaperUpdating = true; Loading @@ -343,8 +350,11 @@ class WallpaperManagerService extends IWallpaperManager.Stub { public boolean onHandleForceStop(Intent intent, String[] packages, int uid, boolean doit) { synchronized (mLock) { boolean changed = false; for (int i = 0; i < mWallpaperMap.size(); i++) { WallpaperData wallpaper = mWallpaperMap.valueAt(i); if (mCurrentUserId != getChangingUserId()) { return false; } WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId); if (wallpaper != null) { boolean res = doPackagesChangedLocked(doit, wallpaper); changed |= res; } Loading @@ -355,8 +365,11 @@ class WallpaperManagerService extends IWallpaperManager.Stub { @Override public void onSomePackagesChanged() { synchronized (mLock) { for (int i = 0; i < mWallpaperMap.size(); i++) { WallpaperData wallpaper = mWallpaperMap.valueAt(i); if (mCurrentUserId != getChangingUserId()) { return; } WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId); if (wallpaper != null) { doPackagesChangedLocked(true, wallpaper); } } Loading Loading @@ -416,7 +429,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub { ServiceManager.getService(Context.WINDOW_SERVICE)); mIPackageManager = AppGlobals.getPackageManager(); mMonitor = new MyPackageMonitor(); mMonitor.register(context, null, true); mMonitor.register(context, null, UserHandle.ALL, true); getWallpaperDir(UserHandle.USER_OWNER).mkdirs(); loadSettingsLocked(UserHandle.USER_OWNER); } Loading Loading
core/java/android/app/ActivityManagerNative.java +20 −0 Original line number Diff line number Diff line Loading @@ -1611,6 +1611,14 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } case GET_RUNNING_USER_IDS_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); int[] result = getRunningUserIds(); reply.writeNoException(); reply.writeIntArray(result); return true; } case REMOVE_SUB_TASK_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); Loading Loading @@ -3846,6 +3854,18 @@ class ActivityManagerProxy implements IActivityManager return result; } public int[] getRunningUserIds() throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); mRemote.transact(GET_RUNNING_USER_IDS_TRANSACTION, data, reply, 0); reply.readException(); int[] result = reply.createIntArray(); reply.recycle(); data.recycle(); return result; } public boolean removeSubTask(int taskId, int subTaskIndex) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); Loading
core/java/android/app/IActivityManager.java +2 −0 Original line number Diff line number Diff line Loading @@ -327,6 +327,7 @@ public interface IActivityManager extends IInterface { public int stopUser(int userid, IStopUserCallback callback) throws RemoteException; public UserInfo getCurrentUser() throws RemoteException; public boolean isUserRunning(int userid) throws RemoteException; public int[] getRunningUserIds() throws RemoteException; public boolean removeSubTask(int taskId, int subTaskIndex) throws RemoteException; Loading Loading @@ -611,4 +612,5 @@ public interface IActivityManager extends IInterface { int STOP_USER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+153; int REGISTER_USER_SWITCH_OBSERVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+154; int UNREGISTER_USER_SWITCH_OBSERVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+155; int GET_RUNNING_USER_IDS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+156; }
core/java/android/content/Intent.java +9 −0 Original line number Diff line number Diff line Loading @@ -2796,6 +2796,15 @@ public class Intent implements Parcelable, Cloneable { */ public static final String EXTRA_DATA_REMOVED = "android.intent.extra.DATA_REMOVED"; /** * @hide * Used as a boolean extra field in {@link android.content.Intent#ACTION_PACKAGE_REMOVED} * intents to indicate that at this point the package has been removed for * all users on the device. */ public static final String EXTRA_REMOVED_FOR_ALL_USERS = "android.intent.extra.REMOVED_FOR_ALL_USERS"; /** * Used as a boolean extra field in {@link android.content.Intent#ACTION_PACKAGE_REMOVED} * intents to indicate that this is a replacement of the package, so this Loading
core/java/com/android/internal/content/PackageMonitor.java +44 −7 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.net.Uri; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.UserHandle; import java.util.HashSet; Loading Loading @@ -62,11 +63,17 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { String[] mAppearingPackages; String[] mModifiedPackages; int mChangeType; int mChangeUserId = UserHandle.USER_NULL; boolean mSomePackagesChanged; String[] mTempArray = new String[1]; public void register(Context context, Looper thread, boolean externalStorage) { register(context, thread, null, externalStorage); } public void register(Context context, Looper thread, UserHandle user, boolean externalStorage) { if (mRegisteredContext != null) { throw new IllegalStateException("Already registered"); } Loading @@ -84,12 +91,21 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { } else { mRegisteredHandler = new Handler(thread); } if (user != null) { context.registerReceiverAsUser(this, user, sPackageFilt, null, mRegisteredHandler); context.registerReceiverAsUser(this, user, sNonDataFilt, null, mRegisteredHandler); if (externalStorage) { context.registerReceiverAsUser(this, user, sExternalFilt, null, mRegisteredHandler); } } else { context.registerReceiver(this, sPackageFilt, null, mRegisteredHandler); context.registerReceiver(this, sNonDataFilt, null, mRegisteredHandler); if (externalStorage) { context.registerReceiver(this, sExternalFilt, null, mRegisteredHandler); } } } public Handler getRegisteredHandler() { return mRegisteredHandler; Loading Loading @@ -125,6 +141,13 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { public void onPackageRemoved(String packageName, int uid) { } /** * Called when a package is really removed (and not replaced) for * all users on the device. */ public void onPackageRemovedAllUsers(String packageName, int uid) { } public void onPackageUpdateStarted(String packageName, int uid) { } Loading Loading @@ -221,6 +244,10 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { public void onFinishPackageChanges() { } public int getChangingUserId() { return mChangeUserId; } String getPackageName(Intent intent) { Uri uri = intent.getData(); String pkg = uri != null ? uri.getSchemeSpecificPart() : null; Loading @@ -229,6 +256,12 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { mChangeUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL); if (mChangeUserId == UserHandle.USER_NULL) { throw new IllegalArgumentException( "Intent broadcast does not contain user handle: " + intent); } onBeginPackageChanges(); mDisappearingPackages = mAppearingPackages = null; Loading Loading @@ -281,6 +314,9 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { // it when it is re-added. mSomePackagesChanged = true; onPackageRemoved(pkg, uid); if (intent.getBooleanExtra(Intent.EXTRA_REMOVED_FOR_ALL_USERS, false)) { onPackageRemovedAllUsers(pkg, uid); } } onPackageDisappeared(pkg, mChangeType); } Loading Loading @@ -344,5 +380,6 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { } onFinishPackageChanges(); mChangeUserId = UserHandle.USER_NULL; } }
services/java/com/android/server/WallpaperManagerService.java +29 −16 Original line number Diff line number Diff line Loading @@ -293,16 +293,17 @@ class WallpaperManagerService extends IWallpaperManager.Stub { @Override public void onPackageUpdateFinished(String packageName, int uid) { synchronized (mLock) { for (int i = 0; i < mWallpaperMap.size(); i++) { WallpaperData wallpaper = mWallpaperMap.valueAt(i); if (mCurrentUserId != getChangingUserId()) { return; } WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId); if (wallpaper != null) { if (wallpaper.wallpaperComponent != null && wallpaper.wallpaperComponent.getPackageName().equals(packageName)) { wallpaper.wallpaperUpdating = false; ComponentName comp = wallpaper.wallpaperComponent; clearWallpaperComponentLocked(wallpaper); // Do this only for the current user's wallpaper if (wallpaper.userId == mCurrentUserId && !bindWallpaperComponentLocked(comp, false, false, if (!bindWallpaperComponentLocked(comp, false, false, wallpaper, null)) { Slog.w(TAG, "Wallpaper no longer available; reverting to default"); clearWallpaperLocked(false, wallpaper.userId, null); Loading @@ -315,11 +316,14 @@ class WallpaperManagerService extends IWallpaperManager.Stub { @Override public void onPackageModified(String packageName) { synchronized (mLock) { for (int i = 0; i < mWallpaperMap.size(); i++) { WallpaperData wallpaper = mWallpaperMap.valueAt(i); if (mCurrentUserId != getChangingUserId()) { return; } WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId); if (wallpaper != null) { if (wallpaper.wallpaperComponent == null || !wallpaper.wallpaperComponent.getPackageName().equals(packageName)) { continue; return; } doPackagesChangedLocked(true, wallpaper); } Loading @@ -329,8 +333,11 @@ class WallpaperManagerService extends IWallpaperManager.Stub { @Override public void onPackageUpdateStarted(String packageName, int uid) { synchronized (mLock) { for (int i = 0; i < mWallpaperMap.size(); i++) { WallpaperData wallpaper = mWallpaperMap.valueAt(i); if (mCurrentUserId != getChangingUserId()) { return; } WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId); if (wallpaper != null) { if (wallpaper.wallpaperComponent != null && wallpaper.wallpaperComponent.getPackageName().equals(packageName)) { wallpaper.wallpaperUpdating = true; Loading @@ -343,8 +350,11 @@ class WallpaperManagerService extends IWallpaperManager.Stub { public boolean onHandleForceStop(Intent intent, String[] packages, int uid, boolean doit) { synchronized (mLock) { boolean changed = false; for (int i = 0; i < mWallpaperMap.size(); i++) { WallpaperData wallpaper = mWallpaperMap.valueAt(i); if (mCurrentUserId != getChangingUserId()) { return false; } WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId); if (wallpaper != null) { boolean res = doPackagesChangedLocked(doit, wallpaper); changed |= res; } Loading @@ -355,8 +365,11 @@ class WallpaperManagerService extends IWallpaperManager.Stub { @Override public void onSomePackagesChanged() { synchronized (mLock) { for (int i = 0; i < mWallpaperMap.size(); i++) { WallpaperData wallpaper = mWallpaperMap.valueAt(i); if (mCurrentUserId != getChangingUserId()) { return; } WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId); if (wallpaper != null) { doPackagesChangedLocked(true, wallpaper); } } Loading Loading @@ -416,7 +429,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub { ServiceManager.getService(Context.WINDOW_SERVICE)); mIPackageManager = AppGlobals.getPackageManager(); mMonitor = new MyPackageMonitor(); mMonitor.register(context, null, true); mMonitor.register(context, null, UserHandle.ALL, true); getWallpaperDir(UserHandle.USER_OWNER).mkdirs(); loadSettingsLocked(UserHandle.USER_OWNER); } Loading