Move restricted apps page to new battery optimization page.

New entry: https://screenshot.googleplex.com/BbU6RnQhBbpnBc3.png
Restricted: https://screenshot.googleplex.com/5ggid7TcSsH9CUF.png
Old entry: https://screenshot.googleplex.com/7JgZpSfKs5zZb3Z.png

Bug: 240711616
Test: manual
Change-Id: I03d17beac0fb85a3d17acd7d0d581feb35e9582b
This commit is contained in:
Tiffany Nguyen
2022-08-02 17:26:10 +00:00
parent aef0cde406
commit 3acd34fe4a
9 changed files with 111 additions and 31 deletions

View File

@@ -633,4 +633,7 @@
<item>@string/config_settingsintelligence_package_name</item> <item>@string/config_settingsintelligence_package_name</item>
<item>android.uid.system:1000</item> <item>android.uid.system:1000</item>
</string-array> </string-array>
<!-- Whether to enable the app battery usage list page feature. -->
<bool name="config_app_battery_usage_list_enabled">false</bool>
</resources> </resources>

View File

@@ -76,6 +76,18 @@
<intent android:action="android.intent.action.MANAGE_UNUSED_APPS"/> <intent android:action="android.intent.action.MANAGE_UNUSED_APPS"/>
</Preference> </Preference>
<Preference
android:key="app_battery_usage"
android:order="17"
android:title="@string/app_battery_optimization_title"
android:summary="@string/app_battery_optimization_summary"
settings:controller="com.android.settings.applications.AppBatteryUsagePreferenceController"
android:fragment="com.android.settings.applications.manageapplications.ManageApplications">
<extra
android:name="classname"
android:value="com.android.settings.Settings$AppBatteryUsageActivity"/>
</Preference>
<Preference <Preference
android:key="special_access" android:key="special_access"
android:fragment="com.android.settings.applications.specialaccess.SpecialAccessSettings" android:fragment="com.android.settings.applications.specialaccess.SpecialAccessSettings"

View File

