mirror of
https://github.com/moparisthebest/k-9
synced 2024-08-13 17:03:48 -04:00
12d1097a24
approximating AOSP coding standards.
124 lines
3.6 KiB
Java
124 lines
3.6 KiB
Java
package com.fsck.k9.activity;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import android.util.Log;
|
|
import android.widget.ArrayAdapter;
|
|
import android.widget.Filter;
|
|
|
|
import com.fsck.k9.K9;
|
|
|
|
/**
|
|
* Filter to search for occurences of the search-expression in any place of the
|
|
* folder-name instead of doing jsut a prefix-search.
|
|
*
|
|
* @author Marcus@Wolschon.biz
|
|
*/
|
|
public class FolderListFilter<T> extends Filter {
|
|
/**
|
|
* ArrayAdapter that contains the list of folders displayed in the
|
|
* ListView.
|
|
* This object is modified by {@link #publishResults} to reflect the
|
|
* changes due to the filtering performed by {@link #performFiltering}.
|
|
* This in turn will change the folders displayed in the ListView.
|
|
*/
|
|
private ArrayAdapter<T> mFolders;
|
|
|
|
/**
|
|
* All folders.
|
|
*/
|
|
private ArrayList<T> mOriginalValues = null;
|
|
|
|
/**
|
|
* Create a filter for a list of folders.
|
|
*
|
|
* @param folderNames
|
|
*/
|
|
public FolderListFilter(final ArrayAdapter<T> folderNames) {
|
|
this.mFolders = folderNames;
|
|
}
|
|
|
|
/**
|
|
* Do the actual search.
|
|
* {@inheritDoc}
|
|
*
|
|
* @see #publishResults(CharSequence, FilterResults)
|
|
*/
|
|
@Override
|
|
protected FilterResults performFiltering(CharSequence searchTerm) {
|
|
FilterResults results = new FilterResults();
|
|
|
|
// Copy the values from mFolders to mOriginalValues if this is the
|
|
// first time this method is called.
|
|
if (mOriginalValues == null) {
|
|
int count = mFolders.getCount();
|
|
mOriginalValues = new ArrayList<T>(count);
|
|
for (int i = 0; i < count; i++) {
|
|
mOriginalValues.add(mFolders.getItem(i));
|
|
}
|
|
}
|
|
|
|
if ((searchTerm == null) || (searchTerm.length() == 0)) {
|
|
ArrayList<T> list = new ArrayList<T>(mOriginalValues);
|
|
results.values = list;
|
|
results.count = list.size();
|
|
} else {
|
|
final String searchTermString = searchTerm.toString().toLowerCase();
|
|
final String[] words = searchTermString.split(" ");
|
|
final int wordCount = words.length;
|
|
|
|
final ArrayList<T> values = mOriginalValues;
|
|
|
|
final ArrayList<T> newValues = new ArrayList<T>();
|
|
|
|
for (final T value : values) {
|
|
final String valueText = value.toString().toLowerCase();
|
|
|
|
for (int k = 0; k < wordCount; k++) {
|
|
if (valueText.contains(words[k])) {
|
|
newValues.add(value);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
results.values = newValues;
|
|
results.count = newValues.size();
|
|
}
|
|
|
|
return results;
|
|
}
|
|
|
|
/**
|
|
* Publish the results to the user-interface.
|
|
* {@inheritDoc}
|
|
*/
|
|
@SuppressWarnings("unchecked")
|
|
@Override
|
|
protected void publishResults(CharSequence constraint, FilterResults results) {
|
|
// Don't notify for every change
|
|
mFolders.setNotifyOnChange(false);
|
|
|
|
//noinspection unchecked
|
|
final List<T> folders = (List<T>) results.values;
|
|
mFolders.clear();
|
|
if (folders != null) {
|
|
for (T folder : folders) {
|
|
if (folder != null) {
|
|
mFolders.add(folder);
|
|
}
|
|
}
|
|
} else {
|
|
Log.w(K9.LOG_TAG, "FolderListFilter.publishResults - null search-result ");
|
|
}
|
|
|
|
// Send notification that the data set changed now
|
|
mFolders.notifyDataSetChanged();
|
|
}
|
|
|
|
public void invalidate() {
|
|
mOriginalValues = null;
|
|
}
|
|
}
|