Merge "Extract the logic of MagnificationMode to the controller" into sc-dev
diff --git a/res/values/config.xml b/res/values/config.xml
index 5a8f636..a41e41b 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -269,6 +269,11 @@
     <!-- ComponentName to launch a vendor-specific enrollment activity if available -->
     <string name="config_face_enroll" translatable="false"></string>
 
+    <!-- Fully qualified name of the introductory activity for face enrollment. -->
+    <string name="config_face_enroll_introduction" translatable="false">
+        com.android.settings.biometrics.face.FaceEnrollIntroduction
+    </string>
+
     <!-- App intent -->
     <string name="config_account_intent_uri" translatable="false"></string>
 
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 72f57f4..f4b759c 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -10017,7 +10017,7 @@
     <string name="runtime_permissions_summary_control_app_access">Control app access to your data</string>
 
     <!-- Permissions usage title [CHAR LIMIT=NONE] -->
-    <string name="permissions_usage_title">Permissions usage</string>
+    <string name="permissions_usage_title">Privacy dashboard</string>
 
     <!-- Permissions usage summary, which describes what the permissions usage does [CHAR LIMIT=NONE] -->
     <string name="permissions_usage_summary">Show which apps recently used permissions</string>
diff --git a/res/xml/transcode_settings.xml b/res/xml/transcode_settings.xml
index c5a9763..5c3bb7c 100644
--- a/res/xml/transcode_settings.xml
+++ b/res/xml/transcode_settings.xml
@@ -40,4 +40,9 @@
         android:key="transcode_notification"
         android:title="@string/transcode_notification"
         settings:controller="com.android.settings.development.transcode.TranscodeNotificationPreferenceController" />
+
+    <SwitchPreference
+        android:key="transcode_disable_cache"
+        android:title="@string/transcode_disable_cache"
+        settings:controller="com.android.settings.development.transcode.TranscodeDisableCachePreferenceController" />
 </PreferenceScreen>
diff --git a/src/com/android/settings/biometrics/BiometricUtils.java b/src/com/android/settings/biometrics/BiometricUtils.java
index f338eb5..4f13d0c 100644
--- a/src/com/android/settings/biometrics/BiometricUtils.java
+++ b/src/com/android/settings/biometrics/BiometricUtils.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.biometrics;
 
+import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
+
 import android.app.Activity;
 import android.app.PendingIntent;
 import android.app.admin.DevicePolicyManager;
@@ -30,8 +32,8 @@
 import androidx.annotation.Nullable;
 
 import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.R;
 import com.android.settings.SetupWizardUtils;
-import com.android.settings.biometrics.face.FaceEnrollIntroduction;
 import com.android.settings.biometrics.fingerprint.FingerprintEnrollFindSensor;
 import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction;
 import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollIntroduction;
@@ -165,7 +167,9 @@
      */
     public static Intent getFaceIntroIntent(@NonNull Context context,
             @NonNull Intent activityIntent) {
-        Intent intent = new Intent(context, FaceEnrollIntroduction.class);
+        final String className = context.getString(R.string.config_face_enroll_introduction);
+        Intent intent = new Intent();
+        intent.setClassName(SETTINGS_PACKAGE_NAME, className);
         WizardManagerHelper.copyWizardManagerExtras(activityIntent, intent);
         return intent;
     }
diff --git a/src/com/android/settings/biometrics/face/FaceStatusPreferenceController.java b/src/com/android/settings/biometrics/face/FaceStatusPreferenceController.java
index 648da9b..94651d7 100644
--- a/src/com/android/settings/biometrics/face/FaceStatusPreferenceController.java
+++ b/src/com/android/settings/biometrics/face/FaceStatusPreferenceController.java
@@ -68,7 +68,7 @@
 
     @Override
     protected String getEnrollClassName() {
-        return FaceEnrollIntroduction.class.getName();
+        return mContext.getResources().getString(R.string.config_face_enroll_introduction);
     }
 
 }
