diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index f7ba017..f1c1191 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -326,8 +326,8 @@
     public static class ChangeWifiStateActivity extends SettingsActivity { /* empty */ }
     public static class AppDrawOverlaySettingsActivity extends SettingsActivity { /* empty */ }
     public static class AppWriteSettingsActivity extends SettingsActivity { /* empty */ }
-    /** Activity to manage app battery optimization details. */
-    public static class AppBatteryOptimizationActivity extends SettingsActivity { /* empty */ }
+    /** Activity to manage app battery usage details. */
+    public static class AppBatteryUsageActivity extends SettingsActivity { /* empty */ }
 
     public static class ManageExternalSourcesActivity extends SettingsActivity {/* empty */ }
     public static class ManageAppExternalSourcesActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/applications/AppBatteryUsagePreferenceController.java b/src/com/android/settings/applications/AppBatteryUsagePreferenceController.java
new file mode 100644
index 0000000..59e409b
--- /dev/null
+++ b/src/com/android/settings/applications/AppBatteryUsagePreferenceController.java
@@ -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;
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/applications/AppStateBatteryOptimizationBridge.java b/src/com/android/settings/applications/AppStateAppBatteryUsageBridge.java
similarity index 81%
rename from src/com/android/settings/applications/AppStateBatteryOptimizationBridge.java
rename to src/com/android/settings/applications/AppStateAppBatteryUsageBridge.java
index 6301c85..3674212 100644
--- a/src/com/android/settings/applications/AppStateBatteryOptimizationBridge.java
+++ b/src/com/android/settings/applications/AppStateAppBatteryUsageBridge.java
@@ -31,10 +31,10 @@
 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 {
-    private static final String TAG = AppStateBatteryOptimizationBridge.class.getSimpleName();
+public class AppStateAppBatteryUsageBridge extends AppStateBaseBridge {
+    private static final String TAG = AppStateAppBatteryUsageBridge.class.getSimpleName();
     static final boolean DEBUG = Build.IS_DEBUGGABLE;
 
     private final Context mContext;
@@ -58,7 +58,7 @@
     @interface OptimizationMode {
     }
 
-    public AppStateBatteryOptimizationBridge(
+    public AppStateAppBatteryUsageBridge(
             Context context, ApplicationsState appState, Callback callback) {
         super(appState, callback);
         mContext = context;
@@ -68,7 +68,7 @@
 
     @Override
     protected void updateExtraInfo(AppEntry app, String pkg, int uid) {
-        app.extraInfo = getAppBatteryOptimizationState(pkg, uid);
+        app.extraInfo = getAppBatteryUsageState(pkg, uid);
     }
 
     @Override
@@ -83,7 +83,7 @@
         }
     }
 
-    protected Object getAppBatteryOptimizationState(String pkg, int uid) {
+    protected Object getAppBatteryUsageState(String pkg, int uid) {
         // Restricted = AppOpsManager.MODE_IGNORED + !allowListed
         // Unrestricted = AppOpsManager.MODE_ALLOWED + allowListed
         // Optimized = AppOpsManager.MODE_ALLOWED + !allowListed
@@ -107,17 +107,17 @@
         if (DEBUG) {
             Log.d(TAG, "Pkg: " + pkg + ", mode: " + modeName);
         }
-        return new BatteryOptimizationDetails(mode);
+        return new AppBatteryUsageDetails(mode);
     }
 
     @OptimizationMode
-    private static int getBatteryOptimizationDetailsMode(AppEntry entry) {
+    private static int getAppBatteryUsageDetailsMode(AppEntry entry) {
         if (entry == null || entry.extraInfo == null) {
             return MODE_UNKNOWN;
         }
 
-        return entry.extraInfo instanceof BatteryOptimizationDetails
-                ? ((BatteryOptimizationDetails) entry.extraInfo).mMode
+        return entry.extraInfo instanceof AppBatteryUsageDetails
+                ? ((AppBatteryUsageDetails) entry.extraInfo).mMode
                 : MODE_UNKNOWN;
     }
 
@@ -132,7 +132,7 @@
 
                 @Override
                 public boolean filterApp(AppEntry info) {
-                    return getBatteryOptimizationDetailsMode(info) == MODE_UNRESTRICTED;
+                    return getAppBatteryUsageDetailsMode(info) == MODE_UNRESTRICTED;
                 }
             };
 
@@ -147,7 +147,7 @@
 
                 @Override
                 public boolean filterApp(AppEntry info) {
-                    return getBatteryOptimizationDetailsMode(info) == MODE_OPTIMIZED;
+                    return getAppBatteryUsageDetailsMode(info) == MODE_OPTIMIZED;
                 }
             };
 
@@ -162,18 +162,18 @@
 
                 @Override
                 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
         int mMode;
 
-        BatteryOptimizationDetails(@OptimizationMode int mode) {
+        AppBatteryUsageDetails(@OptimizationMode int mode) {
             mMode = mode;
         }
     }
diff --git a/src/com/android/settings/applications/manageapplications/AppFilterRegistry.java b/src/com/android/settings/applications/manageapplications/AppFilterRegistry.java
index 35de16e..15cf8e7 100644
--- a/src/com/android/settings/applications/manageapplications/AppFilterRegistry.java
+++ b/src/com/android/settings/applications/manageapplications/AppFilterRegistry.java
@@ -20,7 +20,7 @@
 
 import com.android.settings.R;
 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.AppStateLocaleBridge;
 import com.android.settings.applications.AppStateManageExternalStorageBridge;
@@ -225,21 +225,21 @@
         // Unrestricted
         mFilters[FILTER_APPS_BATTERY_UNRESTRICTED] =
                 new AppFilterItem(
-                        AppStateBatteryOptimizationBridge.FILTER_BATTERY_UNRESTRICTED_APPS,
+                        AppStateAppBatteryUsageBridge.FILTER_BATTERY_UNRESTRICTED_APPS,
                         FILTER_APPS_BATTERY_UNRESTRICTED,
                         R.string.filter_battery_unrestricted_title);
 
         // Optimized
         mFilters[FILTER_APPS_BATTERY_OPTIMIZED] =
                 new AppFilterItem(
-                        AppStateBatteryOptimizationBridge.FILTER_BATTERY_OPTIMIZED_APPS,
+                        AppStateAppBatteryUsageBridge.FILTER_BATTERY_OPTIMIZED_APPS,
                         FILTER_APPS_BATTERY_OPTIMIZED,
                         R.string.filter_battery_optimized_title);
 
         // Unrestricted
         mFilters[FILTER_APPS_BATTERY_RESTRICTED] =
                 new AppFilterItem(
-                        AppStateBatteryOptimizationBridge.FILTER_BATTERY_RESTRICTED_APPS,
+                        AppStateAppBatteryUsageBridge.FILTER_BATTERY_RESTRICTED_APPS,
                         FILTER_APPS_BATTERY_RESTRICTED,
                         R.string.filter_battery_restricted_title);
     }
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index 00af973..71c6a67 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -100,7 +100,7 @@
 import com.android.settings.applications.AppStateAlarmsAndRemindersBridge;
 import com.android.settings.applications.AppStateAppOpsBridge.PermissionState;
 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.AppStateLocaleBridge;
 import com.android.settings.applications.AppStateManageExternalStorageBridge;
@@ -336,7 +336,7 @@
             }
         } else if (className.equals(AppLocaleDetails.class.getName())) {
             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;
         } else {
             mListType = LIST_TYPE_MAIN;
@@ -958,7 +958,7 @@
             screenTitle = R.string.app_notifications_title;
         } else if (className.equals(AppLocaleDetails.class.getName())) {
             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;
         } else {
             if (screenTitle == -1) {
@@ -1153,7 +1153,7 @@
             } else if (mManageApplications.mListType == LIST_TYPE_APPS_LOCALE) {
                 mExtraInfoBridge = new AppStateLocaleBridge(mContext, mState, this);
             } else if (mManageApplications.mListType == LIST_TYPE_BATTERY_OPTIMIZATION) {
-                mExtraInfoBridge = new AppStateBatteryOptimizationBridge(mContext, mState, this);
+                mExtraInfoBridge = new AppStateAppBatteryUsageBridge(mContext, mState, this);
             } else {
                 mExtraInfoBridge = null;
             }
@@ -1199,7 +1199,7 @@
                     rebuild(R.id.sort_order_alpha, true);
                 }
             } else if (mManageApplications.mListType == LIST_TYPE_BATTERY_OPTIMIZATION) {
-                logBatteryOptimization(filterType);
+                logAppBatteryUsage(filterType);
             } else {
                 rebuild();
             }
