Skip to content

Commit

Permalink
update Dock after sort order changed
Browse files Browse the repository at this point in the history
  • Loading branch information
TBog committed Dec 14, 2022
1 parent 00c2693 commit e4d94af
Show file tree
Hide file tree
Showing 11 changed files with 246 additions and 105 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
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.entry.TagSortEntry;
import rocks.tbog.tblauncher.handler.DataHandler;

public class TagsProvider extends DBProvider<TagEntry> {
Expand All @@ -32,9 +32,7 @@ public static TagEntry newTagEntryCheckId(String 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)) {
} else if (id.startsWith(TagEntry.SCHEME)) {
tagEntry = new TagEntry(id);
String tagName = id.substring(TagEntry.SCHEME.length());
tagEntry.setName(tagName);
Expand All @@ -49,7 +47,11 @@ public static String getTagId(@NonNull String tagName) {

@NonNull
private static TagEntry newTagEntry(@NonNull String id, @NonNull String tagName) {
TagEntry tagEntry = new TagEntry(id);
TagEntry tagEntry;
if (TagSortEntry.isTagSort(id))
tagEntry = new TagSortEntry(id);
else
tagEntry = new TagEntry(id);
tagEntry.setName(tagName);
return tagEntry;
}
Expand Down
25 changes: 21 additions & 4 deletions app/src/main/java/rocks/tbog/tblauncher/db/DBHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -134,8 +134,7 @@ private static Cursor getHistoryByFrecency(SQLiteDatabase db, int limit) {
" GROUP BY record " +
" ORDER BY " +
" count(*) * 1.0 / (select count(*) from history LIMIT " + historyWindowSize + ") / ((SELECT _id FROM history ORDER BY _id DESC LIMIT 1) - max(_id) + 0.001) " +
" DESC " +
" LIMIT " + limit;
" DESC " + ((limit > 0 && limit < Integer.MAX_VALUE) ? (" LIMIT " + limit) : "");
return db.rawQuery(sql, null);
}

Expand All @@ -144,7 +143,7 @@ private static Cursor getHistoryByFrequency(SQLiteDatabase db, int limit) {
String sql = "SELECT record, count(*) FROM history" +
" GROUP BY record " +
" ORDER BY count(*) DESC " +
" LIMIT " + limit;
((limit > 0 && limit < Integer.MAX_VALUE) ? (" LIMIT " + limit) : "");
return db.rawQuery(sql, null);
}

Expand All @@ -168,7 +167,7 @@ private static Cursor getHistoryByAdaptive(SQLiteDatabase db, int hours, int lim
"AND timeStamp >" + (System.currentTimeMillis() - (hours * 3600000)) +
" GROUP BY record " +
" ORDER BY count(*) DESC " +
" LIMIT " + limit;
((limit > 0 && limit < Integer.MAX_VALUE) ? (" LIMIT " + limit) : "");
return db.rawQuery(sql, null);
}

Expand Down Expand Up @@ -490,6 +489,24 @@ public static int renameTag(Context context, String tagName, String newName, @Nu
return db.update("tags", values, "tag = ?", new String[]{tagName});
}

/**
* @param context android context
* @param tagEntry what tag to modify
* @param newEntry the new tag sort
* @return number of records affected
*/
public static int changeTagSort(Context context, @NonNull TagEntry tagEntry, @NonNull TagEntry newEntry) {
SQLiteDatabase db = getDatabase(context);

ContentValues values = new ContentValues();
values.put("record", newEntry.id);
int count = db.updateWithOnConflict("favorites", values, "record = ?", new String[]{tagEntry.id}, SQLiteDatabase.CONFLICT_REPLACE);
if (count != 1) {
Log.e(TAG, "Update favorites in rename tag; count = " + count);
}
return count;
}

/**
* @param context android context
* @return HashMap with EntryItem id as key and an ArrayList of tags for each
Expand Down
56 changes: 45 additions & 11 deletions app/src/main/java/rocks/tbog/tblauncher/entry/TagEntry.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,11 @@ public class TagEntry extends StaticEntry {

public TagEntry(@NonNull String id) {
super(id, 0);
if (BuildConfig.DEBUG && !id.startsWith(SCHEME)) {
throw new IllegalStateException("Invalid " + TagEntry.class.getSimpleName() + " id `" + id + "`");
if (BuildConfig.DEBUG) {
if (!id.startsWith(SCHEME))
throw new IllegalStateException("Invalid " + TagEntry.class.getSimpleName() + " id `" + id + "`");
if (!(this instanceof TagSortEntry) && TagSortEntry.isTagSort(id))
throw new IllegalStateException(TagEntry.class.getSimpleName() + " instantiated with id `" + id + "`");
}
}

Expand All @@ -36,11 +39,42 @@ public void setName(String name) {
}
}

@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));
}
super.buildPopupMenuCategory(context, adapter, titleStringId);
}

@Override
boolean popupMenuClickHandler(@NonNull View view, @NonNull LinearAdapter.MenuItem item, int stringId, View parentView) {
Context ctx = view.getContext();
boolean changesMade = false;
if (stringId == R.string.menu_action_rename) {
Context ctx = view.getContext();
launchRenameDialog(ctx);
changesMade = true;
} else if (stringId == R.string.menu_tag_sort_az) {
changesMade = TBApplication.tagsHandler(ctx).changeTagSort(id, SCHEME + TagSortEntry.SORT_AZ + getName());
} else if (stringId == R.string.menu_tag_sort_za) {
changesMade = TBApplication.tagsHandler(ctx).changeTagSort(id, SCHEME + TagSortEntry.SORT_ZA + getName());
} else if (stringId == R.string.menu_tag_sort_hist_rec) {
changesMade = TBApplication.tagsHandler(ctx).changeTagSort(id, SCHEME + TagSortEntry.HISTORY_REC + getName());
} else if (stringId == R.string.menu_tag_sort_hist_freq) {
changesMade = TBApplication.tagsHandler(ctx).changeTagSort(id, SCHEME + TagSortEntry.HISTORY_FREQ + getName());
} else if (stringId == R.string.menu_tag_sort_hist_frec) {
changesMade = TBApplication.tagsHandler(ctx).changeTagSort(id, SCHEME + TagSortEntry.HISTORY_FREC + getName());
} else if (stringId == R.string.menu_tag_sort_hist_adaptive) {
changesMade = TBApplication.tagsHandler(ctx).changeTagSort(id, SCHEME + TagSortEntry.HISTORY_ADAPTIVE + getName());
}
if (changesMade) {
// update providers, we're expecting the tag to be in the Dock
TBApplication.dataHandler(ctx).afterQuickListChanged();
return true;
}
return super.popupMenuClickHandler(view, item, stringId, parentView);
Expand All @@ -67,17 +101,17 @@ public Drawable getDefaultDrawable(Context context) {

private void launchRenameDialog(@NonNull Context c) {
DialogHelper.makeRenameDialog(c, getName(), (dialog, newName) -> {
Context ctx = dialog.getContext();
Context ctx = dialog.getContext();

String oldName = getName();
String oldName = getName();

TBApplication app = TBApplication.getApplication(ctx);
app.tagsHandler().renameTag(oldName, newName);
app.behaviour().refreshSearchRecord(TagEntry.this);
TBApplication app = TBApplication.getApplication(ctx);
app.tagsHandler().renameTag(oldName, newName);
app.behaviour().refreshSearchRecord(TagEntry.this);

// update providers and refresh views
TagsManager.afterChangesMade(ctx);
})
// update providers and refresh views
TagsManager.afterChangesMade(ctx);
})
.setTitle(R.string.title_rename_tag)
.setHint(R.string.hint_rename_tag)
.show();
Expand Down
65 changes: 26 additions & 39 deletions app/src/main/java/rocks/tbog/tblauncher/entry/TagSortEntry.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import android.content.Context;
import android.view.View;
import android.widget.Toast;

import androidx.annotation.NonNull;

Expand All @@ -13,6 +12,7 @@
import rocks.tbog.tblauncher.TBApplication;
import rocks.tbog.tblauncher.searcher.SortedTagSearcher;
import rocks.tbog.tblauncher.ui.LinearAdapter;
import rocks.tbog.tblauncher.ui.ListPopup;

public class TagSortEntry extends TagEntry {
public static final String SORT_AZ = "sort/byName/";
Expand All @@ -37,8 +37,31 @@ public void setName(String name) {
// find the default name from the id
String action = getTagSortOrder(id);
super.setName(id.substring(SCHEME.length() + action.length()));
} else {
super.setName(name);
}
super.setName(name);
}

@Override
ListPopup inflatePopupMenu(@NonNull Context context, @NonNull LinearAdapter adapter) {
// this tag is already sorted, remove the option to sort it the same
var sortOrder = getTagSortOrder(id);
for (int i = 0; i < adapter.getCount(); i += 1) {
LinearAdapter.MenuItem item = adapter.getItem(i);
if (item instanceof LinearAdapter.Item) {
var itemStringId = ((LinearAdapter.Item) item).stringId;
if ((itemStringId == R.string.menu_tag_sort_az && SORT_AZ.equals(sortOrder))
|| (itemStringId == R.string.menu_tag_sort_za && SORT_ZA.equals(sortOrder))
|| (itemStringId == R.string.menu_tag_sort_hist_rec && HISTORY_REC.equals(sortOrder))
|| (itemStringId == R.string.menu_tag_sort_hist_freq && HISTORY_FREQ.equals(sortOrder))
|| (itemStringId == R.string.menu_tag_sort_hist_frec && HISTORY_FREC.equals(sortOrder))
|| (itemStringId == R.string.menu_tag_sort_hist_adaptive && HISTORY_ADAPTIVE.equals(sortOrder))) {
adapter.remove(item);
break;
}
}
}
return super.inflatePopupMenu(context, adapter);
}

@Override
Expand All @@ -49,42 +72,6 @@ public void doLaunch(@NonNull View v, int flags) {
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());
Expand All @@ -104,7 +91,7 @@ public static String getTagSortOrder(String id) {
}

public static boolean isTagSort(String id) {
return !getTagSortOrder(id).isEmpty();
return id.startsWith(SCHEME) && !getTagSortOrder(id).isEmpty();
}

public static class TagDetails {
Expand Down
34 changes: 33 additions & 1 deletion app/src/main/java/rocks/tbog/tblauncher/handler/DataHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
Expand Down Expand Up @@ -579,6 +580,8 @@ public void requestAllRecords(Searcher searcher) {
List<? extends EntryItem> pojos = entry.provider.getPojos();
if (pojos == null)
continue;
for (var item : pojos)
item.resetResultInfo();
boolean accept = searcher.addResult(pojos);
// if searcher will not accept any more results, exit
if (!accept)
Expand Down Expand Up @@ -649,6 +652,31 @@ public List<EntryItem> getHistory(int itemCount, DBHelper.HistoryMode historyMod
return history;
}

public Map<EntryItem, Integer> getHistoryOrder(DBHelper.HistoryMode historyMode, Set<String> itemsToExcludeById) {
// Read history
final Context context = getContext();
List<ValuedHistoryRecord> ids = DBHelper.getHistory(context, Integer.MAX_VALUE, historyMode);

// Pre-allocate array slots that are likely to be used
HashMap<EntryItem, Integer> history = new HashMap<>(ids.size());

// Find associated items
for (int i = 0; i < ids.size(); i++) {
// Ask all providers if they know this id
EntryItem entryItem = getPojo(ids.get(i).record);

if (entryItem == null)
continue;

if (itemsToExcludeById.contains(entryItem.id))
continue;

history.put(entryItem, i);
}

return history;
}

public boolean addShortcut(ShortcutRecord record) {
final Context context = getContext();

Expand Down Expand Up @@ -1067,7 +1095,11 @@ public void setQuickList(Iterable<String> records) {
}
}

// refresh relevant providers
afterQuickListChanged();
}

public void afterQuickListChanged() {
// refresh relevant providers for the Dock
{
IProvider<?> provider = getModProvider();
if (provider != null)
Expand Down
Loading

0 comments on commit e4d94af

Please sign in to comment.