diff options
| -rw-r--r-- | api/system-current.txt | 4 | ||||
| -rw-r--r-- | core/java/android/app/ApplicationPackageManager.java | 9 | ||||
| -rw-r--r-- | core/java/android/content/Intent.java | 12 | ||||
| -rw-r--r-- | core/java/android/content/pm/IPackageManager.aidl | 2 | ||||
| -rw-r--r-- | core/java/android/content/pm/PackageManager.java | 14 | ||||
| -rw-r--r-- | core/res/AndroidManifest.xml | 14 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 24 |
7 files changed, 79 insertions, 0 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index a53ab3ecdaf1..0ab981d515ea 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -158,6 +158,7 @@ package android { field public static final java.lang.String REAL_GET_TASKS = "android.permission.REAL_GET_TASKS"; field public static final java.lang.String REBOOT = "android.permission.REBOOT"; field public static final java.lang.String RECEIVE_DATA_ACTIVITY_CHANGE = "android.permission.RECEIVE_DATA_ACTIVITY_CHANGE"; + field public static final java.lang.String RECEIVE_DEVICE_CUSTOMIZATION_READY = "android.permission.RECEIVE_DEVICE_CUSTOMIZATION_READY"; field public static final java.lang.String RECEIVE_EMERGENCY_BROADCAST = "android.permission.RECEIVE_EMERGENCY_BROADCAST"; field public static final java.lang.String RECEIVE_WIFI_CREDENTIAL_CHANGE = "android.permission.RECEIVE_WIFI_CREDENTIAL_CHANGE"; field public static final java.lang.String RECOVERY = "android.permission.RECOVERY"; @@ -171,6 +172,7 @@ package android { field public static final java.lang.String RETRIEVE_WINDOW_CONTENT = "android.permission.RETRIEVE_WINDOW_CONTENT"; field public static final java.lang.String REVOKE_RUNTIME_PERMISSIONS = "android.permission.REVOKE_RUNTIME_PERMISSIONS"; field public static final java.lang.String SCORE_NETWORKS = "android.permission.SCORE_NETWORKS"; + field public static final java.lang.String SEND_DEVICE_CUSTOMIZATION_READY = "android.permission.SEND_DEVICE_CUSTOMIZATION_READY"; field public static final java.lang.String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE"; field public static final java.lang.String SEND_SHOW_SUSPENDED_APP_DETAILS = "android.permission.SEND_SHOW_SUSPENDED_APP_DETAILS"; field public static final java.lang.String SEND_SMS_NO_CONFIRMATION = "android.permission.SEND_SMS_NO_CONFIRMATION"; @@ -1055,6 +1057,7 @@ package android.content { field public static final java.lang.String ACTION_BATTERY_LEVEL_CHANGED = "android.intent.action.BATTERY_LEVEL_CHANGED"; field public static final java.lang.String ACTION_CALL_EMERGENCY = "android.intent.action.CALL_EMERGENCY"; field public static final java.lang.String ACTION_CALL_PRIVILEGED = "android.intent.action.CALL_PRIVILEGED"; + field public static final java.lang.String ACTION_DEVICE_CUSTOMIZATION_READY = "android.intent.action.DEVICE_CUSTOMIZATION_READY"; field public static final java.lang.String ACTION_FACTORY_RESET = "android.intent.action.FACTORY_RESET"; field public static final java.lang.String ACTION_GLOBAL_BUTTON = "android.intent.action.GLOBAL_BUTTON"; field public static final java.lang.String ACTION_INSTALL_INSTANT_APP_PACKAGE = "android.intent.action.INSTALL_INSTANT_APP_PACKAGE"; @@ -1234,6 +1237,7 @@ package android.content.pm { method public abstract void removeOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener); method public void replacePreferredActivity(android.content.IntentFilter, int, java.util.List<android.content.ComponentName>, android.content.ComponentName); method public abstract void revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle); + method public void sendDeviceCustomizationReadyBroadcast(); method public abstract boolean setDefaultBrowserPackageNameAsUser(java.lang.String, int); method public void setHarmfulAppWarning(java.lang.String, java.lang.CharSequence); method public deprecated java.lang.String[] setPackagesSuspended(java.lang.String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, java.lang.String); diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 8a797dcaf449..7312b2c8163e 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -2981,4 +2981,13 @@ public class ApplicationPackageManager extends PackageManager { throw e.rethrowAsRuntimeException(); } } + + @Override + public void sendDeviceCustomizationReadyBroadcast() { + try { + mPM.sendDeviceCustomizationReadyBroadcast(); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } } diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index e7f0053721d1..6fd5061eee63 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -4116,6 +4116,18 @@ public class Intent implements Parcelable, Cloneable { */ public static final String ACTION_DOCK_ACTIVE = "android.intent.action.DOCK_ACTIVE"; + /** + * Broadcast Action: Indicates that a new device customization has been + * downloaded and applied (packages installed, runtime resource overlays + * enabled, xml files copied, ...), and that it is time for components that + * need to for example clear their caches to do so now. + * + * @hide + */ + @SystemApi + public static final String ACTION_DEVICE_CUSTOMIZATION_READY = + "android.intent.action.DEVICE_CUSTOMIZATION_READY"; + // --------------------------------------------------------------------- // --------------------------------------------------------------------- diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index d0eff2e0fda9..dbea821fab2b 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -676,4 +676,6 @@ interface IPackageManager { String getSystemTextClassifierPackageName(); boolean isPackageStateProtected(String packageName, int userId); + + void sendDeviceCustomizationReadyBroadcast(); } diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index a4b724ba48e7..6421dc5a3f68 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -6409,4 +6409,18 @@ public abstract class PackageManager { "isPackageStateProtected not implemented in subclass"); } + /** + * Notify to the rest of the system that a new device configuration has + * been prepared and that it is time to refresh caches. + * + * @see android.content.Intent#ACTION_DEVICE_CUSTOMIZATION_READY + * + * @hide + */ + @SystemApi + public void sendDeviceCustomizationReadyBroadcast() { + throw new UnsupportedOperationException( + "sendDeviceCustomizationReadyBroadcast not implemented in subclass"); + } + } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 8c5b6f4765fb..6c3085ff2919 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -620,6 +620,8 @@ <protected-broadcast android:name="android.provider.action.DEFAULT_SMS_PACKAGE_CHANGED_INTERNAL" /> + <protected-broadcast android:name="android.intent.action.DEVICE_CUSTOMIZATION_READY" /> + <!-- ====================================================================== --> <!-- RUNTIME PERMISSIONS --> <!-- ====================================================================== --> @@ -4204,6 +4206,18 @@ <permission android:name="android.permission.SMS_FINANCIAL_TRANSACTIONS" android:protectionLevel="signature|appop" /> + <!-- @SystemApi Allows requesting the framework broadcast the + {@link Intent#ACTION_DEVICE_CUSTOMIZATION_READY} intent. + @hide --> + <permission android:name="android.permission.SEND_DEVICE_CUSTOMIZATION_READY" + android:protectionLevel="signature|privileged" /> + + <!-- @SystemApi Permission that protects the {@link Intent#ACTION_DEVICE_CUSTOMIZATION_READY} + intent. + @hide --> + <permission android:name="android.permission.RECEIVE_DEVICE_CUSTOMIZATION_READY" + android:protectionLevel="signature|preinstalled" /> + <application android:process="system" android:persistent="true" android:hasCode="false" diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 6038e2422490..b199f02a444f 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -23494,6 +23494,30 @@ public class PackageManagerService extends IPackageManager.Stub return mProtectedPackages.isPackageStateProtected(userId, packageName); } + @Override + public void sendDeviceCustomizationReadyBroadcast() { + mContext.enforceCallingPermission(Manifest.permission.SEND_DEVICE_CUSTOMIZATION_READY, + "sendDeviceCustomizationReadyBroadcast"); + + final long ident = Binder.clearCallingIdentity(); + try { + final Intent intent = new Intent(Intent.ACTION_DEVICE_CUSTOMIZATION_READY); + intent.setFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND); + final IActivityManager am = ActivityManager.getService(); + final String[] requiredPermissions = { + Manifest.permission.RECEIVE_DEVICE_CUSTOMIZATION_READY, + }; + try { + am.broadcastIntent(null, intent, null, null, 0, null, null, requiredPermissions, + android.app.AppOpsManager.OP_NONE, null, false, false, UserHandle.USER_ALL); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } finally { + Binder.restoreCallingIdentity(ident); + } + } + static class ActiveInstallSession { private final String mPackageName; private final File mStagedDir; |