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 19c2bbccfd)
This commit is contained in:
Raff Tsai
2019-09-04 15:08:57 +08:00
committed by Yanting Yang
parent 46028c13cf
commit 8ef5d5e438
2 changed files with 22 additions and 11 deletions

View File

@@ -49,6 +49,7 @@ public class PowerWhitelistBackend {
private final ArraySet<String> mWhitelistedApps = new ArraySet<>(); private final ArraySet<String> mWhitelistedApps = new ArraySet<>();
private final ArraySet<String> mSysWhitelistedApps = new ArraySet<>(); private final ArraySet<String> mSysWhitelistedApps = new ArraySet<>();
private final ArraySet<String> mSysWhitelistedAppsExceptIdle = new ArraySet<>(); private final ArraySet<String> mSysWhitelistedAppsExceptIdle = new ArraySet<>();
private final ArraySet<String> mDefaultActiveApps = new ArraySet<>();
public PowerWhitelistBackend(Context context) { public PowerWhitelistBackend(Context context) {
this(context, IDeviceIdleController.Stub.asInterface( this(context, IDeviceIdleController.Stub.asInterface(
@@ -90,17 +91,7 @@ public class PowerWhitelistBackend {
// should be automatically whitelisted (otherwise user may be able to set restriction on // should be automatically whitelisted (otherwise user may be able to set restriction on
// them, leading to bad device behavior.) // them, leading to bad device behavior.)
final boolean hasTelephony = mAppContext.getPackageManager().hasSystemFeature( if (mDefaultActiveApps.contains(pkg)) {
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)) {
return true; return true;
} }
@@ -166,6 +157,7 @@ public class PowerWhitelistBackend {
mSysWhitelistedApps.clear(); mSysWhitelistedApps.clear();
mSysWhitelistedAppsExceptIdle.clear(); mSysWhitelistedAppsExceptIdle.clear();
mWhitelistedApps.clear(); mWhitelistedApps.clear();
mDefaultActiveApps.clear();
if (mDeviceIdleService == null) { if (mDeviceIdleService == null) {
return; return;
} }
@@ -183,6 +175,21 @@ public class PowerWhitelistBackend {
for (String app : sysWhitelistedAppsExceptIdle) { for (String app : sysWhitelistedAppsExceptIdle) {
mSysWhitelistedAppsExceptIdle.add(app); 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) { } catch (RemoteException e) {
Log.w(TAG, "Unable to reach IDeviceIdleController", e); Log.w(TAG, "Unable to reach IDeviceIdleController", e);
} }

View File

@@ -117,6 +117,8 @@ public class PowerWhitelistBackendTest {
final String testSms = "com.android.test.defaultsms"; final String testSms = "com.android.test.defaultsms";
ShadowSmsApplication.setDefaultSmsApplication(new ComponentName(testSms, "receiver")); ShadowSmsApplication.setDefaultSmsApplication(new ComponentName(testSms, "receiver"));
mPowerWhitelistBackend.refreshList();
assertThat(mPowerWhitelistBackend.isWhitelisted(testSms)).isTrue(); assertThat(mPowerWhitelistBackend.isWhitelisted(testSms)).isTrue();
assertThat(mPowerWhitelistBackend.isDefaultActiveApp(testSms)).isTrue(); assertThat(mPowerWhitelistBackend.isDefaultActiveApp(testSms)).isTrue();
} }
@@ -126,6 +128,8 @@ public class PowerWhitelistBackendTest {
final String testDialer = "com.android.test.defaultdialer"; final String testDialer = "com.android.test.defaultdialer";
ShadowDefaultDialerManager.setDefaultDialerApplication(testDialer); ShadowDefaultDialerManager.setDefaultDialerApplication(testDialer);
mPowerWhitelistBackend.refreshList();
assertThat(mPowerWhitelistBackend.isWhitelisted(testDialer)).isTrue(); assertThat(mPowerWhitelistBackend.isWhitelisted(testDialer)).isTrue();
assertThat(mPowerWhitelistBackend.isDefaultActiveApp(testDialer)).isTrue(); assertThat(mPowerWhitelistBackend.isDefaultActiveApp(testDialer)).isTrue();
} }