diff --git a/src/com/android/settings/development/transcode/TranscodeDisableCachePreferenceController.java b/src/com/android/settings/development/transcode/TranscodeDisableCachePreferenceController.java
new file mode 100644
index 0000000..38c3208
--- /dev/null
+++ b/src/com/android/settings/development/transcode/TranscodeDisableCachePreferenceController.java
@@ -0,0 +1,53 @@
+/*
+ * 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.development.transcode;
+
+import android.content.Context;
+import android.os.SystemProperties;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.core.TogglePreferenceController;
+
+/**
+ * The controller (in the Media transcoding settings) indicating the user's preference to disable
+ * the cache for transcoding.
+ */
+public class TranscodeDisableCachePreferenceController extends TogglePreferenceController {
+    @VisibleForTesting
+    static final String TRANSCODE_DISABLE_CACHE_SYS_PROP_KEY =
+            "persist.sys.fuse.disable_transcode_cache";
+
+    public TranscodeDisableCachePreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
+    }
+
+    @Override
+    public boolean isChecked() {
+        return SystemProperties.getBoolean(TRANSCODE_DISABLE_CACHE_SYS_PROP_KEY, false);
+    }
+
+    @Override
+    public boolean setChecked(boolean isChecked) {
+        SystemProperties.set(TRANSCODE_DISABLE_CACHE_SYS_PROP_KEY, String.valueOf(isChecked));
+        return true;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+}
diff --git a/src/com/android/settings/emergency/EmergencyDashboardFragment.java b/src/com/android/settings/emergency/EmergencyDashboardFragment.java
index 1983430..3356645 100644
--- a/src/com/android/settings/emergency/EmergencyDashboardFragment.java
+++ b/src/com/android/settings/emergency/EmergencyDashboardFragment.java
@@ -17,12 +17,18 @@
 package com.android.settings.emergency;
 
 import android.app.settings.SettingsEnums;
+import android.content.Context;
 
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.notification.EmergencyBroadcastPreferenceController;
 import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.search.SearchIndexable;
 
+import java.util.ArrayList;
+import java.util.List;
+
 
 /**
  * {@link DashboardFragment} that hosts emergency/safety related settings.
@@ -31,6 +37,7 @@
 public class EmergencyDashboardFragment extends DashboardFragment {
 
     private static final String TAG = "EmergencyDashboard";
+    private static final String WEA_PREF_KEY = "app_and_notif_cell_broadcast_settings";
 
     @Override
     protected int getPreferenceScreenResId() {
@@ -47,6 +54,17 @@
         return SettingsEnums.EMERGENCY_SETTINGS;
     }
 
+    @Override
+    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+        return buildPreferenceControllers(context);
+    }
+
+    private static List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
+        final List<AbstractPreferenceController> controllers = new ArrayList<>();
+        controllers.add(new EmergencyBroadcastPreferenceController(context, WEA_PREF_KEY));
+        return controllers;
+    }
+
     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider(R.xml.emergency_settings);
 }
diff --git a/src/com/android/settings/fuelgauge/BatteryChartView.java b/src/com/android/settings/fuelgauge/BatteryChartView.java
index 5e4d980..26eb3e4 100644
--- a/src/com/android/settings/fuelgauge/BatteryChartView.java
+++ b/src/com/android/settings/fuelgauge/BatteryChartView.java
@@ -255,7 +255,8 @@
     private int getTrapezoidIndex(float x) {
         for (int index = 0; index < mTrapezoidSlot.length; index++) {
             final TrapezoidSlot slot = mTrapezoidSlot[index];
-            if (x >= slot.mLeft && x <= slot.mRight) {
+            if (x >= slot.mLeft - mTrapezoidHOffset
+                    && x <= slot.mRight + mTrapezoidHOffset) {
                 return index;
             }
         }
diff --git a/src/com/android/settings/fuelgauge/BatteryDiffEntry.java b/src/com/android/settings/fuelgauge/BatteryDiffEntry.java
index efc5554..da3825f 100644
--- a/src/com/android/settings/fuelgauge/BatteryDiffEntry.java
+++ b/src/com/android/settings/fuelgauge/BatteryDiffEntry.java
@@ -26,11 +26,18 @@
 
 import java.time.Duration;
 import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
 
 /** A container class to carry battery data in a specific time slot. */
 public final class BatteryDiffEntry {
     private static final String TAG = "BatteryDiffEntry";
 
+    static Locale sCurrentLocale = null;
+    // Caches app label and icon to improve loading performance.
+    static final Map<String, BatteryEntry.NameAndIcon> sResourceCache = new HashMap<>();
+
     /** A comparator for {@link BatteryDiffEntry} based on consumed percentage. */
     public static final Comparator<BatteryDiffEntry> COMPARATOR =
             (a, b) -> Double.compare(b.getPercentOfTotal(), a.getPercentOfTotal());
@@ -97,14 +104,7 @@
     /** Gets the app icon {@link Drawable} for this entry. */
     public Drawable getAppIcon() {
         loadLabelAndIcon();
-        if (mBatteryHistEntry.mConsumerType !=
-                ConvertUtils.CONSUMER_TYPE_UID_BATTERY) {
-            return mAppIcon;
-        }
-        // Returns default application icon if UID_BATTERY icon is null.
-        return mAppIcon == null
-            ? mContext.getPackageManager().getDefaultActivityIcon()
-            : mAppIcon;
+        return mAppIcon;
     }
 
     /** Gets the searching package name for UID battery type. */
@@ -140,11 +140,37 @@
                 }
                 break;
             case ConvertUtils.CONSUMER_TYPE_UID_BATTERY:
