Merge pull request #92 from esensar/fix/67-direct-call-widget

Store all shortcuts with IDs without Intent
This commit is contained in:
Tibor Kaputa 2023-07-26 18:08:10 +02:00 committed by GitHub
commit f3b0c7363a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 32 deletions

View File

@ -17,6 +17,7 @@ import android.content.res.Configuration
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.Color import android.graphics.Color
import android.graphics.Rect import android.graphics.Rect
import android.graphics.drawable.Drawable
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
@ -69,7 +70,7 @@ class MainActivity : SimpleActivity(), FlingListener {
private var mLastTouchCoords = Pair(-1f, -1f) private var mLastTouchCoords = Pair(-1f, -1f)
private var mActionOnCanBindWidget: ((granted: Boolean) -> Unit)? = null private var mActionOnCanBindWidget: ((granted: Boolean) -> Unit)? = null
private var mActionOnWidgetConfiguredWidget: ((granted: Boolean) -> Unit)? = null private var mActionOnWidgetConfiguredWidget: ((granted: Boolean) -> Unit)? = null
private var mActionOnAddShortcut: ((label: String, icon: Bitmap?, intent: String) -> Unit)? = null private var mActionOnAddShortcut: ((shortcutId: String, label: String, icon: Drawable) -> Unit)? = null
private lateinit var mDetector: GestureDetectorCompat private lateinit var mDetector: GestureDetectorCompat
@ -279,10 +280,13 @@ class MainActivity : SimpleActivity(), FlingListener {
REQUEST_CONFIGURE_WIDGET -> mActionOnWidgetConfiguredWidget?.invoke(resultCode == Activity.RESULT_OK) REQUEST_CONFIGURE_WIDGET -> mActionOnWidgetConfiguredWidget?.invoke(resultCode == Activity.RESULT_OK)
REQUEST_CREATE_SHORTCUT -> { REQUEST_CREATE_SHORTCUT -> {
if (resultCode == Activity.RESULT_OK && resultData != null) { if (resultCode == Activity.RESULT_OK && resultData != null) {
val launchIntent = resultData.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT) as? Intent val launcherApps = applicationContext.getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
val label = resultData.getStringExtra(Intent.EXTRA_SHORTCUT_NAME) ?: "" val item = launcherApps.getPinItemRequest(resultData)
val icon = resultData.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON) as? Bitmap item.accept()
mActionOnAddShortcut?.invoke(label, icon, launchIntent?.toUri(0).toString()) val shortcutId = item.shortcutInfo?.id!!
val label = item.shortcutInfo?.shortLabel?.toString() ?: item.shortcutInfo?.longLabel?.toString() ?: ""
val icon = launcherApps.getShortcutIconDrawable(item.shortcutInfo!!, resources.displayMetrics.densityDpi)
mActionOnAddShortcut?.invoke(shortcutId, label, icon)
} }
} }
} }
@ -490,17 +494,12 @@ class MainActivity : SimpleActivity(), FlingListener {
if (clickedGridItem.type == ITEM_TYPE_ICON) { if (clickedGridItem.type == ITEM_TYPE_ICON) {
launchApp(clickedGridItem.packageName, clickedGridItem.activityName) launchApp(clickedGridItem.packageName, clickedGridItem.activityName)
} else if (clickedGridItem.type == ITEM_TYPE_SHORTCUT) { } else if (clickedGridItem.type == ITEM_TYPE_SHORTCUT) {
if (clickedGridItem.intent.isNotEmpty()) { val id = clickedGridItem.shortcutId
launchShortcutIntent(clickedGridItem) val packageName = clickedGridItem.packageName
} else { val userHandle = android.os.Process.myUserHandle()
// launch pinned shortcuts val shortcutBounds = home_screen_grid.getClickableRect(clickedGridItem)
val id = clickedGridItem.shortcutId val launcherApps = applicationContext.getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
val packageName = clickedGridItem.packageName launcherApps.startShortcut(packageName, id, shortcutBounds, null, userHandle)
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)
}
} }
} }
@ -938,7 +937,7 @@ class MainActivity : SimpleActivity(), FlingListener {
) )
} }
fun handleShorcutCreation(activityInfo: ActivityInfo, callback: (label: String, icon: Bitmap?, intent: String) -> Unit) { fun handleShorcutCreation(activityInfo: ActivityInfo, callback: (shortcutId: String, label: String, icon: Drawable) -> Unit) {
mActionOnAddShortcut = callback mActionOnAddShortcut = callback
val componentName = ComponentName(activityInfo.packageName, activityInfo.name) val componentName = ComponentName(activityInfo.packageName, activityInfo.name)
Intent(Intent.ACTION_CREATE_SHORTCUT).apply { Intent(Intent.ACTION_CREATE_SHORTCUT).apply {

View File

@ -8,7 +8,6 @@ import android.provider.Settings
import com.simplemobiletools.commons.extensions.showErrorToast import com.simplemobiletools.commons.extensions.showErrorToast
import com.simplemobiletools.launcher.activities.SettingsActivity import com.simplemobiletools.launcher.activities.SettingsActivity
import com.simplemobiletools.launcher.helpers.UNINSTALL_APP_REQUEST_CODE import com.simplemobiletools.launcher.helpers.UNINSTALL_APP_REQUEST_CODE
import com.simplemobiletools.launcher.models.HomeScreenGridItem
fun Activity.launchApp(packageName: String, activityName: String) { fun Activity.launchApp(packageName: String, activityName: String) {
// if this is true, launch the app settings // if this is true, launch the app settings
@ -48,13 +47,3 @@ fun Activity.uninstallApp(packageName: String) {
startActivityForResult(this, UNINSTALL_APP_REQUEST_CODE) startActivityForResult(this, UNINSTALL_APP_REQUEST_CODE)
} }
} }
// launch static or dynamic shortcuts that have intents as string
fun Activity.launchShortcutIntent(item: HomeScreenGridItem) {
try {
val intent = Intent.parseUri(item.intent, 0)
startActivity(intent)
} catch (e: Exception) {
showErrorToast(e)
}
}

View File

@ -20,6 +20,7 @@ import android.util.Size
import android.util.SizeF import android.util.SizeF
import android.view.View import android.view.View
import android.widget.RelativeLayout import android.widget.RelativeLayout
import androidx.core.graphics.drawable.toBitmap
import androidx.core.graphics.drawable.toDrawable import androidx.core.graphics.drawable.toDrawable
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
@ -426,12 +427,12 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
storeAndShowGridItem(newHomeScreenGridItem) storeAndShowGridItem(newHomeScreenGridItem)
} }
} else if (newHomeScreenGridItem.type == ITEM_TYPE_SHORTCUT) { } else if (newHomeScreenGridItem.type == ITEM_TYPE_SHORTCUT) {
(context as? MainActivity)?.handleShorcutCreation(newHomeScreenGridItem.activityInfo!!) { label, icon, intent -> (context as? MainActivity)?.handleShorcutCreation(newHomeScreenGridItem.activityInfo!!) { shortcutId, label, icon ->
ensureBackgroundThread { ensureBackgroundThread {
newHomeScreenGridItem.shortcutId = shortcutId
newHomeScreenGridItem.title = label newHomeScreenGridItem.title = label
newHomeScreenGridItem.icon = icon newHomeScreenGridItem.icon = icon.toBitmap()
newHomeScreenGridItem.intent = intent newHomeScreenGridItem.drawable = icon
newHomeScreenGridItem.drawable = BitmapDrawable(icon)
storeAndShowGridItem(newHomeScreenGridItem) storeAndShowGridItem(newHomeScreenGridItem)
} }
} }