diff --git a/applications/src/main/java/de/mm20/launcher2/search/data/LauncherApp.kt b/applications/src/main/java/de/mm20/launcher2/search/data/LauncherApp.kt index 6672e7cd..1a5a8951 100644 --- a/applications/src/main/java/de/mm20/launcher2/search/data/LauncherApp.kt +++ b/applications/src/main/java/de/mm20/launcher2/search/data/LauncherApp.kt @@ -15,6 +15,7 @@ import android.os.UserHandle import androidx.core.content.getSystemService import de.mm20.launcher2.icons.LauncherIcon import de.mm20.launcher2.ktx.getSerialNumber +import de.mm20.launcher2.ktx.tryStartActivity import de.mm20.launcher2.preferences.Settings.IconSettings.LegacyIconBackground import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -80,7 +81,7 @@ class LauncherApp( val intent = Intent() intent.component = ComponentName(`package`, activity) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK - context.startActivity(intent, options) + return context.tryStartActivity(intent, options) } else { try { launcherApps.startMainActivity( diff --git a/ktx/src/main/java/de/mm20/launcher2/ktx/Context.kt b/ktx/src/main/java/de/mm20/launcher2/ktx/Context.kt index 7f614574..b80985aa 100644 --- a/ktx/src/main/java/de/mm20/launcher2/ktx/Context.kt +++ b/ktx/src/main/java/de/mm20/launcher2/ktx/Context.kt @@ -25,5 +25,7 @@ fun Context.tryStartActivity(intent: Intent, bundle: Bundle? = null): Boolean { true } catch (e: ActivityNotFoundException) { false + } catch (e: SecurityException) { + false } } \ No newline at end of file diff --git a/search/build.gradle.kts b/search/build.gradle.kts index c71fe049..cfa4b3a7 100644 --- a/search/build.gradle.kts +++ b/search/build.gradle.kts @@ -50,4 +50,5 @@ dependencies { implementation(project(":database")) implementation(project(":preferences")) implementation(project(":crashreporter")) + implementation(project(":ktx")) } \ No newline at end of file diff --git a/search/src/main/java/de/mm20/launcher2/search/data/Searchable.kt b/search/src/main/java/de/mm20/launcher2/search/data/Searchable.kt index 98fe1d05..2dabef8f 100644 --- a/search/src/main/java/de/mm20/launcher2/search/data/Searchable.kt +++ b/search/src/main/java/de/mm20/launcher2/search/data/Searchable.kt @@ -6,6 +6,7 @@ import android.content.Intent import android.os.Bundle import android.widget.Toast import de.mm20.launcher2.icons.LauncherIcon +import de.mm20.launcher2.ktx.tryStartActivity import de.mm20.launcher2.preferences.Settings import de.mm20.launcher2.preferences.Settings.IconSettings.LegacyIconBackground import de.mm20.launcher2.search.R @@ -22,10 +23,9 @@ abstract class Searchable : Comparable { open fun launch(context: Context, options: Bundle?): Boolean { val intent = getLaunchIntent(context) ?: return false - return try { - context.startActivity(intent, options) + return if (context.tryStartActivity(intent, options)) { true - } catch (e: ActivityNotFoundException) { + } else { Toast.makeText(context, context.getString(R.string.error_activity_not_found, label), Toast.LENGTH_SHORT).show() false } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/SearchableItemVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/SearchableItemVM.kt index fa5f7856..a01c26f9 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/SearchableItemVM.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/SearchableItemVM.kt @@ -9,6 +9,7 @@ import de.mm20.launcher2.favorites.FavoritesRepository import de.mm20.launcher2.icons.IconRepository import de.mm20.launcher2.icons.LauncherIcon import de.mm20.launcher2.ktx.isAtLeastApiLevel +import de.mm20.launcher2.search.data.Application import de.mm20.launcher2.search.data.Searchable import kotlinx.coroutines.flow.Flow import org.koin.core.component.KoinComponent @@ -46,7 +47,7 @@ abstract class SearchableItemVM( } - fun launch(context: Context, bounds: Rect? = null): Boolean { + open fun launch(context: Context, bounds: Rect? = null): Boolean { val view = (context as? AppCompatActivity)?.window?.decorView val options = if (bounds != null && view != null) { ActivityOptionsCompat.makeClipRevealAnimation( @@ -66,6 +67,8 @@ abstract class SearchableItemVM( if (searchable.launch(context, bundle)) { favoritesRepository.incrementLaunchCounter(searchable) return true + } else if (searchable is Application) { + favoritesRepository.unpinItem(searchable) } return false }