summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Pinyao Ting <pinyaoting@google.com> 2022-03-21 20:11:58 -0700
committer Pinyao Ting <pinyaoting@google.com> 2022-03-21 20:11:58 -0700
commit9c2cb7e257439bbfd3afc101025bf8bccc5ff5bc (patch)
tree6183b559ec3a828d81994881dcaba86c435850fc
parent286fd132d616b1402b10cf4515cc681de514db1b (diff)
Further defer loading widgets until it is absolutely needed.
Current implementation parses the provider info from all manifests in every app the first time getInstalledProvidersForProfile is called, which causes unnecessary delay on the call-site if only a single package was requested. This CL ensures widgets loading are deferred further down the line, until it is absolutely needed to be parsed. Bug: 202356231 Test: manual Change-Id: I793bd818781ae956cd5bc590a315c669d01e7ca6
-rw-r--r--services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java15
1 files changed, 9 insertions, 6 deletions
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index a65d5b3b94f7..312105a42b30 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -1617,14 +1617,17 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
final int providerCount = mProviders.size();
for (int i = 0; i < providerCount; i++) {
Provider provider = mProviders.get(i);
- AppWidgetProviderInfo info = provider.getInfoLocked(mContext);
final String providerPackageName = provider.id.componentName.getPackageName();
- // Ignore an invalid provider, one not matching the filter,
- // or one that isn't in the given package, if any.
- boolean inPackage = packageName == null
- || providerPackageName.equals(packageName);
- if (provider.zombie || (info.widgetCategory & categoryFilter) == 0 || !inPackage) {
+ // Ignore an invalid provider or one that isn't in the given package, if any.
+ boolean inPackage = packageName == null || providerPackageName.equals(packageName);
+ if (provider.zombie || !inPackage) {
+ continue;
+ }
+
+ // Ignore the ones not matching the filter.
+ AppWidgetProviderInfo info = provider.getInfoLocked(mContext);
+ if ((info.widgetCategory & categoryFilter) == 0) {
continue;
}