+                final BatteryEntry.NameAndIcon nameAndIcon = getCache();
+                if (nameAndIcon != null) {
+                    mAppLabel = nameAndIcon.name;
+                    mAppIcon = nameAndIcon.icon;
+                    break;
+                }
                 loadNameAndIconForUid();
+                // Uses application default icon if we cannot find it from package.
+                if (mAppIcon == null) {
+                    mAppIcon = mContext.getPackageManager().getDefaultActivityIcon();
+                }
+                if (mAppLabel != null && mAppIcon != null) {
+                    sResourceCache.put(
+                        mBatteryHistEntry.getKey(),
+                        new BatteryEntry.NameAndIcon(mAppLabel, mAppIcon, /*iconId=*/ 0));
+                }
                 break;
         }
     }
 
+    private BatteryEntry.NameAndIcon getCache() {
+        final Locale locale = Locale.getDefault();
+        if (sCurrentLocale != locale) {
+            Log.d(TAG, String.format("clearCache() locale is changed from %s to %s",
+                sCurrentLocale, locale));
+            sCurrentLocale = locale;
+            clearCache();
+        }
+        return sResourceCache.get(mBatteryHistEntry.getKey());
+    }
+
     private void loadNameAndIconForUid() {
         final String packageName = mBatteryHistEntry.mPackageName;
         final PackageManager packageManager = mContext.getPackageManager();
@@ -153,7 +179,9 @@
             try {
                 final ApplicationInfo appInfo =
                     packageManager.getApplicationInfo(packageName, /*no flags*/ 0);
-                mAppLabel = packageManager.getApplicationLabel(appInfo).toString();
+                if (appInfo != null) {
+                    mAppLabel = packageManager.getApplicationLabel(appInfo).toString();
+                }
             } catch (NameNotFoundException e) {
                 Log.e(TAG, "failed to retrieve ApplicationInfo for: " + packageName);
                 mAppLabel = packageName;
@@ -203,6 +231,10 @@
         return builder.toString();
     }
 
+    static void clearCache() {
+        sResourceCache.clear();
+    }
+
     private static <T> T getNonNull(T originalObj, T newObj) {
         return newObj != null ? newObj : originalObj;
     }
diff --git a/src/com/android/settings/fuelgauge/BatteryHistEntry.java b/src/com/android/settings/fuelgauge/BatteryHistEntry.java
index e8cbce5..9611de1 100644
--- a/src/com/android/settings/fuelgauge/BatteryHistEntry.java
+++ b/src/com/android/settings/fuelgauge/BatteryHistEntry.java
@@ -65,6 +65,7 @@
     public final int mBatteryStatus;
     public final int mBatteryHealth;
 
+    private String mKey = null;
     private boolean mIsValidEntry = true;
 
     public BatteryHistEntry(ContentValues values) {
@@ -114,7 +115,20 @@
 
     /** Gets an identifier to represent this {@link BatteryHistEntry}. */
     public String getKey() {
-        return mPackageName + "-" + mUserId;
+        if (mKey == null) {
+            switch (mConsumerType) {
+                case ConvertUtils.CONSUMER_TYPE_UID_BATTERY:
+                    mKey = Long.toString(mUid);
+                    break;
+                case ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY:
+                    mKey = "S|" + mDrainType;
+                    break;
+                case ConvertUtils.CONSUMER_TYPE_USER_BATTERY:
+                    mKey = "U|" + mUserId;
+                    break;
+            }
+        }
+        return mKey;
     }
 
     @Override
diff --git a/src/com/android/settings/security/ChangeScreenLockPreferenceController.java b/src/com/android/settings/security/ChangeScreenLockPreferenceController.java
index 1587746..7ea9879 100644
--- a/src/com/android/settings/security/ChangeScreenLockPreferenceController.java
+++ b/src/com/android/settings/security/ChangeScreenLockPreferenceController.java
@@ -28,6 +28,7 @@
 
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.core.SubSettingLauncher;
@@ -48,7 +49,7 @@
     private static final String KEY_UNLOCK_SET_OR_CHANGE = "unlock_set_or_change";
 
     protected final DevicePolicyManager mDPM;
-    protected final SecuritySettings mHost;
+    protected final SettingsPreferenceFragment mHost;
     protected final UserManager mUm;
     protected final LockPatternUtils mLockPatternUtils;
 
@@ -58,7 +59,7 @@
 
     protected RestrictedPreference mPreference;
 
-    public ChangeScreenLockPreferenceController(Context context, SecuritySettings host) {
+    public ChangeScreenLockPreferenceController(Context context, SettingsPreferenceFragment host) {
         super(context);
         mUm = (UserManager) context.getSystemService(Context.USER_SERVICE);
         mDPM = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 97a74d7..ceacefe 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -346,6 +346,10 @@
         if (intent.hasExtra(EXTRA_START_CONNECT_SSID)) {
             mOpenSsid = intent.getStringExtra(EXTRA_START_CONNECT_SSID);
         }
+
+        // After rebooting the device, the Wi-Fi state will not be called back in the airplane
+        // mode, need to call onWifiStateChanged() to update the initial state of the UI.
+        onWifiStateChanged();
     }
 
     @Override
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java
index 0f7a407..84ff07b 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java
@@ -17,6 +17,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 
@@ -39,6 +40,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Locale;
 
 @RunWith(RobolectricTestRunner.class)
 public final class BatteryDiffEntryTest {
@@ -49,6 +51,7 @@
     @Mock private PackageManager mockPackageManager;
     @Mock private UserManager mockUserManager;
     @Mock private Drawable mockDrawable;
+    @Mock private Drawable mockDrawable2;
 
     @Before
     public void setUp() {
@@ -56,6 +59,7 @@
         mContext = spy(RuntimeEnvironment.application);
         doReturn(mockUserManager).when(mContext).getSystemService(UserManager.class);
         doReturn(mockPackageManager).when(mContext).getPackageManager();
+        BatteryDiffEntry.clearCache();
     }
 
     @Test
@@ -112,6 +116,7 @@
         final BatteryDiffEntry entry = createBatteryDiffEntry(10, batteryHistEntry);
 
         assertThat(entry.getAppLabel()).isEqualTo("Ambient display");
+        assertThat(BatteryDiffEntry.sResourceCache).isEmpty();
     }
 
     @Test
@@ -127,6 +132,7 @@
 
         assertThat(entry.getAppLabel()).isEqualTo("Removed user");
         assertThat(entry.getAppIcon()).isNull();
+        assertThat(BatteryDiffEntry.sResourceCache).isEmpty();
     }
 
     @Test
@@ -146,17 +152,28 @@
         final BatteryDiffEntry entry = createBatteryDiffEntry(10, batteryHistEntry);
 
         assertThat(entry.getAppLabel()).isEqualTo(expectedAppLabel);
+        assertThat(BatteryDiffEntry.sResourceCache).hasSize(1);
+        // Verifies the app label in the cache.
+        final BatteryEntry.NameAndIcon nameAndIcon =
+            BatteryDiffEntry.sResourceCache.get(batteryHistEntry.getKey());
+        assertThat(nameAndIcon.name).isEqualTo(expectedAppLabel);
     }
 
     @Test
     public void testGetAppLabel_loadDataFromPreDefinedNameAndUid() {
+        final String expectedAppLabel = "Android OS";
         final ContentValues values = getContentValuesWithType(
             ConvertUtils.CONSUMER_TYPE_UID_BATTERY);
         final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values);
 
         final BatteryDiffEntry entry = createBatteryDiffEntry(10, batteryHistEntry);
 
-        assertThat(entry.getAppLabel()).isEqualTo("Android OS");
+        assertThat(entry.getAppLabel()).isEqualTo(expectedAppLabel);
+        assertThat(BatteryDiffEntry.sResourceCache).hasSize(1);
+        // Verifies the app label in the cache.
+        final BatteryEntry.NameAndIcon nameAndIcon =
+            BatteryDiffEntry.sResourceCache.get(batteryHistEntry.getKey());
+        assertThat(nameAndIcon.name).isEqualTo(expectedAppLabel);
     }
 
     @Test
