Skip to content

Commit

Permalink
Implement basic shorthand system
Browse files Browse the repository at this point in the history
This implementation allows apps to be tagged using a specified label.
Apps can then be searched through the label instead of its name. This
hopefully should be able to save a few keyboard strokes for app search.

With this, it is also possible to group apps based off of a similar
shorthands. For instance, several browser apps can be shorthanded to
'browser', and a search for 'browser' will return them all.

Should somewhat satisfies the third point in #11, and may be enough for
  • Loading branch information
F4uzan committed Feb 18, 2019
1 parent 091bb3a commit 3ad87fe
Show file tree
Hide file tree
Showing 9 changed files with 107 additions and 8 deletions.
37 changes: 37 additions & 0 deletions app/src/main/java/mono/hg/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
Expand Down Expand Up @@ -34,6 +35,7 @@
import java.util.ArrayList;
import java.util.HashSet;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.interpolator.view.animation.LinearOutSlowInInterpolator;
import androidx.recyclerview.widget.DefaultItemAnimator;
Expand Down Expand Up @@ -596,6 +598,8 @@ private void createAppMenu(View view, Boolean isPinned, final String packageName
// We can't hide an app from the favourites panel.
appMenu.getMenu().findItem(R.id.action_hide).setVisible(!isPinned);

appMenu.getMenu().findItem(R.id.action_shorthand).setVisible(!isPinned);

// Only show the 'unpin' option if isPinned is set.
appMenu.getMenu().findItem(R.id.action_unpin).setVisible(isPinned);

Expand Down Expand Up @@ -637,6 +641,9 @@ public boolean onMenuItemClick(MenuItem item) {
case R.id.action_uninstall:
startActivity(new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageNameUri));
break;
case R.id.action_shorthand:
makeRenameDialog(packageName, finalPosition);
break;
case R.id.action_hide:
// Add the app's package name to the exclusion list.
excludedAppsList.add(packageName);
Expand Down Expand Up @@ -1077,7 +1084,37 @@ private void updatePinnedApps(Boolean restart) {
PreferenceHelper.update("pinned_apps_list", newAppString);

pinnedAppString = newAppString;
}

/**
* Creates a dialogue to set an app's shorthand.
*
* @param packageName The package name of the app.
* @param position Adapter position of the app.
*/
private void makeRenameDialog(final String packageName, final int position) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);

final EditText renameField = new EditText(this);
renameField.setHint(PreferenceHelper.getLabel(packageName));
builder.setView(renameField);

builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialogInterface, int i) {
PreferenceHelper.updateLabel(packageName,
renameField.getText().toString().trim());

// Update the specified item.
AppDetail item = appsAdapter.getItem(position);
if (item != null) {
appsAdapter.updateItem(new AppDetail(item.getIcon(), item.getAppName(),
packageName, PreferenceHelper.getLabel(packageName), false));
}
}
})
.setNegativeButton(android.R.string.cancel, null)
.setTitle(R.string.dialogue_title_shorthand)
.show();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ private void loadApps() {
String appName = ri.loadLabel(manager).toString();
Drawable icon = ri.activityInfo.loadIcon(manager);
boolean isHidden = excludedAppList.contains(packageName);
AppDetail app = new AppDetail(icon, appName, packageName, isHidden);
AppDetail app = new AppDetail(icon, appName, packageName, null, isHidden);
appList.add(app);
}
}
Expand Down
30 changes: 30 additions & 0 deletions app/src/main/java/mono/hg/helpers/PreferenceHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import android.preference.PreferenceManager;

import java.util.HashSet;
import java.util.Map;
import java.util.WeakHashMap;

