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