@@ -1336,7 +1336,7 @@
             });
         }
 
-        private void logBatteryOptimization(int filterType) {
+        private void logAppBatteryUsage(int filterType) {
             switch(filterType) {
                 case FILTER_APPS_BATTERY_UNRESTRICTED:
                     logAction(SettingsEnums.ACTION_BATTERY_OPTIMIZED_APPS_FILTER_UNRESTRICTED);
diff --git a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
index b960d4c..b85db40 100644
--- a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
@@ -46,12 +46,15 @@
     private AppOpsManager mAppOpsManager;
     private InstrumentedPreferenceFragment mPreferenceFragment;
     private UserManager mUserManager;
+    private boolean mEnableAppBatteryUsagePage;
 
     public RestrictAppPreferenceController(Context context) {
         super(context, KEY_RESTRICT_APP);
         mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
         mUserManager = context.getSystemService(UserManager.class);
         mAppInfos = BatteryTipUtils.getRestrictedAppsList(mAppOpsManager, mUserManager);
+        mEnableAppBatteryUsagePage =
+                mContext.getResources().getBoolean(R.bool.config_app_battery_usage_list_enabled);
     }
 
     public RestrictAppPreferenceController(InstrumentedPreferenceFragment preferenceFragment) {
@@ -61,7 +64,8 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return mAppInfos.size() > 0 ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+        return mAppInfos.size() > 0 && !mEnableAppBatteryUsagePage ? AVAILABLE
+                : CONDITIONALLY_UNAVAILABLE;
     }
 
     @Override
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceController.java b/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceController.java
index d920a8e..d508603 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceController.java
@@ -36,6 +36,7 @@
     private PowerUsageFeatureProvider mPowerUsageFeatureProvider;
     private AppOpsManager mAppOpsManager;
     private UserManager mUserManager;
+    private boolean mEnableAppBatteryUsagePage;
 
     public BatteryManagerPreferenceController(Context context) {
         super(context, KEY_BATTERY_MANAGER);
@@ -43,6 +44,8 @@
                 context).getPowerUsageFeatureProvider(context);
         mAppOpsManager = context.getSystemService(AppOpsManager.class);
         mUserManager = context.getSystemService(UserManager.class);
+        mEnableAppBatteryUsagePage =
+                mContext.getResources().getBoolean(R.bool.config_app_battery_usage_list_enabled);
     }
 
     @Override
@@ -53,9 +56,12 @@
     @Override
     public void updateState(Preference 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
