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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user