package de.theknut.xposedgelsettings.ui; import android.annotation.SuppressLint; import android.app.AlertDialog; 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.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.View.OnClickListener; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import de.theknut.xposedgelsettings.R; import de.theknut.xposedgelsettings.hooks.Common; import de.theknut.xposedgelsettings.hooks.icon.IconPack; import de.theknut.xposedgelsettings.ui.ImageLoader.ViewHolder; @SuppressLint("WorldReadableFiles") public class ChooseAppList extends ActionBarListActivity { AppArrayAdapter adapter; SharedPreferences prefs; String prefKey; int mode; Intent intent; Set<String> appNames; public static int MODE_APP_RENAME = 1; @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // retrieve the preference key so that we can save an app linked with the gesture intent = getIntent(); prefKey = intent.getStringExtra("prefKey"); mode = intent.getIntExtra("mode", 0); prefs = getSharedPreferences(Common.PREFERENCES_NAME, Context.MODE_WORLD_READABLE); appNames = prefs.getStringSet("appnames", new HashSet<String>()); adapter = new AppArrayAdapter(this, getPackageManager(), CommonUI.getAllApps()); setListAdapter(adapter); } @Override public void onBackPressed() { setResult(RESULT_CANCELED, intent); ChooseAppList.this.finish(); } SharedPreferences.OnSharedPreferenceChangeListener onSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (sharedPreferences.getBoolean("autokilllauncher", false)) { CommonUI.restartLauncher(false); } } }; @Override public void onResume() { super.onResume(); if (adapter != null) { adapter.notifyDataSetChanged(); } prefs.registerOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener); } @Override public void onPause() { prefs.unregisterOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener); super.onPause(); } @Override public boolean onCreateOptionsMenu(Menu menu) { if (prefKey == null && mode != MODE_APP_RENAME) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.chooseapp_menu, menu); } return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // action with ID action_refresh was selected case R.id.action_reset_all: SharedPreferences.Editor editor = prefs.edit(); editor.remove("selectedicons").commit(); adapter.notifyDataSetChanged(); break; default: break; } return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK && adapter != null) { adapter.notifyDataSetChanged(); } } public class AppArrayAdapter extends ArrayAdapter<ResolveInfo> { private Context context; private List<ResolveInfo> values; private PackageManager pm; private LayoutInflater inflater; private IconPack iconPack; OnClickListener onClickListener = new OnClickListener() { @SuppressWarnings("deprecation") @Override public void onClick(View v) { SharedPreferences.Editor editor = prefs.edit(); editor.remove(prefKey + "_launch").commit(); editor.putString(prefKey + "_launch", ((ViewHolder) v.getTag()).cmpName).commit(); setResult(RESULT_OK, intent); ChooseAppList.this.finish(); } }; OnClickListener onClickListenerApp = new OnClickListener() { @SuppressWarnings("deprecation") @Override public void onClick(View v) { Intent i = new Intent(ChooseAppList.this, FragmentSelectiveIcon.class); i.putExtra("app", ((ViewHolder) v.getTag()).cmpName); i.putExtra("name", ((ViewHolder) v.getTag()).textView.getText()); i.putExtra("mode", FragmentSelectiveIcon.MODE_PICK_GLOBAL_ICON); startActivityForResult(i, 0); } }; OnClickListener onClickListenerRename = new OnClickListener() { @SuppressWarnings("deprecation") @Override public void onClick(final View row) { final ViewHolder holder = (ViewHolder) row.getTag(); final String curName = String.valueOf(holder.textView.getText()); final AlertDialog editNameDialog = new AlertDialog.Builder(context).create(); final ViewGroup editNameView = (ViewGroup) inflater.inflate(R.layout.edit_app_name, null); final EditText editText = (EditText) editNameView.findViewById(R.id.edit_app_name_edittext); editText.setHint(curName); int padding = Math.round(context.getResources().getDimension(R.dimen.edit_app_name_padding)); editNameDialog.setView(editNameView, padding, padding, padding, padding); editNameView.findViewById(R.id.edit_app_name_save).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String newName = editText.getText().toString().trim(); if (newName.length() == 0) { editNameDialog.dismiss(); return; } if (!curName.equals(newName)) { Iterator<String> it = appNames.iterator(); while (it.hasNext()) { String next = it.next(); String[] split = next.split("|"); if (split[0].equals(holder.cmpName)) { it.remove(); break; } } appNames.add(holder.cmpName + "|global|" + newName); prefs.edit() .remove("appnames") .commit(); prefs.edit() .putStringSet("appnames", appNames) .commit(); holder.textView.setText(newName); adapter.notifyDataSetChanged(); } editNameDialog.dismiss(); } }); editNameView.findViewById(R.id.edit_app_name_restore).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Iterator<String> it = appNames.iterator(); while (it.hasNext()) { String next = it.next(); String[] split = next.split("\\|"); if (split[0].equals(holder.cmpName)) { it.remove(); break; } } prefs.edit() .remove("appnames") .commit(); prefs.edit() .putStringSet("appnames", appNames) .commit(); holder.textView.setText(String.valueOf(holder.textView.getTag())); adapter.notifyDataSetChanged(); editNameDialog.dismiss(); } }); editNameDialog.setTitle(String.valueOf(holder.textView.getTag())); editNameDialog.show(); } }; public AppArrayAdapter(Context context, PackageManager pm, List<ResolveInfo> values) { super(context, R.layout.row, values); this.context = context; this.values = values; this.pm = pm; this.inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); this.iconPack = FragmentIcon.iconPack; } @Override public View getView(int position, final View convertView, ViewGroup parent) { ResolveInfo item = values.get(position); ViewHolder holder; View rowView = convertView; if (rowView == null) { holder = new ViewHolder(); rowView = inflater.inflate(R.layout.row, parent, false); holder.imageView = (ImageView) rowView.findViewById(R.id.badgepreviewicon); holder.textView = (TextView) rowView.findViewById(R.id.name); holder.checkBox = (CheckBox) rowView.findViewById(R.id.checkbox); holder.delete = (ImageButton) rowView.findViewById(R.id.deletebutton); holder.selectedIcon = (ImageView) rowView.findViewById(R.id.selectedicon); holder.checkBox.setVisibility(View.GONE); if (CommonUI.TextColor == -1) { CommonUI.TextColor = holder.textView.getCurrentTextColor(); } String cmpName = new ComponentName(item.activityInfo.packageName, item.activityInfo.name).flattenToString(); holder.imageView.setImageDrawable( iconPack == null ? item.loadIcon(pm) : iconPack.loadIcon(cmpName) ); rowView.setTag(holder); } holder = (ViewHolder) rowView.getTag(); String name = String.valueOf(item.loadLabel(pm)); holder.textView.setTag(name); holder.textView.setText(name); if (prefKey != null) { holder.cmpName = item.activityInfo.packageName; rowView.setOnClickListener(onClickListener); } else { String cmpName = new ComponentName(item.activityInfo.packageName, item.activityInfo.name).flattenToString(); holder.cmpName = cmpName; holder.delete.setTag(cmpName); boolean visible = false; SharedPreferences prefs = getSharedPreferences(Common.PREFERENCES_NAME, Context.MODE_WORLD_READABLE); HashSet<String> selectedIcons = (HashSet<String>) prefs.getStringSet("selectedicons", new HashSet<String>()); for (String selectedIcon : selectedIcons) { if (selectedIcon.split("\\|")[0].equals(cmpName)) { visible = true; break; } } holder.delete.setVisibility(visible ? View.VISIBLE : View.GONE); holder.selectedIcon.setVisibility(visible ? View.VISIBLE : View.GONE); if (mode == MODE_APP_RENAME) { rowView.setOnClickListener(onClickListenerRename); } else { rowView.setOnClickListener(onClickListenerApp); } } for (String app : appNames) { String[] split = app.split("\\|"); if (split[1].equals("global") && split[0].equals(holder.cmpName)) { holder.textView.setText(split[2]); break; } } holder.delete.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { SharedPreferences prefs = getSharedPreferences(Common.PREFERENCES_NAME, Context.MODE_WORLD_READABLE); SharedPreferences.Editor editor = prefs.edit(); String key = "selectedicons"; String appComponentName = (String) v.getTag(); HashSet<String> selectedIcons = (HashSet<String>) prefs.getStringSet(key, new HashSet<String>()); Iterator it = selectedIcons.iterator(); while (it.hasNext()) { String[] item = it.next().toString().split("\\|"); if (item[0].equals(appComponentName)) { it.remove(); } } editor.remove(key).commit(); editor.putStringSet(key, selectedIcons).commit(); notifyDataSetChanged(); } }); holder.loadImageAsync(pm, item, holder); return rowView; } } }