@@ -326,8 +326,8 @@ public class Settings extends SettingsActivity {
public static class ChangeWifiStateActivity extends SettingsActivity { /* empty */ } public static class ChangeWifiStateActivity extends SettingsActivity { /* empty */ }
public static class AppDrawOverlaySettingsActivity extends SettingsActivity { /* empty */ } public static class AppDrawOverlaySettingsActivity extends SettingsActivity { /* empty */ }
public static class AppWriteSettingsActivity extends SettingsActivity { /* empty */ } public static class AppWriteSettingsActivity extends SettingsActivity { /* empty */ }
/** Activity to manage app battery optimization details. */ /** Activity to manage app battery usage details. */
public static class AppBatteryOptimizationActivity extends SettingsActivity { /* empty */ } public static class AppBatteryUsageActivity extends SettingsActivity { /* empty */ }
public static class ManageExternalSourcesActivity extends SettingsActivity {/* empty */ } public static class ManageExternalSourcesActivity extends SettingsActivity {/* empty */ }
public static class ManageAppExternalSourcesActivity extends SettingsActivity { /* empty */ } public static class ManageAppExternalSourcesActivity extends SettingsActivity { /* empty */ }

View File

@@ -0,0 +1,55 @@
/*
* Copyright (C) 2021 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.applications;
import android.content.Context;
import android.permission.PermissionControllerManager;
import android.provider.DeviceConfig;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.google.common.annotations.VisibleForTesting;
import java.util.concurrent.Executor;
/**
* Preference controller for handling the app battery usage list preference.
*/
public final class AppBatteryUsagePreferenceController extends BasePreferenceController
implements LifecycleObserver {
private static final String TAG = "AppBatteryUsagePreferenceController";
private boolean mEnableAppBatteryUsagePage;
public AppBatteryUsagePreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
mEnableAppBatteryUsagePage =
mContext.getResources().getBoolean(R.bool.config_app_battery_usage_list_enabled);
}
@Override
public int getAvailabilityStatus() {
return mEnableAppBatteryUsagePage ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
}

View File

@@ -31,10 +31,10 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
/** /**
* Class for bridging the Battery optimization information to ApplicationState. * Class for bridging the app battery usage information to ApplicationState.
*/ */
public class AppStateBatteryOptimizationBridge extends AppStateBaseBridge { public class AppStateAppBatteryUsageBridge extends AppStateBaseBridge {
private static final String TAG = AppStateBatteryOptimizationBridge.class.getSimpleName(); private static final String TAG = AppStateAppBatteryUsageBridge.class.getSimpleName();
static final boolean DEBUG = Build.IS_DEBUGGABLE; static final boolean DEBUG = Build.IS_DEBUGGABLE;
private final Context mContext; private final Context mContext;
@@ -58,7 +58,7 @@ public class AppStateBatteryOptimizationBridge extends AppStateBaseBridge {
@interface OptimizationMode { @interface OptimizationMode {
} }
public AppStateBatteryOptimizationBridge( public AppStateAppBatteryUsageBridge(
Context context, ApplicationsState appState, Callback callback) { Context context, ApplicationsState appState, Callback callback) {
super(appState, callback); super(appState, callback);
mContext = context; mContext = context;
@@ -68,7 +68,7 @@ public class AppStateBatteryOptimizationBridge extends AppStateBaseBridge {
@Override @Override
protected void updateExtraInfo(AppEntry app, String pkg, int uid) { protected void updateExtraInfo(AppEntry app, String pkg, int uid) {
app.extraInfo = getAppBatteryOptimizationState(pkg, uid); app.extraInfo = getAppBatteryUsageState(pkg, uid);
} }
@Override @Override
@@ -83,7 +83,7 @@ public class AppStateBatteryOptimizationBridge extends AppStateBaseBridge {
} }
} }
protected Object getAppBatteryOptimizationState(String pkg, int uid) { protected Object getAppBatteryUsageState(String pkg, int uid) {
// Restricted = AppOpsManager.MODE_IGNORED + !allowListed // Restricted = AppOpsManager.MODE_IGNORED + !allowListed
// Unrestricted = AppOpsManager.MODE_ALLOWED + allowListed // Unrestricted = AppOpsManager.MODE_ALLOWED + allowListed
// Optimized = AppOpsManager.MODE_ALLOWED + !allowListed // Optimized = AppOpsManager.MODE_ALLOWED + !allowListed
@@ -107,17 +107,17 @@ public class AppStateBatteryOptimizationBridge extends AppStateBaseBridge {
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "Pkg: " + pkg + ", mode: " + modeName); Log.d(TAG, "Pkg: " + pkg + ", mode: " + modeName);
} }
return new BatteryOptimizationDetails(mode); return new AppBatteryUsageDetails(mode);
} }
@OptimizationMode @OptimizationMode
private static int getBatteryOptimizationDetailsMode(AppEntry entry) { private static int getAppBatteryUsageDetailsMode(AppEntry entry) {
if (entry == null || entry.extraInfo == null) { if (entry == null || entry.extraInfo == null) {
return MODE_UNKNOWN; return MODE_UNKNOWN;
} }
return entry.extraInfo instanceof BatteryOptimizationDetails return entry.extraInfo instanceof AppBatteryUsageDetails
? ((BatteryOptimizationDetails) entry.extraInfo).mMode ? ((AppBatteryUsageDetails) entry.extraInfo).mMode
: MODE_UNKNOWN; : MODE_UNKNOWN;
} }
@@ -132,7 +132,7 @@ public class AppStateBatteryOptimizationBridge extends AppStateBaseBridge {
@Override @Override
public boolean filterApp(AppEntry info) { public boolean filterApp(AppEntry info) {
return getBatteryOptimizationDetailsMode(info) == MODE_UNRESTRICTED; return getAppBatteryUsageDetailsMode(info) == MODE_UNRESTRICTED;
} }
}; };
@@ -147,7 +147,7 @@ public class AppStateBatteryOptimizationBridge extends AppStateBaseBridge {
@Override @Override
public boolean filterApp(AppEntry info) { public boolean filterApp(AppEntry info) {
return getBatteryOptimizationDetailsMode(info) == MODE_OPTIMIZED; return getAppBatteryUsageDetailsMode(info) == MODE_OPTIMIZED;
} }
}; };
@@ -162,18 +162,18 @@ public class AppStateBatteryOptimizationBridge extends AppStateBaseBridge {
@Override @Override
public boolean filterApp(AppEntry info) { public boolean filterApp(AppEntry info) {
return getBatteryOptimizationDetailsMode(info) == MODE_RESTRICTED; return getAppBatteryUsageDetailsMode(info) == MODE_RESTRICTED;
} }
}; };
/** /**
* Extra details for battery optimization app data. * Extra details for app battery usage data.
*/ */
static final class BatteryOptimizationDetails { static final class AppBatteryUsageDetails {
@OptimizationMode @OptimizationMode
int mMode; int mMode;
BatteryOptimizationDetails(@OptimizationMode int mode) { AppBatteryUsageDetails(@OptimizationMode int mode) {
mMode = mode; mMode = mode;
} }
} }

