diff options
author | Rubin Xu <rubinxu@google.com> | 2015-04-14 23:38:01 +0100 |
---|---|---|
committer | Rubin Xu <rubinxu@google.com> | 2015-04-22 22:11:04 +0100 |
commit | dc105cc91c63c27479d73a21702cd4ba0304acc4 (patch) | |
tree | 6869a7c8ea3b203bd3ff788cce1eaf3191cf87b6 /services/devicepolicy/java | |
parent | b5665c99105170998f0069b2a53d50587074f437 (diff) | |
download | frameworks_base-dc105cc91c63c27479d73a21702cd4ba0304acc4.zip frameworks_base-dc105cc91c63c27479d73a21702cd4ba0304acc4.tar.gz frameworks_base-dc105cc91c63c27479d73a21702cd4ba0304acc4.tar.bz2 |
Enable system service to notify device owners about pending update
Create a DevicePolicyManager API which can be used by OTA subsystem
to tell device owners about pending updates. Device owners will get
a callback from its DeviceAdminReceiver when the update service sends
out such notifications.
Bug: 20213644
Change-Id: Ifcc755655e4f441980cf77d76175a046112ca9ae
Diffstat (limited to 'services/devicepolicy/java')
-rw-r--r-- | services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index dc7fad6..80d075d 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -22,6 +22,7 @@ import static android.app.admin.DevicePolicyManager.WIPE_EXTERNAL_STORAGE; import static android.app.admin.DevicePolicyManager.WIPE_RESET_PROTECTION_DATA; import static android.content.pm.PackageManager.GET_UNINSTALLED_PACKAGES; +import android.Manifest.permission; import android.accessibilityservice.AccessibilityServiceInfo; import android.accounts.AccountManager; import android.app.Activity; @@ -45,6 +46,7 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; @@ -6088,4 +6090,42 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } return false; } + + @Override + public void notifyPendingSystemUpdate(long updateReceivedTime) { + mContext.enforceCallingOrSelfPermission(permission.NOTIFY_PENDING_SYSTEM_UPDATE, + "Only the system update service can broadcast update information"); + + if (UserHandle.getCallingUserId() != UserHandle.USER_OWNER) { + Slog.w(LOG_TAG, "Only the system update service in the primary user" + + "can broadcast update information."); + return; + } + Intent intent = new Intent(DeviceAdminReceiver.ACTION_NOTIFY_PENDING_SYSTEM_UPDATE); + intent.putExtra(DeviceAdminReceiver.EXTRA_SYSTEM_UPDATE_RECEIVED_TIME, + updateReceivedTime); + + synchronized (this) { + String deviceOwnerPackage = getDeviceOwner(); + if (deviceOwnerPackage == null) { + return; + } + + try { + ActivityInfo[] receivers = mContext.getPackageManager().getPackageInfo( + deviceOwnerPackage, PackageManager.GET_RECEIVERS).receivers; + if (receivers != null) { + for (int i = 0; i < receivers.length; i++) { + if (permission.BIND_DEVICE_ADMIN.equals(receivers[i].permission)) { + intent.setComponent(new ComponentName(deviceOwnerPackage, + receivers[i].name)); + mContext.sendBroadcastAsUser(intent, UserHandle.OWNER); + } + } + } + } catch (NameNotFoundException e) { + Log.e(LOG_TAG, "Cannot find device owner package", e); + } + } + } } |