From 3a6aa2e96e2d6e040953c65ca656b3d2037a9976 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 9 Oct 2022 19:59:24 +0200 Subject: [PATCH] add support for pinned shortcuts --- app/src/main/AndroidManifest.xml | 7 +- .../launcher/activities/MainActivity.kt | 85 +++++++++++++++++-- .../launcher/fragments/AllAppsFragment.kt | 2 +- .../launcher/fragments/WidgetsFragment.kt | 1 + .../launcher/models/HomeScreenGridItem.kt | 12 ++- .../launcher/views/HomeScreenGrid.kt | 7 +- 6 files changed, 95 insertions(+), 19 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index afe2bd2..a4be681 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,7 +42,12 @@ android:configChanges="orientation|keyboardHidden|screenSize" android:exported="true" android:screenOrientation="portrait" - android:theme="@style/LauncherTheme" /> + android:theme="@style/LauncherTheme"> + + + + + + val occupiedCells = ArrayList>() + gridItems.forEach { item -> + for (xCell in item.left..item.right) { + for (yCell in item.top..item.bottom) { + occupiedCells.add(Pair(xCell, yCell)) + } + } + } + + for (checkedYCell in 0 until COLUMN_COUNT) { + for (checkedXCell in 0 until ROW_COUNT - 1) { + val wantedCell = Pair(checkedXCell, checkedYCell) + if (!occupiedCells.contains(wantedCell)) { + return Rect(wantedCell.first, wantedCell.second, wantedCell.first, wantedCell.second) + } + } + } + + return null } override fun onResume() { @@ -330,7 +391,12 @@ class MainActivity : SimpleActivity(), FlingListener { if (clickedGridItem.type == ITEM_TYPE_ICON) { launchApp(clickedGridItem.packageName) } else if (clickedGridItem.type == ITEM_TYPE_SHORTCUT) { - launchShortcutIntent(clickedGridItem) + val id = clickedGridItem.shortcutId + val packageName = clickedGridItem.packageName + val userHandle = android.os.Process.myUserHandle() + val shortcutBounds = home_screen_grid.getClickableRect(clickedGridItem) + val launcherApps = applicationContext.getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps + launcherApps.startShortcut(packageName, id, shortcutBounds, null, userHandle) } } } @@ -527,7 +593,7 @@ class MainActivity : SimpleActivity(), FlingListener { try { val defaultDialerPackage = (getSystemService(Context.TELECOM_SERVICE) as TelecomManager).defaultDialerPackage appLaunchers.firstOrNull { it.packageName == defaultDialerPackage }?.apply { - val dialerIcon = HomeScreenGridItem(null, 0, ROW_COUNT - 1, 0, ROW_COUNT - 1, defaultDialerPackage, title, ITEM_TYPE_ICON, "", -1, "", null) + val dialerIcon = HomeScreenGridItem(null, 0, ROW_COUNT - 1, 0, ROW_COUNT - 1, defaultDialerPackage, title, ITEM_TYPE_ICON, "", -1, "", "", null) homeScreenGridItems.add(dialerIcon) } } catch (e: Exception) { @@ -537,7 +603,7 @@ class MainActivity : SimpleActivity(), FlingListener { val defaultSMSMessengerPackage = Telephony.Sms.getDefaultSmsPackage(this) appLaunchers.firstOrNull { it.packageName == defaultSMSMessengerPackage }?.apply { val SMSMessengerIcon = - HomeScreenGridItem(null, 1, ROW_COUNT - 1, 1, ROW_COUNT - 1, defaultSMSMessengerPackage, title, ITEM_TYPE_ICON, "", -1, "", null) + HomeScreenGridItem(null, 1, ROW_COUNT - 1, 1, ROW_COUNT - 1, defaultSMSMessengerPackage, title, ITEM_TYPE_ICON, "", -1, "", "", null) homeScreenGridItems.add(SMSMessengerIcon) } } catch (e: Exception) { @@ -549,7 +615,7 @@ class MainActivity : SimpleActivity(), FlingListener { val defaultBrowserPackage = resolveInfo!!.activityInfo.packageName appLaunchers.firstOrNull { it.packageName == defaultBrowserPackage }?.apply { val browserIcon = - HomeScreenGridItem(null, 2, ROW_COUNT - 1, 2, ROW_COUNT - 1, defaultBrowserPackage, title, ITEM_TYPE_ICON, "", -1, "", null) + HomeScreenGridItem(null, 2, ROW_COUNT - 1, 2, ROW_COUNT - 1, defaultBrowserPackage, title, ITEM_TYPE_ICON, "", -1, "", "", null) homeScreenGridItems.add(browserIcon) } } catch (e: Exception) { @@ -560,7 +626,7 @@ class MainActivity : SimpleActivity(), FlingListener { val storePackage = potentialStores.firstOrNull { isPackageInstalled(it) && appLaunchers.map { it.packageName }.contains(it) } if (storePackage != null) { appLaunchers.firstOrNull { it.packageName == storePackage }?.apply { - val storeIcon = HomeScreenGridItem(null, 3, ROW_COUNT - 1, 3, ROW_COUNT - 1, storePackage, title, ITEM_TYPE_ICON, "", -1, "", null) + val storeIcon = HomeScreenGridItem(null, 3, ROW_COUNT - 1, 3, ROW_COUNT - 1, storePackage, title, ITEM_TYPE_ICON, "", -1, "", "", null) homeScreenGridItems.add(storeIcon) } } @@ -572,7 +638,7 @@ class MainActivity : SimpleActivity(), FlingListener { val resolveInfo = packageManager.resolveActivity(cameraIntent, PackageManager.MATCH_DEFAULT_ONLY) val defaultCameraPackage = resolveInfo!!.activityInfo.packageName appLaunchers.firstOrNull { it.packageName == defaultCameraPackage }?.apply { - val cameraIcon = HomeScreenGridItem(null, 4, ROW_COUNT - 1, 4, ROW_COUNT - 1, defaultCameraPackage, title, ITEM_TYPE_ICON, "", -1, "", null) + val cameraIcon = HomeScreenGridItem(null, 4, ROW_COUNT - 1, 4, ROW_COUNT - 1, defaultCameraPackage, title, ITEM_TYPE_ICON, "", -1, "", "", null) homeScreenGridItems.add(cameraIcon) } } catch (e: Exception) { @@ -581,7 +647,12 @@ class MainActivity : SimpleActivity(), FlingListener { homeScreenGridItemsDB.insertAll(homeScreenGridItems) } - fun handleWidgetBinding(appWidgetManager: AppWidgetManager, appWidgetId: Int, appWidgetInfo: AppWidgetProviderInfo, callback: (canBind: Boolean) -> Unit) { + fun handleWidgetBinding( + appWidgetManager: AppWidgetManager, + appWidgetId: Int, + appWidgetInfo: AppWidgetProviderInfo, + callback: (canBind: Boolean) -> Unit + ) { mActionOnCanBindWidget = null val canCreateWidget = appWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, appWidgetInfo.provider) if (canCreateWidget) { diff --git a/app/src/main/kotlin/com/simplemobiletools/launcher/fragments/AllAppsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/launcher/fragments/AllAppsFragment.kt index 25c82e3..c3904ec 100644 --- a/app/src/main/kotlin/com/simplemobiletools/launcher/fragments/AllAppsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/launcher/fragments/AllAppsFragment.kt @@ -141,7 +141,7 @@ class AllAppsFragment(context: Context, attributeSet: AttributeSet) : MyFragment override fun onAppLauncherLongPressed(x: Float, y: Float, appLauncher: AppLauncher) { val gridItem = - HomeScreenGridItem(null, -1, -1, -1, -1, appLauncher.packageName, appLauncher.title, ITEM_TYPE_ICON, "", -1, "", null, appLauncher.drawable) + HomeScreenGridItem(null, -1, -1, -1, -1, appLauncher.packageName, appLauncher.title, ITEM_TYPE_ICON, "", -1, "", "", null, appLauncher.drawable) activity?.showHomeIconMenu(x, y, gridItem, true) ignoreTouches = true } diff --git a/app/src/main/kotlin/com/simplemobiletools/launcher/fragments/WidgetsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/launcher/fragments/WidgetsFragment.kt index 540fad6..f520069 100644 --- a/app/src/main/kotlin/com/simplemobiletools/launcher/fragments/WidgetsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/launcher/fragments/WidgetsFragment.kt @@ -241,6 +241,7 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment appWidget.className, -1, "", + "", null, appWidget.widgetPreviewImage, appWidget.providerInfo, diff --git a/app/src/main/kotlin/com/simplemobiletools/launcher/models/HomeScreenGridItem.kt b/app/src/main/kotlin/com/simplemobiletools/launcher/models/HomeScreenGridItem.kt index 082a9f6..92f62e9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/launcher/models/HomeScreenGridItem.kt +++ b/app/src/main/kotlin/com/simplemobiletools/launcher/models/HomeScreenGridItem.kt @@ -1,14 +1,13 @@ package com.simplemobiletools.launcher.models import android.appwidget.AppWidgetProviderInfo -import android.content.ComponentName import android.content.pm.ActivityInfo import android.graphics.Bitmap import android.graphics.drawable.Drawable import androidx.room.* import com.simplemobiletools.launcher.helpers.ITEM_TYPE_ICON -// grid cells are from 0-5 by default. Icons occupy 1 slot only, widgets can be bigger +// grid cells are from 0-5 by default. Icons and shortcuts occupy 1 slot only, widgets can be bigger @Entity(tableName = "home_screen_grid_items", indices = [(Index(value = ["id"], unique = true))]) data class HomeScreenGridItem( @PrimaryKey(autoGenerate = true) var id: Long?, @@ -21,8 +20,9 @@ data class HomeScreenGridItem( @ColumnInfo(name = "type") var type: Int, @ColumnInfo(name = "class_name") var className: String, @ColumnInfo(name = "widget_id") var widgetId: Int, - @ColumnInfo(name = "intent") var intent: String, // used at shortcuts on click - @ColumnInfo(name = "icon") var icon: Bitmap? = null, // store only images of shortcuts, those cannot be retrieved anytime + @ColumnInfo(name = "intent") var intent: String, // used at static and dynamic shortcuts on click + @ColumnInfo(name = "shortcut_id") var shortcutId: String, // used at pinned shortcuts at startLauncher call + @ColumnInfo(name = "icon") var icon: Bitmap? = null, // store images of pinned shortcuts, those cannot be retrieved after creating @Ignore var drawable: Drawable? = null, @Ignore var providerInfo: AppWidgetProviderInfo? = null, // used at widgets @@ -30,7 +30,7 @@ data class HomeScreenGridItem( @Ignore var widthCells: Int = 1, @Ignore var heightCells: Int = 1 ) { - constructor() : this(null, -1, -1, -1, -1, "", "", ITEM_TYPE_ICON, "", -1, "", null, null, null, null, 1, 1) + constructor() : this(null, -1, -1, -1, -1, "", "", ITEM_TYPE_ICON, "", -1, "", "", null, null, null, null, 1, 1) fun getWidthInCells() = if (right == -1 || left == -1) { widthCells @@ -43,6 +43,4 @@ data class HomeScreenGridItem( } else { bottom - top + 1 } - - fun getComponentName() = ComponentName(activityInfo?.packageName ?: "", activityInfo?.name ?: "") } diff --git a/app/src/main/kotlin/com/simplemobiletools/launcher/views/HomeScreenGrid.kt b/app/src/main/kotlin/com/simplemobiletools/launcher/views/HomeScreenGrid.kt index 891673d..a12eb87 100644 --- a/app/src/main/kotlin/com/simplemobiletools/launcher/views/HomeScreenGrid.kt +++ b/app/src/main/kotlin/com/simplemobiletools/launcher/views/HomeScreenGrid.kt @@ -283,6 +283,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel "", -1, "", + "", draggedItem!!.icon, draggedItem!!.drawable, draggedItem!!.providerInfo, @@ -299,7 +300,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel newHomeScreenGridItem.title = label newHomeScreenGridItem.icon = icon newHomeScreenGridItem.intent = intent - newHomeScreenGridItem.drawable = BitmapDrawable(newHomeScreenGridItem.icon) + newHomeScreenGridItem.drawable = BitmapDrawable(icon) storeAndShowGridItem(newHomeScreenGridItem) } } @@ -318,7 +319,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel } } - private fun storeAndShowGridItem(item: HomeScreenGridItem) { + fun storeAndShowGridItem(item: HomeScreenGridItem) { val newId = context.homeScreenGridItemsDB.insert(item) item.id = newId gridItems.add(item) @@ -642,7 +643,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel } // get the clickable area around the icon, it includes text too - private fun getClickableRect(item: HomeScreenGridItem): Rect { + fun getClickableRect(item: HomeScreenGridItem): Rect { if (cellXCoords.isEmpty()) { fillCellSizes() }