View File

@@ -20,7 +20,7 @@ import androidx.annotation.IntDef;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.applications.AppStateAlarmsAndRemindersBridge; import com.android.settings.applications.AppStateAlarmsAndRemindersBridge;
import com.android.settings.applications.AppStateBatteryOptimizationBridge; import com.android.settings.applications.AppStateAppBatteryUsageBridge;
import com.android.settings.applications.AppStateInstallAppsBridge; import com.android.settings.applications.AppStateInstallAppsBridge;
import com.android.settings.applications.AppStateLocaleBridge; import com.android.settings.applications.AppStateLocaleBridge;
import com.android.settings.applications.AppStateManageExternalStorageBridge; import com.android.settings.applications.AppStateManageExternalStorageBridge;
@@ -225,21 +225,21 @@ public class AppFilterRegistry {
// Unrestricted // Unrestricted
mFilters[FILTER_APPS_BATTERY_UNRESTRICTED] = mFilters[FILTER_APPS_BATTERY_UNRESTRICTED] =
new AppFilterItem( new AppFilterItem(
AppStateBatteryOptimizationBridge.FILTER_BATTERY_UNRESTRICTED_APPS, AppStateAppBatteryUsageBridge.FILTER_BATTERY_UNRESTRICTED_APPS,
FILTER_APPS_BATTERY_UNRESTRICTED, FILTER_APPS_BATTERY_UNRESTRICTED,
R.string.filter_battery_unrestricted_title); R.string.filter_battery_unrestricted_title);
// Optimized // Optimized
mFilters[FILTER_APPS_BATTERY_OPTIMIZED] = mFilters[FILTER_APPS_BATTERY_OPTIMIZED] =
new AppFilterItem( new AppFilterItem(
AppStateBatteryOptimizationBridge.FILTER_BATTERY_OPTIMIZED_APPS, AppStateAppBatteryUsageBridge.FILTER_BATTERY_OPTIMIZED_APPS,
FILTER_APPS_BATTERY_OPTIMIZED, FILTER_APPS_BATTERY_OPTIMIZED,
R.string.filter_battery_optimized_title); R.string.filter_battery_optimized_title);
// Unrestricted // Unrestricted
mFilters[FILTER_APPS_BATTERY_RESTRICTED] = mFilters[FILTER_APPS_BATTERY_RESTRICTED] =
new AppFilterItem( new AppFilterItem(
AppStateBatteryOptimizationBridge.FILTER_BATTERY_RESTRICTED_APPS, AppStateAppBatteryUsageBridge.FILTER_BATTERY_RESTRICTED_APPS,
FILTER_APPS_BATTERY_RESTRICTED, FILTER_APPS_BATTERY_RESTRICTED,
R.string.filter_battery_restricted_title); R.string.filter_battery_restricted_title);
} }

View File

