diff options
6 files changed, 175 insertions, 4 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AospPolicyModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AospPolicyModule.java index ba5fa1df4b15..3d51ab0a2b27 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AospPolicyModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AospPolicyModule.java @@ -45,6 +45,7 @@ public class AospPolicyModule { BroadcastDispatcher broadcastDispatcher, DemoModeController demoModeController, DumpManager dumpManager, + BatteryControllerLogger logger, @Main Handler mainHandler, @Background Handler bgHandler) { BatteryController bC = new BatteryControllerImpl( @@ -54,6 +55,7 @@ public class AospPolicyModule { broadcastDispatcher, demoModeController, dumpManager, + logger, mainHandler, bgHandler); bC.init(); 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 4b515115dd77..41ed76d7edb1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java @@ -20,7 +20,6 @@ import static android.os.BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE; import static android.os.BatteryManager.CHARGING_POLICY_DEFAULT; import static android.os.BatteryManager.EXTRA_CHARGING_STATUS; import static android.os.BatteryManager.EXTRA_PRESENT; - import static com.android.settingslib.fuelgauge.BatterySaverLogging.SAVER_ENABLED_QS; import static com.android.systemui.util.DumpUtilsKt.asIndenting; @@ -85,6 +84,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC private final PowerManager mPowerManager; private final DemoModeController mDemoModeController; private final DumpManager mDumpManager; + private final BatteryControllerLogger mLogger; private final Handler mMainHandler; private final Handler mBgHandler; protected final Context mContext; @@ -122,6 +122,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC BroadcastDispatcher broadcastDispatcher, DemoModeController demoModeController, DumpManager dumpManager, + BatteryControllerLogger logger, @Main Handler mainHandler, @Background Handler bgHandler) { mContext = context; @@ -132,6 +133,8 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC mBroadcastDispatcher = broadcastDispatcher; mDemoModeController = demoModeController; mDumpManager = dumpManager; + mLogger = logger; + mLogger.logBatteryControllerInstance(this); } private void registerReceiver() { @@ -145,6 +148,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC @Override public void init() { + mLogger.logBatteryControllerInit(this, mHasReceivedBattery); registerReceiver(); if (!mHasReceivedBattery) { // Get initial state. Relying on Sticky behavior until API for getting info. @@ -232,8 +236,13 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC @Override public void onReceive(final Context context, Intent intent) { final String action = intent.getAction(); + mLogger.logIntentReceived(action); if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { - if (mTestMode && !intent.getBooleanExtra("testmode", false)) return; + mLogger.logBatteryChangedIntent(intent); + if (mTestMode && !intent.getBooleanExtra("testmode", false)) { + mLogger.logBatteryChangedSkipBecauseTest(); + return; + } mHasReceivedBattery = true; mLevel = (int) (100f * intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0) @@ -275,6 +284,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC fireIsIncompatibleChargingChanged(); } } else if (action.equals(ACTION_LEVEL_TEST)) { + mLogger.logEnterTestMode(); mTestMode = true; mMainHandler.post(new Runnable() { int mCurrentLevel = 0; @@ -286,6 +296,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC @Override public void run() { if (mCurrentLevel < 0) { + mLogger.logExitTestMode(); mTestMode = false; mTestIntent.putExtra("level", mSavedLevel); mTestIntent.putExtra("plugged", mSavedPluggedIn); @@ -438,6 +449,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC } protected void fireBatteryLevelChanged() { + mLogger.logBatteryLevelChangedCallback(mLevel, mPluggedIn, mCharging); synchronized (mChangeCallbacks) { final int N = mChangeCallbacks.size(); for (int i = 0; i < N; i++) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerLogger.kt new file mode 100644 index 000000000000..4a2a2dbad638 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerLogger.kt @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.policy + +import android.content.Intent +import android.os.BatteryManager.EXTRA_LEVEL +import android.os.BatteryManager.EXTRA_SCALE +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.core.LogLevel +import com.android.systemui.statusbar.policy.dagger.BatteryControllerLog +import javax.inject.Inject + +/** Detailed, [LogBuffer]-backed logs for [BatteryControllerImpl] */ +@SysUISingleton +class BatteryControllerLogger +@Inject +constructor(@BatteryControllerLog private val logBuffer: LogBuffer) { + fun logBatteryControllerInstance(controller: BatteryController) { + logBuffer.log( + TAG, + LogLevel.DEBUG, + { int1 = System.identityHashCode(controller) }, + { "BatteryController CREATE (${Integer.toHexString(int1)})" } + ) + } + + fun logBatteryControllerInit(controller: BatteryController, hasReceivedBattery: Boolean) { + logBuffer.log( + TAG, + LogLevel.DEBUG, + { + int1 = System.identityHashCode(controller) + bool1 = hasReceivedBattery + }, + { "BatteryController INIT (${Integer.toHexString(int1)}) hasReceivedBattery=$bool1" } + ) + } + + fun logIntentReceived(action: String) { + logBuffer.log(TAG, LogLevel.DEBUG, { str1 = action }, { "Received intent $str1" }) + } + + fun logBatteryChangedIntent(intent: Intent) { + logBuffer.log( + TAG, + LogLevel.DEBUG, + { + int1 = intent.getIntExtra(EXTRA_LEVEL, DEFAULT) + int2 = intent.getIntExtra(EXTRA_SCALE, DEFAULT) + }, + { "Processing BATTERY_CHANGED intent. level=${int1.report()} scale=${int2.report()}" } + ) + } + + fun logBatteryChangedSkipBecauseTest() { + logBuffer.log( + TAG, + LogLevel.DEBUG, + {}, + { "Detected test intent. Will not execute battery level callbacks." } + ) + } + + fun logEnterTestMode() { + logBuffer.log( + TAG, + LogLevel.DEBUG, + {}, + { "Entering test mode for BATTERY_LEVEL_TEST intent" } + ) + } + + fun logExitTestMode() { + logBuffer.log(TAG, LogLevel.DEBUG, {}, { "Exiting test mode" }) + } + + fun logBatteryLevelChangedCallback(level: Int, plugged: Boolean, charging: Boolean) { + logBuffer.log( + TAG, + LogLevel.DEBUG, + { + int1 = level + bool1 = plugged + bool2 = charging + }, + { + "Sending onBatteryLevelChanged callbacks " + + "with level=$int1, plugged=$bool1, charging=$bool2" + } + ) + } + + private fun Int.report(): String = + if (this == DEFAULT) { + "(missing)" + } else { + toString() + } + + companion object { + const val TAG: String = "BatteryControllerLog" + } +} + +// Use a token value so we can determine if we got the default +private const val DEFAULT = -11 diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/BatteryControllerLog.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/BatteryControllerLog.kt new file mode 100644 index 000000000000..5322b3811f95 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/BatteryControllerLog.kt @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.policy.dagger + +import javax.inject.Qualifier + +/** Logs for Battery events. See [BatteryControllerImpl] */ +@Qualifier +@MustBeDocumented +@Retention(AnnotationRetention.RUNTIME) +annotation class BatteryControllerLog diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java index c2a8e701653a..de07a48a2b56 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java @@ -24,6 +24,8 @@ import com.android.internal.R; import com.android.settingslib.devicestate.DeviceStateRotationLockSettingsManager; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.log.LogBuffer; +import com.android.systemui.log.LogBufferFactory; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.connectivity.AccessPointController; import com.android.systemui.statusbar.connectivity.AccessPointControllerImpl; @@ -31,6 +33,7 @@ import com.android.systemui.statusbar.connectivity.NetworkController; import com.android.systemui.statusbar.connectivity.NetworkControllerImpl; import com.android.systemui.statusbar.connectivity.WifiPickerTrackerFactory; import com.android.systemui.statusbar.phone.ConfigurationControllerImpl; +import com.android.systemui.statusbar.policy.BatteryControllerLogger; import com.android.systemui.statusbar.policy.BluetoothController; import com.android.systemui.statusbar.policy.BluetoothControllerImpl; import com.android.systemui.statusbar.policy.CastController; @@ -202,4 +205,13 @@ public interface StatusBarPolicyModule { static DataSaverController provideDataSaverController(NetworkController networkController) { return networkController.getDataSaverController(); } + + /** Provides a log bufffer for BatteryControllerImpl */ + @Provides + @SysUISingleton + @BatteryControllerLog + //TODO(b/300147438): reduce the size of this log buffer + static LogBuffer provideBatteryControllerLog(LogBufferFactory factory) { + return factory.create(BatteryControllerLogger.TAG, 300); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java index cdeb59278851..58d93c98f015 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java @@ -17,12 +17,10 @@ package com.android.systemui.statusbar.policy; import static android.os.BatteryManager.EXTRA_PRESENT; - import static com.android.dx.mockito.inline.extended.ExtendedMockito.inOrder; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession; import static com.android.dx.mockito.inline.extended.ExtendedMockito.staticMockMarker; import static com.android.settingslib.fuelgauge.BatterySaverLogging.SAVER_ENABLED_QS; - import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -91,6 +89,7 @@ public class BatteryControllerTest extends SysuiTestCase { mBroadcastDispatcher, mDemoModeController, mock(DumpManager.class), + mock(BatteryControllerLogger.class), new Handler(), new Handler()); // Can throw if updateEstimate is called on the main thread |