Added rule sort options

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

@ -53,10 +53,14 @@ import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.text.Collator;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import javax.mail.MessagingException;
@ -70,6 +74,7 @@ public class AdapterRule extends RecyclerView.Adapter<AdapterRule.ViewHolder> {
private NumberFormat NF = NumberFormat.getNumberInstance();
private int protocol = -1;
private String sort;
private String search = null;
private List<TupleRuleEx> all = 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;
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;
@ -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) {
Log.i("Rules query=" + query);
search = query;
set(protocol, all);
set(protocol, sort, all);
}
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" +
" JOIN folder ON folder.id = rule.folder" +
" JOIN account ON account.id = folder.account" +
" WHERE rule.folder = :folder" +
" ORDER BY `order`, name COLLATE NOCASE")
" WHERE rule.folder = :folder")
LiveData<List<TupleRuleEx>> liveRules(long folder);
@Query("SELECT COUNT(*) FROM rule")

@ -173,14 +173,18 @@ public class FragmentRules extends FragmentBase {
searching = savedInstanceState.getString("fair: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>>() {
@Override
public void onChanged(List<TupleRuleEx> rules) {
if (rules == null)
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);
grpReady.setVisibility(View.VISIBLE);
@ -270,13 +274,35 @@ public class FragmentRules extends FragmentBase {
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);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
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();
return true;
} else if (itemId == R.id.menu_import) {
@ -289,6 +315,13 @@ public class FragmentRules extends FragmentBase {
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() {
final Context context = getContext();
if (!ActivityBilling.isPro(context)) {

@ -8,6 +8,26 @@
app:actionViewClass="androidx.appcompat.widget.SearchView"
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">
<item
android:id="@+id/menu_export"

@ -1753,6 +1753,10 @@
<string name="title_sort_on_hidden">Hidden</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_seen">Read</string>
<string name="title_filter_unflagged">Unstarred</string>

Loading…
Cancel
Save