diff --git a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java index 3ce9e6dc7e08c..e7f03279e1b01 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java @@ -43,6 +43,7 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.database.ContentObserver; import android.net.Uri; +import android.os.BatteryManager; import android.os.BatteryManagerInternal; import android.os.Binder; import android.os.Handler; @@ -163,6 +164,7 @@ public class InternalResourceService extends SystemService { @GuardedBy("mLock") private final SparseArrayMap mVipOverrides = new SparseArrayMap<>(); + private volatile boolean mHasBattery = true; private volatile boolean mIsEnabled; private volatile int mBootPhase; private volatile boolean mExemptListLoaded; @@ -204,6 +206,15 @@ public class InternalResourceService extends SystemService { @Override public void onReceive(Context context, Intent intent) { switch (intent.getAction()) { + case Intent.ACTION_BATTERY_CHANGED: { + final boolean hasBattery = + intent.getBooleanExtra(BatteryManager.EXTRA_PRESENT, mHasBattery); + if (mHasBattery != hasBattery) { + mHasBattery = hasBattery; + mConfigObserver.updateEnabledStatus(); + } + } + break; case Intent.ACTION_BATTERY_LEVEL_CHANGED: onBatteryLevelChanged(); break; @@ -713,6 +724,12 @@ public class InternalResourceService extends SystemService { return packages; } + private boolean isTareSupported() { + // TARE is presently designed for devices with batteries. Don't enable it on + // battery-less devices for now. + return mHasBattery; + } + @GuardedBy("mLock") private void loadInstalledPackageListLocked() { mPkgCache.clear(); @@ -731,6 +748,7 @@ public class InternalResourceService extends SystemService { private void registerListeners() { final IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_BATTERY_CHANGED); filter.addAction(Intent.ACTION_BATTERY_LEVEL_CHANGED); filter.addAction(PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED); getContext().registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null); @@ -983,7 +1001,7 @@ public class InternalResourceService extends SystemService { @Override public void registerAffordabilityChangeListener(int userId, @NonNull String pkgName, @NonNull AffordabilityChangeListener listener, @NonNull ActionBill bill) { - if (isSystem(userId, pkgName)) { + if (!isTareSupported() || isSystem(userId, pkgName)) { // The system's affordability never changes. return; } @@ -1006,6 +1024,9 @@ public class InternalResourceService extends SystemService { @Override public void registerTareStateChangeListener(@NonNull TareStateChangeListener listener) { + if (!isTareSupported()) { + return; + } mStateChangeListeners.add(listener); } @@ -1178,11 +1199,10 @@ public class InternalResourceService extends SystemService { private void updateEnabledStatus() { // User setting should override DeviceConfig setting. - // NOTE: There's currently no way for a user to reset the value (via UI), so if a user - // manually toggles TARE via UI, we'll always defer to the user's current setting final boolean isTareEnabledDC = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_TARE, KEY_DC_ENABLE_TARE, Settings.Global.DEFAULT_ENABLE_TARE == 1); - final boolean isTareEnabled = Settings.Global.getInt(mContentResolver, + final boolean isTareEnabled = isTareSupported() + && Settings.Global.getInt(mContentResolver, Settings.Global.ENABLE_TARE, isTareEnabledDC ? 1 : 0) == 1; if (mIsEnabled != isTareEnabled) { mIsEnabled = isTareEnabled; @@ -1266,6 +1286,10 @@ public class InternalResourceService extends SystemService { } private void dumpInternal(final IndentingPrintWriter pw, final boolean dumpAll) { + if (!isTareSupported()) { + pw.print("Unsupported by device"); + return; + } synchronized (mLock) { pw.print("Is enabled: "); pw.println(mIsEnabled);