Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 30eceeca authored by Alex Kershaw's avatar Alex Kershaw
Browse files

Fix NPE in UpdateInstaller.

Fix the NPE caused when the battery condition fails. To make this CTS
testable, change the battery check mechanism and force
DevicePolicyConstants to reload when the device_policy_constants global
settings are modified.

Change-Id: I59d4630a6dd2d1b52f1adb1da4238ee53c20c0e6
Fixes: 112076619
Test: atest com.android.cts.devicepolicy.DeviceOwnerTest#testInstallUpdate
parent b33ef7a9
Loading
Loading
Loading
Loading
+31 −3
Original line number Diff line number Diff line
@@ -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));
    }
}
+23 −14
Original line number Diff line number Diff line
@@ -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;
    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;
    }
        return false;

    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();
        }
    }