@@ -100,7 +100,7 @@ import com.android.settings.applications.AppInfoBase;
import com.android.settings.applications.AppStateAlarmsAndRemindersBridge; import com.android.settings.applications.AppStateAlarmsAndRemindersBridge;
import com.android.settings.applications.AppStateAppOpsBridge.PermissionState; import com.android.settings.applications.AppStateAppOpsBridge.PermissionState;
import com.android.settings.applications.AppStateBaseBridge; import com.android.settings.applications.AppStateBaseBridge;
import com.android.settings.applications.AppStateBatteryOptimizationBridge; import com.android.settings.applications.AppStateAppBatteryUsageBridge;
import com.android.settings.applications.AppStateInstallAppsBridge; import com.android.settings.applications.AppStateInstallAppsBridge;
import com.android.settings.applications.AppStateLocaleBridge; import com.android.settings.applications.AppStateLocaleBridge;
import com.android.settings.applications.AppStateManageExternalStorageBridge; import com.android.settings.applications.AppStateManageExternalStorageBridge;
@@ -336,7 +336,7 @@ public class ManageApplications extends InstrumentedFragment
} }
} else if (className.equals(AppLocaleDetails.class.getName())) { } else if (className.equals(AppLocaleDetails.class.getName())) {
mListType = LIST_TYPE_APPS_LOCALE; mListType = LIST_TYPE_APPS_LOCALE;
} else if (className.equals(Settings.AppBatteryOptimizationActivity.class.getName())) { } else if (className.equals(Settings.AppBatteryUsageActivity.class.getName())) {
mListType = LIST_TYPE_BATTERY_OPTIMIZATION; mListType = LIST_TYPE_BATTERY_OPTIMIZATION;
} else { } else {
mListType = LIST_TYPE_MAIN; mListType = LIST_TYPE_MAIN;
@@ -958,7 +958,7 @@ public class ManageApplications extends InstrumentedFragment
screenTitle = R.string.app_notifications_title; screenTitle = R.string.app_notifications_title;
} else if (className.equals(AppLocaleDetails.class.getName())) { } else if (className.equals(AppLocaleDetails.class.getName())) {
screenTitle = R.string.app_locales_picker_menu_title; screenTitle = R.string.app_locales_picker_menu_title;
} else if (className.equals(Settings.AppBatteryOptimizationActivity.class.getName())) { } else if (className.equals(Settings.AppBatteryUsageActivity.class.getName())) {
screenTitle = R.string.app_battery_optimization_title; screenTitle = R.string.app_battery_optimization_title;
} else { } else {
if (screenTitle == -1) { if (screenTitle == -1) {
@@ -1153,7 +1153,7 @@ public class ManageApplications extends InstrumentedFragment
} else if (mManageApplications.mListType == LIST_TYPE_APPS_LOCALE) { } else if (mManageApplications.mListType == LIST_TYPE_APPS_LOCALE) {
mExtraInfoBridge = new AppStateLocaleBridge(mContext, mState, this); mExtraInfoBridge = new AppStateLocaleBridge(mContext, mState, this);
} else if (mManageApplications.mListType == LIST_TYPE_BATTERY_OPTIMIZATION) { } else if (mManageApplications.mListType == LIST_TYPE_BATTERY_OPTIMIZATION) {
mExtraInfoBridge = new AppStateBatteryOptimizationBridge(mContext, mState, this); mExtraInfoBridge = new AppStateAppBatteryUsageBridge(mContext, mState, this);
} else { } else {
mExtraInfoBridge = null; mExtraInfoBridge = null;
} }
@@ -1199,7 +1199,7 @@ public class ManageApplications extends InstrumentedFragment
rebuild(R.id.sort_order_alpha, true); rebuild(R.id.sort_order_alpha, true);
} }
} else if (mManageApplications.mListType == LIST_TYPE_BATTERY_OPTIMIZATION) { } else if (mManageApplications.mListType == LIST_TYPE_BATTERY_OPTIMIZATION) {
logBatteryOptimization(filterType); logAppBatteryUsage(filterType);
} else { } else {
rebuild(); rebuild();
} }
@@ -1336,7 +1336,7 @@ public class ManageApplications extends InstrumentedFragment
}); });
} }
private void logBatteryOptimization(int filterType) { private void logAppBatteryUsage(int filterType) {
switch(filterType) { switch(filterType) {
case FILTER_APPS_BATTERY_UNRESTRICTED: case FILTER_APPS_BATTERY_UNRESTRICTED:
logAction(SettingsEnums.ACTION_BATTERY_OPTIMIZED_APPS_FILTER_UNRESTRICTED); logAction(SettingsEnums.ACTION_BATTERY_OPTIMIZED_APPS_FILTER_UNRESTRICTED);

View File

@@ -46,12 +46,15 @@ public class RestrictAppPreferenceController extends BasePreferenceController {
private AppOpsManager mAppOpsManager; private AppOpsManager mAppOpsManager;
private InstrumentedPreferenceFragment mPreferenceFragment; private InstrumentedPreferenceFragment mPreferenceFragment;
private UserManager mUserManager; private UserManager mUserManager;
private boolean mEnableAppBatteryUsagePage;
public RestrictAppPreferenceController(Context context) { public RestrictAppPreferenceController(Context context) {
super(context, KEY_RESTRICT_APP); super(context, KEY_RESTRICT_APP);
mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
mUserManager = context.getSystemService(UserManager.class); mUserManager = context.getSystemService(UserManager.class);
mAppInfos = BatteryTipUtils.getRestrictedAppsList(mAppOpsManager, mUserManager); mAppInfos = BatteryTipUtils.getRestrictedAppsList(mAppOpsManager, mUserManager);
mEnableAppBatteryUsagePage =
mContext.getResources().getBoolean(R.bool.config_app_battery_usage_list_enabled);
} }
public RestrictAppPreferenceController(InstrumentedPreferenceFragment preferenceFragment) { public RestrictAppPreferenceController(InstrumentedPreferenceFragment preferenceFragment) {
@@ -61,7 +64,8 @@ public class RestrictAppPreferenceController extends BasePreferenceController {
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus() {
return mAppInfos.size() > 0 ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; return mAppInfos.size() > 0 && !mEnableAppBatteryUsagePage ? AVAILABLE
: CONDITIONALLY_UNAVAILABLE;
} }
@Override @Override

View File

@@ -36,6 +36,7 @@ public class BatteryManagerPreferenceController extends BasePreferenceController
private PowerUsageFeatureProvider mPowerUsageFeatureProvider; private PowerUsageFeatureProvider mPowerUsageFeatureProvider;
private AppOpsManager mAppOpsManager; private AppOpsManager mAppOpsManager;
private UserManager mUserManager; private UserManager mUserManager;
private boolean mEnableAppBatteryUsagePage;
public BatteryManagerPreferenceController(Context context) { public BatteryManagerPreferenceController(Context context) {
super(context, KEY_BATTERY_MANAGER); super(context, KEY_BATTERY_MANAGER);
@@ -43,6 +44,8 @@ public class BatteryManagerPreferenceController extends BasePreferenceController
context).getPowerUsageFeatureProvider(context); context).getPowerUsageFeatureProvider(context);
mAppOpsManager = context.getSystemService(AppOpsManager.class); mAppOpsManager = context.getSystemService(AppOpsManager.class);
mUserManager = context.getSystemService(UserManager.class); mUserManager = context.getSystemService(UserManager.class);
mEnableAppBatteryUsagePage =
mContext.getResources().getBoolean(R.bool.config_app_battery_usage_list_enabled);
} }
@Override @Override
@@ -53,10 +56,13 @@ public class BatteryManagerPreferenceController extends BasePreferenceController
@Override @Override
public void updateState(Preference preference) { public void updateState(Preference preference) {
super.updateState(preference); super.updateState(preference);
final int num = BatteryTipUtils.getRestrictedAppsList(mAppOpsManager, mUserManager).size(); if (!mEnableAppBatteryUsagePage) {
final int num = BatteryTipUtils.getRestrictedAppsList(mAppOpsManager,
mUserManager).size();
updateSummary(preference, num); updateSummary(preference, num);
} }
}
@VisibleForTesting @VisibleForTesting
void updateSummary(Preference preference, int num) { void updateSummary(Preference preference, int num) {