From 93e949f1a9931bf7188f4d2a43630603d7a388a8 Mon Sep 17 00:00:00 2001 From: d34d Date: Tue, 14 Jul 2015 17:19:16 -0700 Subject: Wallpaper: Allow multiple partners to be loaded Current implementation only allowed for one partner, and any additional partner wallpapers would not be loaded. Partrner.get() still returns the first partner and a new method, getAllPartners is introduced which returns a list of all partners. Change-Id: I06b6cd4817d3f812e2110967f075d68ee31cb318 --- src/com/android/launcher3/Partner.java | 27 +++++++++++++++++++++------ src/com/android/launcher3/Utilities.java | 24 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/com/android/launcher3/Partner.java b/src/com/android/launcher3/Partner.java index 380078b26..564421d8e 100644 --- a/src/com/android/launcher3/Partner.java +++ b/src/com/android/launcher3/Partner.java @@ -23,6 +23,8 @@ import android.util.Log; import android.util.Pair; import java.io.File; +import java.util.ArrayList; +import java.util.List; /** * Utilities to discover and interact with partner customizations. There can @@ -52,20 +54,33 @@ public class Partner { public static final String RES_GRID_ICON_SIZE_DP = "grid_icon_size_dp"; private static boolean sSearched = false; - private static Partner sPartner; + private static List sPartners; + + static { + sPartners = new ArrayList(); + } /** - * Find and return partner details, or {@code null} if none exists. + * Find and return first partner details, or {@code null} if none exists. */ public static synchronized Partner get(PackageManager pm) { + getAllPartners(pm); + return sPartners.size() > 0 ? sPartners.get(0) : null; + } + + /** + * Find and return all partner details, or {@code null} if none exists. + */ + public static synchronized List getAllPartners(PackageManager pm) { if (!sSearched) { - Pair apkInfo = Utilities.findSystemApk(ACTION_PARTNER_CUSTOMIZATION, pm); - if (apkInfo != null) { - sPartner = new Partner(apkInfo.first, apkInfo.second); + List> apkInfos = + Utilities.findSystemApks(ACTION_PARTNER_CUSTOMIZATION, pm); + for (Pair apkInfo : apkInfos) { + sPartners.add(new Partner(apkInfo.first, apkInfo.second)); } sSearched = true; } - return sPartner; + return sPartners; } private final String mPackageName; diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 8ffc471a3..c7ff19f7f 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -63,6 +63,7 @@ import com.android.launcher3.settings.SettingsProvider; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.List; import java.util.Locale; import java.util.Set; import java.util.regex.Matcher; @@ -527,6 +528,29 @@ public final class Utilities { } } + /* + * Finds all system apks which had a broadcast receiver listening to a particular action. + * @param action intent action used to find the apk + * @return a list of pairs of apk package name and the resources. + */ + static List> findSystemApks(String action, PackageManager pm) { + final Intent intent = new Intent(action); + List> systemApks = new ArrayList>(); + for (ResolveInfo info : pm.queryBroadcastReceivers(intent, 0)) { + if (info.activityInfo != null && + (info.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { + final String packageName = info.activityInfo.packageName; + try { + final Resources res = pm.getResourcesForApplication(packageName); + systemApks.add(Pair.create(packageName, res)); + } catch (NameNotFoundException e) { + Log.w(TAG, "Failed to find resources for " + packageName); + } + } + } + return systemApks; + } + /** * Returns a widget with category {@link AppWidgetProviderInfo#WIDGET_CATEGORY_SEARCHBOX} * provided by the same package which is set to be global search activity. -- cgit v1.2.3