//package com.forfan.bigbang.onestep;
//
//import android.content.ComponentName;
//import android.content.ContentValues;
//import android.content.Context;
//import android.content.Intent;
//import android.content.pm.ResolveInfo;
//import android.database.Cursor;
//import android.database.sqlite.SQLiteDatabase;
//import android.database.sqlite.SQLiteOpenHelper;
//import android.os.Handler;
//import android.os.HandlerThread;
//import android.os.Looper;
//import android.os.Message;
//import android.provider.BaseColumns;
//import android.text.TextUtils;
//import android.util.Pair;
//import android.widget.Toast;
//
//import com.smartisanos.sidebar.R;
//import com.smartisanos.sidebar.util.ResolveInfoGroup.SameGroupComparator;
//
//import java.util.ArrayList;
//import java.util.Collections;
//import java.util.Comparator;
//import java.util.HashSet;
//import java.util.List;
//import java.util.Set;
//
//public class ResolveInfoManager extends SQLiteOpenHelper {
// private volatile static ResolveInfoManager sInstance;
// public static ResolveInfoManager getInstance(Context context){
// if(sInstance == null){
// synchronized(ResolveInfoManager.class){
// if(sInstance == null){
// sInstance = new ResolveInfoManager(context);
// }
// }
// }
// return sInstance;
// }
//
// private static final String DB_NAME ="resolveinfo";
// private static final int DB_VERSION = 1;
//
// private static final List<String> sAutoAddPackageList;
// private static final List<ComponentName> sAutoAddComponentList;
//
// static {
// // package
// sAutoAddPackageList = new ArrayList<String>();
// sAutoAddPackageList.add("com.sina.weibo");
// sAutoAddPackageList.add("com.smartisanos.notes");
// sAutoAddPackageList.add("com.android.email");
// sAutoAddPackageList.add("com.android.calendar");
// sAutoAddPackageList.add("com.taobao.taobao");
// sAutoAddPackageList.add("com.evernote");
// sAutoAddPackageList.add("com.wunderkinder.wunderlistandroid");
// sAutoAddPackageList.add("com.android.mms");
// sAutoAddPackageList.add("com.meitu.meiyancamera");
// sAutoAddPackageList.add("com.google.android.youtube");
// sAutoAddPackageList.add("com.facebook.katana");
// sAutoAddPackageList.add("com.whatsapp");
// sAutoAddPackageList.add("com.instagram.android");
// // component
// sAutoAddComponentList = new ArrayList<ComponentName>();
// sAutoAddComponentList.add(new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI"));
// sAutoAddComponentList.add(new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI"));
// sAutoAddComponentList.add(new ComponentName("com.tencent.mobileqq", "com.tencent.mobileqq.activity.JumpActivity"));
// sAutoAddComponentList.add(new ComponentName("com.tencent.mobileqq", "com.tencent.mobileqq.activity.qfileJumpActivity"));
// sAutoAddComponentList.add(new ComponentName("com.tencent.mobileqqi", "com.tencent.mobileqq.activity.JumpActivity"));
// sAutoAddComponentList.add(new ComponentName("com.tencent.mobileqqi", "com.tencent.mobileqq.activity.qfileJumpActivity"));
// sAutoAddComponentList.add(new ComponentName("com.twitter.android", "com.twitter.android.composer.ComposerActivity"));
//
// // check ourself
// for (ComponentName cn : sAutoAddComponentList) {
// if (sAutoAddPackageList.contains(cn.getPackageName())) {
// throw new IllegalArgumentException("auto-add package contains auto-add component !");
// }
// }
// }
//
// private static final Set<String> sBlackList;
// private static final Set<Pair<String, String>> sBlackCompList;
// static {
// sBlackList = new HashSet<String>();
// sBlackList.add("com.smartisanos.sidebar");
// sBlackList.add("com.android.phone");
// sBlackList.add("com.android.contacts");
// sBlackList.add("com.android.settings");
// sBlackList.add("com.android.gallery3d");
// sBlackList.add("com.android.nfc");
// sBlackList.add("com.android.bluetooth");
// sBlackList.add("com.intsig.BizCardReader");
// sBlackList.add("com.intsig.camscanner");
// sBlackList.add("com.tmall.wireless");
// sBlackList.add("com.tencent.qqpimsecure");
// sBlackList.add("com.eg.android.AlipayGphone");
// sBlackList.add("com.mobisystems.office");
// sBlackList.add("com.google.android.apps.maps");
// sBlackList.add("com.UCMobile");
// sBlackList.add("com.Qunar");
// sBlackList.add("com.estrongs.android.pop");
// sBlackList.add("com.alensw.PicFolder");
// sBlackList.add("com.douban.frodo");
// sBlackList.add("it.repix.android");
// sBlackList.add("com.coolapk.market");
// sBlackList.add("cn.poco.jane");
// sBlackList.add("com.google.android.inputmethod.japanese");
// sBlackList.add("tc.everphoto");
// sBlackList.add("com.baidu.netdisk");
// sBlackList.add("com.pinterest");
// sBlackList.add("com.skype.raider");
// sBlackList.add("com.wumii.android.mimi");
// sBlackList.add("com.snapchat.android");
// sBlackList.add("com.cleanmaster.mguard_cn");
// sBlackList.add("com.taou.maimai");
// sBlackList.add("com.instagram.layout");
// sBlackList.add("com.soundcloud.android");
// sBlackList.add("com.cyberlink.youcammakeup");
// sBlackList.add("com.weheartit");
//
// sBlackCompList = new HashSet<Pair<String, String>>();
// sBlackCompList.add(new Pair<String, String>("com.tencent.mobileqq", "com.tencent.mobileqq.activity.ContactSyncJumpActivity"));
// sBlackCompList.add(new Pair<String, String>("com.tencent.mm", "com.tencent.mm.plugin.accountsync.ui.ContactsSyncUI"));
// }
//
// public static final String[] ACTIONS = new String[] { Intent.ACTION_SEND,
// Intent.ACTION_SEND_MULTIPLE };
//
// private static final int sMaxNumber = 20;
//
// private Context mContext;
// private List<ResolveInfoGroup> mList = new ArrayList<ResolveInfoGroup>();
// private List<ResolveInfoUpdateListener> mListeners = new ArrayList<ResolveInfoUpdateListener>();
// private Handler mHandler;
//
// private Toast mLimitToast;
//
// private ResolveInfoManager(Context context) {
// super(context, DB_NAME, null, DB_VERSION);
// context = context.getApplicationContext();
// mContext = context;
// HandlerThread thread = new HandlerThread(ResolveInfoManager.class.getName());
// thread.start();
// mHandler = new ResolveInfoManagerHandler(thread.getLooper());
// mHandler.obtainMessage(MSG_UPDATE_LIST).sendToTarget();
// }
//
// @Override
// public void onCreate(SQLiteDatabase db) {
// db.execSQL("CREATE TABLE " + TABLE_RESOLVEINFO
// + " ( _id INTEGER PRIMARY KEY AUTOINCREMENT,"
// + "packagename TEXT," + "names TEXT, " + "weight INTEGER"
// + ");");
//
// List<ResolveInfoGroup> rigs = new ArrayList<ResolveInfoGroup>();
// // pre install part 1, component name
// for (ComponentName cn : sAutoAddComponentList) {
// List<ResolveInfoGroup> list = getAllResolveInfoGroupByPackageName(cn.getPackageName());
// if (list != null) {
// for (ResolveInfoGroup rig : list) {
// if (rig.containsComponent(cn)) {
// if (!rigs.contains(rig)) {
// rigs.add(rig);
// }
// }
// }
// }
// }
//
// // pre install part2, package name
// for (String packageName : sAutoAddPackageList) {
// List<ResolveInfoGroup> list = getAllResolveInfoGroupByPackageName(packageName);
// if (list != null) {
// rigs.addAll(list);
// }
// }
//
// // update index
// for (int i = 0; i < rigs.size(); ++i) {
// rigs.get(i).setIndex(rigs.size() - 1 - i);
// }
//
// // add to database
// for (ResolveInfoGroup rig : rigs) {
// ContentValues cv = new ContentValues();
// cv.put(ResolveInfoColumns.PACKAGE_NAME, rig.getPackageName());
// cv.put(ResolveInfoColumns.COMPONENT_NAMES, rig.getComponentNames());
// cv.put(ResolveInfoColumns.WEIGHT, rig.getIndex());
// db.insert(TABLE_RESOLVEINFO, null, cv);
// }
// }
//
// @Override
// public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// // NA
// }
//
// public void addListener(ResolveInfoUpdateListener listener){
// if (listener == null) {
// return;
// }
// if (!mListeners.contains(listener)) {
// mListeners.add(listener);
// }
// }
//
// public void removeListener(ResolveInfoUpdateListener listener){
// mListeners.remove(listener);
// }
//
// private void notifyUpdate(){
// for(ResolveInfoUpdateListener li : mListeners){
// li.onUpdate();
// }
// }
//
// public void delete(ResolveInfoGroup rig) {
// synchronized (mListeners) {
// for (int i = 0; i < mList.size(); ++i) {
// if (mList.get(i).equals(rig)) {
// mList.remove(i).newRemoved = true;
// notifyUpdate();
// mHandler.obtainMessage(MSG_DELETE, rig).sendToTarget();
// return;
// }
// }
// }
// }
//
// public boolean addResolveInfoGroup(ResolveInfoGroup rig) {
// return addResolveInfoGroupInternal(rig, true);
// }
//
// private boolean addResolveInfoGroupInternal(ResolveInfoGroup rig, boolean showToast) {
// if (rig == null || rig.size() <= 0) {
// return false;
// }
// synchronized (mList) {
// if (mList.size() >= sMaxNumber) {
// if (showToast) {
// showToastDueToLimit();
// }
// return false;
// }
// for (int i = 0; i < mList.size(); ++i) {
// if (mList.get(i).equals(rig)) {
// return true;
// }
// }
// if (mList.size() == 0) {
// rig.setIndex(0);
// } else {
// int maxIndex = mList.get(0).getIndex();
// for (int i = 1; i < mList.size(); ++i) {
// if (mList.get(i).getIndex() > maxIndex) {
// maxIndex = mList.get(i).getIndex();
// }
// }
// rig.setIndex(maxIndex + 1);
// }
// rig.newAdded = true;
// mList.add(0, rig);
// }
// mHandler.obtainMessage(MSG_SAVE, rig).sendToTarget();
// notifyUpdate();
// return true;
// }
//
// public void updateOrder() {
// synchronized (mList) {
// Collections.sort(mList, new ResolveInfoGroup.IndexComparator());
// }
// notifyUpdate();
// mHandler.obtainMessage(MSG_SAVE_ORDER).sendToTarget();
// }
//
// private void showToastDueToLimit() {
// if (mLimitToast != null) {
// mLimitToast.cancel();
// }
// mLimitToast = Toast.makeText(mContext,"最多显示",
// Toast.LENGTH_SHORT);
// mLimitToast.show();
// }
//
// private void saveOrderForList(){
// List<ResolveInfoGroup> list = getAddedResolveInfoGroup();
// SQLiteDatabase db = getWritableDatabase();
// db.beginTransaction();
// try {
// for(ResolveInfoGroup rig : list){
// int id = getId(rig);
// if(id != 0){
// ContentValues cv = new ContentValues();
// cv.put(ResolveInfoColumns.PACKAGE_NAME, rig.getPackageName());
// cv.put(ResolveInfoColumns.COMPONENT_NAMES, rig.getComponentNames());
// cv.put(ResolveInfoColumns.WEIGHT, rig.getIndex());
// db.update(TABLE_RESOLVEINFO, cv, ResolveInfoColumns._ID + "=?", new String[] { id + "" });
// }
// }
// db.setTransactionSuccessful();
// } catch (Exception e) {
// e.printStackTrace();
// } finally {
// if (db != null) {
// db.endTransaction();
// db.close();
// }
// }
// }
//
// private int getId(ResolveInfoGroup rig) {
// Cursor cursor = null;
// try {
// cursor = getReadableDatabase().query(
// TABLE_RESOLVEINFO,
// null,
// ResolveInfoColumns.PACKAGE_NAME + "=? and "
// + ResolveInfoColumns.COMPONENT_NAMES + "=?",
// new String[] { rig.getPackageName(), rig.getComponentNames() },
// null, null, null);
// if (cursor.moveToFirst()) {
// return cursor.getInt(cursor.getColumnIndex(ResolveInfoColumns._ID));
// }
// } catch (Exception e) {
// e.printStackTrace();
// } finally {
// if (cursor != null) {
// cursor.close();
// }
// }
// return 0;
// }
//
// private void deleteFromDatabase(ResolveInfoGroup rig){
// int id = getId(rig);
// if(id != 0){
// getWritableDatabase().delete(TABLE_RESOLVEINFO,
// ResolveInfoColumns._ID + "=?", new String[] { id + "" });
// }
// }
//
// private void saveToDatabase(ResolveInfoGroup rig){
// ContentValues cv = new ContentValues();
// cv.put(ResolveInfoColumns.PACKAGE_NAME, rig.getPackageName());
// cv.put(ResolveInfoColumns.COMPONENT_NAMES, rig.getComponentNames());
// cv.put(ResolveInfoColumns.WEIGHT, rig.getIndex());
// getWritableDatabase().insert(TABLE_RESOLVEINFO, null, cv);
// }
//
// private void updateComponentList(){
// List<ResolveInfoGroup> list = new ArrayList<ResolveInfoGroup>();
// Cursor cursor = null;
// try {
// cursor = getReadableDatabase().query(TABLE_RESOLVEINFO, null,null, null, null, null, null);
// if (cursor.moveToFirst()) {
// do {
// String pkgName = cursor.getString(cursor.getColumnIndex(ResolveInfoColumns.PACKAGE_NAME));
// String componentNames = cursor.getString(cursor.getColumnIndex(ResolveInfoColumns.COMPONENT_NAMES));
// int weight = cursor.getInt(cursor.getColumnIndex(ResolveInfoColumns.WEIGHT));
// ResolveInfoGroup rig = ResolveInfoGroup.fromData(mContext, pkgName, componentNames);
// if (rig != null) {
// rig.setIndex(weight);
// list.add(rig);
// } else {
// getWritableDatabase().delete(TABLE_RESOLVEINFO, "packagename=? and names=?", new String[] { pkgName, componentNames });
// }
// } while (cursor.moveToNext());
// }
// } catch (Exception e) {
// e.printStackTrace();
// } finally {
// if (cursor != null) {
// cursor.close();
// }
// }
//
// Collections.sort(list, new ResolveInfoGroup.IndexComparator());
// synchronized (mList) {
// mList.clear();
// mList.addAll(list);
// }
// notifyUpdate();
// }
//
// public boolean isResolveInfoGroupAdded(ResolveInfoGroup rig) {
// synchronized (mList) {
// for (ResolveInfoGroup addedItem : mList) {
// if (addedItem == rig || addedItem.equals(rig)) {
// return true;
// }
// }
// }
// return false;
// }
//
// public List<ResolveInfoGroup> getAddedResolveInfoGroup() {
// List<ResolveInfoGroup> ret = new ArrayList<ResolveInfoGroup>();
// synchronized (mList) {
// ret.addAll(mList);
// }
// return ret;
// }
//
// public List<ResolveInfoGroup> getUnAddedResolveInfoGroup(){
// List<ResolveInfoGroup> ret = getAllResolveInfoGroupByPackageName(null);
// synchronized (mList) {
// if (ret != null) {
// for (int i = 0; i < ret.size(); ++i) {
// for (int j = 0; j < mList.size(); ++j)
// if (ret.get(i).equals(mList.get(j))) {
// ret.remove(i);
// i--;
// break;
// }
// }
// }
// }
// return ret;
// }
//
// public List<ResolveInfoGroup> getAllResolveInfoGroupByPackageName(String pkgName){
// List<ResolveInfo> allri = getAllResolveInfoByPackageName(pkgName);
// if(allri == null || allri.size() <= 0){
// return null;
// }
// SameGroupComparator sgc = new SameGroupComparator();
// Collections.sort(allri, sgc);
// List<ResolveInfoGroup> ret = new ArrayList<ResolveInfoGroup>();
// ret.add(new ResolveInfoGroup(mContext));
// ret.get(0).add(allri.get(0));
// for(int i = 1; i < allri.size(); ++ i){
// if(sgc.compare(allri.get(i - 1), allri.get(i)) != 0){
// ret.add(new ResolveInfoGroup(mContext));
// }
// ret.get(ret.size() - 1).add(allri.get(i));
// }
// return ret;
// }
//
// public List<ResolveInfo> getAllResolveInfoByPackageName(String packageName) {
// List<ResolveInfo> ret = new ArrayList<ResolveInfo>();
// for (String action : ACTIONS) {
// Intent intent = new Intent(action);
// intent.addCategory(Intent.CATEGORY_DEFAULT);
// intent.setType("*/*");
// intent.setPackage(packageName);
// List<ResolveInfo> infos = mContext.getPackageManager().queryIntentActivities(intent, 0);
// for (ResolveInfo ri : infos) {
// if (sBlackList.contains(ri.activityInfo.packageName)) {
// // NA
// } else {
// Pair<String, String> comp = new Pair<String, String>(ri.activityInfo.packageName, ri.activityInfo.name);
// if (sBlackCompList.contains(comp)) {
// // NA
// } else {
// ret.add(ri);
// }
// }
// }
// }
// ListUtils.getDistinctList(ret, new MyComparator());
// return ret;
// }
//
// public void onPackageRemoved(String packageName){
// synchronized (mList) {
// for (int i = 0; i < mList.size(); ++i) {
// if (mList.get(i).getPackageName().equals(packageName)) {
// mHandler.obtainMessage(MSG_DELETE, mList.get(i)).sendToTarget();
// mList.remove(i);
// i--;
// }
// }
// }
// notifyUpdate();
// }
//
// public void onPackageAdded(String packageName) {
// List<ResolveInfoGroup> rigList = getAllResolveInfoGroupByPackageName(packageName);
// if (rigList == null) {
// // no needed resolveinfo
// return;
// }
// // see component list first
// boolean addComponent = false;
// for (int i = 0; i < sAutoAddComponentList.size(); ++i) {
// ComponentName cn = sAutoAddComponentList.get(i);
// if (cn.getPackageName().equals(packageName)) {
// for (ResolveInfoGroup rig : rigList) {
// if (rig.containsComponent(cn)) {
// addResolveInfoGroupInternal(rig, false);
// addComponent = true;
// break;
// }
// }
// }
// }
//
// if (!addComponent && sAutoAddPackageList.contains(packageName)) {
// for (ResolveInfoGroup rig : rigList) {
// addResolveInfoGroupInternal(rig, false);
// }
// }
// }
//
// public void onPackageUpdate(String packageName) {
// if (!TextUtils.isEmpty(packageName)) {
// boolean changed = false;
// synchronized (mList) {
// for (int i = 0; i < mList.size(); ++i) {
// ResolveInfoGroup rig = mList.get(i);
// if (packageName.equals(rig.getPackageName())) {
// if (!rig.isValid()) {
// mList.remove(i);
// i--;
// mHandler.obtainMessage(MSG_DELETE, rig).sendToTarget();
// changed = true;
// }
// }
// }
// }
// if (changed) {
// notifyUpdate();
// }
// }
// }
//
// public static class MyComparator implements Comparator<ResolveInfo> {
// public final int compare(ResolveInfo a, ResolveInfo b) {
// String pkgA = a.activityInfo.packageName;
// String pkgB = b.activityInfo.packageName;
// if (!pkgA.equals(pkgB)) {
// return pkgA.compareTo(pkgB);
// }
// String nameA = a.activityInfo.name;
// String nameB = b.activityInfo.name;
// if (!nameA.equals(nameB)) {
// return nameA.compareTo(nameB);
// }
// int iconA = a.getIconResource();
// int iconB = b.getIconResource();
// if (iconA != iconB){
// if(iconA < iconB){
// return -1;
// }else{
// return 1;
// }
// }else{
// return 0;
// }
// }
// }
//
// private static final String TABLE_RESOLVEINFO = "resolveinfo";
// static class ResolveInfoColumns implements BaseColumns {
// static final String PACKAGE_NAME = "packagename";
// static final String COMPONENT_NAMES = "names";
// static final String WEIGHT = "weight";
// }
//
// public interface ResolveInfoUpdateListener{
// void onUpdate();
// }
//
// private static final int MSG_SAVE = 0;
// private static final int MSG_DELETE = 1;
// private static final int MSG_UPDATE_LIST = 2;
// private static final int MSG_SAVE_ORDER = 3;
// private class ResolveInfoManagerHandler extends Handler {
// public ResolveInfoManagerHandler(Looper looper) {
// super(looper, null);
// }
//
// @Override
// public void handleMessage(Message msg) {
// switch (msg.what) {
// case MSG_SAVE:
// saveToDatabase((ResolveInfoGroup) msg.obj);
// break;
// case MSG_DELETE:
// deleteFromDatabase((ResolveInfoGroup) msg.obj);
// break;
// case MSG_UPDATE_LIST:
// updateComponentList();
// break;
// case MSG_SAVE_ORDER:
// saveOrderForList();
// break;
// }
// }
// }
//
// public void onIconChanged(Set<String> packages){
// synchronized(mList){
// for(ResolveInfoGroup rig : mList){
// if(packages.contains(rig.getPackageName())){
// rig.onIconChanged();
// }
// }
// }
// notifyUpdate();
// }
//}