Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -118,6 +120,9 @@ public class MainActivity extends FragmentActivity implements CategorySelectionD
private static WeakReference<MainActivity> 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;
Expand All @@ -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<String, Integer>());
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);
Expand Down Expand Up @@ -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);
Expand All @@ -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));
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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<AppItem> updatedAppItems = AppItemManager.getAppItems(getPackageManager(), packageName);
AppItemManager.updatePackageItems(launcher, packageName, updatedAppItems);
final Stream<AppItem> 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);
}
});

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<AppItem> getAppItems(@NonNull final PackageManager packageManager, @NonNull final Intent launcherIntent) {
private Stream<AppItem> getAppItems(@NonNull final PackageManager packageManager, @NonNull final Intent launcherIntent) {
launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER);
final List<ResolveInfo> 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<AppItem> getAppItems(@NonNull final PackageManager packageManager) {
public Stream<AppItem> getAppItems(@NonNull final PackageManager packageManager) {
final Intent launcherIntent = new Intent(Intent.ACTION_MAIN, null);
return getAppItems(packageManager, launcherIntent);
}

@NonNull
public static Stream<AppItem> getAppItems(@NonNull final PackageManager packageManager, @NonNull final String packageName) {
public Stream<AppItem> 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<AppItem> updatedAppItemsStream
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<CategoryAdapter.ItemViewHolder> {
private final LaunchManager launchManager;
private final Postable dragEndService;
private final SortedList<DisplayItem> 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
Copy link
Owner

Choose a reason for hiding this comment

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

Instead of passing SortMethod what do you think about passing an implementation of Comparator<DisplayItem>?

We'd need two implementations, one for order-by-name and one for order-by-usage. This will also remove the need for DisplayItem to implement Comparable<DisplayItem>.

) {
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);
}

Expand Down
13 changes: 10 additions & 3 deletions app/src/main/java/peterfajdiga/fastdraw/launcher/Launcher.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -36,28 +37,34 @@ public class Launcher {
private final PrefMap categoriesOrderMap;
private final Map<String, LauncherItem> 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);
}

Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -217,7 +224,7 @@ private void createCategories(@NonNull final Set<String> 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();
Expand Down
Loading