From 049657372d2fb42232dcbedfb81ef06b54984480 Mon Sep 17 00:00:00 2001 From: Filip Petrovski Date: Thu, 22 May 2025 18:20:33 +0200 Subject: [PATCH 1/4] Add option to set HA as launcher --- app/src/main/AndroidManifest.xml | 6 +++++ .../android/settings/SettingsFragment.kt | 27 +++++++++++++++++++ app/src/main/res/xml/preferences.xml | 5 ++++ common/src/main/res/values/strings.xml | 2 ++ 4 files changed, 40 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 258a9d09672..86031a1b9d3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -305,6 +305,12 @@ android:scheme="homeassistant" android:host="navigate" /> + + + + + + ("set_launcher_app")?.let { + it.summary = getString(commonR.string.default_launcher_prompt_def, getDefaultLauncherInfo()) + it.setOnPreferenceClickListener { + val intent = Intent(Settings.ACTION_HOME_SETTINGS) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + startActivity(intent) + true + } + } } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -560,6 +572,20 @@ class SettingsFragment( override fun getPackageManager(): PackageManager? = context?.packageManager + private fun getDefaultLauncherInfo(): String { + val intent = Intent(Intent.ACTION_MAIN) + .addCategory(Intent.CATEGORY_HOME) + + getPackageManager()?.let { packageManager -> + packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY)?.let { + val packageName = it.activityInfo.packageName + return packageManager.getApplicationLabel(packageManager.getApplicationInfo(packageName, 0)).toString() + } + } + + return UNKNOWN_LAUNCHER_LABEL + } + override fun onPause() { super.onPause() snackbar?.dismiss() @@ -569,6 +595,7 @@ class SettingsFragment( super.onResume() activity?.title = getString(commonR.string.companion_app) context?.let { presenter.updateSuggestions(it) } + findPreference("set_launcher_app")?.summary = getString(commonR.string.default_launcher_prompt_def, getDefaultLauncherInfo()) } override fun onDestroy() { diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 09233d47706..73b13a2839a 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -37,6 +37,11 @@ + Thermostat tile Heating Cooling + Change launcher app + Open settings to choose a default launcher app. Currently set to %s From 8c4a0ec4a64d88c5fb48d1edb9b45970030b7e82 Mon Sep 17 00:00:00 2001 From: Filip Petrovski Date: Wed, 28 May 2025 12:48:13 +0200 Subject: [PATCH 2/4] Extract string --- .../companion/android/settings/SettingsFragment.kt | 3 +-- common/src/main/res/values/strings.xml | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsFragment.kt b/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsFragment.kt index 53114d7fd34..5a6ced82d25 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsFragment.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsFragment.kt @@ -60,7 +60,6 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import timber.log.Timber -private const val UNKNOWN_LAUNCHER_LABEL = "unknown app" class SettingsFragment( private val presenter: SettingsPresenter, @@ -583,7 +582,7 @@ class SettingsFragment( } } - return UNKNOWN_LAUNCHER_LABEL + return getString(commonR.string.unknown_launcher_label) } override fun onPause() { diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index fd872b7e37e..b6f83814cca 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -1384,4 +1384,5 @@ Cooling Change launcher app Open settings to choose a default launcher app. Currently set to %s + unknown app From 661169c177a8f4ea30e5d83b308e88872d84e24f Mon Sep 17 00:00:00 2001 From: Filip Petrovski Date: Sat, 31 May 2025 23:59:20 +0200 Subject: [PATCH 3/4] Add Launcher activity alias --- app/src/main/AndroidManifest.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 86031a1b9d3..820f2b79514 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -305,13 +305,19 @@ android:scheme="homeassistant" android:host="navigate" /> + + - + From 8c153fc51af954c7e5e13361e1e5247a6f633b44 Mon Sep 17 00:00:00 2001 From: Filip Petrovski Date: Mon, 2 Jun 2025 20:45:49 +0200 Subject: [PATCH 4/4] Create switch preference to enable launcher mode --- .../android/settings/SettingsFragment.kt | 9 ++++++++- .../android/settings/SettingsPresenterImpl.kt | 18 ++++++++++++++++++ app/src/main/res/xml/preferences.xml | 19 ++++++++++++++----- .../common/data/prefs/PrefsRepository.kt | 4 ++++ .../common/data/prefs/PrefsRepositoryImpl.kt | 9 +++++++++ common/src/main/res/values/strings.xml | 3 +++ 6 files changed, 56 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsFragment.kt b/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsFragment.kt index 5a6ced82d25..0fecf4ced39 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsFragment.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsFragment.kt @@ -60,7 +60,6 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import timber.log.Timber - class SettingsFragment( private val presenter: SettingsPresenter, private val langProvider: LanguagesProvider @@ -361,7 +360,15 @@ class SettingsFragment( } } + findPreference("enable_ha_launcher")?.let { switchPreference -> + switchPreference.setOnPreferenceClickListener { + findPreference("set_launcher_app")?.isVisible = switchPreference.isChecked + true + } + } + findPreference("set_launcher_app")?.let { + it.isVisible = findPreference("enable_ha_launcher")?.isChecked ?: false it.summary = getString(commonR.string.default_launcher_prompt_def, getDefaultLauncherInfo()) it.setOnPreferenceClickListener { val intent = Intent(Settings.ACTION_HOME_SETTINGS) diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsPresenterImpl.kt b/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsPresenterImpl.kt index 3bdb886b806..8767ccf54a5 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsPresenterImpl.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsPresenterImpl.kt @@ -64,6 +64,11 @@ class SettingsPresenterImpl @Inject constructor( "io.homeassistant.companion.android.assist.VoiceCommandIntentActivity" ) + private val launcherAliasComponent = ComponentName( + BuildConfig.APPLICATION_ID, + "io.homeassistant.companion.android.launch.LauncherAlias" + ) + private var suggestionFlow = MutableStateFlow(null) override fun getBoolean(key: String, defValue: Boolean): Boolean = runBlocking { @@ -78,6 +83,7 @@ class SettingsPresenterImpl @Inject constructor( val componentSetting = view.getPackageManager()?.getComponentEnabledSetting(voiceCommandAppComponent) componentSetting != null && componentSetting != PackageManager.COMPONENT_ENABLED_STATE_DISABLED } + "enable_ha_launcher" -> prefsRepository.isLauncherCapabilityEnabled() else -> throw IllegalArgumentException("No boolean found by this key: $key") } } @@ -97,6 +103,10 @@ class SettingsPresenterImpl @Inject constructor( if (value) PackageManager.COMPONENT_ENABLED_STATE_DEFAULT else PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP ) + "enable_ha_launcher" -> { + prefsRepository.setLauncherCapabilityEnabled(value) + enableLauncherMode(value) + } else -> throw IllegalArgumentException("No boolean found by this key: $key") } } @@ -295,4 +305,12 @@ class SettingsPresenterImpl @Inject constructor( suggestionFlow.emit(null) } } + + private fun enableLauncherMode(enable: Boolean) { + view.getPackageManager()?.setComponentEnabledSetting( + launcherAliasComponent, + if (enable) PackageManager.COMPONENT_ENABLED_STATE_ENABLED else PackageManager.COMPONENT_ENABLED_STATE_DISABLED, + PackageManager.DONT_KILL_APP + ) + } } diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 73b13a2839a..03473f1477c 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -37,11 +37,6 @@ - + + + + Thermostat tile Heating Cooling + Launcher + Enable Home Assistant launcher mode + Add Home Assistant to the list of available device launchers that can replace your device\'s home screen Change launcher app Open settings to choose a default launcher app. Currently set to %s unknown app