Skip to content

Commit

Permalink
Merge branch 'LawnchairLauncher:15-dev' into trunk
Browse files Browse the repository at this point in the history
  • Loading branch information
Goooler authored Feb 14, 2025
2 parents 8bf8b18 + 4c05942 commit 8be8a08
Show file tree
Hide file tree
Showing 10 changed files with 108 additions and 32 deletions.
56 changes: 27 additions & 29 deletions .github/renovate.json5
Original file line number Diff line number Diff line change
@@ -1,43 +1,41 @@
{
"labels": [
"dependencies",
labels: [
'dependencies',
],
"extends": [
"config:base",
extends: [
'config:recommended',
],
"packageRules": [
packageRules: [
{
"groupName": "Kotlin and KSP",
"matchPackagePrefixes": [
"com.google.devtools.ksp",
groupName: 'Kotlin and KSP',
matchPackageNames: [
'com.google.devtools.ksp{/,}**',
'/org.jetbrains.kotlin.*/',
],
"matchPackagePatterns": [
"org.jetbrains.kotlin.*",
]
},
{
"groupName": "AGP",
"matchPackagePatterns": [
"com.android.*",
]
groupName: 'AGP',
matchPackageNames: [
'/com.android.*/',
],
},
{
"groupName": "dev.rikka.tools.refine",
"matchPackagePrefixes": [
"dev.rikka.tools.refine",
]
groupName: 'dev.rikka.tools.refine',
matchPackageNames: [
'dev.rikka.tools.refine{/,}**',
],
},
{
"groupName": "androidx.lifecycle",
"matchPackagePatterns": [
"androidx.lifecycle:*",
]
groupName: 'androidx.lifecycle',
matchPackageNames: [
'/androidx.lifecycle:*/',
],
},
{
"groupName": "Dagger",
"matchPackagePrefixes": [
"com.google.dagger",
]
}
]
groupName: 'Dagger',
matchPackageNames: [
'com.google.dagger{/,}**',
],
},
],
}
6 changes: 3 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ import com.android.build.gradle.api.AndroidBasePlugin
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
id 'com.android.application' version "8.8.0"
id 'com.android.library' version "8.8.0" apply false
id 'com.android.test' version '8.8.0' apply false
id 'com.android.application' version "8.8.1"
id 'com.android.library' version "8.8.1" apply false
id 'com.android.test' version '8.8.1' apply false
id 'androidx.baselineprofile' version '1.3.3'
id 'org.jetbrains.kotlin.android' version "2.1.10"
id 'org.jetbrains.kotlin.plugin.compose' version "2.1.10"
Expand Down
2 changes: 2 additions & 0 deletions lawnchair/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@
<string name="overlay_suck_in">Suck In</string>
<string name="app_closing_animation">App closing animation</string>
<string name="overlay_label">Overlay</string>
<string name="overlay_none">None</string>

<!--
Expand Down Expand Up @@ -471,6 +472,7 @@
<string name="gesture_handler_open_app_drawer">Open app drawer</string>
<string name="gesture_handler_open_app_search">Open app search</string>
<string name="gesture_handler_open_search">Open search</string>
<string name="gesture_handler_open_assistant">Open assistant</string>

<string name="pick_app_for_gesture">Pick app</string>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import app.lawnchair.gestures.handlers.OpenAppDrawerGestureHandler
import app.lawnchair.gestures.handlers.OpenAppGestureHandler
import app.lawnchair.gestures.handlers.OpenAppSearchGestureHandler
import app.lawnchair.gestures.handlers.OpenAppTarget
import app.lawnchair.gestures.handlers.OpenAssistantHandler
import app.lawnchair.gestures.handlers.OpenNotificationsHandler
import app.lawnchair.gestures.handlers.OpenSearchGestureHandler
import app.lawnchair.gestures.handlers.RecentsGestureHandler
Expand Down Expand Up @@ -61,6 +62,10 @@ sealed class GestureHandlerConfig {
@SerialName("openSearch")
data object OpenSearch : Simple(R.string.gesture_handler_open_search, ::OpenSearchGestureHandler)

@Serializable
@SerialName("openAssistant")
data object OpenAssistant : Simple(R.string.gesture_handler_open_assistant, ::OpenAssistantHandler)

@Serializable
@SerialName("openApp")
data class OpenApp(val appName: String, val target: OpenAppTarget) : GestureHandlerConfig() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ sealed class GestureHandlerOption(
data object OpenAppDrawer : Simple(GestureHandlerConfig.OpenAppDrawer)
data object OpenAppSearch : Simple(GestureHandlerConfig.OpenAppSearch)
data object OpenSearch : Simple(GestureHandlerConfig.OpenSearch)
data object OpenAssistant : Simple(GestureHandlerConfig.OpenAssistant)

data object OpenApp : GestureHandlerOption(
R.string.gesture_handler_open_app_option,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package app.lawnchair.gestures.handlers

import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.provider.Settings
import android.util.Log
import app.lawnchair.LawnchairLauncher

class OpenAssistantHandler(context: Context) : GestureHandler(context) {

override suspend fun onTrigger(launcher: LawnchairLauncher) {
try {
val component = getCurrentlySelectedDefaultAssistant(context)
Log.d(TAG, "Detected assistant: $component")

when {
component == null -> noValidAssistantFound()
isActivity(component) -> launchIntent(Intent(Intent.ACTION_ASSIST).setComponent(component))
isService(component) -> launchIntent(Intent(Intent.ACTION_VOICE_COMMAND))
isInstalled(component.packageName) -> launchIntent(context.packageManager.getLaunchIntentForPackage(component.packageName))
else -> noValidAssistantFound()
}
} catch (e: Exception) {
Log.e(TAG, "Error launching assistant", e)
noValidAssistantFound()
}
}

private fun launchIntent(intent: Intent?) {
intent?.apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK
runCatching { context.startActivity(this) }
.onFailure { Log.e(TAG, "Failed to launch intent: $intent", it) }
} ?: Log.e(TAG, "Intent is null, cannot launch.")
}

private fun noValidAssistantFound() {
Log.e(TAG, "No valid assistant found, opening voice input settings.")
launchIntent(Intent(Settings.ACTION_VOICE_INPUT_SETTINGS))
}

private fun getCurrentlySelectedDefaultAssistant(context: Context): ComponentName? = Settings.Secure.getString(context.contentResolver, "assistant")
?.takeIf { it.isNotEmpty() }
?.let(ComponentName::unflattenFromString)
?: context.packageManager.resolveActivity(Intent(Intent.ACTION_ASSIST), PackageManager.MATCH_DEFAULT_ONLY)
?.activityInfo?.let { ComponentName(it.packageName, it.name) }

private fun isActivity(component: ComponentName) = context.packageManager.queryIntentActivities(Intent().setComponent(component), PackageManager.MATCH_DEFAULT_ONLY).isNotEmpty()

private fun isService(component: ComponentName) = context.packageManager.getInstalledPackages(PackageManager.GET_SERVICES)
.any { it.packageName == component.packageName && it.services?.any { service -> service.name == component.className } == true }

private fun isInstalled(packageName: String) = runCatching {
context.packageManager.getPackageInfo(packageName, 0)
true
}.getOrDefault(false)

companion object {
private const val TAG = "OpenAssistantHandler"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ val options = listOf(
GestureHandlerOption.OpenAppSearch,
GestureHandlerOption.OpenSearch,
GestureHandlerOption.OpenApp,
GestureHandlerOption.OpenAssistant,
)

@Composable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import app.lawnchair.views.overlay.FullScreenOverlayMode
import kotlinx.coroutines.launch

val overlayOptions = listOf(
FullScreenOverlayMode.NONE,
FullScreenOverlayMode.SUCK_IN,
FullScreenOverlayMode.FADE_IN,
)
Expand Down
4 changes: 4 additions & 0 deletions lawnchair/src/app/lawnchair/views/FullScreenOverlayView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -214,5 +214,9 @@ fun Activity.showFullScreenOverlay(
onOverlayReady()
}
}
FullScreenOverlayMode.NONE -> {
targetRootView?.removeView(overlayView)
onOverlayReady()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.annotation.StringRes
import com.android.launcher3.R

enum class FullScreenOverlayMode(val value: String, @StringRes val labelRes: Int) {
NONE("none", R.string.overlay_none),
FADE_IN("fade_in", R.string.overlay_fade_in),
SUCK_IN("suck_in", R.string.overlay_suck_in),
;
Expand Down

0 comments on commit 8be8a08

Please sign in to comment.