diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 258a9d09672..820f2b79514 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -307,6 +307,18 @@
+
+
+
+
+
+
+
+
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 983a46392d3..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
@@ -359,6 +359,24 @@ class SettingsFragment(
return@setOnPreferenceClickListener true
}
}
+
+ 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)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ startActivity(intent)
+ true
+ }
+ }
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -560,6 +578,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 getString(commonR.string.unknown_launcher_label)
+ }
+
override fun onPause() {
super.onPause()
snackbar?.dismiss()
@@ -569,6 +601,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/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 09233d47706..03473f1477c 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -185,6 +185,20 @@
android:title="@string/manage_widgets"
android:summary="@string/manage_widgets_summary" />
+
+
+
+
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