summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alex Kershaw <alexkershaw@google.com> 2019-01-21 11:03:37 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2019-01-21 11:03:37 +0000
commit249f7900d652d909e4a02dd0dd38ab9790d4f2ef (patch)
tree452a7628970234a99acf330a8aa39fb2a71bb9fd
parenta8b23abc6683374357b27ce9010cb0824a8d90fc (diff)
parent30eceeca2118a5f81a4c8c518fdccbd44d888595 (diff)
Merge "Fix NPE in UpdateInstaller."
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java34
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/UpdateInstaller.java37
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();
}
}