From d90026d18479652530fd0bb861f0f331b61259aa Mon Sep 17 00:00:00 2001 From: Wesley Wang Date: Wed, 28 Sep 2022 18:12:35 +0800 Subject: [PATCH] Add BatteryHistoricalLogUtil class - Impl optimize mode log mechanism to record optimize setup flow - Log optimize action with MANUAL, APPLY, RESET and RESTORE - Use proto file to serialize logs sample result: https://screenshot.googleplex.com/5KPrHVGb4pMvS7V.png Bug: 241735485 Test: make SettingsRoboTests Change-Id: I879663de4cf45d0cfb9cd7eee957eeb65addfbe1 --- Android.bp | 1 + protos/Android.bp | 8 ++ protos/fuelgauge_log.proto | 27 ++++ .../fuelgauge/AdvancedPowerUsageDetail.java | 14 +- .../fuelgauge/BatteryBackupHelper.java | 3 +- .../fuelgauge/BatteryHistoricalLogUtil.java | 129 ++++++++++++++++++ .../fuelgauge/BatteryOptimizeUtils.java | 43 ++++-- .../AdvancedPowerUsageDetailTest.java | 1 + .../fuelgauge/BatteryBackupHelperTest.java | 13 +- .../BatteryHistoricalLogUtilTest.java | 82 +++++++++++ .../fuelgauge/BatteryOptimizeUtilsTest.java | 9 +- 11 files changed, 309 insertions(+), 21 deletions(-) create mode 100644 protos/fuelgauge_log.proto create mode 100644 src/com/android/settings/fuelgauge/BatteryHistoricalLogUtil.java create mode 100644 tests/robotests/src/com/android/settings/fuelgauge/BatteryHistoricalLogUtilTest.java diff --git a/Android.bp b/Android.bp index f980bfa6581..b74794f1937 100644 --- a/Android.bp +++ b/Android.bp @@ -79,6 +79,7 @@ android_library { "settings-contextual-card-protos-lite", "settings-log-bridge-protos-lite", "settings-telephony-protos-lite", + "fuelgauge-log-protos-lite", "contextualcards", "settings-logtags", "statslog-settings", diff --git a/protos/Android.bp b/protos/Android.bp index fbcf645307b..d546e2db7fe 100644 --- a/protos/Android.bp +++ b/protos/Android.bp @@ -33,3 +33,11 @@ java_library_static { }, srcs: ["network_mode_choices.proto"], } + +java_library { + name: "fuelgauge-log-protos-lite", + proto: { + type: "lite", + }, + srcs: ["fuelgauge_log.proto"], +} diff --git a/protos/fuelgauge_log.proto b/protos/fuelgauge_log.proto new file mode 100644 index 00000000000..6358951f312 --- /dev/null +++ b/protos/fuelgauge_log.proto @@ -0,0 +1,27 @@ +syntax = "proto2"; + +package com.android.settings.intelligence; +option java_multiple_files = true; +option java_package = "com.android.settings.fuelgauge"; +option java_outer_classname = "FuelgaugeLogProto"; + +// Stores history of setting optimize mode +message BatteryOptimizeHistoricalLog { + repeated BatteryOptimizeHistoricalLogEntry log_entry = 1; +} + +message BatteryOptimizeHistoricalLogEntry { + + // The action to set optimize mode + enum Action { + UNKNOWN = 0; + MANUAL = 1; + APPLY = 2; + RESET = 3; + RESTORE = 4; + } + + optional string package_name = 1; + optional Action action = 2; + optional string action_description = 3; +} \ No newline at end of file diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java index c08a1b8985e..64207aecb12 100644 --- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java @@ -41,6 +41,7 @@ import com.android.settings.applications.appinfo.ButtonActionDialogFragment; import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.core.SubSettingLauncher; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action; import com.android.settings.fuelgauge.batteryusage.BatteryDiffEntry; import com.android.settings.fuelgauge.batteryusage.BatteryEntry; import com.android.settings.fuelgauge.batteryusage.BatteryHistEntry; @@ -113,6 +114,8 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements int mOptimizationMode = BatteryOptimizeUtils.MODE_UNKNOWN; @VisibleForTesting BackupManager mBackupManager; + @VisibleForTesting + StringBuilder mLogStringBuilder; private AppButtonsPreferenceController mAppButtonsPreferenceController; @@ -272,6 +275,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements getContext(), SettingsEnums.OPEN_APP_BATTERY_USAGE, packageName); + mLogStringBuilder = new StringBuilder("onResume mode = ").append(mOptimizationMode); } @Override @@ -281,8 +285,16 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements final int selectedPreference = getSelectedPreference(); notifyBackupManager(); + mLogStringBuilder.append(", onPause mode = ").append(selectedPreference); logMetricCategory(selectedPreference); - mBatteryOptimizeUtils.setAppUsageState(selectedPreference); + + BatteryHistoricalLogUtil.writeLog( + getContext().getApplicationContext(), + Action.MANUAL, + BatteryHistoricalLogUtil.getPackageNameWithUserId( + mBatteryOptimizeUtils.getPackageName(), UserHandle.myUserId()), + mLogStringBuilder.toString()); + mBatteryOptimizeUtils.setAppUsageState(selectedPreference, Action.APPLY); Log.d(TAG, "Leave with mode: " + selectedPreference); } diff --git a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java index 9860240b289..04605451b48 100644 --- a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java +++ b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java @@ -221,7 +221,8 @@ public final class BatteryBackupHelper implements BackupHelper { mBatteryOptimizeUtils != null ? mBatteryOptimizeUtils /*testing only*/ : new BatteryOptimizeUtils(mContext, uid, packageName); - batteryOptimizeUtils.setAppUsageState(mode); + batteryOptimizeUtils.setAppUsageState( + mode, BatteryOptimizeHistoricalLogEntry.Action.RESTORE); Log.d(TAG, String.format("restore:%s mode=%d", packageName, mode)); } diff --git a/src/com/android/settings/fuelgauge/BatteryHistoricalLogUtil.java b/src/com/android/settings/fuelgauge/BatteryHistoricalLogUtil.java new file mode 100644 index 00000000000..7b076425205 --- /dev/null +++ b/src/com/android/settings/fuelgauge/BatteryHistoricalLogUtil.java @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2022 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.settings.fuelgauge; + +import android.content.Context; +import android.content.SharedPreferences; +import android.util.Base64; +import android.util.Log; + +import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action; + +import com.google.common.annotations.VisibleForTesting; +import com.google.protobuf.InvalidProtocolBufferException; +import com.google.protobuf.MessageLite; + +import java.io.PrintWriter; +import java.util.List; + +/** Writes and reads a historical log of battery related state change events. */ +public final class BatteryHistoricalLogUtil { + private static final String BATTERY_OPTIMIZE_FILE_NAME = "battery_optimize_historical_logs"; + private static final String LOGS_KEY = "battery_optimize_logs_key"; + private static final String TAG = "BatteryHistoricalLogUtil"; + + @VisibleForTesting + static final int MAX_ENTRIES = 40; + + /** + * Writes a log entry. + * + *