public class PreferenceHelper {
private static boolean icon_hide;
Expand All @@ -20,6 +22,8 @@ public class PreferenceHelper {
private static boolean has_widget;
private static boolean is_testing;
private static boolean was_alien;
private static Map<String, String> label_list = new WeakHashMap<>();
private static HashSet<String> label_list_set = new HashSet<>();
private static HashSet<String> exclusion_list;
private static String launch_anim;
private static String app_theme;
Expand Down Expand Up @@ -161,6 +165,29 @@ public static void initPreference(Context context) {
editor = preferences.edit();
}

private static void fetchLabels() {
String splitPackage[];
for (String packageName : label_list_set) {
splitPackage = packageName.split("\\|");
label_list.put(splitPackage[0], splitPackage[1]);
}
}

public static String getLabel(String packageName) {
return label_list.get(packageName);
}

public static void updateLabel(String packageName, String newLabel) {
label_list.put(packageName, newLabel);

// Clear then add the set.
label_list_set.clear();
for (Map.Entry<String, String> newPackage : label_list.entrySet()) {
label_list_set.add(newPackage.getKey() + "|" + newPackage.getValue());
}
update("label_list", label_list_set);
}

public static void update(String id, HashSet<String> stringSet) {
getEditor().putStringSet(id, stringSet).apply();
}
Expand Down Expand Up @@ -197,5 +224,8 @@ public static void fetchPreference() {

exclusion_list = (HashSet<String>) preferences.getStringSet("hidden_apps",
new HashSet<String>());
HashSet<String> temp_label_list = (HashSet<String>) preferences.getStringSet("label_list", new HashSet<String>());
label_list_set.addAll(temp_label_list);
fetchLabels();
}
}
30 changes: 26 additions & 4 deletions app/src/main/java/mono/hg/models/AppDetail.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,14 @@

public class AppDetail extends AbstractFlexibleItem<AppDetail.ViewHolder>
implements IFilterable<String> {
private String appName, packageName;
private String appName, packageName, hintName;
private Boolean isAppHidden;
private Drawable icon;

public AppDetail(Drawable icon, String appName, @NonNull String packageName, Boolean isAppHidden) {
public AppDetail(Drawable icon, String appName, @NonNull String packageName, String hintName, Boolean isAppHidden) {
this.packageName = packageName;
this.appName = appName;
this.hintName = hintName;
this.icon = icon;
this.isAppHidden = isAppHidden;
}
Expand All @@ -42,6 +43,10 @@ public String getPackageName() {
return packageName;
}

public String getHintName() {
return hintName;
}

public Drawable getIcon() {
return icon;
}
Expand All @@ -54,6 +59,10 @@ public void setAppHidden(Boolean hidden) {
isAppHidden = hidden;
}

public boolean hasHintName() {
return hintName != null;
}

public boolean equals(Object object) {
AppDetail alt = (AppDetail) object;
return this == object || getClass() != object.getClass() || getPackageName().equals(
Expand All @@ -80,8 +89,21 @@ public boolean equals(Object object) {
}

@Override public boolean filter(String constraint) {
int fuzzyScore = KissFuzzySearch.doFuzzy(getAppName(), constraint);
return fuzzyScore >= 30;
int fuzzyScore = 0;

// See if we can match by hint names.
if (hasHintName()) {
fuzzyScore = KissFuzzySearch.doFuzzy(getHintName(), constraint);
}

// Is the hint name strong enough?
if (fuzzyScore >= 35) {
return true;
} else {
// Fall back to app name matching if it isn't.
fuzzyScore = KissFuzzySearch.doFuzzy(appName, constraint);
return fuzzyScore >= 30;
}
}

protected class ViewHolder extends FlexibleViewHolder {
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/mono/hg/models/PinnedAppDetail.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
public class PinnedAppDetail extends AppDetail {

public PinnedAppDetail(Drawable icon, @NonNull String packageName) {
super(icon, null, packageName, false);
super(icon, null, packageName, null, false);
}

public PinnedAppDetail(String packageName) {
Expand Down
3 changes: 2 additions & 1 deletion app/src/main/java/mono/hg/utils/AppUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,7 @@ public static List<AppDetail> loadApps(Activity activity) {
if (!PreferenceHelper.getExclusionList().contains(packageName) && !packageName.contains(
activity.getPackageName())) {
String appName = ri.loadLabel(manager).toString();
String hintName = PreferenceHelper.getLabel(packageName);
Drawable icon = null;
Drawable getIcon = null;
// Only show icons if user chooses so.
Expand All @@ -248,7 +249,7 @@ public static List<AppDetail> loadApps(Activity activity) {
icon = getIcon;
}
}
AppDetail app = new AppDetail(icon, appName, packageName, false);
AppDetail app = new AppDetail(icon, appName, packageName, hintName, false);
appsList.add(app);
}
}
Expand Down
3 changes: 2 additions & 1 deletion app/src/main/java/mono/hg/utils/ViewUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@ public static void disableSnackbarSwipe(final Snackbar snackbar) {
@Override
public boolean onPreDraw() {
snackbar.getView().getViewTreeObserver().removeOnPreDrawListener(this);
((CoordinatorLayout.LayoutParams) snackbar.getView().getLayoutParams()).setBehavior(
((CoordinatorLayout.LayoutParams) snackbar.getView()
.getLayoutParams()).setBehavior(
null);
return true;
}
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/res/menu/menu_app.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@
android:title="@string/action_info"
app:showAsAction="never" />

<item
android:id="@+id/action_shorthand"
android:orderInCategory="100"
android:title="@string/action_shorthand"
app:showAsAction="never" />

<item
android:id="@+id/action_uninstall"
android:orderInCategory="100"
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,14 @@
<string name="action_backup">Backup</string>
<string name="action_uninstall">Uninstall</string>
<string name="action_info">App info</string>
<string name="action_shorthand">Shorthand</string>

<!-- Misc -->
<string name="search_hint">Search…</string>
<string name="search_web_hint">Search for \'%1$s\' online.</string>
<string name="search_web_button_prompt">With</string>
<string name="search_web_button">Go</string>
<string name="dialogue_title_shorthand">Set shorthand</string>
<string name="dialogue_action_close">Close</string>

<!-- Warning/Information messages -->
Expand Down

1 comment on commit 3ad87fe

@F4uzan
Copy link
Owner Author

@F4uzan F4uzan commented on 3ad87fe Feb 18, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Neato. Commit message broke.

This commit should be somewhat enough for #16. I'm not that sure about renaming, as this feels like a similar implementation. We'll see about what to do in the future though.

Please sign in to comment.