diff --git a/res/xml/power_usage_advanced.xml b/res/xml/power_usage_advanced.xml
index f2c3d87..3258b7b 100644
--- a/res/xml/power_usage_advanced.xml
+++ b/res/xml/power_usage_advanced.xml
@@ -59,16 +59,15 @@
 
         <com.android.settingslib.widget.SettingsSpinnerPreference
             android:key="battery_usage_spinner"
+            android:order="0"
             settings:isPreferenceVisible="false" />
 
-        <PreferenceCategory
-            android:key="app_list"
-            android:layout="@layout/preference_category_no_label"
-            settings:isPreferenceVisible="false" />
+        <!-- App usage preference list will be added here with the order in range [100, 1000). -->
 
         <com.android.settingslib.widget.FooterPreference
             android:key="battery_usage_footer"
             android:selectable="false"
+            android:order="1000"
             settings:isPreferenceVisible="false"
             settings:searchable="false" />
 
diff --git a/src/com/android/settings/fuelgauge/batteryusage/AnomalyAppItemPreference.java b/src/com/android/settings/fuelgauge/batteryusage/AnomalyAppItemPreference.java
index 2f139ec..592d308 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/AnomalyAppItemPreference.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/AnomalyAppItemPreference.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.fuelgauge.batteryusage;
 
+import android.annotation.Nullable;
 import android.content.Context;
 import android.text.TextUtils;
 import android.view.View;
@@ -37,7 +38,7 @@
         setLayoutResource(R.layout.anomaly_app_item_preference);
     }
 
