Add filter functionality to the app blacklist activity

master
Daniele Gobbetti 2017-04-09 00:21:43 +02:00
parent bb98910e1c
commit a77ff03ca5
6 changed files with 90 additions and 5 deletions

View File

@ -5,6 +5,7 @@
* Changed colours: deep sleep is now dark blue, light sleep is now light blue
* Support for exporting and importing of preferences in addition to the database
* Visual improvements of the pie charts
* Add filter by name in the App blacklist activity
* Pebble: improve compatibility with watch app configuration pages
* HPlus: users can now decide whether they want to pair the device or not, hopefully fixing some connection problems (#642)
* HPlus: display battery state and warn on low battery

View File

@ -27,6 +27,7 @@ import android.support.v4.app.NavUtils;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.view.MenuItem;
import org.slf4j.Logger;
@ -67,6 +68,22 @@ public class AppBlacklistActivity extends GBActivity {
appListView.setAdapter(appBlacklistAdapter);
SearchView searchView = (SearchView) findViewById(R.id.appListViewSearch);
searchView.setIconifiedByDefault(false);
searchView.setIconified(false);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
appBlacklistAdapter.getFilter().filter(newText);
return true;
}
});
IntentFilter filter = new IntentFilter();
filter.addAction(GBApplication.ACTION_QUIT);
LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, filter);

View File

@ -8,9 +8,12 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.IdentityHashMap;
@ -19,14 +22,15 @@ import java.util.List;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
public class AppBlacklistAdapter extends RecyclerView.Adapter<AppBlacklistAdapter.AppBLViewHolder> {
public class AppBlacklistAdapter extends RecyclerView.Adapter<AppBlacklistAdapter.AppBLViewHolder> implements Filterable {
private final List<ApplicationInfo> applicationInfoList;
private List<ApplicationInfo> applicationInfoList;
private final int mLayoutId;
private final Context mContext;
private final PackageManager mPm;
private final IdentityHashMap<ApplicationInfo, String> mNameMap;
private ApplicationFilter applicationFilter;
public AppBlacklistAdapter(int layoutId, Context context) {
mLayoutId = layoutId;
@ -96,6 +100,13 @@ public class AppBlacklistAdapter extends RecyclerView.Adapter<AppBlacklistAdapte
return applicationInfoList.size();
}
@Override
public Filter getFilter() {
if (applicationFilter == null)
applicationFilter = new ApplicationFilter(this, applicationInfoList);
return applicationFilter;
}
public class AppBLViewHolder extends RecyclerView.ViewHolder {
final CheckBox checkbox;
@ -114,4 +125,49 @@ public class AppBlacklistAdapter extends RecyclerView.Adapter<AppBlacklistAdapte
}
private class ApplicationFilter extends Filter {
private final AppBlacklistAdapter adapter;
private final List<ApplicationInfo> originalList;
private final List<ApplicationInfo> filteredList;
private ApplicationFilter(AppBlacklistAdapter adapter, List<ApplicationInfo> originalList) {
super();
this.originalList = new ArrayList<>(originalList);
this.filteredList = new ArrayList<>();
this.adapter = adapter;
}
@Override
protected Filter.FilterResults performFiltering(CharSequence filter) {
filteredList.clear();
final Filter.FilterResults results = new Filter.FilterResults();
if (filter == null || filter.length() == 0)
filteredList.addAll(originalList);
else {
final String filterPattern = filter.toString().toLowerCase().trim();
for (ApplicationInfo ai : originalList) {
CharSequence name = mPm.getApplicationLabel(ai);
if (((String) name).contains(filterPattern) ||
(ai.packageName.contains(filterPattern))) {
filteredList.add(ai);
}
}
}
results.values = filteredList;
results.count = filteredList.size();
return results;
}
@Override
protected void publishResults(CharSequence charSequence, Filter.FilterResults filterResults) {
adapter.applicationInfoList.clear();
adapter.applicationInfoList.addAll((List<ApplicationInfo>) filterResults.values);
adapter.notifyDataSetChanged();
}
}
}

View File

@ -4,11 +4,21 @@
android:layout_height="match_parent"
tools:context="nodomain.freeyourgadget.gadgetbridge.activities.AppBlacklistActivity">
<android.support.v7.widget.SearchView
android:id="@+id/appListViewSearch"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:paddingEnd="16dp"
android:paddingStart="16dp">
</android.support.v7.widget.SearchView>
<android.support.v7.widget.RecyclerView
android:id="@+id/appListView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_below="@id/appListViewSearch"
android:layout_centerHorizontal="true"
android:divider="@null" />

View File

@ -47,10 +47,10 @@
<TextView
android:id="@+id/item_details"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Item Description" />
android:text="Item Description"
android:textAppearance="@style/TextAppearance.AppCompat.Small" />
</LinearLayout>
</RelativeLayout>

View File

@ -5,6 +5,7 @@
<change>Changed colours: deep sleep is now dark blue, light sleep is now light blue</change>
<change>Support for exporting and importing of preferences in addition to the database</change>
<change>Visual improvements of the pie charts</change>
<change>Add filter by name in the App blacklist activity</change>
<change>Pebble: improve compatibility with watch app configuration pages</change>
<change>HPlus: users can now decide whether they want to pair the device or not, hopefully fixing some connection problems (#642)</change>
<change>HPlus: display battery state and warn on low battery</change>