From 7de8929c051a0a42a66bab50013604f477cdaae9 Mon Sep 17 00:00:00 2001 From: Salvador Martinez Date: Tue, 23 Apr 2019 14:55:36 -0700 Subject: [PATCH] Update SysUI to use system cache for battery estimates This should help prevent Settings and SysUI from getting out of sync with each other. Test: manual by adjusting battery levels with adb Bug: 124030091 Change-Id: I8eaba920a10e045c4c983406873de66208c22fb7 --- .../android/settingslib/fuelgauge/Estimate.kt | 2 +- .../android/systemui/BatteryMeterView.java | 9 +++++++ .../policy/BatteryControllerImpl.java | 25 ++++++++++--------- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/Estimate.kt b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/Estimate.kt index ae8e1e2a60c02..786139ffc7903 100644 --- a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/Estimate.kt +++ b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/Estimate.kt @@ -45,7 +45,7 @@ class Estimate( Settings.Global.getLong( resolver, Settings.Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME, -1)) return if (Duration.between(lastUpdateTime, - Instant.now()).compareTo(Duration.ofMinutes(2)) > 0) { + Instant.now()).compareTo(Duration.ofMinutes(1)) > 0) { null } else Estimate( Settings.Global.getLong(resolver, diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java index 6c1d1f91830fd..6832ee3c33129 100644 --- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java @@ -36,6 +36,7 @@ import android.graphics.Rect; import android.net.Uri; import android.os.Handler; import android.provider.Settings; +import android.text.TextUtils; import android.util.ArraySet; import android.util.AttributeSet; import android.util.TypedValue; @@ -319,6 +320,9 @@ public class BatteryMeterView extends LinearLayout implements mUser = ActivityManager.getCurrentUser(); getContext().getContentResolver().registerContentObserver( Settings.System.getUriFor(SHOW_BATTERY_PERCENT), false, mSettingObserver, mUser); + getContext().getContentResolver().registerContentObserver( + Settings.Global.getUriFor(Settings.Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME), + false, mSettingObserver); updateShowPercent(); subscribeForTunerUpdates(); mUserTracker.startTracking(); @@ -493,6 +497,11 @@ public class BatteryMeterView extends LinearLayout implements public void onChange(boolean selfChange, Uri uri) { super.onChange(selfChange, uri); updateShowPercent(); + if (TextUtils.equals(uri.getLastPathSegment(), + Settings.Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME)) { + // update the text for sure if the estimate in the cache was updated + updatePercentText(); + } } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java index fde1455b0af0e..9c7a1e34aeb78 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java @@ -73,7 +73,6 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC private boolean mTestmode = false; private boolean mHasReceivedBattery = false; private Estimate mEstimate; - private long mLastEstimateTimestamp = -1; private boolean mFetchingEstimate = false; @Inject @@ -203,13 +202,6 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC @Override public void getEstimatedTimeRemainingString(EstimateFetchCompletion completion) { - if (mEstimate != null - && mLastEstimateTimestamp > System.currentTimeMillis() - UPDATE_GRANULARITY_MSEC) { - String percentage = generateTimeRemainingString(); - completion.onBatteryRemainingEstimateRetrieved(percentage); - return; - } - // Need to fetch or refresh the estimate, but it may involve binder calls so offload the // work synchronized (mFetchCallbacks) { @@ -238,8 +230,10 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC mFetchingEstimate = true; Dependency.get(Dependency.BG_HANDLER).post(() -> { // Only fetch the estimate if they are enabled - mEstimate = mEstimates.isHybridNotificationEnabled() ? mEstimates.getEstimate() : null; - mLastEstimateTimestamp = System.currentTimeMillis(); + mEstimate = null; + if (mEstimates.isHybridNotificationEnabled()) { + updateEstimate(); + } mFetchingEstimate = false; Dependency.get(Dependency.MAIN_HANDLER).post(this::notifyEstimateFetchCallbacks); }); @@ -258,8 +252,15 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC } private void updateEstimate() { - mEstimate = mEstimates.getEstimate(); - mLastEstimateTimestamp = System.currentTimeMillis(); + // if the estimate has been cached we can just use that, otherwise get a new one and + // throw it in the cache. + mEstimate = Estimate.getCachedEstimateIfAvailable(mContext); + if (mEstimate == null) { + mEstimate = mEstimates.getEstimate(); + if (mEstimate != null) { + Estimate.storeCachedEstimate(mContext, mEstimate); + } + } } private void updatePowerSave() {