package de.theknut.xposedgelsettings.ui; import android.annotation.SuppressLint; import android.app.ActivityManager; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.ImageView; import android.widget.TextView; import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import de.theknut.xposedgelsettings.R; import de.theknut.xposedgelsettings.hooks.Common; public class AllWidgetsList extends ActionBarListActivity { public static Set<String> hiddenWidgets; // http://androidxref.com/4.4.2_r1/xref/packages/apps/Launcher3/src/com/android/launcher3/LauncherModel.java#3089 public static class WidgetAndShortcutNameComparator implements Comparator<Object> { private Collator mCollator; private PackageManager mPackageManager; private HashMap<Object, String> mLabelCache; WidgetAndShortcutNameComparator(PackageManager pm) { mPackageManager = pm; mLabelCache = new HashMap<Object, String>(); mCollator = Collator.getInstance(); } public final int compare(Object a, Object b) { String labelA, labelB; if (mLabelCache.containsKey(a)) { labelA = mLabelCache.get(a); } else { labelA = (a instanceof AppWidgetProviderInfo) ? ((AppWidgetProviderInfo) a).label : ((ResolveInfo) a).loadLabel(mPackageManager).toString().trim(); mLabelCache.put(a, labelA); } if (mLabelCache.containsKey(b)) { labelB = mLabelCache.get(b); } else { labelB = (b instanceof AppWidgetProviderInfo) ? ((AppWidgetProviderInfo) b).label : ((ResolveInfo) b).loadLabel(mPackageManager).toString().trim(); mLabelCache.put(b, labelB); } return mCollator.compare(labelA, labelB); } }; @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); CommonUI.CONTEXT = CommonUI.ACTIVITY = this; // load all widgets PackageManager packageManager = getPackageManager(); final ArrayList<Object> widgetsAndShortcuts = new ArrayList<Object>(); widgetsAndShortcuts.addAll(AppWidgetManager.getInstance(this).getInstalledProviders()); Intent shortcutsIntent = new Intent(Intent.ACTION_CREATE_SHORTCUT); widgetsAndShortcuts.addAll(packageManager.queryIntentActivities(shortcutsIntent, 0)); Collections.sort(widgetsAndShortcuts, new WidgetAndShortcutNameComparator(packageManager)); AppArrayAdapter adapter = new AppArrayAdapter(this, widgetsAndShortcuts); setListAdapter(adapter); } @SuppressLint("WorldReadableFiles") @SuppressWarnings("deprecation") @Override protected void onPause() { super.onPause(); // save our new list SharedPreferences.Editor editor = getSharedPreferences(Common.PREFERENCES_NAME, Context.MODE_WORLD_READABLE).edit(); editor.remove("hiddenwidgets").commit(); editor.putStringSet("hiddenwidgets", hiddenWidgets).commit(); } @SuppressLint("WorldReadableFiles") @SuppressWarnings("deprecation") @Override protected void onResume() { super.onResume(); // get our hidden widgets list hiddenWidgets = getSharedPreferences(Common.PREFERENCES_NAME, Context.MODE_WORLD_READABLE).getStringSet("hiddenwidgets", new HashSet<String>()); ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> processes = am.getRunningAppProcesses(); for (ActivityManager.RunningAppProcessInfo process : processes) { if (Common.PACKAGE_NAMES.contains(process.processName)) { am.killBackgroundProcesses(process.processName); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); menu.findItem(R.id.action_refresh).setVisible(false); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_save: ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningAppProcessInfo process : am.getRunningAppProcesses()) { if (Common.PACKAGE_NAMES.contains(process.processName)) { am.killBackgroundProcesses(process.processName); } } finish(); break; } return true; } public class AppArrayAdapter extends ArrayAdapter<AppWidgetProviderInfo> { private Context context; private List values; public AppArrayAdapter(Context context, List values) { super(context, R.layout.row, values); this.context = context; this.values = values; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View rowView = inflater.inflate(R.layout.row, parent, false); ComponentName cmp; String pkg, label; Object item = values.get(position); if (item instanceof AppWidgetProviderInfo) { cmp = ((AppWidgetProviderInfo) item).provider; pkg = cmp.getPackageName(); label = ((AppWidgetProviderInfo) item).label; } else { pkg = ((ResolveInfo) item).activityInfo.packageName; label = ((ResolveInfo) item).activityInfo.loadLabel(getPackageManager()).toString(); cmp = new ComponentName(pkg, label); } // setup app icon to row ImageView imageView = (ImageView) rowView.findViewById(R.id.badgepreviewicon); try { imageView.setImageDrawable(context.getPackageManager().getApplicationIcon(pkg)); } catch (NameNotFoundException e) { e.printStackTrace(); } // setup app label to row TextView textView = (TextView) rowView.findViewById(R.id.name); textView.setText((item instanceof ResolveInfo) ? (label + " (1 x 1)") : label); // setup checkbox to row CheckBox checkBox = (CheckBox) rowView.findViewById(R.id.checkbox); checkBox.setTag(cmp.flattenToString()); checkBox.setChecked(hiddenWidgets.contains(checkBox.getTag())); checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener () { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { if (!hiddenWidgets.contains(buttonView.getTag())) { // app is not in the list, so lets add it hiddenWidgets.add((String)buttonView.getTag()); } } else { if (hiddenWidgets.contains(buttonView.getTag())) { // app is in the list but the checkbox is no longer checked, we can remove it hiddenWidgets.remove(buttonView.getTag()); } } } }); // add the row to the listview return rowView; } } }