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()
}