package com.novoda.priorityshare; import android.content.pm.ResolveInfo; import android.os.Parcel; import android.os.Parcelable; import android.util.SparseArray; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; /** * Represents a set of targets for a priority share action. */ public class TargetApps implements Parcelable { public static final String ACTION_SEND_WITH_PRIORITY = "com.novoda.priority.ACTION_SEND_WITH_PRIORITY"; public static final String EXTRA_PRIORITY_APPS = "com.novoda.priority.extra.PRIORITY_APPS"; public static final String APP_GOOGLE_PLUS = "com.google.android.apps.plus"; public static final String APP_FACEBOOK = "com.facebook.katana"; public static final String APP_FRIENDCASTER = "uk.co.senab.blueNotifyFree"; public static final String APP_FRIENDCASTER_PRO = "uk.co.senab.blueNotify"; public static final String APP_TWITTER = "com.twitter.android"; public static final String APP_FALCON_PRO = "com.jv.falcon"; public static final String APP_PLUME = "com.levelup.touiteur"; public static final String APP_TALON = "com.klinker.android.twitter"; public static final String APP_TWEEDLE = "com.handlerexploit.tweedle"; public static final String APP_CARBON = "com.dotsandlines.carbon"; public static final String APP_SEESMIC = "com.seesmic"; public static final String APP_TWEETCASTER = "com.handmark.tweetcaster"; public static final String APP_TWEETCASTER_PRO = "com.handmark.tweetcaster.premium"; public static final String APP_TWEETLANES = "com.tweetlanes.android"; private static final String[] FACEBOOK_PACKAGES; private static final String[] TWITTER_PACKAGES; private static final String[] GOOGLE_PLUS_PACKAGES; public static final TargetApps DEFAULTS; public static final TargetApps FACEBOOK; public static final TargetApps TWITTER; public static final TargetApps GOOGLE_PLUS; public static final TargetApps NONE; static { GOOGLE_PLUS_PACKAGES = new String[]{ APP_GOOGLE_PLUS }; FACEBOOK_PACKAGES = new String[]{ APP_FACEBOOK, APP_FRIENDCASTER_PRO, APP_FRIENDCASTER }; TWITTER_PACKAGES = new String[]{ APP_TWITTER, APP_PLUME, APP_FALCON_PRO, APP_TALON, APP_CARBON, APP_TWEEDLE, APP_SEESMIC, APP_TWEETCASTER_PRO, APP_TWEETCASTER, APP_TWEETLANES }; FACEBOOK = new TargetApps(FACEBOOK_PACKAGES); TWITTER = new TargetApps(TWITTER_PACKAGES); GOOGLE_PLUS = new TargetApps(GOOGLE_PLUS_PACKAGES); DEFAULTS = new TargetApps(FACEBOOK, TWITTER, GOOGLE_PLUS); NONE = new TargetApps(new String[0]); } private final Set<String> targetPackages; public static final Creator<TargetApps> CREATOR = new Creator<TargetApps>() { public TargetApps createFromParcel(Parcel in) { int arraySize = in.readInt(); String[] packageNames = new String[arraySize]; in.readStringArray(packageNames); return new TargetApps(packageNames); } public TargetApps[] newArray(int size) { return new TargetApps[size]; } }; public static TargetApps from(List<String>... targetPackages) { return new TargetApps(targetPackages); } public static TargetApps from(TargetApps... targets) { return new TargetApps(targets); } TargetApps(TargetApps... targets) { targetPackages = new LinkedHashSet<String>(); for (TargetApps target : targets) { targetPackages.addAll(target.getTargetPackages()); } } TargetApps(List<String>[] targetPackagesLists) { targetPackages = new LinkedHashSet<String>(); for (List<String> targetPackageList : targetPackagesLists) { targetPackages.addAll(targetPackageList); } } TargetApps(String[]... packageNamesArrays) { targetPackages = new LinkedHashSet<String>(); for (String[] packageNamesArray : packageNamesArrays) { targetPackages.addAll(Arrays.asList(packageNamesArray)); } } public Set<String> getTargetPackages() { return new HashSet<String>(targetPackages); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { int arraySize = targetPackages.size(); dest.writeInt(arraySize); String[] packagesArray = new String[arraySize]; targetPackages.toArray(packagesArray); dest.writeStringArray(packagesArray); } public List<ResolveInfo> extractTargetResolveInfosFrom(List<ResolveInfo> resolveInfos) { SparseArray<ResolveInfo> matchedResolveInfos = new SparseArray<ResolveInfo>(targetPackages.size()); for (ResolveInfo info : resolveInfos) { String packageName = info.activityInfo.packageName; int index = indexOfItemInto(packageName, targetPackages); if (index >= 0) { matchedResolveInfos.put(index, info); } } return sparseArrayToList(matchedResolveInfos); } private static <T> List<T> sparseArrayToList(SparseArray<T> sparseArray) { int sparseArraySize = sparseArray.size(); ArrayList<T> list = new ArrayList<T>(sparseArraySize); for (int i = 0; i < sparseArraySize; i++) { list.add(sparseArray.valueAt(i)); } return list; } private static <T> int indexOfItemInto(T item, Set<T> set) { int i = 0; for (T setItem : set) { if (setItem.equals(item)) { return i; } i++; } return -1; } }