-    void setAnomalyHint(CharSequence anomalyHintText) {
+    void setAnomalyHint(@Nullable CharSequence anomalyHintText) {
         if (!TextUtils.equals(mAnomalyHintText, anomalyHintText)) {
             mAnomalyHintText = anomalyHintText;
             notifyChanged();
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java
index 09940b3..6fd4eb5 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java
@@ -31,7 +31,6 @@
 import android.widget.AdapterView;
 
 import androidx.preference.Preference;
-import androidx.preference.PreferenceCategory;
 import androidx.preference.PreferenceGroup;
 import androidx.preference.PreferenceScreen;
 
@@ -68,11 +67,11 @@
     private static final String ROOT_PREFERENCE_KEY = "battery_usage_breakdown";
     private static final String FOOTER_PREFERENCE_KEY = "battery_usage_footer";
     private static final String SPINNER_PREFERENCE_KEY = "battery_usage_spinner";
-    private static final String APP_LIST_PREFERENCE_KEY = "app_list";
     private static final String PACKAGE_NAME_NONE = "none";
     private static final String SLOT_TIMESTAMP = "slot_timestamp";
     private static final String ANOMALY_KEY = "anomaly_key";
     private static final String KEY_SPINNER_POSITION = "spinner_position";
+    private static final int ENTRY_PREF_ORDER_OFFSET = 100;
     private static final List<BatteryDiffEntry> EMPTY_ENTRY_LIST = new ArrayList<>();
 
     private static int sUiMode = Configuration.UI_MODE_NIGHT_UNDEFINED;
@@ -89,8 +88,7 @@
     private SettingsSpinnerAdapter<CharSequence> mSpinnerAdapter;
 
     @VisibleForTesting Context mPrefContext;
-    @VisibleForTesting PreferenceCategory mRootPreference;
-    @VisibleForTesting PreferenceGroup mAppListPreferenceGroup;
+    @VisibleForTesting PreferenceGroup mRootPreferenceGroup;
     @VisibleForTesting FooterPreference mFooterPreference;
     @VisibleForTesting BatteryDiffData mBatteryDiffData;
     @VisibleForTesting String mBatteryUsageBreakdownTitleLastFullChargeText;
@@ -143,7 +141,7 @@
     public void onDestroy() {
         mHandler.removeCallbacksAndMessages(/* token= */ null);
         mPreferenceCache.clear();
-        mAppListPreferenceGroup.removeAll();
+        mRootPreferenceGroup.removeAll();
     }
 
     @Override
@@ -226,9 +224,8 @@
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
         mPrefContext = screen.getContext();
-        mRootPreference = screen.findPreference(ROOT_PREFERENCE_KEY);
+        mRootPreferenceGroup = screen.findPreference(ROOT_PREFERENCE_KEY);
         mSpinnerPreference = screen.findPreference(SPINNER_PREFERENCE_KEY);
-        mAppListPreferenceGroup = screen.findPreference(APP_LIST_PREFERENCE_KEY);
         mFooterPreference = screen.findPreference(FOOTER_PREFERENCE_KEY);
         mBatteryUsageBreakdownTitleLastFullChargeText =
                 mPrefContext.getString(
@@ -242,7 +239,7 @@
                         R.string.battery_usage_less_than_percent_content_description,
                         formatPercentage);
 
-        mAppListPreferenceGroup.setOrderingAsAdded(false);
+        mRootPreferenceGroup.setOrderingAsAdded(false);
         mSpinnerAdapter = new SettingsSpinnerAdapter<>(mPrefContext);
         mSpinnerAdapter.addAll(
                 new String[] {
@@ -328,8 +325,9 @@
                         : mPrefContext.getString(
                                 R.string.battery_usage_breakdown_title_for_slot,
                                 accessibilitySlotTimestamp);
-        mRootPreference.setTitle(Utils.createAccessibleSequence(displayTitle, accessibilityTitle));
-        mRootPreference.setVisible(true);
+        mRootPreferenceGroup.setTitle(
+                Utils.createAccessibleSequence(displayTitle, accessibilityTitle));
+        mRootPreferenceGroup.setVisible(true);
     }
 
     private void showFooterPreference(boolean isAllBatteryUsageEmpty) {
@@ -350,7 +348,6 @@
             return;
         }
         mSpinnerPreference.setVisible(true);
-        mAppListPreferenceGroup.setVisible(true);
         mHandler.post(
                 () -> {
                     removeAndCacheAllUnusedPreferences();
@@ -374,7 +371,7 @@
         }
         final long start = System.currentTimeMillis();
         final List<BatteryDiffEntry> entries = getBatteryDiffEntries();
-        int prefIndex = mAppListPreferenceGroup.getPreferenceCount();
+        int preferenceOrder = ENTRY_PREF_ORDER_OFFSET;
         for (BatteryDiffEntry entry : entries) {
             boolean isAdded = false;
             final String appLabel = entry.getAppLabel();
@@ -384,33 +381,32 @@
                 continue;
             }
             final String prefKey = entry.getKey();
-            AnomalyAppItemPreference pref = mAppListPreferenceGroup.findPreference(prefKey);
-            if (pref != null) {
+            AnomalyAppItemPreference preference = mRootPreferenceGroup.findPreference(prefKey);
+            if (preference != null) {
                 isAdded = true;
             } else {
-                pref = (AnomalyAppItemPreference) mPreferenceCache.get(prefKey);
+                preference = (AnomalyAppItemPreference) mPreferenceCache.get(prefKey);
             }
             // Creates new instance if cached preference is not found.
-            if (pref == null) {
-                pref = new AnomalyAppItemPreference(mPrefContext);
-                pref.setKey(prefKey);
-                mPreferenceCache.put(prefKey, pref);
+            if (preference == null) {
+                preference = new AnomalyAppItemPreference(mPrefContext);
+                preference.setKey(prefKey);
+                mPreferenceCache.put(prefKey, preference);
             }
-            pref.setIcon(appIcon);
-            pref.setTitle(appLabel);
-            pref.setOrder(prefIndex);
-            pref.setSingleLineTitle(true);
+            preference.setIcon(appIcon);
+            preference.setTitle(appLabel);
+            preference.setOrder(++preferenceOrder);
+            preference.setSingleLineTitle(true);
             // Updates App item preference style
-            pref.setAnomalyHint(isAnomalyBatteryDiffEntry(entry) ? mAnomalyHintString : null);
+            preference.setAnomalyHint(isAnomalyBatteryDiffEntry(entry) ? mAnomalyHintString : null);
             // Sets the BatteryDiffEntry to preference for launching detailed page.
-            pref.setBatteryDiffEntry(entry);
-            pref.setSelectable(entry.validForRestriction());
-            setPreferencePercentage(pref, entry);
-            setPreferenceSummary(pref, entry);
+            preference.setBatteryDiffEntry(entry);
+            preference.setSelectable(entry.validForRestriction());
+            setPreferencePercentage(preference, entry);
+            setPreferenceSummary(preference, entry);
             if (!isAdded) {
-                mAppListPreferenceGroup.addPreference(pref);
+                mRootPreferenceGroup.addPreference(preference);
             }
-            prefIndex++;
         }
         Log.d(
                 TAG,
@@ -424,17 +420,22 @@
         List<BatteryDiffEntry> entries = getBatteryDiffEntries();
         Set<String> entryKeySet = new ArraySet<>(entries.size());
         entries.forEach(entry -> entryKeySet.add(entry.getKey()));
-        final int prefsCount = mAppListPreferenceGroup.getPreferenceCount();
-        for (int index = prefsCount - 1; index >= 0; index--) {
-            final Preference pref = mAppListPreferenceGroup.getPreference(index);
-            if (entryKeySet.contains(pref.getKey())) {
-                // The pref is still used, don't remove.
+        final int preferenceCount = mRootPreferenceGroup.getPreferenceCount();
+        for (int index = preferenceCount - 1; index >= 0; index--) {
+            final Preference preference = mRootPreferenceGroup.getPreference(index);
+            if ((preference instanceof SettingsSpinnerPreference)
+                    || (preference instanceof FooterPreference)) {
+                // Consider the app preference only and skip others
                 continue;
             }
-            if (!TextUtils.isEmpty(pref.getKey())) {
-                mPreferenceCache.put(pref.getKey(), pref);
+            if (entryKeySet.contains(preference.getKey())) {
+                // Don't remove the preference if it is still in use
+                continue;
             }
-            mAppListPreferenceGroup.removePreference(pref);
+            if (!TextUtils.isEmpty(preference.getKey())) {
+                mPreferenceCache.put(preference.getKey(), preference);
+            }
+            mRootPreferenceGroup.removePreference(preference);
         }
     }
 
diff --git a/src/com/android/settings/network/AirplaneModePreference.kt b/src/com/android/settings/network/AirplaneModePreference.kt
index 5b7903c..2d9fbe9 100644
--- a/src/com/android/settings/network/AirplaneModePreference.kt
+++ b/src/com/android/settings/network/AirplaneModePreference.kt
@@ -18,7 +18,7 @@
 
 import android.content.Context
 import android.content.pm.PackageManager
-import android.provider.Settings.Global.AIRPLANE_MODE_ON
+import android.provider.Settings
 import androidx.annotation.DrawableRes
 import com.android.settings.R
 import com.android.settingslib.datastore.SettingsGlobalStore
@@ -27,7 +27,7 @@
 
 // LINT.IfChange
 class AirplaneModePreference :
-    SwitchPreference(AIRPLANE_MODE_ON, R.string.airplane_mode),
+    SwitchPreference(KEY, R.string.airplane_mode),
     PreferenceAvailabilityProvider {
 
     override val icon: Int
@@ -38,5 +38,9 @@
     override fun isAvailable(context: Context) =
         (context.resources.getBoolean(R.bool.config_show_toggle_airplane)
                 && !context.packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK))
+
+    companion object {
+        const val KEY = Settings.Global.AIRPLANE_MODE_ON
+    }
 }
 // LINT.ThenChange(AirplaneModePreferenceController.java)
diff --git a/src/com/android/settings/network/AirplaneModePreferenceController.java b/src/com/android/settings/network/AirplaneModePreferenceController.java
index 430feb1..ca8595f 100644
--- a/src/com/android/settings/network/AirplaneModePreferenceController.java
+++ b/src/com/android/settings/network/AirplaneModePreferenceController.java
@@ -15,8 +15,6 @@
  */
 package com.android.settings.network;
 
-import static android.provider.SettingsSlicesContract.KEY_AIRPLANE_MODE;
-
 import static com.android.settings.network.SatelliteWarningDialogActivity.EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG;
 import static com.android.settings.network.SatelliteWarningDialogActivity.TYPE_IS_AIRPLANE_MODE;
 
@@ -95,7 +93,7 @@
 
     @Override
     public boolean handlePreferenceTreeClick(Preference preference) {
-        if (KEY_AIRPLANE_MODE.equals(preference.getKey()) && isAvailable()) {
+        if (AirplaneModePreference.KEY.equals(preference.getKey()) && isAvailable()) {
             // In ECM mode launch ECM app dialog
             if (mAirplaneModeEnabler.isInEcmMode()) {
                 if (mFragment != null) {
diff --git a/src/com/android/settings/system/reset/ResetNetworkConfirm.kt b/src/com/android/settings/system/reset/ResetNetworkConfirm.kt
index b353f69..3412825 100644
--- a/src/com/android/settings/system/reset/ResetNetworkConfirm.kt
+++ b/src/com/android/settings/system/reset/ResetNetworkConfirm.kt
@@ -21,6 +21,7 @@
 import android.content.DialogInterface
 import android.os.Bundle
 import android.os.Looper
+import android.telecom.TelecomManager
 import android.telephony.SubscriptionManager
 import android.util.Log
 import android.view.LayoutInflater
@@ -89,7 +90,12 @@
     /** Configure the UI for the final confirmation interaction */
     private fun View.establishFinalConfirmationState() {
         requireViewById<View>(R.id.execute_reset_network).setOnClickListener {
-            showResetInternetDialog();
+            val tm = context.getSystemService(TelecomManager::class.java)
+            if (tm != null && tm.isInCall) {
+                showResetInternetDialog();
+            } else {
+                onResetClicked()
+            }
         }
     }
 
@@ -138,9 +144,13 @@
      * settings to its factory-default state.
      */
     @VisibleForTesting
-    suspend fun onResetClicked() {
-        showProgressDialog()
-        resetNetwork()
+    fun onResetClicked() {
+        if (!Utils.isMonkeyRunning() && !resetStarted) {
+            resetStarted = true
+            viewLifecycleOwner.lifecycleScope.launch {
+                showProgressDialog()
+                resetNetwork() }
+        }
     }
 
     private fun showProgressDialog() {
@@ -165,10 +175,7 @@
         val builder = AlertDialog.Builder(requireContext())
         val resetInternetClickListener =
             DialogInterface.OnClickListener { dialog, which ->
-                if (!Utils.isMonkeyRunning() && !resetStarted) {
-                    resetStarted = true
-                    viewLifecycleOwner.lifecycleScope.launch { onResetClicked() }
-                }
+                onResetClicked()
             }
 
         builder.setTitle(R.string.reset_your_internet_title)
diff --git a/tests/componenttests/src/com/android/settings/network/AirplaneModePreferenceControllerComponentTest.java b/tests/componenttests/src/com/android/settings/network/AirplaneModePreferenceControllerComponentTest.java
index 27e67e5..9617cfd 100644
--- a/tests/componenttests/src/com/android/settings/network/AirplaneModePreferenceControllerComponentTest.java
+++ b/tests/componenttests/src/com/android/settings/network/AirplaneModePreferenceControllerComponentTest.java
@@ -20,7 +20,6 @@
 
 import android.app.Instrumentation;
 import android.provider.Settings;
-import android.provider.SettingsSlicesContract;
 import android.util.Log;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -64,7 +63,7 @@
     public void test_on_off_airplane_mode_multiple_times() {
         AirplaneModePreferenceController controller =
                 new AirplaneModePreferenceController(mInstrumentation.getTargetContext(),
-                        SettingsSlicesContract.KEY_AIRPLANE_MODE);
+                        AirplaneModePreference.KEY);
 
         for (int i = 0; i < 10; ++i) {
             Log.d(TAG, "Test #" + (i + 1));
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java
index 85fc6e2..c4cbb98 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java
@@ -59,11 +59,12 @@
     private static final String PREF_KEY2 = "pref_key2";
     private static final String PREF_SUMMARY = "fake preference summary";
     private static final String KEY_SPINNER_POSITION = "spinner_position";
-    private static final long TIME_LESS_THAN_HALF_MINUTE  = DateUtils.MINUTE_IN_MILLIS / 2  - 1;
+    private static final int ENTRY_PREF_ORDER_OFFSET = 100;
+    private static final long TIME_LESS_THAN_HALF_MINUTE = DateUtils.MINUTE_IN_MILLIS / 2 - 1;
 
     @Mock private InstrumentedPreferenceFragment mFragment;
     @Mock private SettingsActivity mSettingsActivity;
-    @Mock private PreferenceGroup mAppListPreferenceGroup;
+    @Mock private PreferenceGroup mRootPreferenceGroup;
     @Mock private Drawable mDrawable;
     @Mock private BatteryHistEntry mBatteryHistEntry;
     @Mock private AnomalyAppItemPreference mAnomalyAppItemPreference;
@@ -90,7 +91,7 @@
                 .when(mFeatureFactory.powerUsageFeatureProvider)
                 .getHideApplicationSet();
         mBatteryUsageBreakdownController = createController();
-        mBatteryUsageBreakdownController.mAppListPreferenceGroup = mAppListPreferenceGroup;
+        mBatteryUsageBreakdownController.mRootPreferenceGroup = mRootPreferenceGroup;
         mBatteryDiffEntry =
                 new BatteryDiffEntry(
                         mContext,
@@ -130,7 +131,7 @@
         BatteryDiffEntry.sResourceCache.put(
                 "fakeBatteryDiffEntryKey",
                 new BatteryEntry.NameAndIcon("fakeName", /* icon= */ null, /* iconId= */ 1));
-        doReturn(mAnomalyAppItemPreference).when(mAppListPreferenceGroup).findPreference(PREF_KEY);
+        doReturn(mAnomalyAppItemPreference).when(mRootPreferenceGroup).findPreference(PREF_KEY);
     }
 
     @Test
@@ -147,7 +148,7 @@
     @Test
     public void onDestroy_removeAllPreferenceFromPreferenceGroup() {
         mBatteryUsageBreakdownController.onDestroy();
-        verify(mAppListPreferenceGroup).removeAll();
+        verify(mRootPreferenceGroup).removeAll();
     }
 
     @Test
@@ -162,11 +163,11 @@
     @Test
     public void addAllPreferences_addAllPreferences() {
         final String appLabel = "fake app label";
-        doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount();
+        doReturn(1).when(mRootPreferenceGroup).getPreferenceCount();
         doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon();
         doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel();
         doReturn(PREF_KEY).when(mBatteryDiffEntry).getKey();
-        doReturn(null).when(mAppListPreferenceGroup).findPreference(PREF_KEY);
+        doReturn(null).when(mRootPreferenceGroup).findPreference(PREF_KEY);
         doReturn(false).when(mBatteryDiffEntry).validForRestriction();
 
         mBatteryUsageBreakdownController.addAllPreferences();
@@ -177,11 +178,11 @@
                         mBatteryUsageBreakdownController.mPreferenceCache.get(PREF_KEY);
         assertThat(pref).isNotNull();
         // Verifies the added preference configuration.
-        verify(mAppListPreferenceGroup).addPreference(pref);
+        verify(mRootPreferenceGroup).addPreference(pref);
         assertThat(pref.getKey()).isEqualTo(PREF_KEY);
         assertThat(pref.getTitle().toString()).isEqualTo(appLabel);
         assertThat(pref.getIcon()).isEqualTo(mDrawable);
-        assertThat(pref.getOrder()).isEqualTo(1);
+        assertThat(pref.getOrder()).isEqualTo(ENTRY_PREF_ORDER_OFFSET + 1);
         assertThat(pref.getBatteryDiffEntry()).isSameInstanceAs(mBatteryDiffEntry);
         assertThat(pref.isSingleLineTitle()).isTrue();
         assertThat(pref.isSelectable()).isFalse();
@@ -190,20 +191,20 @@
     @Test
     public void addPreferenceToScreen_alreadyInScreen_notAddPreferenceAgain() {
         final String appLabel = "fake app label";
-        doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount();
+        doReturn(1).when(mRootPreferenceGroup).getPreferenceCount();
         doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon();
         doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel();
         doReturn(PREF_KEY).when(mBatteryDiffEntry).getKey();
 
         mBatteryUsageBreakdownController.addAllPreferences();
 
-        verify(mAppListPreferenceGroup, never()).addPreference(any());
+        verify(mRootPreferenceGroup, never()).addPreference(any());
     }
 
     @Test
     public void removeAndCacheAllUnusedPreferences_removePref_buildCacheAndRemoveAllPreference() {
-        doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount();
-        doReturn(mAnomalyAppItemPreference).when(mAppListPreferenceGroup).getPreference(0);
+        doReturn(1).when(mRootPreferenceGroup).getPreferenceCount();
+        doReturn(mAnomalyAppItemPreference).when(mRootPreferenceGroup).getPreference(0);
         doReturn(PREF_KEY2).when(mBatteryHistEntry).getKey();
         doReturn(PREF_KEY).when(mAnomalyAppItemPreference).getKey();
         // Ensures the testing data is correct.
@@ -213,13 +214,13 @@
 
         assertThat(mBatteryUsageBreakdownController.mPreferenceCache.get(PREF_KEY))
                 .isEqualTo(mAnomalyAppItemPreference);
-        verify(mAppListPreferenceGroup).removePreference(mAnomalyAppItemPreference);
+        verify(mRootPreferenceGroup).removePreference(mAnomalyAppItemPreference);
     }
 
     @Test
     public void removeAndCacheAllUnusedPreferences_keepPref_KeepAllPreference() {
-        doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount();
-        doReturn(mAnomalyAppItemPreference).when(mAppListPreferenceGroup).getPreference(0);
+        doReturn(1).when(mRootPreferenceGroup).getPreferenceCount();
+        doReturn(mAnomalyAppItemPreference).when(mRootPreferenceGroup).getPreference(0);
         doReturn(PREF_KEY).when(mBatteryDiffEntry).getKey();
         doReturn(PREF_KEY).when(mAnomalyAppItemPreference).getKey();
         // Ensures the testing data is correct.
@@ -227,15 +228,13 @@
 
         mBatteryUsageBreakdownController.removeAndCacheAllUnusedPreferences();
 
-        verify(mAppListPreferenceGroup, never()).removePreference(any());
+        verify(mRootPreferenceGroup, never()).removePreference(any());
         assertThat(mBatteryUsageBreakdownController.mPreferenceCache).isEmpty();
     }
 
     @Test
     public void handlePreferenceTreeClick_notPowerGaugePreference_returnFalse() {
-        assertThat(
-                        mBatteryUsageBreakdownController.handlePreferenceTreeClick(
-                                mAppListPreferenceGroup))
+        assertThat(mBatteryUsageBreakdownController.handlePreferenceTreeClick(mRootPreferenceGroup))
                 .isFalse();
 
         verify(mMetricsFeatureProvider, never())
diff --git a/tests/unit/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java
index 7612805..2205929 100644
--- a/tests/unit/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java
@@ -16,8 +16,6 @@
 
 package com.android.settings.network;
 
-import static android.provider.SettingsSlicesContract.KEY_AIRPLANE_MODE;
-
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -78,12 +76,12 @@
         mResolver = mContext.getContentResolver();
         doReturn(mPackageManager).when(mContext).getPackageManager();
         mController = new AirplaneModePreferenceController(mContext,
-                KEY_AIRPLANE_MODE);
+                AirplaneModePreference.KEY);
 
         mPreferenceManager = new PreferenceManager(mContext);
         mScreen = mPreferenceManager.createPreferenceScreen(mContext);
         mPreference = new RestrictedSwitchPreference(mContext);
-        mPreference.setKey(KEY_AIRPLANE_MODE);
+        mPreference.setKey(AirplaneModePreference.KEY);
         mScreen.addPreference(mPreference);
         mController.setFragment(null);
     }
