From 00c26939d5d7f0599267a68cfc991ff3a718e1eb Mon Sep 17 00:00:00 2001 From: TBog Date: Mon, 12 Dec 2022 23:23:30 +0200 Subject: [PATCH] Add sort order to tag entry --- .../dataprovider/CalculatorProvider.java | 3 +- .../dataprovider/ContactsProvider.java | 3 +- .../tblauncher/dataprovider/DialProvider.java | 3 +- .../dataprovider/EntryToResultUtils.java | 3 +- .../dataprovider/SearchProvider.java | 2 +- .../tblauncher/dataprovider/TagsProvider.java | 14 +- .../tbog/tblauncher/entry/StaticEntry.java | 25 ++-- .../tbog/tblauncher/entry/TagSortEntry.java | 130 ++++++++++++++++++ .../tbog/tblauncher/handler/DataHandler.java | 8 +- .../tbog/tblauncher/searcher/ISearcher.java | 4 +- .../tblauncher/searcher/QuerySearcher.java | 3 +- .../tblauncher/searcher/ResultBuffer.java | 2 +- .../tbog/tblauncher/searcher/Searcher.java | 7 +- .../searcher/SortedTagSearcher.java | 103 ++++++++++++++ .../tbog/tblauncher/searcher/TagList.java | 3 +- .../tbog/tblauncher/searcher/TagSearcher.java | 3 +- app/src/main/res/values/strings.xml | 8 ++ 17 files changed, 294 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/rocks/tbog/tblauncher/entry/TagSortEntry.java create mode 100644 app/src/main/java/rocks/tbog/tblauncher/searcher/SortedTagSearcher.java diff --git a/app/src/main/java/rocks/tbog/tblauncher/dataprovider/CalculatorProvider.java b/app/src/main/java/rocks/tbog/tblauncher/dataprovider/CalculatorProvider.java index 6cab8367b..07697a602 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/dataprovider/CalculatorProvider.java +++ b/app/src/main/java/rocks/tbog/tblauncher/dataprovider/CalculatorProvider.java @@ -3,6 +3,7 @@ import java.math.BigDecimal; import java.text.NumberFormat; import java.util.ArrayDeque; +import java.util.Collections; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -72,7 +73,7 @@ public void requestResults(String query, ISearcher searcher) { pojo.setRelevance(pojo.normalizedName, null); pojo.boostRelevance(19); - searcher.addResult(pojo); + searcher.addResult(Collections.singletonList(pojo)); } } } diff --git a/app/src/main/java/rocks/tbog/tblauncher/dataprovider/ContactsProvider.java b/app/src/main/java/rocks/tbog/tblauncher/dataprovider/ContactsProvider.java index e53846394..5bf6cf85a 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/dataprovider/ContactsProvider.java +++ b/app/src/main/java/rocks/tbog/tblauncher/dataprovider/ContactsProvider.java @@ -9,6 +9,7 @@ import androidx.preference.PreferenceManager; import java.util.Collection; +import java.util.Collections; import rocks.tbog.tblauncher.Permission; import rocks.tbog.tblauncher.entry.ContactEntry; @@ -108,7 +109,7 @@ public static void checkResults(Collection entries, FuzzyScore fuz boost += 40; } entry.boostRelevance(boost); - if (!searcher.addResult(entry)) + if (!searcher.addResult(Collections.singletonList(entry))) return; } } diff --git a/app/src/main/java/rocks/tbog/tblauncher/dataprovider/DialProvider.java b/app/src/main/java/rocks/tbog/tblauncher/dataprovider/DialProvider.java index 3709941fd..aa665a09d 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/dataprovider/DialProvider.java +++ b/app/src/main/java/rocks/tbog/tblauncher/dataprovider/DialProvider.java @@ -2,6 +2,7 @@ import androidx.annotation.NonNull; +import java.util.Collections; import java.util.regex.Pattern; import rocks.tbog.tblauncher.entry.ContactEntry; @@ -36,7 +37,7 @@ public DialContactEntry findById(@NonNull String id) { public void requestResults(String query, ISearcher searcher) { // Append an item only if query looks like a phone number and device has phone capabilities if (phonePattern.matcher(query).find()) { - searcher.addResult(getResult(query)); + searcher.addResult(Collections.singletonList(getResult(query))); } } diff --git a/app/src/main/java/rocks/tbog/tblauncher/dataprovider/EntryToResultUtils.java b/app/src/main/java/rocks/tbog/tblauncher/dataprovider/EntryToResultUtils.java index 63ac07aa2..0d09b9bda 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/dataprovider/EntryToResultUtils.java +++ b/app/src/main/java/rocks/tbog/tblauncher/dataprovider/EntryToResultUtils.java @@ -5,6 +5,7 @@ import androidx.annotation.WorkerThread; import java.util.Collection; +import java.util.Collections; import rocks.tbog.tblauncher.entry.EntryItem; import rocks.tbog.tblauncher.entry.EntryWithTags; @@ -74,7 +75,7 @@ public static void tagsCheckResults(Collection entries, entry.addResultMatch(matchedText, matchedInfo); - if (matchedInfo.match && !searcher.addResult(entry)) { + if (matchedInfo.match && !searcher.addResult(Collections.singletonList(entry))) { return; } } diff --git a/app/src/main/java/rocks/tbog/tblauncher/dataprovider/SearchProvider.java b/app/src/main/java/rocks/tbog/tblauncher/dataprovider/SearchProvider.java index 63f1ea269..bb1d78cfb 100755 --- a/app/src/main/java/rocks/tbog/tblauncher/dataprovider/SearchProvider.java +++ b/app/src/main/java/rocks/tbog/tblauncher/dataprovider/SearchProvider.java @@ -117,7 +117,7 @@ public SearchEntry findById(@NonNull String id) { @Override public void requestResults(String query, ISearcher searcher) { - searcher.addResult(getResults(query).toArray(new SearchEntry[0])); + searcher.addResult(getResults(query)); } @NonNull diff --git a/app/src/main/java/rocks/tbog/tblauncher/dataprovider/TagsProvider.java b/app/src/main/java/rocks/tbog/tblauncher/dataprovider/TagsProvider.java index db40cf43c..78e27a2aa 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/dataprovider/TagsProvider.java +++ b/app/src/main/java/rocks/tbog/tblauncher/dataprovider/TagsProvider.java @@ -9,6 +9,7 @@ import java.util.List; import rocks.tbog.tblauncher.db.ModRecord; +import rocks.tbog.tblauncher.entry.TagSortEntry; import rocks.tbog.tblauncher.entry.TagEntry; import rocks.tbog.tblauncher.handler.DataHandler; @@ -25,13 +26,20 @@ protected DBLoader newLoadTask() { @Nullable public static TagEntry newTagEntryCheckId(String id) { + TagEntry tagEntry = null; + // first check if this is a TagAction + if (TagSortEntry.isTagSort(id)) { + tagEntry = new TagSortEntry(id); + // set default name (based on id) + tagEntry.setName(null); + } + // now check if it's a tag if (id.startsWith(TagEntry.SCHEME)) { - TagEntry tagEntry = new TagEntry(id); + tagEntry = new TagEntry(id); String tagName = id.substring(TagEntry.SCHEME.length()); tagEntry.setName(tagName); - return tagEntry; } - return null; + return tagEntry; } @NonNull diff --git a/app/src/main/java/rocks/tbog/tblauncher/entry/StaticEntry.java b/app/src/main/java/rocks/tbog/tblauncher/entry/StaticEntry.java index f4eec38e7..0f8440219 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/entry/StaticEntry.java +++ b/app/src/main/java/rocks/tbog/tblauncher/entry/StaticEntry.java @@ -52,27 +52,32 @@ public String getIconCacheId() { @Override protected ListPopup buildPopupMenu(Context context, LinearAdapter adapter, View parentView, int flags) { - List categoryTitle = PrefCache.getResultPopupOrder(context); - for (ContentLoadHelper.CategoryItem categoryItem : categoryTitle) { - int titleStringId = categoryItem.textId; - if (titleStringId == R.string.popup_title_customize) { - adapter.add(new LinearAdapter.ItemTitle(context, R.string.popup_title_customize)); - adapter.add(new LinearAdapter.Item(context, R.string.menu_action_rename)); - adapter.add(new LinearAdapter.Item(context, R.string.menu_custom_icon)); - } + int pos = adapter.getCount(); + buildPopupMenuCategory(context, adapter, categoryItem.textId); + if (pos != adapter.getCount()) + adapter.add(pos, new LinearAdapter.ItemTitle(context, categoryItem.textId)); } if (Utilities.checkFlag(flags, LAUNCHED_FROM_QUICK_LIST)) { adapter.add(new LinearAdapter.ItemTitle(context, R.string.menu_popup_title_settings)); - adapter.add(new LinearAdapter.Item(context, R.string.menu_quick_list_remove)); - adapter.add(new LinearAdapter.Item(context, R.string.menu_popup_quick_list_customize)); + buildPopupMenuCategory(context, adapter, R.string.menu_popup_title_settings); } return inflatePopupMenu(context, adapter); } + protected void buildPopupMenuCategory(Context context, @NonNull LinearAdapter adapter, int titleStringId) { + if (titleStringId == R.string.popup_title_customize) { + adapter.add(new LinearAdapter.Item(context, R.string.menu_action_rename)); + adapter.add(new LinearAdapter.Item(context, R.string.menu_custom_icon)); + } else if (titleStringId == R.string.menu_popup_title_settings) { + adapter.add(new LinearAdapter.Item(context, R.string.menu_quick_list_remove)); + adapter.add(new LinearAdapter.Item(context, R.string.menu_popup_quick_list_customize)); + } + } + @Override boolean popupMenuClickHandler(@NonNull View view, @NonNull LinearAdapter.MenuItem item, int stringId, View parentView) { Context ctx = view.getContext(); diff --git a/app/src/main/java/rocks/tbog/tblauncher/entry/TagSortEntry.java b/app/src/main/java/rocks/tbog/tblauncher/entry/TagSortEntry.java new file mode 100644 index 000000000..431e09eb1 --- /dev/null +++ b/app/src/main/java/rocks/tbog/tblauncher/entry/TagSortEntry.java @@ -0,0 +1,130 @@ +package rocks.tbog.tblauncher.entry; + +import android.content.Context; +import android.view.View; +import android.widget.Toast; + +import androidx.annotation.NonNull; + +import java.util.Collections; + +import rocks.tbog.tblauncher.BuildConfig; +import rocks.tbog.tblauncher.R; +import rocks.tbog.tblauncher.TBApplication; +import rocks.tbog.tblauncher.searcher.SortedTagSearcher; +import rocks.tbog.tblauncher.ui.LinearAdapter; + +public class TagSortEntry extends TagEntry { + public static final String SORT_AZ = "sort/byName/"; + public static final String SORT_ZA = "sort/byNameReversed/"; + public static final String HISTORY_REC = "sort/history/recency/"; + public static final String HISTORY_FREQ = "sort/history/frequency/"; + public static final String HISTORY_FREC = "sort/history/frecency/"; + public static final String HISTORY_ADAPTIVE = "sort/history/adaptive/"; + + public TagSortEntry(@NonNull String id) { + super(id); + if (BuildConfig.DEBUG) { + String action = getTagSortOrder(id); + if (action.isEmpty()) + throw new IllegalStateException("Invalid " + TagSortEntry.class.getSimpleName() + " id `" + id + "`"); + } + } + + @Override + public void setName(String name) { + if (name == null) { + // find the default name from the id + String action = getTagSortOrder(id); + super.setName(id.substring(SCHEME.length() + action.length())); + } + super.setName(name); + } + + @Override + public void doLaunch(@NonNull View v, int flags) { + if (TBApplication.activityInvalid(v)) + return; + Context ctx = v.getContext(); + TBApplication.quickList(ctx).toggleSearch(v, id, SortedTagSearcher.class); + } + + @Override + protected void buildPopupMenuCategory(Context context, @NonNull LinearAdapter adapter, int titleStringId) { + if (titleStringId == R.string.popup_title_hist_fav) { + adapter.add(new LinearAdapter.Item(context, R.string.menu_tag_sort_az)); + adapter.add(new LinearAdapter.Item(context, R.string.menu_tag_sort_za)); + adapter.add(new LinearAdapter.Item(context, R.string.menu_tag_sort_hist_rec)); + adapter.add(new LinearAdapter.Item(context, R.string.menu_tag_sort_hist_freq)); + adapter.add(new LinearAdapter.Item(context, R.string.menu_tag_sort_hist_frec)); + adapter.add(new LinearAdapter.Item(context, R.string.menu_tag_sort_hist_adaptive)); + } + } + + @Override + boolean popupMenuClickHandler(@NonNull View view, @NonNull LinearAdapter.MenuItem item, int stringId, View parentView) { + if (stringId == R.string.menu_tag_sort_az) { + Toast.makeText(view.getContext(), "WIP: sort AZ", Toast.LENGTH_SHORT).show(); + return true; + } else if (stringId == R.string.menu_tag_sort_za) { + Toast.makeText(view.getContext(), "WIP: sort ZA", Toast.LENGTH_SHORT).show(); + return true; + }else if (stringId == R.string.menu_tag_sort_hist_rec) { + Toast.makeText(view.getContext(), "WIP: sort hist rec", Toast.LENGTH_SHORT).show(); + return true; + }else if (stringId == R.string.menu_tag_sort_hist_freq) { + Toast.makeText(view.getContext(), "WIP: sort hist freq", Toast.LENGTH_SHORT).show(); + return true; + }else if (stringId == R.string.menu_tag_sort_hist_frec) { + Toast.makeText(view.getContext(), "WIP: sort hist frec", Toast.LENGTH_SHORT).show(); + return true; + }else if (stringId == R.string.menu_tag_sort_hist_adaptive) { + Toast.makeText(view.getContext(), "WIP: sort hist adaptive", Toast.LENGTH_SHORT).show(); + return true; + } + return super.popupMenuClickHandler(view, item, stringId, parentView); + } + + @NonNull + public static String getTagSortOrder(String id) { + String idWithoutScheme = id.substring(SCHEME.length()); + if (idWithoutScheme.startsWith(SORT_AZ)) + return SORT_AZ; + if (idWithoutScheme.startsWith(SORT_ZA)) + return SORT_ZA; + if (idWithoutScheme.startsWith(HISTORY_REC)) + return HISTORY_REC; + if (idWithoutScheme.startsWith(HISTORY_FREQ)) + return HISTORY_FREQ; + if (idWithoutScheme.startsWith(HISTORY_FREC)) + return HISTORY_FREC; + if (idWithoutScheme.startsWith(HISTORY_ADAPTIVE)) + return HISTORY_ADAPTIVE; + return ""; + } + + public static boolean isTagSort(String id) { + return !getTagSortOrder(id).isEmpty(); + } + + public static class TagDetails { + public final String name; + public final String order; + + public TagDetails(@NonNull String tagSortId) { + order = getTagSortOrder(tagSortId); + name = tagSortId.substring(SCHEME.length() + order.length()); + } + + public java.util.Comparator getComparator() { + switch (order) { + case SORT_AZ: + return NAME_COMPARATOR; + case SORT_ZA: + return Collections.reverseOrder(NAME_COMPARATOR); + default: + return RELEVANCE_COMPARATOR; + } + } + } +} diff --git a/app/src/main/java/rocks/tbog/tblauncher/handler/DataHandler.java b/app/src/main/java/rocks/tbog/tblauncher/handler/DataHandler.java index 5e6180643..244846d6b 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/handler/DataHandler.java +++ b/app/src/main/java/rocks/tbog/tblauncher/handler/DataHandler.java @@ -579,7 +579,7 @@ public void requestAllRecords(Searcher searcher) { List pojos = entry.provider.getPojos(); if (pojos == null) continue; - boolean accept = searcher.addResult(pojos.toArray(new EntryItem[0])); + boolean accept = searcher.addResult(pojos); // if searcher will not accept any more results, exit if (!accept) break; @@ -608,12 +608,12 @@ public static DBHelper.HistoryMode getHistoryMode(String historyMode) { * * @param itemCount max number of items to retrieve, total number may be less (search or calls are not returned for instance) * @param historyMode Recency vs Frecency vs Frequency vs Adaptive - * @param sortHistory Sort history entries alphabetically + * @param sortByName Sort history entries alphabetically * @param itemsToExcludeById Items to exclude from history by their id * @return pojos in recent history */ public List getHistory(int itemCount, DBHelper.HistoryMode historyMode, - boolean sortHistory, Set itemsToExcludeById) { + boolean sortByName, Set itemsToExcludeById) { // Max sure that we get enough items, regardless of how many may be excluded int extendedItemCount = itemCount + itemsToExcludeById.size(); @@ -639,7 +639,7 @@ public List getHistory(int itemCount, DBHelper.HistoryMode historyMod } // sort the list if needed - if (sortHistory) + if (sortByName) Collections.sort(history, (a, b) -> a.getName().compareTo(b.getName())); // enforce item count after the sort operation diff --git a/app/src/main/java/rocks/tbog/tblauncher/searcher/ISearcher.java b/app/src/main/java/rocks/tbog/tblauncher/searcher/ISearcher.java index 10ced6713..9034a1b40 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/searcher/ISearcher.java +++ b/app/src/main/java/rocks/tbog/tblauncher/searcher/ISearcher.java @@ -2,11 +2,13 @@ import androidx.annotation.WorkerThread; +import java.util.Collection; + import rocks.tbog.tblauncher.entry.EntryItem; public interface ISearcher { @WorkerThread - boolean addResult(EntryItem... items); + boolean addResult(Collection items); boolean tagsEnabled(); } diff --git a/app/src/main/java/rocks/tbog/tblauncher/searcher/QuerySearcher.java b/app/src/main/java/rocks/tbog/tblauncher/searcher/QuerySearcher.java index 9d125f1d6..d3d0e8012 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/searcher/QuerySearcher.java +++ b/app/src/main/java/rocks/tbog/tblauncher/searcher/QuerySearcher.java @@ -5,6 +5,7 @@ import androidx.annotation.NonNull; import androidx.annotation.WorkerThread; +import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -29,7 +30,7 @@ public QuerySearcher(ISearchActivity activity, @NonNull String query) { } @Override - public boolean addResult(EntryItem... pojos) { + public boolean addResult(Collection pojos) { // Give a boost if item was previously selected for this query for (EntryItem pojo : pojos) { int historyRecord = MapCompat.getOrDefault(knownIds, pojo.id, 0); diff --git a/app/src/main/java/rocks/tbog/tblauncher/searcher/ResultBuffer.java b/app/src/main/java/rocks/tbog/tblauncher/searcher/ResultBuffer.java index c10ee5346..439c357c0 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/searcher/ResultBuffer.java +++ b/app/src/main/java/rocks/tbog/tblauncher/searcher/ResultBuffer.java @@ -20,7 +20,7 @@ public Collection getEntryItems() { } @Override - public boolean addResult(EntryItem... items) { + public boolean addResult(Collection items) { boolean result = false; for (EntryItem item : items) result |= entryItems.add(typeClass.cast(item)); diff --git a/app/src/main/java/rocks/tbog/tblauncher/searcher/Searcher.java b/app/src/main/java/rocks/tbog/tblauncher/searcher/Searcher.java index d288697ff..cd9b47ea1 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/searcher/Searcher.java +++ b/app/src/main/java/rocks/tbog/tblauncher/searcher/Searcher.java @@ -12,7 +12,7 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; -import java.util.Collections; +import java.util.Collection; import java.util.PriorityQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -71,10 +71,11 @@ protected int getMaxResultCount(Context context) { /** * This is called from the background thread by the providers + * @param pojos */ @WorkerThread @Override - public boolean addResult(EntryItem... pojos) { + public boolean addResult(Collection pojos) { if (isCancelled()) return false; @@ -83,7 +84,7 @@ public boolean addResult(EntryItem... pojos) { if (activity == null) return false; - Collections.addAll(processedPojos, pojos); + processedPojos.addAll(pojos); while (processedPojos.size() > maxResults) processedPojos.poll(); diff --git a/app/src/main/java/rocks/tbog/tblauncher/searcher/SortedTagSearcher.java b/app/src/main/java/rocks/tbog/tblauncher/searcher/SortedTagSearcher.java new file mode 100644 index 000000000..ec9d8681e --- /dev/null +++ b/app/src/main/java/rocks/tbog/tblauncher/searcher/SortedTagSearcher.java @@ -0,0 +1,103 @@ +package rocks.tbog.tblauncher.searcher; + +import android.app.Activity; +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.annotation.WorkerThread; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.PriorityQueue; + +import rocks.tbog.tblauncher.TBApplication; +import rocks.tbog.tblauncher.entry.EntryItem; +import rocks.tbog.tblauncher.entry.EntryWithTags; +import rocks.tbog.tblauncher.entry.TagSortEntry; +import rocks.tbog.tblauncher.handler.DataHandler; +import rocks.tbog.tblauncher.utils.Utilities; + +public class SortedTagSearcher extends Searcher { + final EntryWithTags.TagDetails tagDetails; + final TagSortEntry.TagDetails tagSort; + final HashSet foundIdSet = new HashSet<>(); + + public SortedTagSearcher(ISearchActivity activity, @NonNull String tagSortId) { + super(activity, tagSortId); + tagSort = new TagSortEntry.TagDetails(tagSortId); + tagDetails = new EntryWithTags.TagDetails(tagSort.name); + } + + @Override + protected PriorityQueue getPojoProcessor(ISearchActivity activity) { + return new PriorityQueue<>(INITIAL_CAPACITY, tagSort.getComparator()); + } + + @WorkerThread + @Override + public boolean addResult(Collection pojos) { + if (isCancelled()) + return false; + + ISearchActivity searchActivity = activityWeakReference.get(); + Activity activity = searchActivity != null ? Utilities.getActivity(searchActivity.getContext()) : null; + if (activity == null) + return false; + + for (EntryItem entryItem : pojos) { + if (entryItem instanceof EntryWithTags) { + if (((EntryWithTags) entryItem).getTags().contains(tagDetails)) { + addProcessedPojo((EntryWithTags) entryItem); + } + } + } + return true; + } + + private void addProcessedPojo(EntryWithTags entryItem) { + // if id already processed, skip it + if (!foundIdSet.add(entryItem.id)) + return; + + processedPojos.add(entryItem); + if (processedPojos.size() > maxResults) + processedPojos.poll(); + } + + @WorkerThread + @Override + protected Void doInBackground(Void param) { + ISearchActivity searchActivity = activityWeakReference.get(); + Context context = searchActivity != null ? searchActivity.getContext() : null; + if (context == null) + return null; + + DataHandler dh = TBApplication.dataHandler(context); + + switch (tagSort.order) { + case TagSortEntry.SORT_AZ: + case TagSortEntry.SORT_ZA: + // Request all results via "addResult" + dh.requestAllRecords(this); + break; + case TagSortEntry.HISTORY_REC: + case TagSortEntry.HISTORY_FREQ: + case TagSortEntry.HISTORY_FREC: + case TagSortEntry.HISTORY_ADAPTIVE: + { + var history = dh.getHistory(Integer.MAX_VALUE, DataHandler.getHistoryMode(query), false, Collections.emptySet()); + int order = 0; + for (var entry : history) { + entry.resetResultInfo(); + entry.boostRelevance(order++); + } + addResult(history); + break; + } + default: + break; + } + return null; + } +} diff --git a/app/src/main/java/rocks/tbog/tblauncher/searcher/TagList.java b/app/src/main/java/rocks/tbog/tblauncher/searcher/TagList.java index 28fc5bf28..c3d8aaf41 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/searcher/TagList.java +++ b/app/src/main/java/rocks/tbog/tblauncher/searcher/TagList.java @@ -8,6 +8,7 @@ import androidx.annotation.WorkerThread; import androidx.preference.PreferenceManager; +import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.PriorityQueue; @@ -39,7 +40,7 @@ protected PriorityQueue getPojoProcessor(ISearchActivity activity) { @WorkerThread @Override - public boolean addResult(EntryItem... pojos) { + public boolean addResult(Collection pojos) { if (isCancelled()) return false; diff --git a/app/src/main/java/rocks/tbog/tblauncher/searcher/TagSearcher.java b/app/src/main/java/rocks/tbog/tblauncher/searcher/TagSearcher.java index 4710563cc..8e7b27277 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/searcher/TagSearcher.java +++ b/app/src/main/java/rocks/tbog/tblauncher/searcher/TagSearcher.java @@ -6,6 +6,7 @@ import androidx.annotation.NonNull; import androidx.annotation.WorkerThread; +import java.util.Collection; import java.util.HashSet; import java.util.PriorityQueue; @@ -30,7 +31,7 @@ protected PriorityQueue getPojoProcessor(ISearchActivity activity) { @WorkerThread @Override - public boolean addResult(EntryItem... pojos) { + public boolean addResult(Collection pojos) { if (isCancelled()) return false; diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e85ca8dc7..98e129bcd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,6 +15,14 @@ Add to dock Remove from dock Remove from history + + Sort name A to Z + Sort name Z to A + Sort by last accessed + Sort most accessed + Sort last and most accessed + Sort adaptive history + App name app tag list Grant this permission first