Keeps up to {@link #MAX_ENTRIES} in the log, once that number is exceeded, it prunes the + * oldest one. + */ + static void writeLog(Context context, Action action, String pkg, String actionDescription) { + writeLog( + context, + BatteryOptimizeHistoricalLogEntry.newBuilder() + .setPackageName(pkg) + .setAction(action) + .setActionDescription(actionDescription) + .build()); + } + + private static void writeLog(Context context, BatteryOptimizeHistoricalLogEntry logEntry) { + SharedPreferences sharedPreferences = getSharedPreferences(context); + + BatteryOptimizeHistoricalLog existingLog = + parseLogFromString(sharedPreferences.getString(LOGS_KEY, "")); + BatteryOptimizeHistoricalLog.Builder newLogBuilder = existingLog.toBuilder(); + // Prune old entries + if (existingLog.getLogEntryCount() >= MAX_ENTRIES) { + newLogBuilder.removeLogEntry(0); + } + newLogBuilder.addLogEntry(logEntry); + + sharedPreferences + .edit() + .putString( + LOGS_KEY, + Base64.encodeToString(newLogBuilder.build().toByteArray(), Base64.DEFAULT)) + .apply(); + } + + private static BatteryOptimizeHistoricalLog parseLogFromString(String storedLogs) { + return parseProtoFromString(storedLogs, BatteryOptimizeHistoricalLog.getDefaultInstance()); + } + + @SuppressWarnings("unchecked") + private static T parseProtoFromString( + String serializedProto, T protoClass) { + if (serializedProto.isEmpty()) { + return (T) protoClass.getDefaultInstanceForType(); + } + try { + return (T) protoClass.getParserForType() + .parseFrom(Base64.decode(serializedProto, Base64.DEFAULT)); + } catch (InvalidProtocolBufferException e) { + Log.e(TAG, "Failed to deserialize proto class", e); + return (T) protoClass.getDefaultInstanceForType(); + } + } + + /** + * Prints the historical log that has previously been stored by this utility. + */ + public static void printBatteryOptimizeHistoricalLog(Context context, PrintWriter writer) { + writer.println("Battery optimize state history:"); + SharedPreferences sharedPreferences = getSharedPreferences(context); + BatteryOptimizeHistoricalLog existingLog = + parseLogFromString(sharedPreferences.getString(LOGS_KEY, "")); + List logEntryList = existingLog.getLogEntryList(); + if (logEntryList.isEmpty()) { + writer.println("\tNo past logs."); + } else { + logEntryList.forEach(entry -> writer.println(toString(entry))); + } + } + + /** + * Gets the unique key for logging, combined with package name, delimiter and user id. + */ + static String getPackageNameWithUserId(String pkgName, int userId) { + return pkgName + ":" + userId; + } + + private static String toString(BatteryOptimizeHistoricalLogEntry entry) { + return String.format("%s\tAction:%s\tEvent:%s", + entry.getPackageName(), entry.getAction(), entry.getActionDescription()); + } + + @VisibleForTesting + static SharedPreferences getSharedPreferences(Context context) { + return context.getSharedPreferences(BATTERY_OPTIMIZE_FILE_NAME, Context.MODE_PRIVATE); + } +} diff --git a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java index dbfacc6907c..19286625761 100644 --- a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java @@ -32,6 +32,7 @@ import android.util.Log; import androidx.annotation.VisibleForTesting; +import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action; import com.android.settingslib.fuelgauge.PowerAllowlistBackend; import java.lang.annotation.Retention; @@ -49,6 +50,7 @@ public class BatteryOptimizeUtils { @VisibleForTesting boolean mAllowListed; private final String mPackageName; + private final Context mContext; private final int mUid; // If current user is admin, match apps from all users. Otherwise, only match the currect user. @@ -77,6 +79,7 @@ public class BatteryOptimizeUtils { public BatteryOptimizeUtils(Context context, int uid, String packageName) { mUid = uid; + mContext = context; mPackageName = packageName; mAppOpsManager = context.getSystemService(AppOpsManager.class); mBatteryUtils = BatteryUtils.getInstance(context); @@ -115,12 +118,13 @@ public class BatteryOptimizeUtils { } /** Sets the {@link OptimizationMode} for associated app. */ - public void setAppUsageState(@OptimizationMode int mode) { + public void setAppUsageState(@OptimizationMode int mode, Action action) { if (getAppOptimizationMode(mMode, mAllowListed) == mode) { Log.w(TAG, "set the same optimization mode for: " + mPackageName); return; } - setAppUsageStateInternal(mode, mUid, mPackageName, mBatteryUtils, mPowerAllowListBackend); + setAppUsageStateInternal( + mContext, mode, mUid, mPackageName, mBatteryUtils, mPowerAllowListBackend, action); } /** @@ -192,8 +196,8 @@ public class BatteryOptimizeUtils { } // Resets to the default mode: MODE_OPTIMIZED. - setAppUsageStateInternal(MODE_OPTIMIZED, info.uid, info.packageName, batteryUtils, - allowlistBackend); + setAppUsageStateInternal(context, MODE_OPTIMIZED, info.uid, info.packageName, + batteryUtils, allowlistBackend, Action.RESET); } } @@ -208,8 +212,9 @@ public class BatteryOptimizeUtils { } private static void setAppUsageStateInternal( - @OptimizationMode int mode, int uid, String packageName, BatteryUtils batteryUtils, - PowerAllowlistBackend powerAllowlistBackend) { + Context context, @OptimizationMode int mode, int uid, String packageName, + BatteryUtils batteryUtils, PowerAllowlistBackend powerAllowlistBackend, + Action action) { if (mode == MODE_UNKNOWN) { Log.d(TAG, "set unknown app optimization mode."); return; @@ -223,14 +228,17 @@ public class BatteryOptimizeUtils { final boolean allowListed = mode == MODE_UNRESTRICTED; AsyncTask.execute(() -> { - setAppOptimizationModeInternal(appOpsManagerMode, allowListed, uid, packageName, - batteryUtils, powerAllowlistBackend); + setAppOptimizationModeInternal(context, appOpsManagerMode, allowListed, uid, + packageName, batteryUtils, powerAllowlistBackend, action); }); } private static void setAppOptimizationModeInternal( - int appStandbyMode, boolean allowListed, int uid, String packageName, - BatteryUtils batteryUtils, PowerAllowlistBackend powerAllowlistBackend) { + Context context, int appStandbyMode, boolean allowListed, int uid, String packageName, + BatteryUtils batteryUtils, PowerAllowlistBackend powerAllowlistBackend, + Action action) { + final String packageNameKey = BatteryHistoricalLogUtil + .getPackageNameWithUserId(packageName, UserHandle.myUserId()); try { batteryUtils.setForceAppStandby(uid, packageName, appStandbyMode); if (allowListed) { @@ -239,8 +247,15 @@ public class BatteryOptimizeUtils { powerAllowlistBackend.removeApp(packageName); } } catch (Exception e) { + // Error cases, set standby mode as -1 for logging. + appStandbyMode = -1; Log.e(TAG, "set OPTIMIZATION MODE failed for " + packageName, e); } + BatteryHistoricalLogUtil.writeLog( + context, + action, + packageNameKey, + createLogEvent(appStandbyMode, allowListed)); } private void refreshState() { @@ -251,4 +266,12 @@ public class BatteryOptimizeUtils { Log.d(TAG, String.format("refresh %s state, allowlisted = %s, mode = %d", mPackageName, mAllowListed, mMode)); } + + private static String createLogEvent(int appStandbyMode, boolean allowListed) { + return appStandbyMode < 0 ? "Apply optimize setting ERROR" : + String.format("\tStandbyMode: %s, allowListed: %s, mode: %s", + appStandbyMode, + allowListed, + getAppOptimizationMode(appStandbyMode, allowListed)); + } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java index 45e80891faa..55ae957ae21 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java @@ -184,6 +184,7 @@ public class AdvancedPowerUsageDetailTest { mFragment.mBatteryUtils = new BatteryUtils(RuntimeEnvironment.application); mFragment.mBatteryOptimizeUtils = mBatteryOptimizeUtils; mFragment.mBackupManager = mBackupManager; + mFragment.mLogStringBuilder = new StringBuilder(); mAppEntry.info = mock(ApplicationInfo.class); mTestActivity = spy(new SettingsActivity()); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java index 55ff93b964a..904064c6271 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java @@ -51,6 +51,7 @@ import android.os.UserHandle; import android.os.UserManager; import android.util.ArraySet; +import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action; import com.android.settingslib.fuelgauge.PowerAllowlistBackend; import org.junit.After; @@ -312,8 +313,9 @@ public final class BatteryBackupHelperTest { TimeUnit.SECONDS.sleep(1); final InOrder inOrder = inOrder(mBatteryOptimizeUtils); - inOrder.verify(mBatteryOptimizeUtils).setAppUsageState(MODE_RESTRICTED); - inOrder.verify(mBatteryOptimizeUtils, never()).setAppUsageState(anyInt()); + inOrder.verify(mBatteryOptimizeUtils).setAppUsageState(MODE_RESTRICTED, Action.RESTORE); + inOrder.verify(mBatteryOptimizeUtils, never()) + .setAppUsageState(anyInt(), eq(Action.RESTORE)); } @Test @@ -327,9 +329,10 @@ public final class BatteryBackupHelperTest { TimeUnit.SECONDS.sleep(1); final InOrder inOrder = inOrder(mBatteryOptimizeUtils); - inOrder.verify(mBatteryOptimizeUtils).setAppUsageState(MODE_RESTRICTED); - inOrder.verify(mBatteryOptimizeUtils).setAppUsageState(MODE_UNRESTRICTED); - inOrder.verify(mBatteryOptimizeUtils, never()).setAppUsageState(MODE_RESTRICTED); + inOrder.verify(mBatteryOptimizeUtils).setAppUsageState(MODE_RESTRICTED, Action.RESTORE); + inOrder.verify(mBatteryOptimizeUtils).setAppUsageState(MODE_UNRESTRICTED, Action.RESTORE); + inOrder.verify(mBatteryOptimizeUtils, never()) + .setAppUsageState(MODE_RESTRICTED, Action.RESTORE); } private void mockUid(int uid, String packageName) throws Exception { diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistoricalLogUtilTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistoricalLogUtilTest.java new file mode 100644 index 00000000000..844285e239b --- /dev/null +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistoricalLogUtilTest.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2022 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.settings.fuelgauge; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; + +import androidx.test.core.app.ApplicationProvider; + +import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +import java.io.PrintWriter; +import java.io.StringWriter; + +@RunWith(RobolectricTestRunner.class) +public final class BatteryHistoricalLogUtilTest { + + private final StringWriter mTestStringWriter = new StringWriter(); + private final PrintWriter mTestPrintWriter = new PrintWriter(mTestStringWriter); + + private Context mContext; + + @Before + public void setUp() { + mContext = ApplicationProvider.getApplicationContext(); + BatteryHistoricalLogUtil.getSharedPreferences(mContext).edit().clear().commit(); + } + + @Test + public void printHistoricalLog_withDefaultLogs() { + BatteryHistoricalLogUtil.printBatteryOptimizeHistoricalLog(mContext, mTestPrintWriter); + assertThat(mTestStringWriter.toString()).contains("No past logs"); + } + + @Test + public void writeLog_withExpectedLogs() { + BatteryHistoricalLogUtil.writeLog(mContext, Action.APPLY, "pkg1", "logs"); + BatteryHistoricalLogUtil.printBatteryOptimizeHistoricalLog(mContext, mTestPrintWriter); + + assertThat(mTestStringWriter.toString()).contains("pkg1\tAction:APPLY\tEvent:logs"); + } + + @Test + public void writeLog_multipleLogs_withCorrectCounts() { + for (int i = 0; i < BatteryHistoricalLogUtil.MAX_ENTRIES; i++) { + BatteryHistoricalLogUtil.writeLog(mContext, Action.MANUAL, "pkg" + i, "logs"); + } + BatteryHistoricalLogUtil.printBatteryOptimizeHistoricalLog(mContext, mTestPrintWriter); + + assertThat(mTestStringWriter.toString().split("MANUAL").length).isEqualTo(41); + } + + @Test + public void writeLog_overMaxEntriesLogs_withCorrectCounts() { + for (int i = 0; i < BatteryHistoricalLogUtil.MAX_ENTRIES + 10; i++) { + BatteryHistoricalLogUtil.writeLog(mContext, Action.RESET, "pkg" + i, "logs"); + } + BatteryHistoricalLogUtil.printBatteryOptimizeHistoricalLog(mContext, mTestPrintWriter); + + assertThat(mTestStringWriter.toString().split("RESET").length).isEqualTo(41); + } +} diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java index f92c3223b90..104a6773f09 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java @@ -47,6 +47,7 @@ import android.content.pm.UserInfo; import android.os.UserManager; import android.util.ArraySet; +import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action; import com.android.settingslib.fuelgauge.PowerAllowlistBackend; import org.junit.Before; @@ -152,7 +153,7 @@ public class BatteryOptimizeUtilsTest { mBatteryOptimizeUtils.mAllowListed = false; mBatteryOptimizeUtils.mMode = AppOpsManager.MODE_ALLOWED; - mBatteryOptimizeUtils.setAppUsageState(MODE_RESTRICTED); + mBatteryOptimizeUtils.setAppUsageState(MODE_RESTRICTED, Action.UNKNOWN); TimeUnit.SECONDS.sleep(1); verifySetAppOptimizationMode(AppOpsManager.MODE_IGNORED, /* allowListed */ false); @@ -160,7 +161,7 @@ public class BatteryOptimizeUtilsTest { @Test public void testSetAppUsageState_Unrestricted_verifyAction() throws Exception { - mBatteryOptimizeUtils.setAppUsageState(MODE_UNRESTRICTED); + mBatteryOptimizeUtils.setAppUsageState(MODE_UNRESTRICTED, Action.UNKNOWN); TimeUnit.SECONDS.sleep(1); verifySetAppOptimizationMode(AppOpsManager.MODE_ALLOWED, /* allowListed */ true); @@ -168,7 +169,7 @@ public class BatteryOptimizeUtilsTest { @Test public void testSetAppUsageState_Optimized_verifyAction() throws Exception { - mBatteryOptimizeUtils.setAppUsageState(MODE_OPTIMIZED); + mBatteryOptimizeUtils.setAppUsageState(MODE_OPTIMIZED, Action.UNKNOWN); TimeUnit.SECONDS.sleep(1); verifySetAppOptimizationMode(AppOpsManager.MODE_ALLOWED, /* allowListed */ false); @@ -180,7 +181,7 @@ public class BatteryOptimizeUtilsTest { mBatteryOptimizeUtils.mAllowListed = true; mBatteryOptimizeUtils.mMode = AppOpsManager.MODE_ALLOWED; - mBatteryOptimizeUtils.setAppUsageState(MODE_UNRESTRICTED); + mBatteryOptimizeUtils.setAppUsageState(MODE_UNRESTRICTED, Action.UNKNOWN); TimeUnit.SECONDS.sleep(1); verifyNoInteractions(mMockBackend);