From 1d8737e89ac585d7bb026062d74c9531307173fb Mon Sep 17 00:00:00 2001 From: LJ Date: Wed, 15 May 2024 23:42:15 +0300 Subject: [PATCH 1/2] Make linux gradlew binary executable --- gradlew | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 gradlew diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 From 7f673d5f8e1713d443265b6b9ad6b6a1d8559aec Mon Sep 17 00:00:00 2001 From: LJ Date: Thu, 16 May 2024 00:23:12 +0300 Subject: [PATCH 2/2] WIP: Sort order pref for usage based sorting --- .../fastdraw/activities/MainActivity.java | 37 +++++++++++++------ .../fastdraw/launcher/AppItemManager.java | 19 ++++++---- .../fastdraw/launcher/Category.java | 5 ++- .../fastdraw/launcher/CategoryAdapter.java | 11 +++++- .../fastdraw/launcher/Launcher.java | 13 +++++-- .../launcher/ShortcutItemManager.java | 34 +++++++++-------- .../fastdraw/launcher/StatisticsManager.java | 27 ++++++++++++++ .../launcher/launchable/IntentLaunchable.java | 8 +++- .../launcher/launcheritem/AppItem.java | 11 ++++-- .../launcheritem/BitmapShortcutItem.java | 11 +++++- .../launcheritem/FiledShortcutItem.java | 7 +++- .../launcheritem/ResShortcutItem.java | 13 ++++++- .../fastdraw/prefs/Preferences.java | 2 + .../fastdraw/prefs/SortMethod.java | 13 +++++++ .../receivers/InstallShortcutReceiver.java | 7 ++-- app/src/main/res/values/arrays.xml | 12 ++++++ app/src/main/res/values/defaults.xml | 1 + app/src/main/res/values/strings.xml | 6 +++ app/src/main/res/xml/pref_appearance.xml | 7 ++++ 19 files changed, 192 insertions(+), 52 deletions(-) create mode 100644 app/src/main/java/peterfajdiga/fastdraw/launcher/StatisticsManager.java create mode 100644 app/src/main/java/peterfajdiga/fastdraw/prefs/SortMethod.java create mode 100644 app/src/main/res/values/arrays.xml diff --git a/app/src/main/java/peterfajdiga/fastdraw/activities/MainActivity.java b/app/src/main/java/peterfajdiga/fastdraw/activities/MainActivity.java index ec1fec89..dac9d1f9 100644 --- a/app/src/main/java/peterfajdiga/fastdraw/activities/MainActivity.java +++ b/app/src/main/java/peterfajdiga/fastdraw/activities/MainActivity.java @@ -56,6 +56,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -75,6 +76,7 @@ import peterfajdiga.fastdraw.launcher.LaunchManager; import peterfajdiga.fastdraw.launcher.Launcher; import peterfajdiga.fastdraw.launcher.ShortcutItemManager; +import peterfajdiga.fastdraw.launcher.StatisticsManager; import peterfajdiga.fastdraw.launcher.launcheritem.AppItem; import peterfajdiga.fastdraw.launcher.launcheritem.BitmapShortcutItem; import peterfajdiga.fastdraw.launcher.launcheritem.FiledShortcutItem; @@ -118,6 +120,9 @@ public class MainActivity extends FragmentActivity implements CategorySelectionD private static WeakReference instance; private final LaunchManager launchManager = new LaunchManager(this); private final RunnableQueue dragEndService = new RunnableQueue(); + private StatisticsManager statisticsManager; + public ShortcutItemManager shortcutItemManager; + private AppItemManager appItemManager; private Preferences preferences; private Launcher launcher; private WidgetManager widgetManager; @@ -128,8 +133,16 @@ protected void onCreate(Bundle savedInstanceState) { MainActivity.instance = new WeakReference<>(this); this.preferences = new Preferences(this); + + // TODO: Retrieve stored prefs + statisticsManager = new StatisticsManager(new HashMap()); + shortcutItemManager = new ShortcutItemManager(statisticsManager); + appItemManager = new AppItemManager(statisticsManager); + onFirstRun(); migrateCategoryNames(); + + setContentView(this.preferences.headerOnBottom ? R.layout.activity_main_headerbtm : R.layout.activity_main_headertop); if (this.preferences.allowOrientation) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); @@ -178,7 +191,7 @@ protected void onCreate(Bundle savedInstanceState) { if (intent != null) { final String action = intent.getAction(); if (action != null && action.equals(LauncherApps.ACTION_CONFIRM_PIN_SHORTCUT)) { - final OreoShortcutItem newShortcut = ShortcutItemManager.oreoShortcutFromIntent(this, intent); + final OreoShortcutItem newShortcut = shortcutItemManager.oreoShortcutFromIntent(this, intent); if (newShortcut != null) { final String shortcutCategoryName = Category.shortcutsCategory; addOreoShortcut(newShortcut, shortcutCategoryName); @@ -195,7 +208,7 @@ private void onFirstRun() { final ActivityInfo fastdrawPrefsInfo = new ActivityInfo(); fastdrawPrefsInfo.packageName = getPackageName(); fastdrawPrefsInfo.name = SettingsActivity.class.getName(); - addAppToHome(new AppItem(fastdrawPrefsInfo)); + addAppToHome(new AppItem(appItemManager, statisticsManager, fastdrawPrefsInfo)); // phone app addAppToHome(new Intent(Intent.ACTION_DIAL)); @@ -290,7 +303,7 @@ private void setupAppsPager(final NestedScrollParent scrollParent) { }); final ViewPager appsPager = findViewById(R.id.apps_pager); - launcher = new Launcher(launchManager, dragEndService, longPressListener, appsPager, this.preferences.hideHidden); + launcher = new Launcher(launchManager, statisticsManager, dragEndService, longPressListener, appsPager, this.preferences.hideHidden, this.preferences.sortMethod); setupWallpaperParallax(appsPager); setupHeader(appsPager); @@ -595,19 +608,19 @@ private void setupInstallAppReceiver() { installAppReceiver = new InstallAppReceiver(new InstallAppReceiver.Owner() { @Override public void onAppInstall(final String packageName) { - final AppItem[] appItems = AppItemManager.getAppItems(getPackageManager(), packageName).toArray(AppItem[]::new); + final AppItem[] appItems = appItemManager.getAppItems(getPackageManager(), packageName).toArray(AppItem[]::new); launcher.addItems(appItems); } @Override public void onAppChange(final String packageName) { - final Stream updatedAppItems = AppItemManager.getAppItems(getPackageManager(), packageName); - AppItemManager.updatePackageItems(launcher, packageName, updatedAppItems); + final Stream updatedAppItems = appItemManager.getAppItems(getPackageManager(), packageName); + appItemManager.updatePackageItems(launcher, packageName, updatedAppItems); } @Override public void onAppRemove(final String packageName) { - AppItemManager.removePackageItems(launcher, packageName); + appItemManager.removePackageItems(launcher, packageName); } }); @@ -684,7 +697,7 @@ protected void onActivityResult(final int requestCode, final int resultCode, fin switch (requestCode) { case INSTALL_SHORTCUT_REQUEST: { if (resultCode == RESULT_OK) { - final FiledShortcutItem newShortcut = ShortcutItemManager.shortcutFromIntent(this, data); + final FiledShortcutItem newShortcut = shortcutItemManager.shortcutFromIntent(this, data); addShortcut(newShortcut, launcher.getCurrentCategoryName()); } return; @@ -745,7 +758,7 @@ protected void onActivityResult(final int requestCode, final int resultCode, fin } private void addShortcut(@NonNull final FiledShortcutItem shortcutItem, @NonNull final String categoryName) { - ShortcutItemManager.saveShortcut(this, shortcutItem); + shortcutItemManager.saveShortcut(this, shortcutItem); launcher.moveItems(categoryName, shortcutItem); } @@ -796,8 +809,8 @@ private void persistWidgetHeight(final float delta) { private void loadLauncherItems() { final LauncherItem[] items = Stream.concat( - AppItemManager.getAppItems(getPackageManager()), - ShortcutItemManager.getShortcutItems(this) + appItemManager.getAppItems(getPackageManager()), + shortcutItemManager.getShortcutItems(this) ).toArray(LauncherItem[]::new); launcher.addItemsStartup(items); @@ -828,7 +841,7 @@ private boolean addAppToHome(@NonNull final Intent launcherIntent) { if (resolveInfo == null) { return false; } - addAppToHome(new AppItem(resolveInfo.activityInfo)); + addAppToHome(new AppItem(appItemManager, statisticsManager, resolveInfo.activityInfo)); return true; } diff --git a/app/src/main/java/peterfajdiga/fastdraw/launcher/AppItemManager.java b/app/src/main/java/peterfajdiga/fastdraw/launcher/AppItemManager.java index d332925e..76001e04 100644 --- a/app/src/main/java/peterfajdiga/fastdraw/launcher/AppItemManager.java +++ b/app/src/main/java/peterfajdiga/fastdraw/launcher/AppItemManager.java @@ -18,33 +18,36 @@ import peterfajdiga.fastdraw.launcher.launcheritem.AppItem; public class AppItemManager { - private AppItemManager() {} + private final StatisticsManager statisticsManager; + public AppItemManager( @NonNull final StatisticsManager statisticsManager) { + this.statisticsManager = statisticsManager; + } @NonNull - private static Stream getAppItems(@NonNull final PackageManager packageManager, @NonNull final Intent launcherIntent) { + private Stream getAppItems(@NonNull final PackageManager packageManager, @NonNull final Intent launcherIntent) { launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER); final List appActivities = packageManager.queryIntentActivities(launcherIntent, 0); - return appActivities.stream().map(resolveInfo -> new AppItem(resolveInfo.activityInfo)); + return appActivities.stream().map(resolveInfo -> new AppItem(this, statisticsManager, resolveInfo.activityInfo)); } @NonNull - public static Stream getAppItems(@NonNull final PackageManager packageManager) { + public Stream getAppItems(@NonNull final PackageManager packageManager) { final Intent launcherIntent = new Intent(Intent.ACTION_MAIN, null); return getAppItems(packageManager, launcherIntent); } @NonNull - public static Stream getAppItems(@NonNull final PackageManager packageManager, @NonNull final String packageName) { + public Stream getAppItems(@NonNull final PackageManager packageManager, @NonNull final String packageName) { final Intent launcherIntent = new Intent(Intent.ACTION_MAIN, null); launcherIntent.setPackage(packageName); return getAppItems(packageManager, launcherIntent); } - public static void removePackageItems(final Launcher launcher, final String packageName) { + public void removePackageItems(final Launcher launcher, final String packageName) { launcher.removeItems(item -> item instanceof AppItem && item.getPackageName().equals(packageName)); } - public static void updatePackageItems( + public void updatePackageItems( final Launcher launcher, final String packageName, final Stream updatedAppItemsStream @@ -57,7 +60,7 @@ public static void updatePackageItems( launcher.addItems(updatedAppItems.values().toArray(new AppItem[0])); } - public static void showPackageDetails(final Context context, final String packageName) { + public void showPackageDetails(final Context context, final String packageName) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", packageName, null); diff --git a/app/src/main/java/peterfajdiga/fastdraw/launcher/Category.java b/app/src/main/java/peterfajdiga/fastdraw/launcher/Category.java index cfad9145..37a79d39 100644 --- a/app/src/main/java/peterfajdiga/fastdraw/launcher/Category.java +++ b/app/src/main/java/peterfajdiga/fastdraw/launcher/Category.java @@ -17,6 +17,7 @@ import peterfajdiga.fastdraw.R; import peterfajdiga.fastdraw.launcher.displayitem.DisplayItem; import peterfajdiga.fastdraw.launcher.launcheritem.LauncherItem; +import peterfajdiga.fastdraw.prefs.SortMethod; import peterfajdiga.fastdraw.views.AutoGridLayoutManager; import peterfajdiga.fastdraw.views.NestedScrollChildManager; @@ -28,10 +29,12 @@ public class Category { public Category( final Context context, final LaunchManager launchManager, + final StatisticsManager statisticsManager, + final SortMethod sortMethod, final Postable dragEndService, final View.OnTouchListener backgroundTouchListener ) { - this.adapter = new CategoryAdapter(launchManager, dragEndService); + this.adapter = new CategoryAdapter(launchManager, dragEndService, statisticsManager, sortMethod); view = createView(context, backgroundTouchListener, adapter, nestedScrollChildManager); } diff --git a/app/src/main/java/peterfajdiga/fastdraw/launcher/CategoryAdapter.java b/app/src/main/java/peterfajdiga/fastdraw/launcher/CategoryAdapter.java index 4e218fc3..9b84517b 100644 --- a/app/src/main/java/peterfajdiga/fastdraw/launcher/CategoryAdapter.java +++ b/app/src/main/java/peterfajdiga/fastdraw/launcher/CategoryAdapter.java @@ -23,18 +23,27 @@ import peterfajdiga.fastdraw.Postable; import peterfajdiga.fastdraw.R; import peterfajdiga.fastdraw.launcher.displayitem.DisplayItem; +import peterfajdiga.fastdraw.prefs.SortMethod; public class CategoryAdapter extends RecyclerView.Adapter { private final LaunchManager launchManager; private final Postable dragEndService; private final SortedList items; - public CategoryAdapter(@NonNull final LaunchManager launchManager, final Postable dragEndService) { + public CategoryAdapter( + @NonNull final LaunchManager launchManager, + final Postable dragEndService, + @NonNull final StatisticsManager statisticsManager, + @NonNull final SortMethod sortMethod + ) { this.launchManager = launchManager; this.dragEndService = dragEndService; this.items = new SortedList<>(DisplayItem.class, new SortedList.Callback<>() { @Override public int compare(final DisplayItem o1, final DisplayItem o2) { + if (sortMethod == SortMethod.Usage) { + return statisticsManager.launchCount(o2.id).compareTo(statisticsManager.launchCount(o1.id)); + } return o1.compareTo(o2); } diff --git a/app/src/main/java/peterfajdiga/fastdraw/launcher/Launcher.java b/app/src/main/java/peterfajdiga/fastdraw/launcher/Launcher.java index e8561b46..e0182802 100644 --- a/app/src/main/java/peterfajdiga/fastdraw/launcher/Launcher.java +++ b/app/src/main/java/peterfajdiga/fastdraw/launcher/Launcher.java @@ -27,6 +27,7 @@ import peterfajdiga.fastdraw.launcher.launcheritem.LauncherItem; import peterfajdiga.fastdraw.launcher.launcheritem.ShortcutItem; import peterfajdiga.fastdraw.prefs.PrefMap; +import peterfajdiga.fastdraw.prefs.SortMethod; import peterfajdiga.fastdraw.views.NestedScrollChildManager; public class Launcher { @@ -36,28 +37,34 @@ public class Launcher { private final PrefMap categoriesOrderMap; private final Map itemsById = new HashMap<>(); private final LaunchManager launchManager; + private final StatisticsManager statisticsManager; private final Postable dragEndService; private final View.OnTouchListener backgroundTouchListener; private final ViewPager pager; private final LauncherPagerAdapter adapter; private final boolean hideHidden; + private final SortMethod sortMethod; public Launcher( @NonNull final LaunchManager launchManager, + @NonNull final StatisticsManager statisticsManager, @NonNull final Postable dragEndService, @NonNull final View.OnTouchListener backgroundTouchListener, @NonNull final ViewPager pager, - final boolean hideHidden + final boolean hideHidden, + @NonNull final SortMethod sortMethod ) { final Context context = pager.getContext(); this.itemCategoryMap = new PrefMap(context, "categories"); // TODO: pass from outside this.categoriesOrderMap = new PrefMap(context, "categoryorder"); // TODO: pass from outside this.launchManager = launchManager; + this.statisticsManager = statisticsManager; this.dragEndService = dragEndService; this.backgroundTouchListener = backgroundTouchListener; this.pager = pager; this.adapter = new LauncherPagerAdapter(context); this.hideHidden = hideHidden; + this.sortMethod = sortMethod; pager.setAdapter(this.adapter); } @@ -161,7 +168,7 @@ private synchronized void addItemsToCategory(@NonNull final String categoryName, Category category = adapter.categories.get(categoryName); if (category == null) { final Context context = pager.getContext(); - category = new Category(context, launchManager, dragEndService, backgroundTouchListener); + category = new Category(context, launchManager, statisticsManager, sortMethod, dragEndService, backgroundTouchListener); categoriesOrderMap.getIntCreate(categoryName, CategoryComparator.UNORDERED); // make sure the new category is added to the categoryorder prefs adapter.categories.put(categoryName, category); adapter.notifyDataSetChanged(); @@ -217,7 +224,7 @@ private void createCategories(@NonNull final Set categories) { if (adapter.categories.containsKey(categoryName)) { continue; } - final Category category = new Category(pager.getContext(), launchManager, dragEndService, backgroundTouchListener); + final Category category = new Category(pager.getContext(), launchManager, statisticsManager, sortMethod, dragEndService, backgroundTouchListener); adapter.categories.put(categoryName, category); } adapter.notifyDataSetChanged(); diff --git a/app/src/main/java/peterfajdiga/fastdraw/launcher/ShortcutItemManager.java b/app/src/main/java/peterfajdiga/fastdraw/launcher/ShortcutItemManager.java index cf8214b7..404dae97 100644 --- a/app/src/main/java/peterfajdiga/fastdraw/launcher/ShortcutItemManager.java +++ b/app/src/main/java/peterfajdiga/fastdraw/launcher/ShortcutItemManager.java @@ -30,16 +30,20 @@ import peterfajdiga.fastdraw.launcher.launcheritem.Saveable; public class ShortcutItemManager { - private ShortcutItemManager() {} + private final StatisticsManager statisticsManager; + + public ShortcutItemManager(@NonNull final StatisticsManager statisticsManager) { + this.statisticsManager = statisticsManager; + } @NonNull - public static Stream getShortcutItems(@NonNull final Context context) { + public Stream getShortcutItems(@NonNull final Context context) { final Stream filedShortcuts = getFiledShortcutItems(context); final Stream oreoShortcuts = getOreoShortcutItems(context); return Stream.concat(filedShortcuts, oreoShortcuts); } - private static Stream getFiledShortcutItems(@NonNull final Context context) { + private Stream getFiledShortcutItems(@NonNull final Context context) { final File shortcutsDir = getShortcutsDir(context); shortcutsDir.mkdir(); return Arrays.stream(shortcutsDir.listFiles()).map(file -> { @@ -56,7 +60,7 @@ private static Stream getFiledShortcutItems(@NonNull final Context } @NonNull - private static Stream getOreoShortcutItems(@NonNull final Context context) { + private Stream getOreoShortcutItems(@NonNull final Context context) { final List shortcuts = OreoShortcuts.getPinnedShortcuts(context); if (shortcuts == null) { return Stream.empty(); @@ -66,7 +70,7 @@ private static Stream getOreoShortcutItems(@NonNull final Context } @Nullable - private static FiledShortcutItem readShortcutItem( + private FiledShortcutItem readShortcutItem( @NonNull final Context context, @NonNull final File file ) throws IOException, URISyntaxException, Saveable.LeftoverException { @@ -83,7 +87,7 @@ private static FiledShortcutItem readShortcutItem( } } - @Nullable private static FiledShortcutItem readShortcutItem( + @Nullable private FiledShortcutItem readShortcutItem( @NonNull final Context context, @NonNull final FileInputStream in, @NonNull final String typeKey, @@ -91,9 +95,9 @@ private static FiledShortcutItem readShortcutItem( ) throws IOException, URISyntaxException, Saveable.LeftoverException { switch (typeKey) { case BitmapShortcutItem.TYPE_KEY: - return BitmapShortcutItem.fromFile(context, in, uuid); + return BitmapShortcutItem.fromFile(this, statisticsManager, context, in, uuid); case ResShortcutItem.TYPE_KEY: - return ResShortcutItem.fromFile(context, in, uuid); + return ResShortcutItem.fromFile(this, statisticsManager, context, in, uuid); case OreoShortcutItem.TYPE_KEY: throw new Saveable.LeftoverException(); default: @@ -102,7 +106,7 @@ private static FiledShortcutItem readShortcutItem( } } - public static void saveShortcut(@NonNull final Context context, @NonNull final FiledShortcutItem item) { + public void saveShortcut(@NonNull final Context context, @NonNull final FiledShortcutItem item) { final String filename = item.getFilename(); try { final File file = new File(getShortcutsDir(context), filename); @@ -114,34 +118,34 @@ public static void saveShortcut(@NonNull final Context context, @NonNull final F } } - public static void deleteShortcut(@NonNull final Context context, @NonNull final FiledShortcutItem item) { + public void deleteShortcut(@NonNull final Context context, @NonNull final FiledShortcutItem item) { final String filename = item.getFilename(); final File file = new File(getShortcutsDir(context), filename); file.delete(); } @NonNull - private static File getShortcutsDir(@NonNull final Context context) { + private File getShortcutsDir(@NonNull final Context context) { return new File(context.getFilesDir(), "shortcuts"); } @NonNull - public static FiledShortcutItem shortcutFromIntent(@NonNull final Context context, @NonNull final Intent intent) { + public FiledShortcutItem shortcutFromIntent(@NonNull final Context context, @NonNull final Intent intent) { final Intent launchIntent = intent.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT); final String name = intent.getStringExtra(Intent.EXTRA_SHORTCUT_NAME); final Bitmap bmp = intent.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON); if (bmp != null) { final BitmapDrawable icon = new BitmapDrawable(context.getResources(), bmp); - return new BitmapShortcutItem(generateUUID(), launchIntent, name, icon); + return new BitmapShortcutItem(this, statisticsManager, generateUUID(), launchIntent, name, icon); } else { final Intent.ShortcutIconResource iconResource = intent.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE); - return new ResShortcutItem(generateUUID(), launchIntent, name, iconResource.packageName, iconResource.resourceName); + return new ResShortcutItem(this, statisticsManager, generateUUID(), launchIntent, name, iconResource.packageName, iconResource.resourceName); } } @Nullable - public static OreoShortcutItem oreoShortcutFromIntent(final Context context, @NonNull final Intent intent) { + public OreoShortcutItem oreoShortcutFromIntent(final Context context, @NonNull final Intent intent) { @NonNull final LauncherApps launcherApps = (LauncherApps)context.getSystemService(Context.LAUNCHER_APPS_SERVICE); final LauncherApps.PinItemRequest pinItemRequest = launcherApps.getPinItemRequest(intent); if (!pinItemRequest.isValid()) { diff --git a/app/src/main/java/peterfajdiga/fastdraw/launcher/StatisticsManager.java b/app/src/main/java/peterfajdiga/fastdraw/launcher/StatisticsManager.java new file mode 100644 index 00000000..fc294a3a --- /dev/null +++ b/app/src/main/java/peterfajdiga/fastdraw/launcher/StatisticsManager.java @@ -0,0 +1,27 @@ +package peterfajdiga.fastdraw.launcher; + +import androidx.annotation.NonNull; + +import java.util.HashMap; + +import peterfajdiga.fastdraw.launcher.launcheritem.AppItem; + +public class StatisticsManager { + private final HashMap launchCounts; + + public StatisticsManager(@NonNull final HashMap launchCounts) { + this.launchCounts = launchCounts; + } + + public Integer launchCount(final String id) { + Integer count = launchCounts.get(id); + if (count == null) return 0; + return count; + } + + public void addLaunch(final String id) { + Integer count = launchCounts.get(id); + if (count == null) launchCounts.put(id, 1); + else launchCounts.put(id, count++); + } +} diff --git a/app/src/main/java/peterfajdiga/fastdraw/launcher/launchable/IntentLaunchable.java b/app/src/main/java/peterfajdiga/fastdraw/launcher/launchable/IntentLaunchable.java index 27471dab..ad0ce666 100644 --- a/app/src/main/java/peterfajdiga/fastdraw/launcher/launchable/IntentLaunchable.java +++ b/app/src/main/java/peterfajdiga/fastdraw/launcher/launchable/IntentLaunchable.java @@ -8,12 +8,17 @@ import androidx.annotation.NonNull; import peterfajdiga.fastdraw.launcher.LaunchManager; +import peterfajdiga.fastdraw.launcher.StatisticsManager; public class IntentLaunchable implements Launchable { private final Intent intent; + private final String id; + private final StatisticsManager statisticsManager; - public IntentLaunchable(@NonNull final Intent intent) { + public IntentLaunchable(@NonNull final Intent intent, @NonNull final StatisticsManager statisticsManager, @NonNull final String id) { this.intent = intent; + this.id = id; + this.statisticsManager = statisticsManager; } @Override @@ -21,5 +26,6 @@ public void launch(final Context context, final LaunchManager launchManager, fin final Intent intent = new Intent(this.intent); intent.setSourceBounds(clipBounds); launchManager.launch(intent, opts); + statisticsManager.addLaunch(id); } } diff --git a/app/src/main/java/peterfajdiga/fastdraw/launcher/launcheritem/AppItem.java b/app/src/main/java/peterfajdiga/fastdraw/launcher/launcheritem/AppItem.java index 24662b55..e6e16d71 100644 --- a/app/src/main/java/peterfajdiga/fastdraw/launcher/launcheritem/AppItem.java +++ b/app/src/main/java/peterfajdiga/fastdraw/launcher/launcheritem/AppItem.java @@ -10,6 +10,7 @@ import androidx.annotation.NonNull; import peterfajdiga.fastdraw.launcher.AppItemManager; +import peterfajdiga.fastdraw.launcher.StatisticsManager; import peterfajdiga.fastdraw.launcher.displayitem.DisplayItem; import peterfajdiga.fastdraw.launcher.launchable.IntentLaunchable; import peterfajdiga.fastdraw.launcher.launchable.Launchable; @@ -19,9 +20,13 @@ public class AppItem implements LauncherItem { private final ActivityInfo info; private DisplayItem displayItem = null; + private final StatisticsManager statisticsManager; + private final AppItemManager appItemManager; - public AppItem(@NonNull final ActivityInfo info) { + public AppItem(@NonNull final AppItemManager appItemManager, @NonNull final StatisticsManager statisticsManager, @NonNull final ActivityInfo info) { this.info = info; + this.appItemManager = appItemManager; + this.statisticsManager = statisticsManager; } @Override @@ -55,12 +60,12 @@ public DisplayItem getDisplayItem(final Context context) { final CharSequence label = info.loadLabel(packageManager).toString(); final Drawable icon = info.loadIcon(packageManager); - final Launchable launchable = new IntentLaunchable(getIntent()); + final Launchable launchable = new IntentLaunchable(getIntent(), statisticsManager, getId()); displayItem = new DisplayItem(getId(), label, icon, this, launchable); return displayItem; } public void openAppDetails(final Context context) { - AppItemManager.showPackageDetails(context, info.packageName); + appItemManager.showPackageDetails(context, info.packageName); } } diff --git a/app/src/main/java/peterfajdiga/fastdraw/launcher/launcheritem/BitmapShortcutItem.java b/app/src/main/java/peterfajdiga/fastdraw/launcher/launcheritem/BitmapShortcutItem.java index cc834fcf..ff5c2e18 100644 --- a/app/src/main/java/peterfajdiga/fastdraw/launcher/launcheritem/BitmapShortcutItem.java +++ b/app/src/main/java/peterfajdiga/fastdraw/launcher/launcheritem/BitmapShortcutItem.java @@ -13,6 +13,8 @@ import java.io.IOException; import java.io.OutputStream; +import peterfajdiga.fastdraw.launcher.ShortcutItemManager; +import peterfajdiga.fastdraw.launcher.StatisticsManager; import peterfajdiga.fastdraw.launcher.displayitem.DisplayItem; import peterfajdiga.fastdraw.launcher.launchable.IntentLaunchable; import peterfajdiga.fastdraw.launcher.launchable.Launchable; @@ -27,16 +29,19 @@ public class BitmapShortcutItem extends FiledShortcutItem { private final DisplayItem displayItem; public BitmapShortcutItem( + @NonNull final ShortcutItemManager shortcutItemManager, + @NonNull final StatisticsManager statisticsManager, final String uuid, final Intent intent, final String label, final BitmapDrawable icon ) { + super(shortcutItemManager); this.uuid = uuid; this.intent = intent; this.label = label; this.icon = icon; - final Launchable launchable = new IntentLaunchable(intent); + final Launchable launchable = new IntentLaunchable(intent, statisticsManager, getFilename()); this.displayItem = new DisplayItem(getId(), label, icon, this, launchable); } @@ -79,6 +84,8 @@ public String getUUID() { } public static BitmapShortcutItem fromFile( + @NonNull final ShortcutItemManager shortcutItemManager, + @NonNull final StatisticsManager statisticsManager, @NonNull final Context context, @NonNull final FileInputStream in, @NonNull final String uuid @@ -86,6 +93,6 @@ public static BitmapShortcutItem fromFile( final Intent intent = Intent.parseUri(Saveable.readString(in), 0); final String label = Saveable.readString(in); final BitmapDrawable icon = new BitmapDrawable(context.getResources(), BitmapFactory.decodeFileDescriptor(in.getFD())); - return new BitmapShortcutItem(uuid, intent, label, icon); + return new BitmapShortcutItem(shortcutItemManager, statisticsManager, uuid, intent, label, icon); } } diff --git a/app/src/main/java/peterfajdiga/fastdraw/launcher/launcheritem/FiledShortcutItem.java b/app/src/main/java/peterfajdiga/fastdraw/launcher/launcheritem/FiledShortcutItem.java index f385e6e1..6c95ff66 100644 --- a/app/src/main/java/peterfajdiga/fastdraw/launcher/launcheritem/FiledShortcutItem.java +++ b/app/src/main/java/peterfajdiga/fastdraw/launcher/launcheritem/FiledShortcutItem.java @@ -7,6 +7,11 @@ import peterfajdiga.fastdraw.launcher.ShortcutItemManager; public abstract class FiledShortcutItem implements ShortcutItem, Saveable { + protected final ShortcutItemManager shortcutItemManager; + public FiledShortcutItem(@NonNull final ShortcutItemManager shortcutItemManager) { + this.shortcutItemManager = shortcutItemManager; + } + @NonNull abstract String getTypeKey(); @NonNull abstract String getUUID(); @@ -16,7 +21,7 @@ public String getFilename() { @Override public void delete(final Context context) { - ShortcutItemManager.deleteShortcut(context, this); + shortcutItemManager.deleteShortcut(context, this); } } diff --git a/app/src/main/java/peterfajdiga/fastdraw/launcher/launcheritem/ResShortcutItem.java b/app/src/main/java/peterfajdiga/fastdraw/launcher/launcheritem/ResShortcutItem.java index 063bd54c..8bb5c40f 100644 --- a/app/src/main/java/peterfajdiga/fastdraw/launcher/launcheritem/ResShortcutItem.java +++ b/app/src/main/java/peterfajdiga/fastdraw/launcher/launcheritem/ResShortcutItem.java @@ -15,6 +15,8 @@ import java.io.OutputStream; import peterfajdiga.fastdraw.R; +import peterfajdiga.fastdraw.launcher.ShortcutItemManager; +import peterfajdiga.fastdraw.launcher.StatisticsManager; import peterfajdiga.fastdraw.launcher.displayitem.DisplayItem; import peterfajdiga.fastdraw.launcher.launchable.IntentLaunchable; import peterfajdiga.fastdraw.launcher.launchable.Launchable; @@ -28,14 +30,19 @@ public class ResShortcutItem extends FiledShortcutItem { private final String iconPackageName; private final String iconResourceName; private DisplayItem displayItem = null; + private final StatisticsManager statisticsManager; public ResShortcutItem( + @NonNull final ShortcutItemManager shortcutManager, + @NonNull final StatisticsManager statisticsManager, final String uuid, final Intent intent, final String label, final String iconPackageName, final String iconResourceName ) { + super(shortcutManager); + this.statisticsManager = statisticsManager; this.uuid = uuid; this.intent = intent; this.label = label; @@ -63,7 +70,7 @@ public DisplayItem getDisplayItem(final Context context) { } final Drawable icon = loadIcon(context); - final Launchable launchable = new IntentLaunchable(intent); + final Launchable launchable = new IntentLaunchable(intent, statisticsManager, getId()); displayItem = new DisplayItem(getId(), label, icon, this, launchable); return displayItem; } @@ -112,6 +119,8 @@ public void save(@NonNull final OutputStream out) throws java.io.IOException { } public static ResShortcutItem fromFile( + @NonNull final ShortcutItemManager shortcutItemManager, + @NonNull final StatisticsManager statisticsManager, @NonNull final Context context, @NonNull final InputStream in, @NonNull final String uuid @@ -120,6 +129,6 @@ public static ResShortcutItem fromFile( final String label = Saveable.readString(in); final String iconPackageName = Saveable.readString(in); final String iconResourceName = Saveable.readString(in); - return new ResShortcutItem(uuid, intent, label, iconPackageName, iconResourceName); + return new ResShortcutItem(shortcutItemManager, statisticsManager, uuid, intent, label, iconPackageName, iconResourceName); } } diff --git a/app/src/main/java/peterfajdiga/fastdraw/prefs/Preferences.java b/app/src/main/java/peterfajdiga/fastdraw/prefs/Preferences.java index 64ed5dd2..3cb5d887 100644 --- a/app/src/main/java/peterfajdiga/fastdraw/prefs/Preferences.java +++ b/app/src/main/java/peterfajdiga/fastdraw/prefs/Preferences.java @@ -18,6 +18,7 @@ public final class Preferences { public final boolean headerDivider; public final boolean bgGradientColorFromWallpaper; public final int bgGradientOpacity; + public final SortMethod sortMethod; private final SharedPreferences prefs; private final Resources res; @@ -34,6 +35,7 @@ public Preferences(@NonNull final Context context) { headerDivider = this.prefs.getBoolean("headerDivider", this.res.getBoolean(R.bool.default_headerDivider)); bgGradientColorFromWallpaper = this.prefs.getBoolean("bgGradientColorFromWallpaper", this.res.getBoolean(R.bool.default_bgGradientColorFromWallpaper)); bgGradientOpacity = this.prefs.getInt("bgGradientOpacity", this.res.getInteger(R.integer.default_bgGradientOpacity)); + sortMethod = SortMethod.fromString(this.prefs.getString("sortMethod", this.res.getString(R.string.default_sortMethod))); } public int getWidgetHeight() { diff --git a/app/src/main/java/peterfajdiga/fastdraw/prefs/SortMethod.java b/app/src/main/java/peterfajdiga/fastdraw/prefs/SortMethod.java new file mode 100644 index 00000000..92283227 --- /dev/null +++ b/app/src/main/java/peterfajdiga/fastdraw/prefs/SortMethod.java @@ -0,0 +1,13 @@ +package peterfajdiga.fastdraw.prefs; + +public enum SortMethod { + Alphabetical, Usage; + + public static SortMethod fromString (String str) { + try { + return valueOf(str); + } catch (Exception ex) { + return Alphabetical; + } + } +} diff --git a/app/src/main/java/peterfajdiga/fastdraw/receivers/InstallShortcutReceiver.java b/app/src/main/java/peterfajdiga/fastdraw/receivers/InstallShortcutReceiver.java index 638d8e39..54756c12 100644 --- a/app/src/main/java/peterfajdiga/fastdraw/receivers/InstallShortcutReceiver.java +++ b/app/src/main/java/peterfajdiga/fastdraw/receivers/InstallShortcutReceiver.java @@ -11,11 +11,12 @@ public class InstallShortcutReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent data) { - final FiledShortcutItem newShortcutItem = ShortcutItemManager.shortcutFromIntent(context, data); - ShortcutItemManager.saveShortcut(context, newShortcutItem); - final MainActivity activity = MainActivity.getInstance(); + if (activity != null) { + final FiledShortcutItem newShortcutItem = activity.shortcutItemManager.shortcutFromIntent(context, data); + activity.shortcutItemManager.saveShortcut(context, newShortcutItem); + activity.onShortcutReceived(newShortcutItem); } } diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml new file mode 100644 index 00000000..d4a40350 --- /dev/null +++ b/app/src/main/res/values/arrays.xml @@ -0,0 +1,12 @@ + + + + + @string/pref_label_sortMethod_alphabetical + @string/pref_label_sortMethod_usage + + + Alphabetical + Usage + + diff --git a/app/src/main/res/values/defaults.xml b/app/src/main/res/values/defaults.xml index e1011f77..f52d795b 100644 --- a/app/src/main/res/values/defaults.xml +++ b/app/src/main/res/values/defaults.xml @@ -9,4 +9,5 @@ false 96 260 + Alphabetical diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3baad518..d865eda1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -47,6 +47,12 @@ Color the background shadow based on the color of your wallpaper (requires Android Oreo or newer) Background shadow opacity + Sort method + How to sort the apps + Alphabetical + Most used + + Order of categories Order alphabetically diff --git a/app/src/main/res/xml/pref_appearance.xml b/app/src/main/res/xml/pref_appearance.xml index 34f9cacd..e496d814 100644 --- a/app/src/main/res/xml/pref_appearance.xml +++ b/app/src/main/res/xml/pref_appearance.xml @@ -27,4 +27,11 @@ android:key="bgGradientOpacity" android:title="@string/pref_title_bgGradientOpacity" /> +