@@ -171,6 +188,7 @@
 
         entry.mIsLoaded = true;
         assertThat(entry.getAppLabel()).isEqualTo(expectedAppLabel);
+        assertThat(BatteryDiffEntry.sResourceCache).isEmpty();
     }
 
     @Test
@@ -184,20 +202,39 @@
         entry.mIsLoaded = true;
         entry.mAppIcon = mockDrawable;
         assertThat(entry.getAppIcon()).isEqualTo(mockDrawable);
+        assertThat(BatteryDiffEntry.sResourceCache).isEmpty();
     }
 
     @Test
-    public void testGetAppIcon_uidConsumerWithNullIcon_returnDefaultActivityIcon() {
-        final ContentValues values = getContentValuesWithType(
-            ConvertUtils.CONSUMER_TYPE_UID_BATTERY);
-        final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values);
-        doReturn(mockDrawable).when(mockPackageManager).getDefaultActivityIcon();
+    public void testGetAppIcon_uidConsumerWithNullIcon_returnDefaultActivityIcon()
+            throws Exception {
+        final BatteryDiffEntry entry = createBatteryDiffEntry(mockDrawable);
 
-        final BatteryDiffEntry entry = createBatteryDiffEntry(10, batteryHistEntry);
-
-        entry.mIsLoaded = true;
         entry.mAppIcon = null;
         assertThat(entry.getAppIcon()).isEqualTo(mockDrawable);
+        assertThat(BatteryDiffEntry.sResourceCache).hasSize(1);
+        // Verifies the app label in the cache.
+        final BatteryEntry.NameAndIcon nameAndIcon =
+            BatteryDiffEntry.sResourceCache.get(entry.mBatteryHistEntry.getKey());
+        assertThat(nameAndIcon.icon).isEqualTo(mockDrawable);
+    }
+
+    @Test
+    public void testClearCache_switchLocale_clearCacheIconAndLabel() throws Exception {
+        Locale.setDefault(new Locale("en_US"));
+        final BatteryDiffEntry entry1 = createBatteryDiffEntry(mockDrawable);
+        assertThat(entry1.getAppIcon()).isEqualTo(mockDrawable);
+        // Switch the locale into another one.
+        Locale.setDefault(new Locale("zh_TW"));
+
+        final BatteryDiffEntry entry2 = createBatteryDiffEntry(mockDrawable2);
+
+        // We should get new drawable without caching.
+        assertThat(entry2.getAppIcon()).isEqualTo(mockDrawable2);
+        // Verifies the cache is updated into the new drawable.
+        final BatteryEntry.NameAndIcon nameAndIcon =
+            BatteryDiffEntry.sResourceCache.get(entry2.mBatteryHistEntry.getKey());
+        assertThat(nameAndIcon.icon).isEqualTo(mockDrawable2);
     }
 
     private BatteryDiffEntry createBatteryDiffEntry(
@@ -217,4 +254,17 @@
         values.put("consumerType", Integer.valueOf(consumerType));
         return values;
     }
