package com.smartisanos.sidebar.util;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.smartisanos.sidebar.PendingDragEventTask;
import android.content.ClipDescription;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.view.DragEvent;
public class ResolveInfoGroup extends SidebarItem {
private static final String TAG = ResolveInfoGroup.class.getName();
private Context mContext;
private List<ComponentName> mNames = new ArrayList<ComponentName>();
private SoftReference<Drawable> mAvatar = null;
public ResolveInfoGroup(Context context){
super();
mContext = context;
}
public String getPackageName(){
if(size() > 0){
return mNames.get(0).getPackageName();
}else{
return null;
}
}
//format : name_1|name_2| .. |name_n
public String getComponentNames(){
if (size() <= 0) {
return null;
}
List<String> ls = new ArrayList<String>();
for(ComponentName name : mNames){
ls.add(name.getClassName());
}
Collections.sort(ls);
StringBuilder sb = new StringBuilder();
sb.append(ls.get(0));
for(int i = 1; i < ls.size(); ++ i){
sb.append("|" + ls.get(i));
}
return sb.toString();
}
@Override
public Drawable getAvatar() {
Drawable ret;
if (mAvatar != null) {
ret = mAvatar.get();
if (ret != null) {
return ret;
}
}
ret = loadIcon();
if (ret != null) {
mAvatar = new SoftReference<Drawable>(ret);
}
return ret;
}
public void clearAvatarCache() {
if (mAvatar != null) {
mAvatar.clear();
mAvatar = null;
}
}
private Drawable loadIcon() {
if (size() > 0) {
ComponentName name = mNames.get(0);
Drawable drawable = IconRedirect.getRedirectIcon(name.getPackageName(), name.getClassName(), mContext);
if (drawable != null) {
return drawable;
} else {
List<ResolveInfo> ris = ResolveInfoManager.getInstance(mContext).getAllResolveInfoByPackageName(getPackageName());
if (ris != null) {
for (ResolveInfo ri : ris) {
if (name.equals(new ComponentName(
ri.activityInfo.packageName,
ri.activityInfo.name))) {
return ri.loadIcon(mContext.getPackageManager());
}
}
}
}
}
return null;
}
@Override
public CharSequence getDisplayName() {
if (size() > 0) {
ComponentName cn = mNames.get(0);
List<ResolveInfo> ris = ResolveInfoManager.getInstance(mContext).getAllResolveInfoByPackageName(getPackageName());
if(ris != null) {
for (ResolveInfo ri : ris) {
if (cn.equals(new ComponentName(
ri.activityInfo.packageName, ri.activityInfo.name))) {
return ri.loadLabel(mContext.getPackageManager());
}
}
}
}
return null;
}
public void onIconChanged() {
if (mAvatar != null) {
mAvatar.clear();
mAvatar = null;
}
}
public boolean acceptDragEvent(Context context, DragEvent event) {
if (event == null || event.getClipDescription().getMimeTypeCount() <= 0
|| size() <= 0) {
return false;
}
String mimeType = MimeUtils.getCommonMimeType(event);
if (TextUtils.isEmpty(mimeType)) {
return false;
}
if (ClipDescription.MIMETYPE_TEXT_PLAIN.equals(mimeType)) {
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("text/plain");
sharingIntent.setPackage(getPackageName());
List<ResolveInfo> infos = context.getPackageManager().queryIntentActivities(sharingIntent, 0);
if (infos != null) {
for (ComponentName name : mNames) {
for (ResolveInfo ri2 : infos) {
if (name.equals(new ComponentName(ri2.activityInfo.packageName, ri2.activityInfo.name))) {
return true;
}
}
}
}
} else {
Intent intent = new Intent();
if (event.getClipDescription().getMimeTypeCount() > 1) {
intent.setAction(Intent.ACTION_SEND_MULTIPLE);
} else {
intent.setAction(Intent.ACTION_SEND);
}
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setType(mimeType);
intent.setPackage(getPackageName());
List<ResolveInfo> infos = context.getPackageManager().queryIntentActivities(intent, 0);
if (infos != null) {
for (ComponentName name : mNames) {
for (ResolveInfo ri2 : infos) {
if (name.equals(new ComponentName(ri2.activityInfo.packageName, ri2.activityInfo.name))) {
return true;
}
}
}
}
}
return false;
}
public boolean handleDragEvent(Context context, DragEvent event){
Tracker.dragSuccess(0, getPackageName());
boolean isPending = PendingDragEventTask.tryPending(context, event, this);
if(isPending){
return true;
}
if (event.getClipData().getItemCount() <= 0
|| event.getClipDescription() == null
|| event.getClipDescription().getMimeTypeCount() <= 0
|| size() <= 0) {
return false;
}
String mimeType = MimeUtils.getCommonMimeType(event);
if (TextUtils.isEmpty(mimeType)) {
return false;
}
if (ClipDescription.MIMETYPE_TEXT_PLAIN.equals(mimeType) && !TextUtils.isEmpty(event.getClipData().getItemAt(0).getText())) {
Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setPackage(getPackageName());
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_NEW_DOCUMENT
| Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
intent.setType(mimeType);
intent.putExtra(Intent.EXTRA_TEXT, event.getClipData().getItemAt(0).getText().toString());
List<ResolveInfo> infos = context.getPackageManager().queryIntentActivities(intent, 0);
if (infos != null) {
for (ComponentName name : mNames) {
for (ResolveInfo ri2 : infos) {
if (name.equals(new ComponentName(ri2.activityInfo.packageName, ri2.activityInfo.name))) {
intent.setComponent(name);
Utils.dismissAllDialog(mContext);
context.startActivity(intent);
return true;
}
}
}
}
}else{
if(event.getClipData().getItemAt(0).getUri() == null){
return false;
}
Intent intent = new Intent();
intent.setType(mimeType);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setPackage(getPackageName());
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_NEW_DOCUMENT
| Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
if (event.getClipData().getItemCount() > 1) {
intent.setAction(Intent.ACTION_SEND_MULTIPLE);
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, MimeUtils.getUris(event));
} else {
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM, event.getClipData().getItemAt(0).getUri());
}
List<ResolveInfo> infos = context.getPackageManager().queryIntentActivities(intent, 0);
if (infos != null) {
for (ComponentName name : mNames) {
for (ResolveInfo ri2 : infos) {
if (name.equals(new ComponentName(ri2.activityInfo.packageName, ri2.activityInfo.name))) {
intent.setComponent(name);
Utils.dismissAllDialog(mContext);
context.startActivity(intent);
return true;
}
}
}
}
}
return false;
}
@Override
public boolean openUI(Context context) {
// don't support this action
return false;
}
public boolean containsComponent(ComponentName cn) {
for (ComponentName name : mNames) {
if (name.equals(cn)) {
return true;
}
}
return false;
}
public void add(ResolveInfo ri) {
mNames.add(new ComponentName(ri.activityInfo.packageName, ri.activityInfo.name));
}
public int size() {
return mNames.size();
}
public ComponentName get(int i) {
return mNames.get(i);
}
public boolean isValid() {
return fromData(mContext, getPackageName(), getComponentNames()) != null;
}
public static ResolveInfoGroup fromData(Context context, String pkgName, String componentNames) {
List<ResolveInfoGroup> rigs = ResolveInfoManager.getInstance(context).getAllResolveInfoGroupByPackageName(pkgName);
if (rigs != null) {
for (ResolveInfoGroup rig : rigs) {
String names = rig.getComponentNames();
if (names != null && names.equals(componentNames)) {
return rig;
}
}
}
return null;
}
public static boolean sameComponet(ResolveInfo ri1, ResolveInfo ri2){
if(ri1.activityInfo == null || ri2.activityInfo == null){
return false;
}
return ri1.activityInfo.packageName.equals(ri2.activityInfo.packageName) &&
ri1.activityInfo.name.equals(ri2.activityInfo.name);
}
public static class IndexComparator implements Comparator<ResolveInfoGroup> {
@Override
public int compare(ResolveInfoGroup lhs, ResolveInfoGroup rhs) {
if (lhs.getIndex() > rhs.getIndex()) {
return -1;
}
if (lhs.getIndex() < rhs.getIndex()) {
return 1;
}
return 0;
}
}
public static class SameGroupComparator implements Comparator<ResolveInfo> {
private static Set<String> sPACKAGES;
private static List<String> sPACKAGE_ORDER;
static {
sPACKAGES = new HashSet<String>();
sPACKAGES.add("com.android.contacts");
sPACKAGE_ORDER = new ArrayList<String>();
sPACKAGE_ORDER.add("com.sina.weibo");
sPACKAGE_ORDER.add("com.tencent.mm");
sPACKAGE_ORDER.add("com.tencent.mobileqq");
sPACKAGE_ORDER.add("com.android.email");
sPACKAGE_ORDER.add("com.smartisanos.notes");
sPACKAGE_ORDER.add("com.android.mms");
sPACKAGE_ORDER.add("com.android.calendar");
}
public static boolean notNeedSplit(String packageName) {
/**
if (sPACKAGES.contains(packageName)) {
return true;
}
*/
return packageName.startsWith("com.smartisan");
}
public final int compare(ResolveInfo a, ResolveInfo b) {
String pkgA = a.activityInfo.packageName;
String pkgB = b.activityInfo.packageName;
if (!pkgA.equals(pkgB)) {
int orderA = sPACKAGE_ORDER.indexOf(pkgA);
int orderB = sPACKAGE_ORDER.indexOf(pkgB);
if (orderA != orderB) {
if (orderA == -1) {
return 1;
} else if (orderB == -1) {
return -1;
} else {
if (orderA < orderB) {
return -1;
} else {
return 1;
}
}
}
return pkgA.compareTo(pkgB);
}
if (notNeedSplit(pkgA)) {
return 0;
}
int la = getLabel(a);
int lb = getLabel(b);
if (la != lb) {
if (la < lb) {
return -1;
} else {
return 1;
}
} else {
return 0;
}
}
public static final int getLabel(ResolveInfo ri) {
if (ri.labelRes != 0) {
return ri.labelRes;
}
if(ri.activityInfo.labelRes != 0) {
return ri.activityInfo.labelRes;
}
if (ri.activityInfo.applicationInfo.labelRes != 0) {
return ri.activityInfo.applicationInfo.labelRes;
}
return 0;
}
}
@Override
public boolean equals(Object o) {
ResolveInfoGroup rig = (ResolveInfoGroup) o;
if (!TextUtils.equals(this.getPackageName(), rig.getPackageName())) {
return false;
}
if (!TextUtils.equals(this.getComponentNames(), rig.getComponentNames())) {
return false;
}
return true;
}
@Override
public void delete() {
ResolveInfoManager.getInstance(mContext).delete(this);
}
}