diff options
| author | 2019-01-21 11:03:37 +0000 | |
|---|---|---|
| committer | 2019-01-21 11:03:37 +0000 | |
| commit | 249f7900d652d909e4a02dd0dd38ab9790d4f2ef (patch) | |
| tree | 452a7628970234a99acf330a8aa39fb2a71bb9fd | |
| parent | a8b23abc6683374357b27ce9010cb0824a8d90fc (diff) | |
| parent | 30eceeca2118a5f81a4c8c518fdccbd44d888595 (diff) | |
Merge "Fix NPE in UpdateInstaller."
| -rw-r--r-- | services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java | 34 | ||||
| -rw-r--r-- | services/devicepolicy/java/com/android/server/devicepolicy/UpdateInstaller.java | 37 |
2 files changed, 54 insertions, 17 deletions
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 76ae5ccd4eeb..f8e24ff03410 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -492,7 +492,6 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { final UsageStatsManagerInternal mUsageStatsManagerInternal; final TelephonyManager mTelephonyManager; private final LockPatternUtils mLockPatternUtils; - private final DevicePolicyConstants mConstants; private final DeviceAdminServiceController mDeviceAdminServiceController; private final OverlayPackagesProvider mOverlayPackagesProvider; @@ -539,6 +538,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { private final AtomicBoolean mRemoteBugreportSharingAccepted = new AtomicBoolean(); private final SetupContentObserver mSetupContentObserver; + private final DevicePolicyConstantsObserver mConstantsObserver; + + private DevicePolicyConstants mConstants; private static boolean ENABLE_LOCK_GUARD = Build.IS_ENG || true // STOPSHIP Remove it. @@ -2169,8 +2171,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { mInjector = injector; mContext = Preconditions.checkNotNull(injector.mContext); mHandler = new Handler(Preconditions.checkNotNull(injector.getMyLooper())); - mConstants = DevicePolicyConstants.loadFromString( - mInjector.settingsGlobalGetString(Global.DEVICE_POLICY_CONSTANTS)); + + mConstantsObserver = new DevicePolicyConstantsObserver(mHandler); + mConstantsObserver.register(); + mConstants = loadConstants(); mOwners = Preconditions.checkNotNull(injector.newOwners()); @@ -10954,6 +10958,25 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } } + private class DevicePolicyConstantsObserver extends ContentObserver { + final Uri mConstantsUri = + Settings.Global.getUriFor(Settings.Global.DEVICE_POLICY_CONSTANTS); + + DevicePolicyConstantsObserver(Handler handler) { + super(handler); + } + + void register() { + mInjector.registerContentObserver( + mConstantsUri, /* notifyForDescendents= */ false, this, UserHandle.USER_ALL); + } + + @Override + public void onChange(boolean selfChange, Uri uri, int userId) { + mConstants = loadConstants(); + } + } + @VisibleForTesting final class LocalService extends DevicePolicyManagerInternal { private List<OnCrossProfileWidgetProvidersChangeListener> mWidgetProviderListeners; @@ -14167,4 +14190,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return false; } } + + private DevicePolicyConstants loadConstants() { + return DevicePolicyConstants.loadFromString( + mInjector.settingsGlobalGetString(Global.DEVICE_POLICY_CONSTANTS)); + } } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/UpdateInstaller.java b/services/devicepolicy/java/com/android/server/devicepolicy/UpdateInstaller.java index d8a875d7747b..cf68ccf9f306 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/UpdateInstaller.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/UpdateInstaller.java @@ -16,10 +16,13 @@ package com.android.server.devicepolicy; +import android.annotation.Nullable; import android.app.admin.DevicePolicyEventLogger; import android.app.admin.DevicePolicyManager; import android.app.admin.StartInstallingUpdateCallback; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.os.BatteryManager; import android.os.Environment; import android.os.FileUtils; @@ -41,7 +44,8 @@ abstract class UpdateInstaller { private ParcelFileDescriptor mUpdateFileDescriptor; private DevicePolicyConstants mConstants; protected Context mContext; - protected File mCopiedUpdateFile; + + @Nullable protected File mCopiedUpdateFile; static final String TAG = "UpdateInstaller"; private DevicePolicyManagerService.Injector mInjector; @@ -59,7 +63,8 @@ abstract class UpdateInstaller { public abstract void installUpdateInThread(); public void startInstallUpdate() { - if (!checkIfBatteryIsSufficient()) { + mCopiedUpdateFile = null; + if (!isBatteryLevelSufficient()) { notifyCallbackOnError( DevicePolicyManager.InstallUpdateCallback.UPDATE_ERROR_BATTERY_LOW, "The battery level must be above " @@ -81,17 +86,21 @@ abstract class UpdateInstaller { thread.start(); } - private boolean checkIfBatteryIsSufficient() { - BatteryManager batteryManager = - (BatteryManager) mContext.getSystemService(Context.BATTERY_SERVICE); - if (batteryManager != null) { - int chargePercentage = batteryManager - .getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY); - return batteryManager.isCharging() - ? chargePercentage >= mConstants.BATTERY_THRESHOLD_CHARGING - : chargePercentage >= mConstants.BATTERY_THRESHOLD_NOT_CHARGING; - } - return false; + private boolean isBatteryLevelSufficient() { + Intent batteryStatus = mContext.registerReceiver( + /* receiver= */ null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + float batteryPercentage = calculateBatteryPercentage(batteryStatus); + boolean isBatteryPluggedIn = + batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, /* defaultValue= */ -1) > 0; + return isBatteryPluggedIn + ? batteryPercentage >= mConstants.BATTERY_THRESHOLD_CHARGING + : batteryPercentage >= mConstants.BATTERY_THRESHOLD_NOT_CHARGING; + } + + private float calculateBatteryPercentage(Intent batteryStatus) { + int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, /* defaultValue= */ -1); + int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, /* defaultValue= */ -1); + return 100 * level / (float) scale; } private File copyUpdateFileToDataOtaPackageDir() { @@ -127,7 +136,7 @@ abstract class UpdateInstaller { } void cleanupUpdateFile() { - if (mCopiedUpdateFile.exists()) { + if (mCopiedUpdateFile != null && mCopiedUpdateFile.exists()) { mCopiedUpdateFile.delete(); } } |