Added answer sorting options

pull/212/head
M66B 3 years ago
parent 24146fd0ab
commit 68aecc45d7

@ -48,10 +48,14 @@ import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListUpdateCallback; import androidx.recyclerview.widget.ListUpdateCallback;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
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;
public class AdapterAnswer extends RecyclerView.Adapter<AdapterAnswer.ViewHolder> { public class AdapterAnswer extends RecyclerView.Adapter<AdapterAnswer.ViewHolder> {
private Fragment parentFragment; private Fragment parentFragment;
@ -63,6 +67,7 @@ public class AdapterAnswer extends RecyclerView.Adapter<AdapterAnswer.ViewHolder
private DateFormat DF; private DateFormat DF;
private NumberFormat NF = NumberFormat.getNumberInstance(); private NumberFormat NF = NumberFormat.getNumberInstance();
private String sort = null;
private String search = null; private String search = null;
private List<EntityAnswer> all = new ArrayList<>(); private List<EntityAnswer> all = new ArrayList<>();
private List<EntityAnswer> selected = new ArrayList<>(); private List<EntityAnswer> selected = new ArrayList<>();
@ -313,8 +318,39 @@ public class AdapterAnswer extends RecyclerView.Adapter<AdapterAnswer.ViewHolder
}.execute(context, owner, new Bundle(), "answer:composable"); }.execute(context, owner, new Bundle(), "answer:composable");
} }
public void set(@NonNull List<EntityAnswer> answers) { public void set(String sort, @NonNull List<EntityAnswer> answers) {
Log.i("Set answers=" + answers.size() + " search=" + search); this.sort = sort;
Log.i("Set answers=" + answers.size() + " sort=" + sort + " search=" + search);
final Collator collator = Collator.getInstance(Locale.getDefault());
collator.setStrength(Collator.SECONDARY); // Case insensitive, process accents etc
Collections.sort(answers, new Comparator<EntityAnswer>() {
@Override
public int compare(EntityAnswer a1, EntityAnswer a2) {
int order;
if ("last_applied".equals(sort))
order = -Long.compare(
a1.last_applied == null ? 0 : a1.last_applied,
a2.last_applied == null ? 0 : a2.last_applied);
else if ("applied".equals(sort)) {
order = -Integer.compare(
a1.applied == null ? 0 : a1.applied,
a2.applied == null ? 0 : a2.applied);
} else {
order = collator.compare(a1.group == null ? "" : a1.group, a2.group == null ? "" : a2.group);
if (order == 0)
order = -Boolean.compare(a1.favorite, a2.favorite);
}
if (order == 0)
return collator.compare(
a1.name == null ? "" : a1.name,
a2.name == null ? "" : a2.name);
else
return order;
}
});
all = answers; all = answers;
@ -365,10 +401,16 @@ public class AdapterAnswer extends RecyclerView.Adapter<AdapterAnswer.ViewHolder
} }
} }
public void setSort(String sort) {
this.sort = sort;
set(sort, all);
notifyDataSetChanged();
}
public void search(String query) { public void search(String query) {
Log.i("Answers query=" + query); Log.i("Answers query=" + query);
search = query; search = query;
set(all); set(sort, all);
} }
private static class DiffCallback extends DiffUtil.Callback { private static class DiffCallback extends DiffUtil.Callback {

@ -66,8 +66,7 @@ public interface DaoAnswer {
" WHERE receipt AND NOT hide") " WHERE receipt AND NOT hide")
EntityAnswer getReceiptAnswer(); EntityAnswer getReceiptAnswer();
@Query("SELECT * FROM answer" + @Query("SELECT * FROM answer")
" ORDER BY `group`, -favorite, name COLLATE NOCASE")
LiveData<List<EntityAnswer>> liveAnswers(); LiveData<List<EntityAnswer>> liveAnswers();
@Query("SELECT COUNT(*) FROM answer" + @Query("SELECT COUNT(*) FROM answer" +

@ -106,6 +106,8 @@ public class FragmentAnswers extends FragmentBase {
rvAnswer.addItemDecoration(itemDecorator); rvAnswer.addItemDecoration(itemDecorator);
} }
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
DividerItemDecoration categoryDecorator = new DividerItemDecoration(getContext(), llm.getOrientation()) { DividerItemDecoration categoryDecorator = new DividerItemDecoration(getContext(), llm.getOrientation()) {
@Override @Override
public void onDraw(@NonNull Canvas canvas, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { public void onDraw(@NonNull Canvas canvas, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
@ -141,6 +143,10 @@ public class FragmentAnswers extends FragmentBase {
if (!getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) if (!getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
return null; return null;
String sort = prefs.getString("answer_sort", "name");
if ("last_applied".equals(sort) || "applied".equals(sort))
return null;
EntityAnswer prev = adapter.getItemAtPosition(pos - 1); EntityAnswer prev = adapter.getItemAtPosition(pos - 1);
EntityAnswer account = adapter.getItemAtPosition(pos); EntityAnswer account = adapter.getItemAtPosition(pos);
if (pos > 0 && prev == null) if (pos > 0 && prev == null)
@ -212,14 +218,18 @@ public class FragmentAnswers 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.answer().liveAnswers().observe(getViewLifecycleOwner(), new Observer<List<EntityAnswer>>() { db.answer().liveAnswers().observe(getViewLifecycleOwner(), new Observer<List<EntityAnswer>>() {
@Override @Override
public void onChanged(List<EntityAnswer> answers) { public void onChanged(List<EntityAnswer> answers) {
if (answers == null) if (answers == null)
answers = new ArrayList<>(); answers = new ArrayList<>();
adapter.set(answers); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
String sort = prefs.getString("answer_sort", "name");
adapter.set(sort, answers);
pbWait.setVisibility(View.GONE); pbWait.setVisibility(View.GONE);
grpReady.setVisibility(View.VISIBLE); grpReady.setVisibility(View.VISIBLE);
@ -279,6 +289,16 @@ public class FragmentAnswers extends FragmentBase {
} }
}); });
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
String sort = prefs.getString("answer_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_name).setChecked(true);
Menu smenu = menu.findItem(R.id.menu_placeholders).getSubMenu(); Menu smenu = menu.findItem(R.id.menu_placeholders).getSubMenu();
List<String> names = EntityAnswer.getCustomPlaceholders(getContext()); List<String> names = EntityAnswer.getCustomPlaceholders(getContext());
@ -291,19 +311,38 @@ public class FragmentAnswers extends FragmentBase {
@Override @Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) { public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getGroupId() == Menu.FIRST) { if (item.getGroupId() == Menu.FIRST) {
onDefine(item.getTitle().toString()); onMenuDefine(item.getTitle().toString());
return true; return true;
} else { } else {
int id = item.getItemId(); int itemId = item.getItemId();
if (id == R.id.menu_define) { if (itemId == R.id.menu_sort_on_name) {
onDefine(null); item.setChecked(true);
onMenuSort("name");
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_define) {
onMenuDefine(null);
return true; return true;
} else } else
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
} }
private void onDefine(String name) { private void onMenuSort(String sort) {
final Context context = getContext();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.edit().putString("answer_sort", sort).apply();
adapter.setSort(sort);
}
private void onMenuDefine(String name) {
final Context context = getContext(); final Context context = getContext();
View view = LayoutInflater.from(context).inflate(R.layout.dialog_placeholder, null); View view = LayoutInflater.from(context).inflate(R.layout.dialog_placeholder, null);
final EditText etName = view.findViewById(R.id.etName); final EditText etName = view.findViewById(R.id.etName);

@ -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_name"
android:title="@string/title_sort_on_name" />
<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>
<item <item
android:id="@+id/menu_placeholders" android:id="@+id/menu_placeholders"
android:title="@string/title_answer_placeholder"> android:title="@string/title_answer_placeholder">

@ -1766,6 +1766,7 @@
<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_name">Name</string>
<string name="title_sort_on_order">Order</string> <string name="title_sort_on_order">Order</string>
<string name="title_sort_on_applied">Applied count</string> <string name="title_sort_on_applied">Applied count</string>
<string name="title_sort_on_last_applied">Last applied</string> <string name="title_sort_on_last_applied">Last applied</string>

Loading…
Cancel
Save