Cherish: Implement HideAppFromRecents (HAFR) Settings

Change-Id: I1afcab02d4daa1f2f01bc537fca9878a1eb0ad6b
Signed-off-by: Adin Kwok <adin.kwok@carbonrom.org>
Signed-off-by: Hưng Phan <phandinhhungvp2001@gmail.com>
This commit is contained in:
Christian Oder
2016-09-19 15:40:22 +02:00
committed by Hưng Phan
parent ab991e3db7
commit cebca8ba7d
11 changed files with 838 additions and 0 deletions

View File

@@ -0,0 +1,182 @@
package com.cherish.settings.fragments;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.settings.R;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
public abstract class HAFRAppChooserAdapter extends BaseAdapter implements Filterable {
final Context mContext;
final Handler mHandler;
final PackageManager mPackageManager;
final LayoutInflater mLayoutInflater;
protected List<PackageInfo> mInstalledAppInfo;
protected List<AppItem> mInstalledApps = new LinkedList<AppItem>();
protected List<PackageInfo> mTemporarylist;
boolean isUpdating;
public HAFRAppChooserAdapter(Context context) {
mContext = context;
mHandler = new Handler();
mPackageManager = mContext.getPackageManager();
mLayoutInflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mInstalledAppInfo = mPackageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS);
mTemporarylist = mInstalledAppInfo;
}
public synchronized void update() {
onStartUpdate();
new Thread(new Runnable() {
@Override
public void run() {
isUpdating = true;
final List<AppItem> temp = new LinkedList<AppItem>();
for (PackageInfo info : mTemporarylist) {
final AppItem item = new AppItem();
item.title = info.applicationInfo.loadLabel(mPackageManager);
item.icon = info.applicationInfo.loadIcon(mPackageManager);
item.packageName = info.packageName;
final int index = Collections.binarySearch(temp, item);
if (index < 0) {
temp.add((-index - 1), item);
} else {
temp.add((index + 1), item);
}
}
mHandler.post(new Runnable() {
@Override
public void run() {
mInstalledApps = temp;
notifyDataSetChanged();
isUpdating = false;
onFinishUpdate();
}
});
}
}).start();
}
public abstract void onStartUpdate();
public abstract void onFinishUpdate();
@Override
public int getCount() {
return mInstalledApps.size();
}
@Override
public AppItem getItem(int position) {
if (position >= mInstalledApps.size()) {
return mInstalledApps.get(mInstalledApps.size());
} else if (position < 0) {
return mInstalledApps.get(0);
}
return mInstalledApps.get(position);
}
@Override
public long getItemId(int position) {
if (position < 0 || position >= mInstalledApps.size()) {
return -1;
}
return getItem(position).hashCode();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView != null) {
holder = (ViewHolder) convertView.getTag();
} else {
convertView = mLayoutInflater.inflate(R.layout.view_app_list, parent, false);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(android.R.id.title);
holder.icon = (ImageView) convertView.findViewById(android.R.id.icon);
holder.pkg = (TextView) convertView.findViewById(android.R.id.message);
convertView.setTag(holder);
}
AppItem appInfo = getItem(position);
holder.name.setText(appInfo.title);
holder.pkg.setText(appInfo.packageName);
holder.icon.setImageDrawable(appInfo.icon);
return convertView;
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if (TextUtils.isEmpty(constraint)) {
// No filter implemented we return all the list
mTemporarylist = mInstalledAppInfo;
return new FilterResults();
}
ArrayList<PackageInfo> FilteredList = new ArrayList<PackageInfo>();
for (PackageInfo data : mInstalledAppInfo) {
final String filterText = constraint.toString().toLowerCase(Locale.ENGLISH);
try {
if (data.applicationInfo.loadLabel(mPackageManager).toString()
.toLowerCase(Locale.ENGLISH).contains(filterText)) {
FilteredList.add(data);
} else if (data.packageName.contains(filterText)) {
FilteredList.add(data);
}
} catch (Exception e) {
}
}
mTemporarylist = FilteredList;
return new FilterResults();
}
};
}
public class AppItem implements Comparable<AppItem> {
public CharSequence title;
public String packageName;
public Drawable icon;
@Override
public int compareTo(AppItem another) {
return this.title.toString().compareTo(another.title.toString());
}
}
static class ViewHolder {
TextView name;
ImageView icon;
TextView pkg;
}
}

View File

