Merge "Remove IBatteryStats call from setDozing"
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index 4d8abff..5abca6b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -18,7 +18,6 @@
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
-import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Resources;
@@ -118,11 +117,11 @@
private int mChargingSpeed;
private int mChargingWattage;
private int mBatteryLevel;
+ private long mChargingTimeRemaining;
private String mMessageToShowOnScreenOn;
private KeyguardUpdateMonitorCallback mUpdateMonitorCallback;
- private final DevicePolicyManager mDevicePolicyManager;
private boolean mDozing;
private final ViewClippingUtil.ClippingParameters mClippingParams =
new ViewClippingUtil.ClippingParameters() {
@@ -144,7 +143,9 @@
Dependency.get(KeyguardStateController.class),
Dependency.get(StatusBarStateController.class),
Dependency.get(KeyguardUpdateMonitor.class),
- Dependency.get(DockManager.class));
+ Dependency.get(DockManager.class),
+ IBatteryStats.Stub.asInterface(
+ ServiceManager.getService(BatteryStats.SERVICE_NAME)));
}
/**
@@ -157,7 +158,8 @@
KeyguardStateController keyguardStateController,
StatusBarStateController statusBarStateController,
KeyguardUpdateMonitor keyguardUpdateMonitor,
- DockManager dockManager) {
+ DockManager dockManager,
+ IBatteryStats iBatteryStats) {
mContext = context;
mLockIcon = lockIcon;
mShadeController = shadeController;
@@ -180,11 +182,8 @@
mFastThreshold = res.getInteger(R.integer.config_chargingFastThreshold);
mUserManager = context.getSystemService(UserManager.class);
- mBatteryInfo = IBatteryStats.Stub.asInterface(
- ServiceManager.getService(BatteryStats.SERVICE_NAME));
+ mBatteryInfo = iBatteryStats;
- mDevicePolicyManager = (DevicePolicyManager) context.getSystemService(
- Context.DEVICE_POLICY_SERVICE);
setIndicationArea(indicationArea);
mKeyguardUpdateMonitor.registerCallback(getKeyguardCallback());
@@ -480,16 +479,7 @@
return mContext.getResources().getString(R.string.keyguard_charged);
}
- // Try fetching charging time from battery stats.
- long chargingTimeRemaining = 0;
- try {
- chargingTimeRemaining = mBatteryInfo.computeChargeTimeRemaining();
-
- } catch (RemoteException e) {
- Log.e(TAG, "Error calling IBatteryStats: ", e);
- }
- final boolean hasChargingTime = chargingTimeRemaining > 0;
-
+ final boolean hasChargingTime = mChargingTimeRemaining > 0;
int chargingId;
if (mPowerPluggedInWired) {
switch (mChargingSpeed) {
@@ -522,7 +512,7 @@
// locales will also have it in the future. For now, we still have to support the old
// format until all languages get the new translations.
String chargingTimeFormatted = Formatter.formatShortElapsedTimeRoundingUpToMinutes(
- mContext, chargingTimeRemaining);
+ mContext, mChargingTimeRemaining);
try {
return mContext.getResources().getString(chargingId, chargingTimeFormatted,
percentage);
@@ -639,6 +629,13 @@
mChargingWattage = status.maxChargingWattage;
mChargingSpeed = status.getChargingSpeed(mSlowThreshold, mFastThreshold);
mBatteryLevel = status.level;
+ try {
+ mChargingTimeRemaining = mPowerPluggedIn
+ ? mBatteryInfo.computeChargeTimeRemaining() : -1;
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error calling IBatteryStats: ", e);
+ mChargingTimeRemaining = -1;
+ }
updateIndication(!wasPluggedIn && mPowerPluggedInWired);
if (mDozing) {
if (!wasPluggedIn && mPowerPluggedIn) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
index a0a3679..48169ea 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
@@ -23,7 +23,9 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -37,7 +39,9 @@
import android.hardware.biometrics.BiometricSourceType;
import android.hardware.face.FaceManager;
import android.hardware.fingerprint.FingerprintManager;
+import android.os.BatteryManager;
import android.os.Looper;
+import android.os.RemoteException;
import android.os.UserManager;
import android.view.View;
import android.view.ViewGroup;
@@ -46,8 +50,10 @@
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
+import com.android.internal.app.IBatteryStats;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.KeyguardUpdateMonitor.BatteryStatus;
import com.android.settingslib.Utils;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
@@ -96,6 +102,8 @@
@Mock
private UserManager mUserManager;
@Mock
+ private IBatteryStats mIBatteryStats;
+ @Mock
private DockManager mDockManager;
@Captor
private ArgumentCaptor<DockManager.AlignmentStateListener> mAlignmentListener;
@@ -131,8 +139,9 @@
mController = new KeyguardIndicationController(mContext, mIndicationArea, mLockIcon,
mLockPatternUtils, mWakeLock, mShadeController, mAccessibilityController,
mKeyguardStateController, mStatusBarStateController, mKeyguardUpdateMonitor,
- mDockManager);
+ mDockManager, mIBatteryStats);
mController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
+ clearInvocations(mIBatteryStats);
}
@Test
@@ -341,6 +350,42 @@
}
@Test
+ public void onRefreshBatteryInfo_computesChargingTime() throws RemoteException {
+ createController();
+ BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_CHARGING,
+ 80 /* level */, BatteryManager.BATTERY_PLUGGED_WIRELESS, 100 /* health */,
+ 0 /* maxChargingWattage */);
+
+ mController.getKeyguardCallback().onRefreshBatteryInfo(status);
+ verify(mIBatteryStats).computeChargeTimeRemaining();
+ }
+
+ @Test
+ public void onRefreshBatteryInfo_computesChargingTime_onlyWhenCharging()
+ throws RemoteException {
+ createController();
+ BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_CHARGING,
+ 80 /* level */, 0 /* plugged */, 100 /* health */,
+ 0 /* maxChargingWattage */);
+
+ mController.getKeyguardCallback().onRefreshBatteryInfo(status);
+ verify(mIBatteryStats, never()).computeChargeTimeRemaining();
+ }
+
+ /**
+ * Regression test.
+ * We should not make calls to the system_process when updating the doze state.
+ */
+ @Test
+ public void setDozing_noIBatteryCalls() throws RemoteException {
+ createController();
+ mController.setVisible(true);
+ mController.setDozing(true);
+ mController.setDozing(false);
+ verify(mIBatteryStats, never()).computeChargeTimeRemaining();
+ }
+
+ @Test
public void updateMonitor_listener() {
createController();
verify(mKeyguardStateController).addCallback(eq(mController));