+
+    private BatteryDiffEntry createBatteryDiffEntry(Drawable drawable) throws Exception {
+        final ContentValues values = getContentValuesWithType(
+            ConvertUtils.CONSUMER_TYPE_UID_BATTERY);
+        values.put("uid", 1001);
+        values.put("packageName", "com.a.b.c");
+        final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values);
+        doReturn(drawable).when(mockPackageManager).getDefaultActivityIcon();
+        doReturn(null).when(mockPackageManager).getApplicationInfo("com.a.b.c", 0);
+        doReturn(new String[] {"com.a.b.c"}).when(mockPackageManager)
+            .getPackagesForUid(1001);
+        return createBatteryDiffEntry(10, batteryHistEntry);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistEntryTest.java
index d97b0d2..72ccebe 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistEntryTest.java
@@ -137,6 +137,42 @@
             /*percentOfTotal=*/ 0.3);
     }
 
+    @Test
+    public void testGetKey_consumerUidType_returnExpectedString() {
+        final ContentValues values = getContentValuesWithType(
+            ConvertUtils.CONSUMER_TYPE_UID_BATTERY);
+        values.put("uid", 3);
+        final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values);
+
+        assertThat(batteryHistEntry.getKey()).isEqualTo("3");
+    }
+
+    @Test
+    public void testGetKey_consumerUserType_returnExpectedString() {
+        final ContentValues values = getContentValuesWithType(
+            ConvertUtils.CONSUMER_TYPE_USER_BATTERY);
+        values.put("userId", 2);
+        final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values);
+
+        assertThat(batteryHistEntry.getKey()).isEqualTo("U|2");
+    }
+
+    @Test
+    public void testGetKey_consumerSystemType_returnExpectedString() {
+        final ContentValues values = getContentValuesWithType(
+            ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
+        values.put("drainType", 1);
+        final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values);
+
+        assertThat(batteryHistEntry.getKey()).isEqualTo("S|1");
+    }
+
+    private static ContentValues getContentValuesWithType(int consumerType) {
+        final ContentValues values = new ContentValues();
+        values.put("consumerType", Integer.valueOf(consumerType));
+        return values;
+    }
+
     private void assertBatteryHistEntry(
         BatteryHistEntry entry, int drainType, double percentOfTotal) {
         assertThat(entry.isValidEntry()).isTrue();
@@ -161,7 +197,5 @@
             .isEqualTo(BatteryManager.BATTERY_STATUS_FULL);
         assertThat(entry.mBatteryHealth)
             .isEqualTo(BatteryManager.BATTERY_HEALTH_COLD);
-        assertThat(entry.getKey())
-            .isEqualTo("com.google.android.settings.battery-" + entry.mUserId);
     }
 }
