am 02c5fabc
: Merge change 22064 into eclair
Merge commit '02c5fabcfd9e1c258b2cdef7a851cadea85f2869' * commit '02c5fabcfd9e1c258b2cdef7a851cadea85f2869': Add type to filter option to list view
This commit is contained in:
@@ -52,6 +52,8 @@ import android.view.ViewGroup;
|
|||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
import android.widget.BaseAdapter;
|
import android.widget.BaseAdapter;
|
||||||
|
import android.widget.Filter;
|
||||||
|
import android.widget.Filterable;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.ListView;
|
import android.widget.ListView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
@@ -654,18 +656,28 @@ public class ManageApplications extends ListActivity implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean matchFilter(boolean filter, Map<String, String> filterMap, String pkg) {
|
||||||
|
boolean add = true;
|
||||||
|
if (filter) {
|
||||||
|
if (filterMap == null || !filterMap.containsKey(pkg)) {
|
||||||
|
add = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return add;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Utility method used to figure out list of apps based on filterOption
|
* Utility method used to figure out list of apps based on filterOption
|
||||||
* If the framework supports an additional flag to indicate running apps
|
* If the framework supports an additional flag to indicate running apps
|
||||||
* we can get away with some code here.
|
* we can get away with some code here.
|
||||||
*/
|
*/
|
||||||
List<ApplicationInfo> getFilteredApps(List<ApplicationInfo> pAppList, int filterOption) {
|
List<ApplicationInfo> getFilteredApps(List<ApplicationInfo> pAppList, int filterOption, boolean filter,
|
||||||
|
Map<String, String> filterMap) {
|
||||||
List<ApplicationInfo> retList = new ArrayList<ApplicationInfo>();
|
List<ApplicationInfo> retList = new ArrayList<ApplicationInfo>();
|
||||||
if(pAppList == null) {
|
if(pAppList == null) {
|
||||||
return retList;
|
return retList;
|
||||||
}
|
}
|
||||||
if (filterOption == FILTER_APPS_THIRD_PARTY) {
|
if (filterOption == FILTER_APPS_THIRD_PARTY) {
|
||||||
List<ApplicationInfo> appList =new ArrayList<ApplicationInfo> ();
|
|
||||||
for (ApplicationInfo appInfo : pAppList) {
|
for (ApplicationInfo appInfo : pAppList) {
|
||||||
boolean flag = false;
|
boolean flag = false;
|
||||||
if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
|
if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
|
||||||
@@ -676,15 +688,16 @@ public class ManageApplications extends ListActivity implements
|
|||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
if (flag) {
|
if (flag) {
|
||||||
appList.add(appInfo);
|
if (matchFilter(filter, filterMap, appInfo.packageName)) {
|
||||||
|
retList.add(appInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return appList;
|
}
|
||||||
|
return retList;
|
||||||
} else if (filterOption == FILTER_APPS_RUNNING) {
|
} else if (filterOption == FILTER_APPS_RUNNING) {
|
||||||
List<ApplicationInfo> appList =new ArrayList<ApplicationInfo> ();
|
|
||||||
List<ActivityManager.RunningAppProcessInfo> procList = getRunningAppProcessesList();
|
List<ActivityManager.RunningAppProcessInfo> procList = getRunningAppProcessesList();
|
||||||
if ((procList == null) || (procList.size() == 0)) {
|
if ((procList == null) || (procList.size() == 0)) {
|
||||||
return appList;
|
return retList;
|
||||||
}
|
}
|
||||||
// Retrieve running processes from ActivityManager
|
// Retrieve running processes from ActivityManager
|
||||||
HashMap<String, ActivityManager.RunningAppProcessInfo> runningMap =
|
HashMap<String, ActivityManager.RunningAppProcessInfo> runningMap =
|
||||||
@@ -700,12 +713,19 @@ public class ManageApplications extends ListActivity implements
|
|||||||
// Query list to find running processes in current list
|
// Query list to find running processes in current list
|
||||||
for (ApplicationInfo appInfo : pAppList) {
|
for (ApplicationInfo appInfo : pAppList) {
|
||||||
if (runningMap.get(appInfo.packageName) != null) {
|
if (runningMap.get(appInfo.packageName) != null) {
|
||||||
appList.add(appInfo);
|
if (matchFilter(filter, filterMap, appInfo.packageName)) {
|
||||||
|
retList.add(appInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return appList;
|
}
|
||||||
|
return retList;
|
||||||
} else {
|
} else {
|
||||||
return pAppList;
|
for (ApplicationInfo appInfo : pAppList) {
|
||||||
|
if (matchFilter(filter, filterMap, appInfo.packageName)) {
|
||||||
|
retList.add(appInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retList;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -927,11 +947,63 @@ public class ManageApplications extends ListActivity implements
|
|||||||
* the getId methods via the package name into the internal maps and indices.
|
* the getId methods via the package name into the internal maps and indices.
|
||||||
* The order of applications in the list is mirrored in mAppLocalList
|
* The order of applications in the list is mirrored in mAppLocalList
|
||||||
*/
|
*/
|
||||||
class AppInfoAdapter extends BaseAdapter {
|
class AppInfoAdapter extends BaseAdapter implements Filterable {
|
||||||
private List<ApplicationInfo> mAppList;
|
private List<ApplicationInfo> mAppList;
|
||||||
private List<ApplicationInfo> mAppLocalList;
|
private List<ApplicationInfo> mAppLocalList;
|
||||||
|
private Map<String, String> mFilterMap = new HashMap<String, String>();
|
||||||
AlphaComparator mAlphaComparator = new AlphaComparator();
|
AlphaComparator mAlphaComparator = new AlphaComparator();
|
||||||
SizeComparator mSizeComparator = new SizeComparator();
|
SizeComparator mSizeComparator = new SizeComparator();
|
||||||
|
private Filter mAppFilter = new AppFilter();
|
||||||
|
final private Object mFilterLock = new Object();
|
||||||
|
private Map<String, String> mCurrentFilterMap = null;
|
||||||
|
|
||||||
|
private void generateFilterListLocked(List<ApplicationInfo> list) {
|
||||||
|
mAppLocalList = new ArrayList<ApplicationInfo>(list);
|
||||||
|
synchronized(mFilterLock) {
|
||||||
|
for (ApplicationInfo info : mAppLocalList) {
|
||||||
|
String label = info.packageName;
|
||||||
|
AppInfo aInfo = mCache.getEntry(info.packageName);
|
||||||
|
if ((aInfo != null) && (aInfo.appName != null)) {
|
||||||
|
label = aInfo.appName.toString();
|
||||||
|
}
|
||||||
|
mFilterMap.put(info.packageName, label.toLowerCase());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addFilterListLocked(int newIdx, ApplicationInfo info, CharSequence pLabel) {
|
||||||
|
mAppLocalList.add(newIdx, info);
|
||||||
|
synchronized (mFilterLock) {
|
||||||
|
String label = info.packageName;
|
||||||
|
if (pLabel != null) {
|
||||||
|
label = pLabel.toString();
|
||||||
|
}
|
||||||
|
mFilterMap.put(info.packageName, label.toLowerCase());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean removeFilterListLocked(String removePkg) {
|
||||||
|
// Remove from filtered list
|
||||||
|
int N = mAppLocalList.size();
|
||||||
|
int i;
|
||||||
|
for (i = (N-1); i >= 0; i--) {
|
||||||
|
ApplicationInfo info = mAppLocalList.get(i);
|
||||||
|
if (info.packageName.equalsIgnoreCase(removePkg)) {
|
||||||
|
if (localLOGV) Log.i(TAG, "Removing " + removePkg + " from local list");
|
||||||
|
mAppLocalList.remove(i);
|
||||||
|
synchronized (mFilterLock) {
|
||||||
|
mFilterMap.remove(removePkg);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void reverseGenerateList() {
|
||||||
|
generateFilterListLocked(getFilteredApps(mAppList, mFilterApps, mCurrentFilterMap!= null, mCurrentFilterMap));
|
||||||
|
sortListInner(mSortOrder);
|
||||||
|
}
|
||||||
|
|
||||||
// Make sure the cache or map contains entries for all elements
|
// Make sure the cache or map contains entries for all elements
|
||||||
// in appList for a valid sort.
|
// in appList for a valid sort.
|
||||||
@@ -942,11 +1014,11 @@ public class ManageApplications extends ListActivity implements
|
|||||||
// Just refresh the list
|
// Just refresh the list
|
||||||
appList = mAppList;
|
appList = mAppList;
|
||||||
} else {
|
} else {
|
||||||
mAppList = pAppList;
|
mAppList = new ArrayList<ApplicationInfo>(pAppList);
|
||||||
appList = pAppList;
|
appList = pAppList;
|
||||||
notify = true;
|
notify = true;
|
||||||
}
|
}
|
||||||
mAppLocalList = getFilteredApps(appList, filterOption);
|
generateFilterListLocked(getFilteredApps(appList, filterOption, mCurrentFilterMap!= null, mCurrentFilterMap));
|
||||||
// This loop verifies and creates new entries for new packages in list
|
// This loop verifies and creates new entries for new packages in list
|
||||||
int imax = appList.size();
|
int imax = appList.size();
|
||||||
for (int i = 0; i < imax; i++) {
|
for (int i = 0; i < imax; i++) {
|
||||||
@@ -1083,7 +1155,7 @@ public class ManageApplications extends ListActivity implements
|
|||||||
public void sortBaseList(int sortOrder) {
|
public void sortBaseList(int sortOrder) {
|
||||||
if (localLOGV) Log.i(TAG, "Sorting base list based on sortOrder = "+sortOrder);
|
if (localLOGV) Log.i(TAG, "Sorting base list based on sortOrder = "+sortOrder);
|
||||||
sortAppList(mAppList, sortOrder);
|
sortAppList(mAppList, sortOrder);
|
||||||
mAppLocalList = getFilteredApps(mAppList, mFilterApps);
|
generateFilterListLocked(getFilteredApps(mAppList, mFilterApps, mCurrentFilterMap!= null, mCurrentFilterMap));
|
||||||
adjustIndex();
|
adjustIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1106,7 +1178,7 @@ public class ManageApplications extends ListActivity implements
|
|||||||
*/
|
*/
|
||||||
public boolean resetAppList(int filterOption) {
|
public boolean resetAppList(int filterOption) {
|
||||||
// Change application list based on filter option
|
// Change application list based on filter option
|
||||||
mAppLocalList = getFilteredApps(mAppList, filterOption);
|
generateFilterListLocked(getFilteredApps(mAppList, filterOption, mCurrentFilterMap!= null, mCurrentFilterMap));
|
||||||
// Check for all properties in map before sorting. Populate values from cache
|
// Check for all properties in map before sorting. Populate values from cache
|
||||||
for(ApplicationInfo applicationInfo : mAppLocalList) {
|
for(ApplicationInfo applicationInfo : mAppLocalList) {
|
||||||
AppInfo appInfo = mCache.getEntry(applicationInfo.packageName);
|
AppInfo appInfo = mCache.getEntry(applicationInfo.packageName);
|
||||||
@@ -1220,8 +1292,9 @@ public class ManageApplications extends ListActivity implements
|
|||||||
mAppList.add(info);
|
mAppList.add(info);
|
||||||
// Add entry to map. Note that the index gets adjusted later on based on
|
// Add entry to map. Note that the index gets adjusted later on based on
|
||||||
// whether the newly added package is part of displayed list
|
// whether the newly added package is part of displayed list
|
||||||
|
CharSequence label = info.loadLabel(mPm);
|
||||||
mCache.addEntry(new AppInfo(pkgName, -1,
|
mCache.addEntry(new AppInfo(pkgName, -1,
|
||||||
info.loadLabel(mPm), info.loadIcon(mPm), size, formattedSize));
|
label, info.loadIcon(mPm), size, formattedSize));
|
||||||
// Add to list
|
// Add to list
|
||||||
if (notInList && (shouldBeInList(mFilterApps, info))) {
|
if (notInList && (shouldBeInList(mFilterApps, info))) {
|
||||||
// Binary search returns a negative index (ie -index) of the position where
|
// Binary search returns a negative index (ie -index) of the position where
|
||||||
@@ -1234,7 +1307,7 @@ public class ManageApplications extends ListActivity implements
|
|||||||
}
|
}
|
||||||
// New entry
|
// New entry
|
||||||
newIdx = -newIdx-1;
|
newIdx = -newIdx-1;
|
||||||
mAppLocalList.add(newIdx, info);
|
addFilterListLocked(newIdx, info, label);
|
||||||
// Adjust index
|
// Adjust index
|
||||||
adjustIndex();
|
adjustIndex();
|
||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
@@ -1286,15 +1359,8 @@ public class ManageApplications extends ListActivity implements
|
|||||||
if (localLOGV) Log.i(TAG, "Removing " + pkg + " from cache");
|
if (localLOGV) Log.i(TAG, "Removing " + pkg + " from cache");
|
||||||
mCache.removeEntry(pkg);
|
mCache.removeEntry(pkg);
|
||||||
// Remove from filtered list
|
// Remove from filtered list
|
||||||
int i = 0;
|
if (removeFilterListLocked(pkg)) {
|
||||||
for (ApplicationInfo info : mAppLocalList) {
|
|
||||||
if (info.packageName.equalsIgnoreCase(pkg)) {
|
|
||||||
mAppLocalList.remove(i);
|
|
||||||
if (localLOGV) Log.i(TAG, "Removing " + pkg + " from local list");
|
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Adjust indices of list entries
|
// Adjust indices of list entries
|
||||||
@@ -1324,6 +1390,50 @@ public class ManageApplications extends ListActivity implements
|
|||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Filter getFilter() {
|
||||||
|
return mAppFilter;
|
||||||
|
}
|
||||||
|
|
||||||
|
private class AppFilter extends Filter {
|
||||||
|
@Override
|
||||||
|
protected FilterResults performFiltering(CharSequence prefix) {
|
||||||
|
FilterResults results = new FilterResults();
|
||||||
|
if (prefix == null || prefix.length() == 0) {
|
||||||
|
synchronized (mFilterLock) {
|
||||||
|
results.values = new HashMap<String, String>(mFilterMap);
|
||||||
|
results.count = mFilterMap.size();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
final String prefixString = prefix.toString().toLowerCase();
|
||||||
|
Map<String, String> newMap = new HashMap<String, String>();
|
||||||
|
synchronized (mFilterLock) {
|
||||||
|
Map<String, String> localMap = mFilterMap;
|
||||||
|
Set<String> keys = mFilterMap.keySet();
|
||||||
|
for (String key : keys) {
|
||||||
|
String label = localMap.get(key);
|
||||||
|
if (label.indexOf(prefixString) != -1) {
|
||||||
|
newMap.put(key, label);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
results.values = newMap;
|
||||||
|
results.count = newMap.size();
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void publishResults(CharSequence constraint, FilterResults results) {
|
||||||
|
mCurrentFilterMap = (Map<String, String>) results.values;
|
||||||
|
reverseGenerateList();
|
||||||
|
if (results.count > 0) {
|
||||||
|
notifyDataSetChanged();
|
||||||
|
} else {
|
||||||
|
notifyDataSetInvalidated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1481,6 +1591,7 @@ public class ManageApplications extends ListActivity implements
|
|||||||
lv.setSaveEnabled(true);
|
lv.setSaveEnabled(true);
|
||||||
lv.setItemsCanFocus(true);
|
lv.setItemsCanFocus(true);
|
||||||
lv.setOnItemClickListener(this);
|
lv.setOnItemClickListener(this);
|
||||||
|
lv.setTextFilterEnabled(true);
|
||||||
mListView = lv;
|
mListView = lv;
|
||||||
if (DEBUG_TIME) {
|
if (DEBUG_TIME) {
|
||||||
Log.i(TAG, "Total time in Activity.create:: " +
|
Log.i(TAG, "Total time in Activity.create:: " +
|
||||||
|
Reference in New Issue
Block a user