@@ -0,0 +1,80 @@
package com.cherish.settings.fragments;
import android.app.Dialog;
import android.content.Context;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.Filter;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.AdapterView.OnItemClickListener;
import com.android.settings.R;
public abstract class HAFRAppChooserDialog extends Dialog {
final HAFRAppChooserAdapter dAdapter;
final ProgressBar dProgressBar;
final ListView dListView;
final EditText dSearch;
final ImageButton dButton;
private int mId;
public HAFRAppChooserDialog(Context context) {
super(context);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.dialog_app_chooser_list);
dListView = (ListView) findViewById(R.id.listView1);
dSearch = (EditText) findViewById(R.id.searchText);
dButton = (ImageButton) findViewById(R.id.searchButton);
dProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
dAdapter = new HAFRAppChooserAdapter(context) {
@Override
public void onStartUpdate() {
dProgressBar.setVisibility(View.VISIBLE);
}
@Override
public void onFinishUpdate() {
dProgressBar.setVisibility(View.GONE);
}
};
dListView.setAdapter(dAdapter);
dListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> av, View v, int pos, long id) {
HAFRAppChooserAdapter.AppItem info = (HAFRAppChooserAdapter.AppItem) av
.getItemAtPosition(pos);
onListViewItemClick(info, mId);
dismiss();
}
});
dButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dAdapter.getFilter().filter(dSearch.getText().toString(), new Filter.FilterListener() {
public void onFilterComplete(int count) {
dAdapter.update();
}
});
}
});
dAdapter.update();
}
public void show(int id) {
mId = id;
show();
}
public abstract void onListViewItemClick(HAFRAppChooserAdapter.AppItem info, int id);
}

View File

