diff options
author | Tony Wickham <twickham@google.com> | 2017-03-29 16:01:23 -0700 |
---|---|---|
committer | Tony Wickham <twickham@google.com> | 2017-04-04 14:13:01 -0700 |
commit | a41da04b2d3eb6d746bb357925ec5d4d2a72998c (patch) | |
tree | 56f810e532d1609002846c01cc169fba37d90627 | |
parent | b7980a3bbee067eae4665c8abbe8d39aefb2d36a (diff) |
Add AppWidgetManager#getInstalledProvidersForPackage()
This allows more fine-grained control than getting all installed
providers for a user, when you might only want to check for a particular
package. For instance, Launcher can use this API to surface widgets per
app without having to ask for all the widgets.
Test: Unit test on AppWidgetServiceImplTest
$ runtest --path=services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java
Bug: 34940468
Change-Id: I182bf1c012d31182024422fc4a63f57f151c3ee5
-rw-r--r-- | api/current.txt | 1 | ||||
-rw-r--r-- | api/system-current.txt | 1 | ||||
-rw-r--r-- | api/test-current.txt | 1 | ||||
-rw-r--r-- | core/java/android/appwidget/AppWidgetManager.java | 41 | ||||
-rw-r--r-- | core/java/com/android/internal/appwidget/IAppWidgetService.aidl | 4 | ||||
-rw-r--r-- | services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java | 9 | ||||
-rw-r--r-- | services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java | 20 |
7 files changed, 64 insertions, 13 deletions
diff --git a/api/current.txt b/api/current.txt index 8d2790568f9b..65d3b6073c0e 100644 --- a/api/current.txt +++ b/api/current.txt @@ -7022,6 +7022,7 @@ package android.appwidget { method public android.appwidget.AppWidgetProviderInfo getAppWidgetInfo(int); method public android.os.Bundle getAppWidgetOptions(int); method public java.util.List<android.appwidget.AppWidgetProviderInfo> getInstalledProviders(); + method public java.util.List<android.appwidget.AppWidgetProviderInfo> getInstalledProvidersForPackage(java.lang.String, android.os.UserHandle); method public java.util.List<android.appwidget.AppWidgetProviderInfo> getInstalledProvidersForProfile(android.os.UserHandle); method public static android.appwidget.AppWidgetManager getInstance(android.content.Context); method public boolean isRequestPinAppWidgetSupported(); diff --git a/api/system-current.txt b/api/system-current.txt index badd31e3583a..c44247211416 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -7479,6 +7479,7 @@ package android.appwidget { method public android.appwidget.AppWidgetProviderInfo getAppWidgetInfo(int); method public android.os.Bundle getAppWidgetOptions(int); method public java.util.List<android.appwidget.AppWidgetProviderInfo> getInstalledProviders(); + method public java.util.List<android.appwidget.AppWidgetProviderInfo> getInstalledProvidersForPackage(java.lang.String, android.os.UserHandle); method public java.util.List<android.appwidget.AppWidgetProviderInfo> getInstalledProvidersForProfile(android.os.UserHandle); method public static android.appwidget.AppWidgetManager getInstance(android.content.Context); method public boolean isRequestPinAppWidgetSupported(); diff --git a/api/test-current.txt b/api/test-current.txt index 3a23cd98730a..5927e5024d10 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -7052,6 +7052,7 @@ package android.appwidget { method public android.appwidget.AppWidgetProviderInfo getAppWidgetInfo(int); method public android.os.Bundle getAppWidgetOptions(int); method public java.util.List<android.appwidget.AppWidgetProviderInfo> getInstalledProviders(); + method public java.util.List<android.appwidget.AppWidgetProviderInfo> getInstalledProvidersForPackage(java.lang.String, android.os.UserHandle); method public java.util.List<android.appwidget.AppWidgetProviderInfo> getInstalledProvidersForProfile(android.os.UserHandle); method public static android.appwidget.AppWidgetManager getInstance(android.content.Context); method public boolean isRequestPinAppWidgetSupported(); diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java index 74a39e85e029..9f35e85b0665 100644 --- a/core/java/android/appwidget/AppWidgetManager.java +++ b/core/java/android/appwidget/AppWidgetManager.java @@ -710,9 +710,9 @@ public class AppWidgetManager { * user may have a corporate profile. In this case the parent user profile has a * child profile, the corporate one. * - * @param profile The profile for which to get providers. Passing null is equivaled - * to passing only the current user handle. - * @return The intalled providers. + * @param profile The profile for which to get providers. Passing null is equivalent + * to querying for only the calling user. + * @return The installed providers. * * @see android.os.Process#myUserHandle() * @see android.os.UserManager#getUserProfiles() @@ -722,7 +722,31 @@ public class AppWidgetManager { return Collections.emptyList(); } return getInstalledProvidersForProfile(AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN, - profile); + profile, null); + } + + /** + * Gets the AppWidget providers for the given package and user profile. User + * profile can only be the current user or a profile of the current user. For + * example, the current user may have a corporate profile. In this case the + * parent user profile has a child profile, the corporate one. + * + * @param packageName The package for which to get providers. If null, this method is + * equivalent to {@link #getInstalledProvidersForProfile(UserHandle)}. + * @param profile The profile for which to get providers. Passing null is equivalent + * to querying for only the calling user. + * @return The installed providers. + * + * @see android.os.Process#myUserHandle() + * @see android.os.UserManager#getUserProfiles() + */ + public List<AppWidgetProviderInfo> getInstalledProvidersForPackage(@Nullable String packageName, + @Nullable UserHandle profile) { + if (mService == null) { + return Collections.emptyList(); + } + return getInstalledProvidersForProfile(AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN, + profile, packageName); } /** @@ -733,7 +757,7 @@ public class AppWidgetManager { return Collections.emptyList(); } return getInstalledProvidersForProfile(AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN, - null); + null, null); } /** @@ -752,7 +776,7 @@ public class AppWidgetManager { if (mService == null) { return Collections.emptyList(); } - return getInstalledProvidersForProfile(categoryFilter, null); + return getInstalledProvidersForProfile(categoryFilter, null, null); } /** @@ -766,6 +790,7 @@ public class AppWidgetManager { * @param profile A profile of the current user which to be queried. The user * is itself also a profile. If null, the providers only for the current user * are returned. + * @param packageName If specified, will only return providers from the given package. * @return The intalled providers. * * @see android.os.Process#myUserHandle() @@ -774,7 +799,7 @@ public class AppWidgetManager { * @hide */ public List<AppWidgetProviderInfo> getInstalledProvidersForProfile(int categoryFilter, - UserHandle profile) { + @Nullable UserHandle profile, @Nullable String packageName) { if (mService == null) { return Collections.emptyList(); } @@ -785,7 +810,7 @@ public class AppWidgetManager { try { ParceledListSlice<AppWidgetProviderInfo> providers = mService.getInstalledProvidersForProfile( - categoryFilter, profile.getIdentifier()); + categoryFilter, profile.getIdentifier(), packageName); if (providers == null) { return Collections.emptyList(); } diff --git a/core/java/com/android/internal/appwidget/IAppWidgetService.aidl b/core/java/com/android/internal/appwidget/IAppWidgetService.aidl index f987a9f45e9f..caf35b39b324 100644 --- a/core/java/com/android/internal/appwidget/IAppWidgetService.aidl +++ b/core/java/com/android/internal/appwidget/IAppWidgetService.aidl @@ -55,8 +55,8 @@ interface IAppWidgetService { in RemoteViews views); void updateAppWidgetProvider(in ComponentName provider, in RemoteViews views); void notifyAppWidgetViewDataChanged(String packageName, in int[] appWidgetIds, int viewId); - ParceledListSlice getInstalledProvidersForProfile(int categoryFilter, - int profileId); + ParceledListSlice getInstalledProvidersForProfile(int categoryFilter, int profileId, + String packageName); AppWidgetProviderInfo getAppWidgetInfo(String callingPackage, int appWidgetId); boolean hasBindAppWidgetPermission(in String packageName, int userId); void setBindAppWidgetPermission(in String packageName, int userId, in boolean permission); diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index 8aa37ef2d4eb..a5e56459eaf0 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -1633,7 +1633,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku @Override public ParceledListSlice<AppWidgetProviderInfo> getInstalledProvidersForProfile(int categoryFilter, - int profileId) { + int profileId, String packageName) { final int userId = UserHandle.getCallingUserId(); if (DEBUG) { @@ -1655,8 +1655,11 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku Provider provider = mProviders.get(i); AppWidgetProviderInfo info = provider.info; - // Ignore an invalid provider or one not matching the filter. - if (provider.zombie || (info.widgetCategory & categoryFilter) == 0) { + // Ignore an invalid provider, one not matching the filter, + // or one that isn't in the given package, if any. + boolean inPackage = packageName == null + || provider.id.componentName.getPackageName().equals(packageName); + if (provider.zombie || (info.widgetCategory & categoryFilter) == 0 || !inPackage) { continue; } diff --git a/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java b/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java index f3f68ff06e03..2663aaf35b3d 100644 --- a/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java +++ b/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java @@ -50,6 +50,7 @@ import com.android.server.LocalServices; import org.mockito.ArgumentCaptor; +import java.util.Iterator; import java.util.List; import java.util.Random; import java.util.concurrent.CountDownLatch; @@ -249,6 +250,25 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase { assertEquals(7, updates.size()); } + public void testGetInstalledProvidersForPackage() { + List<AppWidgetProviderInfo> allProviders = mManager.getInstalledProviders(); + assertTrue(!allProviders.isEmpty()); + String packageName = allProviders.get(0).provider.getPackageName(); + List<AppWidgetProviderInfo> providersForPackage = mManager.getInstalledProvidersForPackage( + packageName, null); + // Remove providers from allProviders that don't have the given package name. + Iterator<AppWidgetProviderInfo> iter = allProviders.iterator(); + while (iter.hasNext()) { + if (!iter.next().provider.getPackageName().equals(packageName)) { + iter.remove(); + } + } + assertEquals(allProviders.size(), providersForPackage.size()); + for (int i = 0; i < allProviders.size(); i++) { + assertEquals(allProviders.get(i).provider, providersForPackage.get(i).provider); + } + } + private int setupHostAndWidget() { List<PendingHostUpdate> updates = mService.startListening( mMockHost, mPkgName, HOST_ID, new int[0]).getList(); |