diff --git a/tests/unit/src/com/android/settings/development/transcode/TranscodeDefaultOptionPreferenceControllerTest.java b/tests/unit/src/com/android/settings/development/transcode/TranscodeDefaultOptionPreferenceControllerTest.java
index 550613b..e3fa076 100644
--- a/tests/unit/src/com/android/settings/development/transcode/TranscodeDefaultOptionPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/development/transcode/TranscodeDefaultOptionPreferenceControllerTest.java
@@ -70,7 +70,7 @@
     }
 
     @Test
-    public void getAvailabilityStatus_shouldReturn_isAvailable() {
+    public void getAvailabilityStatus_shouldReturnAVAILABLE() {
         assertThat(mUnderTest.getAvailabilityStatus()).isEqualTo(
                 BasePreferenceController.AVAILABLE);
     }
diff --git a/tests/unit/src/com/android/settings/development/transcode/TranscodeDisableCachePreferenceControllerTest.java b/tests/unit/src/com/android/settings/development/transcode/TranscodeDisableCachePreferenceControllerTest.java
new file mode 100644
index 0000000..89c8773
--- /dev/null
+++ b/tests/unit/src/com/android/settings/development/transcode/TranscodeDisableCachePreferenceControllerTest.java
@@ -0,0 +1,77 @@
+/*
+ * 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.development.transcode;
+
+import static com.android.settings.development.transcode.TranscodeDisableCachePreferenceController.TRANSCODE_DISABLE_CACHE_SYS_PROP_KEY;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.os.SystemProperties;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settings.core.BasePreferenceController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class TranscodeDisableCachePreferenceControllerTest {
+
+    private TranscodeUserControlPreferenceController mUnderTest;
+
+    @Before
+    public void setUp() {
+        Context context = ApplicationProvider.getApplicationContext();
+        mUnderTest = new TranscodeUserControlPreferenceController(context, "some_key");
+    }
+
+    @Test
+    public void isChecked_whenSysPropSet_shouldReturnTrue() {
+        SystemProperties.set(TRANSCODE_DISABLE_CACHE_SYS_PROP_KEY, "true");
+        assertThat(mUnderTest.isChecked()).isTrue();
+    }
+
+    @Test
+    public void isChecked_whenSysPropUnset_shouldReturnFalse() {
+        SystemProperties.set(TRANSCODE_DISABLE_CACHE_SYS_PROP_KEY, "false");
+        assertThat(mUnderTest.isChecked()).isFalse();
+    }
+
+    @Test
+    public void setChecked_withTrue_shouldSetSysProp() {
+        mUnderTest.setChecked(true);
+        assertThat(
+                SystemProperties.getBoolean(TRANSCODE_DISABLE_CACHE_SYS_PROP_KEY, false)).isTrue();
+    }
+
+    @Test
+    public void setChecked_withFalse_shouldUnsetSysProp() {
+        mUnderTest.setChecked(false);
+        assertThat(
+                SystemProperties.getBoolean(TRANSCODE_DISABLE_CACHE_SYS_PROP_KEY, true)).isFalse();
+    }
+
+    @Test
+    public void getAvailabilityStatus_shouldReturnAVAILABLE() {
+        assertThat(mUnderTest.getAvailabilityStatus()).isEqualTo(
+                BasePreferenceController.AVAILABLE);
+    }
+}
diff --git a/tests/unit/src/com/android/settings/development/transcode/TranscodeNotificationPreferenceControllerTest.java b/tests/unit/src/com/android/settings/development/transcode/TranscodeNotificationPreferenceControllerTest.java
index 0903c72..65bfbf5 100644
--- a/tests/unit/src/com/android/settings/development/transcode/TranscodeNotificationPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/development/transcode/TranscodeNotificationPreferenceControllerTest.java
@@ -69,7 +69,7 @@
     }
 
     @Test
-    public void getAvailabilityStatus_shouldReturn_isAvailable() {
+    public void getAvailabilityStatus_shouldReturnAVAILABLE() {
         assertThat(mUnderTest.getAvailabilityStatus()).isEqualTo(
                 BasePreferenceController.AVAILABLE);
     }
diff --git a/tests/unit/src/com/android/settings/development/transcode/TranscodeUserControlPreferenceControllerTest.java b/tests/unit/src/com/android/settings/development/transcode/TranscodeUserControlPreferenceControllerTest.java
index 3caf8ae..63a6ac6 100644
--- a/tests/unit/src/com/android/settings/development/transcode/TranscodeUserControlPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/development/transcode/TranscodeUserControlPreferenceControllerTest.java
@@ -70,7 +70,7 @@
     }
 
     @Test
-    public void getAvailabilityStatus_shouldReturn_isAvailable() {
+    public void getAvailabilityStatus_shouldReturnAVAILABLE() {
         assertThat(mUnderTest.getAvailabilityStatus()).isEqualTo(
                 BasePreferenceController.AVAILABLE);
     }