Loading res/values/strings.xml +10 −0 Original line number Diff line number Diff line Loading @@ -4938,6 +4938,16 @@ <!-- Summary for auto restriction toggle --> <string name="battery_auto_restriction_summary">Prevent apps from using extra battery in the background</string> <!-- Summary for battery manager when it is on --> <string name="battery_manager_on">On / Restricting apps automatically</string> <!-- Summary for battery manager when it is off --> <string name="battery_manager_off">Off</string> <!-- Summary for battery manager, showing app restricted --> <plurals name="battery_manager_app_restricted"> <item quantity="one">%1$d app restricted</item> <item quantity="other">%1$d apps restricted</item> </plurals> <!-- Title for force stop dialog [CHAR LIMIT=30] --> <string name="dialog_stop_title">Stop app?</string> <!-- Message body for force stop dialog [CHAR LIMIT=NONE] --> Loading res/xml/power_usage_summary.xml +2 −1 Original line number Diff line number Diff line Loading @@ -42,7 +42,8 @@ <Preference android:fragment="com.android.settings.fuelgauge.SmartBatterySettings" android:key="smart_battery_manager" android:title="@string/smart_battery_manager_title"/> android:title="@string/smart_battery_manager_title" settings:controller="com.android.settings.fuelgauge.batterytip.BatteryManagerPreferenceController"/> <SwitchPreference android:key="battery_percentage" Loading src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java +2 −22 Original line number Diff line number Diff line Loading @@ -22,14 +22,13 @@ import android.content.Context; import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; import com.android.internal.util.CollectionUtils; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.fuelgauge.batterytip.AppInfo; import com.android.settings.fuelgauge.batterytip.BatteryTipUtils; import java.util.ArrayList; import java.util.List; /** Loading Loading @@ -65,26 +64,7 @@ public class RestrictAppPreferenceController extends BasePreferenceController { public void updateState(Preference preference) { super.updateState(preference); final List<AppOpsManager.PackageOps> packageOpsList = mAppOpsManager.getPackagesForOps( new int[]{AppOpsManager.OP_RUN_ANY_IN_BACKGROUND}); mAppInfos = new ArrayList<>(); for (int i = 0, size = CollectionUtils.size(packageOpsList); i < size; i++) { final AppOpsManager.PackageOps packageOps = packageOpsList.get(i); final List<AppOpsManager.OpEntry> entries = packageOps.getOps(); for (int j = 0; j < entries.size(); j++) { AppOpsManager.OpEntry ent = entries.get(j); if (ent.getOp() != AppOpsManager.OP_RUN_ANY_IN_BACKGROUND) { continue; } if (ent.getMode() != AppOpsManager.MODE_ALLOWED) { mAppInfos.add(new AppInfo.Builder() .setPackageName(packageOps.getPackageName()) .setUid(packageOps.getUid()) .build()); } } } mAppInfos = BatteryTipUtils.getRestrictedAppsList(mAppOpsManager); final int num = mAppInfos.size(); // Enable the preference if some apps already been restricted, otherwise disable it Loading src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceController.java 0 → 100644 +75 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 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.batterytip; import android.app.AppOpsManager; import android.content.Context; import android.provider.Settings; import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.overlay.FeatureFactory; /** * Preference controller to control the battery manager */ public class BatteryManagerPreferenceController extends BasePreferenceController { private static final String KEY_BATTERY_MANAGER = "smart_battery_manager"; private static final int ON = 1; private PowerUsageFeatureProvider mPowerUsageFeatureProvider; private AppOpsManager mAppOpsManager; public BatteryManagerPreferenceController(Context context) { super(context, KEY_BATTERY_MANAGER); mPowerUsageFeatureProvider = FeatureFactory.getFactory( context).getPowerUsageFeatureProvider(context); mAppOpsManager = context.getSystemService(AppOpsManager.class); } @Override public int getAvailabilityStatus() { return AVAILABLE; } @Override public void updateState(Preference preference) { super.updateState(preference); final int num = BatteryTipUtils.getRestrictedAppsList(mAppOpsManager).size(); final String setting = mPowerUsageFeatureProvider.isSmartBatterySupported() ? Settings.Global.APP_STANDBY_ENABLED : Settings.Global.APP_AUTO_RESTRICTION_ENABLED; final boolean featureOn = Settings.Global.getInt(mContext.getContentResolver(), setting, ON) == ON; updateSummary(preference, featureOn, num); } @VisibleForTesting void updateSummary(Preference preference, boolean featureOn, int num) { if (num > 0) { preference.setSummary(mContext.getResources().getQuantityString( R.plurals.battery_manager_app_restricted, num, num)); } else if (featureOn) { preference.setSummary(R.string.battery_manager_on); } else { preference.setSummary(R.string.battery_manager_off); } } } src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java +35 −0 Original line number Diff line number Diff line Loading @@ -16,11 +16,14 @@ package com.android.settings.fuelgauge.batterytip; import android.app.AppOpsManager; import android.app.PendingIntent; import android.app.StatsManager; import android.content.Context; import android.content.Intent; import android.support.annotation.NonNull; import com.android.internal.util.CollectionUtils; import com.android.settings.SettingsActivity; import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.fuelgauge.batterytip.actions.BatterySaverAction; Loading @@ -33,12 +36,44 @@ import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip; import java.util.ArrayList; import java.util.List; /** * Utility class for {@link BatteryTip} */ public class BatteryTipUtils { private static final int REQUEST_CODE = 0; /** * Get a list of restricted apps with {@link AppOpsManager#OP_RUN_ANY_IN_BACKGROUND} */ @NonNull public static List<AppInfo> getRestrictedAppsList(AppOpsManager appOpsManager) { final List<AppOpsManager.PackageOps> packageOpsList = appOpsManager.getPackagesForOps( new int[]{AppOpsManager.OP_RUN_ANY_IN_BACKGROUND}); final List<AppInfo> appInfos = new ArrayList<>(); for (int i = 0, size = CollectionUtils.size(packageOpsList); i < size; i++) { final AppOpsManager.PackageOps packageOps = packageOpsList.get(i); final List<AppOpsManager.OpEntry> entries = packageOps.getOps(); for (int j = 0, entriesSize = entries.size(); j < entriesSize; j++) { AppOpsManager.OpEntry entry = entries.get(j); if (entry.getOp() != AppOpsManager.OP_RUN_ANY_IN_BACKGROUND) { continue; } if (entry.getMode() != AppOpsManager.MODE_ALLOWED) { appInfos.add(new AppInfo.Builder() .setPackageName(packageOps.getPackageName()) .setUid(packageOps.getUid()) .build()); } } } return appInfos; } /** * Get a corresponding action based on {@code batteryTip} * @param batteryTip used to detect which action to choose Loading Loading
res/values/strings.xml +10 −0 Original line number Diff line number Diff line Loading @@ -4938,6 +4938,16 @@ <!-- Summary for auto restriction toggle --> <string name="battery_auto_restriction_summary">Prevent apps from using extra battery in the background</string> <!-- Summary for battery manager when it is on --> <string name="battery_manager_on">On / Restricting apps automatically</string> <!-- Summary for battery manager when it is off --> <string name="battery_manager_off">Off</string> <!-- Summary for battery manager, showing app restricted --> <plurals name="battery_manager_app_restricted"> <item quantity="one">%1$d app restricted</item> <item quantity="other">%1$d apps restricted</item> </plurals> <!-- Title for force stop dialog [CHAR LIMIT=30] --> <string name="dialog_stop_title">Stop app?</string> <!-- Message body for force stop dialog [CHAR LIMIT=NONE] --> Loading
res/xml/power_usage_summary.xml +2 −1 Original line number Diff line number Diff line Loading @@ -42,7 +42,8 @@ <Preference android:fragment="com.android.settings.fuelgauge.SmartBatterySettings" android:key="smart_battery_manager" android:title="@string/smart_battery_manager_title"/> android:title="@string/smart_battery_manager_title" settings:controller="com.android.settings.fuelgauge.batterytip.BatteryManagerPreferenceController"/> <SwitchPreference android:key="battery_percentage" Loading
src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java +2 −22 Original line number Diff line number Diff line Loading @@ -22,14 +22,13 @@ import android.content.Context; import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; import com.android.internal.util.CollectionUtils; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.fuelgauge.batterytip.AppInfo; import com.android.settings.fuelgauge.batterytip.BatteryTipUtils; import java.util.ArrayList; import java.util.List; /** Loading Loading @@ -65,26 +64,7 @@ public class RestrictAppPreferenceController extends BasePreferenceController { public void updateState(Preference preference) { super.updateState(preference); final List<AppOpsManager.PackageOps> packageOpsList = mAppOpsManager.getPackagesForOps( new int[]{AppOpsManager.OP_RUN_ANY_IN_BACKGROUND}); mAppInfos = new ArrayList<>(); for (int i = 0, size = CollectionUtils.size(packageOpsList); i < size; i++) { final AppOpsManager.PackageOps packageOps = packageOpsList.get(i); final List<AppOpsManager.OpEntry> entries = packageOps.getOps(); for (int j = 0; j < entries.size(); j++) { AppOpsManager.OpEntry ent = entries.get(j); if (ent.getOp() != AppOpsManager.OP_RUN_ANY_IN_BACKGROUND) { continue; } if (ent.getMode() != AppOpsManager.MODE_ALLOWED) { mAppInfos.add(new AppInfo.Builder() .setPackageName(packageOps.getPackageName()) .setUid(packageOps.getUid()) .build()); } } } mAppInfos = BatteryTipUtils.getRestrictedAppsList(mAppOpsManager); final int num = mAppInfos.size(); // Enable the preference if some apps already been restricted, otherwise disable it Loading
src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceController.java 0 → 100644 +75 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 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.batterytip; import android.app.AppOpsManager; import android.content.Context; import android.provider.Settings; import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.overlay.FeatureFactory; /** * Preference controller to control the battery manager */ public class BatteryManagerPreferenceController extends BasePreferenceController { private static final String KEY_BATTERY_MANAGER = "smart_battery_manager"; private static final int ON = 1; private PowerUsageFeatureProvider mPowerUsageFeatureProvider; private AppOpsManager mAppOpsManager; public BatteryManagerPreferenceController(Context context) { super(context, KEY_BATTERY_MANAGER); mPowerUsageFeatureProvider = FeatureFactory.getFactory( context).getPowerUsageFeatureProvider(context); mAppOpsManager = context.getSystemService(AppOpsManager.class); } @Override public int getAvailabilityStatus() { return AVAILABLE; } @Override public void updateState(Preference preference) { super.updateState(preference); final int num = BatteryTipUtils.getRestrictedAppsList(mAppOpsManager).size(); final String setting = mPowerUsageFeatureProvider.isSmartBatterySupported() ? Settings.Global.APP_STANDBY_ENABLED : Settings.Global.APP_AUTO_RESTRICTION_ENABLED; final boolean featureOn = Settings.Global.getInt(mContext.getContentResolver(), setting, ON) == ON; updateSummary(preference, featureOn, num); } @VisibleForTesting void updateSummary(Preference preference, boolean featureOn, int num) { if (num > 0) { preference.setSummary(mContext.getResources().getQuantityString( R.plurals.battery_manager_app_restricted, num, num)); } else if (featureOn) { preference.setSummary(R.string.battery_manager_on); } else { preference.setSummary(R.string.battery_manager_off); } } }
src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java +35 −0 Original line number Diff line number Diff line Loading @@ -16,11 +16,14 @@ package com.android.settings.fuelgauge.batterytip; import android.app.AppOpsManager; import android.app.PendingIntent; import android.app.StatsManager; import android.content.Context; import android.content.Intent; import android.support.annotation.NonNull; import com.android.internal.util.CollectionUtils; import com.android.settings.SettingsActivity; import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.fuelgauge.batterytip.actions.BatterySaverAction; Loading @@ -33,12 +36,44 @@ import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip; import java.util.ArrayList; import java.util.List; /** * Utility class for {@link BatteryTip} */ public class BatteryTipUtils { private static final int REQUEST_CODE = 0; /** * Get a list of restricted apps with {@link AppOpsManager#OP_RUN_ANY_IN_BACKGROUND} */ @NonNull public static List<AppInfo> getRestrictedAppsList(AppOpsManager appOpsManager) { final List<AppOpsManager.PackageOps> packageOpsList = appOpsManager.getPackagesForOps( new int[]{AppOpsManager.OP_RUN_ANY_IN_BACKGROUND}); final List<AppInfo> appInfos = new ArrayList<>(); for (int i = 0, size = CollectionUtils.size(packageOpsList); i < size; i++) { final AppOpsManager.PackageOps packageOps = packageOpsList.get(i); final List<AppOpsManager.OpEntry> entries = packageOps.getOps(); for (int j = 0, entriesSize = entries.size(); j < entriesSize; j++) { AppOpsManager.OpEntry entry = entries.get(j); if (entry.getOp() != AppOpsManager.OP_RUN_ANY_IN_BACKGROUND) { continue; } if (entry.getMode() != AppOpsManager.MODE_ALLOWED) { appInfos.add(new AppInfo.Builder() .setPackageName(packageOps.getPackageName()) .setUid(packageOps.getUid()) .build()); } } } return appInfos; } /** * Get a corresponding action based on {@code batteryTip} * @param batteryTip used to detect which action to choose Loading