@@ -0,0 +1,205 @@
package com.cherish.settings.fragments;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import com.cherish.settings.fragments.HAFRAppChooserAdapter.AppItem;
import com.android.settings.R;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
public class HAFRAppListActivity extends Activity {
/* others */
static final int ID_ADD_APP = 1;
/* main stuff */
SharedPreferences mPref;
HAFRAppListAdapter mPkgAdapter;
ListView mListView;
/* app dialog stuff */
HAFRAppChooserDialog dDialog;
ArrayList<String> excludeFromRecentsList;
public static final String KEY_PREFERENCE_APPS = "hide_recents_apps_pref";
@Override
@SuppressLint("WorldReadableFiles")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPref = getSharedPreferences(KEY_PREFERENCE_APPS, MODE_PRIVATE);
loadList();
initAppList();
}
@Override
public void onPause() {
super.onPause();
// Avoid WindowLeaked Exception
// http://publicstaticdroidmain.com/2012/01/avoiding-android-memory-leaks-part-1/
if (dDialog != null && dDialog.isShowing()) {
dDialog.dismiss();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem add = menu.add(Menu.NONE, ID_ADD_APP, 0, R.string.hide_from_recents_add_app);
add.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case ID_ADD_APP:
dDialog.show(ID_ADD_APP);
break;
}
return false;
}
private void initAppList() {
dDialog = new HAFRAppChooserDialog(this) {
@Override
public void onListViewItemClick(AppItem info, int id) {
addApp(info.packageName);
}
};
}
private void loadList() {
final Map<String, Integer> list = getSetStrings();
mPkgAdapter = new HAFRAppListAdapter(this, list) {
@Override
public void onRemoveButtonPress(PackageItem app_info) {
removeApp(app_info.packageName);
}
};
mListView = new ListView(this);
mListView.setAdapter(mPkgAdapter);
setContentView(mListView);
}
@SuppressWarnings("unchecked")
private Map<String, Integer> getSetStrings() {
return (Map<String, Integer>) mPref.getAll();
}
public void removeApp(String pkg) {
Editor editor = mPref.edit().clear();
excludeFromRecentsList = new ArrayList<String>();
List<ArrayList<String>> tempItemList2 = new ArrayList<ArrayList<String>>();
List<String> tempItemList3 = new ArrayList<String>();
for (HAFRAppListAdapter.PackageItem item : mPkgAdapter.getList()) {
if (!item.packageName.equals(pkg)) {
excludeFromRecentsList.add(item.packageName);
}
}
PackageManager packageManager = getApplicationContext().getPackageManager();
for (int i = 0; i < excludeFromRecentsList.size(); i++) {
try {
tempItemList2.add(new ArrayList<String>(Arrays.asList((String) packageManager.getApplicationLabel(packageManager.getApplicationInfo(excludeFromRecentsList.get(i), PackageManager.GET_META_DATA)), excludeFromRecentsList.get(i))));
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
Collections.sort(tempItemList2, new Comparator<ArrayList<String>>() {
@Override
public int compare(ArrayList<String> o1, ArrayList<String> o2) {
return o1.get(0).toLowerCase().compareTo(o2.get(0).toLowerCase());
}
});
for (int i = 0; i < excludeFromRecentsList.size(); i++) {
tempItemList3.add(tempItemList2.get(i).get(1));
}
for (HAFRAppListAdapter.PackageItem item : mPkgAdapter.getList()) {
editor.putInt(item.packageName, tempItemList3.indexOf(item.packageName));
}
editor.commit();
saveExcludeFromRecentsString();
updateList();
}
public void addApp(String pkg) {
Editor editor = mPref.edit().clear();
excludeFromRecentsList = new ArrayList<String>();
List<ArrayList<String>> tempItemList2 = new ArrayList<ArrayList<String>>();
List<String> tempItemList3 = new ArrayList<String>();
for (HAFRAppListAdapter.PackageItem item : mPkgAdapter.getList()) {
excludeFromRecentsList.add(item.packageName);
}
excludeFromRecentsList.add(pkg);
PackageManager packageManager = getApplicationContext().getPackageManager();
for (int i = 0; i < excludeFromRecentsList.size(); i++) {
try {
tempItemList2.add(new ArrayList<String>(Arrays.asList((String) packageManager.getApplicationLabel(packageManager.getApplicationInfo(excludeFromRecentsList.get(i), PackageManager.GET_META_DATA)), excludeFromRecentsList.get(i))));
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
Collections.sort(tempItemList2, new Comparator<ArrayList<String>>() {
@Override
public int compare(ArrayList<String> o1, ArrayList<String> o2) {
return o1.get(0).toLowerCase().compareTo(o2.get(0).toLowerCase());
}
});
for (int i = 0; i < excludeFromRecentsList.size(); i++) {
tempItemList3.add(tempItemList2.get(i).get(1));
}
for (HAFRAppListAdapter.PackageItem item : mPkgAdapter.getList()) {
editor.putInt(item.packageName, tempItemList3.indexOf(item.packageName));
}
editor.putInt(pkg, tempItemList3.indexOf(pkg));
editor.commit();
saveExcludeFromRecentsString();
updateList();
}
private void saveExcludeFromRecentsString() {
StringBuilder sb = new StringBuilder();
for (String name : excludeFromRecentsList) {
sb.append(name + "|");
}
if (sb.length() > 0) {
sb.deleteCharAt(sb.length() - 1);
}
Log.d("Myself5", sb.toString());
Settings.System.putString(getContentResolver(),
Settings.System.HIDE_FROM_RECENTS_LIST, sb.toString());
}
public void updateList() {
mPkgAdapter.update(getSetStrings());
}
}

View File

@@ -0,0 +1,151 @@
package com.cherish.settings.fragments;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.settings.R;
import java.util.LinkedList;
import java.util.Map;
public abstract class HAFRAppListAdapter extends BaseAdapter {
final Context mContext;
final Handler mHandler;
final PackageManager mPackageManager;
final LayoutInflater mLayoutInflater;
protected LinkedList<PackageItem> mApps = new LinkedList<PackageItem>();
public HAFRAppListAdapter(Context context, Map<String, Integer> list) {
mContext = context;
mHandler = new Handler();
mPackageManager = context.getPackageManager();
mLayoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
update(list);
}
public void update(final Map<String, Integer> app_array) {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (mApps) {
final PackageItem[] array = new PackageItem[app_array.size() * 2];
for (String pkg_name : app_array.keySet()) {
try {
ApplicationInfo ai = mPackageManager.getApplicationInfo(pkg_name, 0);
final PackageItem item = new PackageItem();
item.title = ai.loadLabel(mPackageManager);
item.icon = ai.loadIcon(mPackageManager);
item.packageName = ai.packageName;
array[app_array.get(pkg_name)] = item;
} catch (Exception e) {
}
}
final LinkedList<PackageItem> temp = new LinkedList<PackageItem>();
for (int x = 0; x < array.length; x++) {
if (array[x] != null) {
temp.add(array[x]);
}
}
mHandler.post(new Runnable() {
@Override
public void run() {
mApps.clear();
mApps = temp;
notifyDataSetChanged();
}
});
}
}
}).start();
}
@Override
public int getCount() {
return mApps.size();
}
public LinkedList<PackageItem> getList() {
return mApps;
}
@Override
public PackageItem getItem(int position) {
return mApps.get(position);
}
@Override
public long getItemId(int position) {
if (position < 0 || position >= mApps.size()) {
return -1;
}
return mApps.get(position).hashCode();
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView != null) {
holder = (ViewHolder) convertView.getTag();
} else {
convertView = mLayoutInflater.inflate(R.layout.view_package_list, parent, false);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(android.R.id.title);
holder.icon = (ImageView) convertView.findViewById(android.R.id.icon);
holder.pkg = (TextView) convertView.findViewById(android.R.id.message);
holder.remove = (ImageButton) convertView.findViewById(R.id.removeButton);
convertView.setTag(holder);
}
final PackageItem appInfo = getItem(position);
holder.name.setText(appInfo.title);
holder.pkg.setText(appInfo.packageName);
holder.icon.setImageDrawable(appInfo.icon);
holder.remove.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onRemoveButtonPress(appInfo);
}
});
return convertView;
}
public abstract void onRemoveButtonPress(PackageItem app_info);
public class PackageItem implements Comparable<PackageItem> {
public CharSequence title;
public String packageName;
public Drawable icon;
@Override
public int compareTo(PackageItem another) {
return this.title.toString().compareTo(another.title.toString());
}
}
static class ViewHolder {
TextView name;
ImageView icon;
TextView pkg;
ImageButton remove;
}
}