Fix Battery optimization takes long time

isDefaultActiveApp is called on every package. We can cache default
dialer and default sms package in a list, and check if the list
contains target package name.

Fixes: 140279638
Bug: 151233929
Test: manual, make RunSettingsLibRoboTests
Change-Id: I81f5ccb7aed1ebec797a21af6094971e05f456a7
(cherry picked from commit 19c2bbccfd34af8cd305b7416f4a64632f461b8b)
diff --git a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/PowerWhitelistBackend.java b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/PowerWhitelistBackend.java
index eeb6cb0..ea8a62f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/PowerWhitelistBackend.java
+++ b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/PowerWhitelistBackend.java
@@ -49,6 +49,7 @@
     private final ArraySet<String> mWhitelistedApps = new ArraySet<>();
     private final ArraySet<String> mSysWhitelistedApps = new ArraySet<>();
     private final ArraySet<String> mSysWhitelistedAppsExceptIdle = new ArraySet<>();
+    private final ArraySet<String> mDefaultActiveApps = new ArraySet<>();
 
     public PowerWhitelistBackend(Context context) {
         this(context, IDeviceIdleController.Stub.asInterface(
@@ -90,17 +91,7 @@
         // should be automatically whitelisted (otherwise user may be able to set restriction on
         // them, leading to bad device behavior.)
 
-        final boolean hasTelephony = mAppContext.getPackageManager().hasSystemFeature(
-                PackageManager.FEATURE_TELEPHONY);
-        final ComponentName defaultSms = SmsApplication.getDefaultSmsApplication(mAppContext,
-                true /* updateIfNeeded */);
-        if (hasTelephony && defaultSms != null && TextUtils.equals(pkg,
-                defaultSms.getPackageName())) {
-            return true;
-        }
-
-        final String defaultDialer = DefaultDialerManager.getDefaultDialerApplication(mAppContext);
-        if (hasTelephony && TextUtils.equals(pkg, defaultDialer)) {
+        if (mDefaultActiveApps.contains(pkg)) {
             return true;
         }
 
@@ -166,6 +157,7 @@
         mSysWhitelistedApps.clear();
         mSysWhitelistedAppsExceptIdle.clear();
         mWhitelistedApps.clear();
+        mDefaultActiveApps.clear();
         if (mDeviceIdleService == null) {
             return;
         }
@@ -183,6 +175,21 @@
             for (String app : sysWhitelistedAppsExceptIdle) {
                 mSysWhitelistedAppsExceptIdle.add(app);
             }
+            final boolean hasTelephony = mAppContext.getPackageManager().hasSystemFeature(
+                    PackageManager.FEATURE_TELEPHONY);
+            final ComponentName defaultSms = SmsApplication.getDefaultSmsApplication(mAppContext,
+                    true /* updateIfNeeded */);
+            final String defaultDialer = DefaultDialerManager.getDefaultDialerApplication(
+                    mAppContext);
+
+            if (hasTelephony) {
+                if (defaultSms != null) {
+                    mDefaultActiveApps.add(defaultSms.getPackageName());
+                }
+                if (!TextUtils.isEmpty(defaultDialer)) {
+                    mDefaultActiveApps.add(defaultDialer);
+                }
+            }
         } catch (RemoteException e) {
             Log.w(TAG, "Unable to reach IDeviceIdleController", e);
         }
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/PowerWhitelistBackendTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/PowerWhitelistBackendTest.java
index 44ee423..3a571f9 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/PowerWhitelistBackendTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/PowerWhitelistBackendTest.java
@@ -117,6 +117,8 @@
         final String testSms = "com.android.test.defaultsms";
         ShadowSmsApplication.setDefaultSmsApplication(new ComponentName(testSms, "receiver"));
 
+        mPowerWhitelistBackend.refreshList();
+
         assertThat(mPowerWhitelistBackend.isWhitelisted(testSms)).isTrue();
         assertThat(mPowerWhitelistBackend.isDefaultActiveApp(testSms)).isTrue();
     }
@@ -126,6 +128,8 @@
         final String testDialer = "com.android.test.defaultdialer";
         ShadowDefaultDialerManager.setDefaultDialerApplication(testDialer);
 
+        mPowerWhitelistBackend.refreshList();
+
         assertThat(mPowerWhitelistBackend.isWhitelisted(testDialer)).isTrue();
         assertThat(mPowerWhitelistBackend.isDefaultActiveApp(testDialer)).isTrue();
     }