diff options
Diffstat (limited to 'core/java')
-rw-r--r-- | core/java/android/app/ActivityManagerNative.java | 20 | ||||
-rw-r--r-- | core/java/android/app/IActivityManager.java | 2 | ||||
-rw-r--r-- | core/java/android/content/Intent.java | 9 | ||||
-rw-r--r-- | core/java/com/android/internal/content/PackageMonitor.java | 51 |
4 files changed, 75 insertions, 7 deletions
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 8436b2c..b0df660 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -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); @@ -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(); diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index d6ebc9b..ed17d0e 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -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; @@ -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; } diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 383739b..b9518b8 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -2797,6 +2797,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 * broadcast will immediately be followed by an add broadcast for a diff --git a/core/java/com/android/internal/content/PackageMonitor.java b/core/java/com/android/internal/content/PackageMonitor.java index 3477a90..20ecace 100644 --- a/core/java/com/android/internal/content/PackageMonitor.java +++ b/core/java/com/android/internal/content/PackageMonitor.java @@ -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; @@ -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"); } @@ -84,10 +91,19 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { } else { mRegisteredHandler = new Handler(thread); } - context.registerReceiver(this, sPackageFilt, null, mRegisteredHandler); - context.registerReceiver(this, sNonDataFilt, null, mRegisteredHandler); - if (externalStorage) { - context.registerReceiver(this, sExternalFilt, null, mRegisteredHandler); + 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); + } } } @@ -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) { } @@ -220,7 +243,11 @@ 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; @@ -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; @@ -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); } @@ -344,5 +380,6 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { } onFinishPackageChanges(); + mChangeUserId = UserHandle.USER_NULL; } } |