Added rule sort options

pull/212/head
M66B 3 years ago
parent 14627ab57e
commit dec6931f9b

@ -53,10 +53,14 @@ import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.io.IOException; import java.io.IOException;
import java.text.Collator;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Locale;
import javax.mail.MessagingException; import javax.mail.MessagingException;
@ -70,6 +74,7 @@ public class AdapterRule extends RecyclerView.Adapter<AdapterRule.ViewHolder> {
private NumberFormat NF = NumberFormat.getNumberInstance(); private NumberFormat NF = NumberFormat.getNumberInstance();
private int protocol = -1; private int protocol = -1;
private String sort;
private String search = null; private String search = null;
private List<TupleRuleEx> all = new ArrayList<>(); private List<TupleRuleEx> all = new ArrayList<>();
private List<TupleRuleEx> selected = new ArrayList<>(); private List<TupleRuleEx> selected = new ArrayList<>();
@ -574,9 +579,37 @@ public class AdapterRule extends RecyclerView.Adapter<AdapterRule.ViewHolder> {
}); });
} }
public void set(int protocol, @NonNull List<TupleRuleEx> rules) { public void set(int protocol, String sort, @NonNull List<TupleRuleEx> rules) {
this.protocol = protocol; this.protocol = protocol;
Log.i("Set protocol=" + protocol + " rules=" + rules.size() + " search=" + search); this.sort = sort;
Log.i("Set protocol=" + protocol + " rules=" + rules.size() + " sort=" + sort + " search=" + search);
final Collator collator = Collator.getInstance(Locale.getDefault());
collator.setStrength(Collator.SECONDARY); // Case insensitive, process accents etc
Collections.sort(rules, new Comparator<TupleRuleEx>() {
@Override
public int compare(TupleRuleEx r1, TupleRuleEx r2) {
int order;
if ("last_applied".equals(sort))
order = -Long.compare(
r1.last_applied == null ? 0 : r1.last_applied,
r2.last_applied == null ? 0 : r2.last_applied);
else if ("applied".equals(sort)) {
order = -Integer.compare(
r1.applied == null ? 0 : r1.applied,
r2.applied == null ? 0 : r2.applied);
} else
order = Integer.compare(r1.order, r2.order);
if (order == 0)
return collator.compare(
r1.name == null ? "" : r1.name,
r2.name == null ? "" : r2.name);
else
return order;
}
});
all = rules; all = rules;
@ -624,10 +657,16 @@ public class AdapterRule extends RecyclerView.Adapter<AdapterRule.ViewHolder> {
} }
} }
public void setSort(String sort) {
this.sort = sort;
set(protocol, sort, all);
notifyDataSetChanged();
}
public void search(String query) { public void search(String query) {
Log.i("Rules query=" + query); Log.i("Rules query=" + query);
search = query; search = query;
set(protocol, all); set(protocol, sort, all);
} }
private static class DiffCallback extends DiffUtil.Callback { private static class DiffCallback extends DiffUtil.Callback {

@ -53,8 +53,7 @@ public interface DaoRule {
@Query("SELECT rule.*, folder.account, folder.name AS folderName, account.name AS accountName FROM rule" + @Query("SELECT rule.*, folder.account, folder.name AS folderName, account.name AS accountName FROM rule" +
" JOIN folder ON folder.id = rule.folder" + " JOIN folder ON folder.id = rule.folder" +
" JOIN account ON account.id = folder.account" + " JOIN account ON account.id = folder.account" +
" WHERE rule.folder = :folder" + " WHERE rule.folder = :folder")
" ORDER BY `order`, name COLLATE NOCASE")
LiveData<List<TupleRuleEx>> liveRules(long folder); LiveData<List<TupleRuleEx>> liveRules(long folder);
@Query("SELECT COUNT(*) FROM rule") @Query("SELECT COUNT(*) FROM rule")

@ -173,14 +173,18 @@ public class FragmentRules extends FragmentBase {
searching = savedInstanceState.getString("fair:searching"); searching = savedInstanceState.getString("fair:searching");
adapter.search(searching); adapter.search(searching);
DB db = DB.getInstance(getContext()); final Context context = getContext();
DB db = DB.getInstance(context);
db.rule().liveRules(folder).observe(getViewLifecycleOwner(), new Observer<List<TupleRuleEx>>() { db.rule().liveRules(folder).observe(getViewLifecycleOwner(), new Observer<List<TupleRuleEx>>() {
@Override @Override
public void onChanged(List<TupleRuleEx> rules) { public void onChanged(List<TupleRuleEx> rules) {
if (rules == null) if (rules == null)
rules = new ArrayList<>(); rules = new ArrayList<>();
adapter.set(protocol, rules); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
String sort = prefs.getString("rule_sort", "order");
adapter.set(protocol, sort, rules);
pbWait.setVisibility(View.GONE); pbWait.setVisibility(View.GONE);
grpReady.setVisibility(View.VISIBLE); grpReady.setVisibility(View.VISIBLE);
@ -270,13 +274,35 @@ public class FragmentRules extends FragmentBase {
MenuCompat.setGroupDividerEnabled(menu, true); MenuCompat.setGroupDividerEnabled(menu, true);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
String sort = prefs.getString("rule_sort", "order");
if ("last_applied".equals(sort))
menu.findItem(R.id.menu_sort_on_last_applied).setChecked(true);
else if ("applied".equals(sort))
menu.findItem(R.id.menu_sort_on_applied).setChecked(true);
else
menu.findItem(R.id.menu_sort_on_order).setChecked(true);
super.onCreateOptionsMenu(menu, inflater); super.onCreateOptionsMenu(menu, inflater);
} }
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId(); int itemId = item.getItemId();
if (itemId == R.id.menu_export) { if (itemId == R.id.menu_sort_on_order) {
item.setChecked(true);
onMenuSort("order");
return true;
} else if (itemId == R.id.menu_sort_on_applied) {
item.setChecked(true);
onMenuSort("applied");
return true;
} else if (itemId == R.id.menu_sort_on_last_applied) {
item.setChecked(true);
onMenuSort("last_applied");
return true;
} else if (itemId == R.id.menu_export) {
onMenuExport(); onMenuExport();
return true; return true;
} else if (itemId == R.id.menu_import) { } else if (itemId == R.id.menu_import) {
@ -289,6 +315,13 @@ public class FragmentRules extends FragmentBase {
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
private void onMenuSort(String sort) {
final Context context = getContext();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.edit().putString("rule_sort", sort).apply();
adapter.setSort(sort);
}
private void onMenuExport() { private void onMenuExport() {
final Context context = getContext(); final Context context = getContext();
if (!ActivityBilling.isPro(context)) { if (!ActivityBilling.isPro(context)) {

@ -8,6 +8,26 @@
app:actionViewClass="androidx.appcompat.widget.SearchView" app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="collapseActionView|always" /> app:showAsAction="collapseActionView|always" />
<item
android:id="@+id/menu_sort_on"
android:icon="@drawable/twotone_sort_24"
android:title="@string/title_sort_on"
app:showAsAction="ifRoom">
<menu>
<group android:checkableBehavior="single">
<item
android:id="@+id/menu_sort_on_order"
android:title="@string/title_sort_on_order" />
<item
android:id="@+id/menu_sort_on_applied"
android:title="@string/title_sort_on_applied" />
<item
android:id="@+id/menu_sort_on_last_applied"
android:title="@string/title_sort_on_last_applied" />
</group>
</menu>
</item>
<group android:id="@+id/group_backup"> <group android:id="@+id/group_backup">
<item <item
android:id="@+id/menu_export" android:id="@+id/menu_export"

@ -1753,6 +1753,10 @@
<string name="title_sort_on_hidden">Hidden</string> <string name="title_sort_on_hidden">Hidden</string>
<string name="title_sort_ascending">Oldest first</string> <string name="title_sort_ascending">Oldest first</string>
<string name="title_sort_on_order">Order</string>
<string name="title_sort_on_applied">Applied count</string>
<string name="title_sort_on_last_applied">Last applied</string>
<string name="title_filter">Filter out</string> <string name="title_filter">Filter out</string>
<string name="title_filter_seen">Read</string> <string name="title_filter_seen">Read</string>
<string name="title_filter_unflagged">Unstarred</string> <string name="title_filter_unflagged">Unstarred</string>

Loading…
Cancel
Save