Skip to content

Commit c989c91

Browse files
authored
Add option to set HA as launcher (#5348)
* Add Launcher activity alias * Create switch preference to enable launcher mode
1 parent 4859b75 commit c989c91

File tree

5 files changed

+86
-0
lines changed

5 files changed

+86
-0
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,18 @@
307307
</intent-filter>
308308
</activity>
309309

310+
<activity-alias
311+
android:name=".launch.LauncherAlias"
312+
android:targetActivity=".launch.LaunchActivity"
313+
android:enabled="false"
314+
android:exported="true">
315+
<intent-filter>
316+
<action android:name="android.intent.action.MAIN" />
317+
<category android:name="android.intent.category.HOME" />
318+
<category android:name="android.intent.category.DEFAULT" />
319+
</intent-filter>
320+
</activity-alias>
321+
310322
<activity android:name=".launch.link.LinkActivity"
311323
android:exported="true"
312324
android:launchMode="singleTask">

app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsFragment.kt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,8 @@ class SettingsFragment(
359359
return@setOnPreferenceClickListener true
360360
}
361361
}
362+
363+
setupLauncherPrefs()
362364
}
363365

364366
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -538,6 +540,39 @@ class SettingsFragment(
538540
?: false
539541
}
540542

543+
private fun getDefaultLauncherInfo(): String {
544+
val intent = Intent(Intent.ACTION_MAIN)
545+
.addCategory(Intent.CATEGORY_HOME)
546+
547+
getPackageManager()?.let { packageManager ->
548+
packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY)?.let {
549+
val packageName = it.activityInfo.packageName
550+
return packageManager.getApplicationLabel(packageManager.getApplicationInfo(packageName, 0)).toString()
551+
}
552+
}
553+
554+
return getString(commonR.string.unknown_launcher_label)
555+
}
556+
557+
private fun setupLauncherPrefs() {
558+
val launcherSwitchPref = findPreference<SwitchPreference>("enable_ha_launcher")
559+
val launcherPref = findPreference<Preference>("set_launcher_app")
560+
561+
launcherSwitchPref?.setOnPreferenceClickListener {
562+
launcherPref?.isVisible = launcherSwitchPref.isChecked
563+
true
564+
}
565+
566+
launcherPref?.apply {
567+
isVisible = launcherSwitchPref?.isChecked ?: false
568+
summary = getString(commonR.string.default_launcher_prompt_def, getDefaultLauncherInfo())
569+
setOnPreferenceClickListener {
570+
startActivity(Intent(Settings.ACTION_HOME_SETTINGS).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
571+
true
572+
}
573+
}
574+
}
575+
541576
override fun onAddServerResult(success: Boolean, serverId: Int?) {
542577
view?.let {
543578
snackbar = Snackbar.make(
@@ -569,6 +604,7 @@ class SettingsFragment(
569604
super.onResume()
570605
activity?.title = getString(commonR.string.companion_app)
571606
context?.let { presenter.updateSuggestions(it) }
607+
findPreference<Preference>("set_launcher_app")?.summary = getString(commonR.string.default_launcher_prompt_def, getDefaultLauncherInfo())
572608
}
573609

574610
override fun onDestroy() {

app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsPresenterImpl.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ class SettingsPresenterImpl @Inject constructor(
6464
"io.homeassistant.companion.android.assist.VoiceCommandIntentActivity",
6565
)
6666

67+
private val launcherAliasComponent = ComponentName(
68+
BuildConfig.APPLICATION_ID,
69+
"io.homeassistant.companion.android.launch.LauncherAlias",
70+
)
71+
6772
private var suggestionFlow = MutableStateFlow<SettingsHomeSuggestion?>(null)
6873

6974
override fun getBoolean(key: String, defValue: Boolean): Boolean = runBlocking {
@@ -78,6 +83,10 @@ class SettingsPresenterImpl @Inject constructor(
7883
val componentSetting = view.getPackageManager()?.getComponentEnabledSetting(voiceCommandAppComponent)
7984
componentSetting != null && componentSetting != PackageManager.COMPONENT_ENABLED_STATE_DISABLED
8085
}
86+
"enable_ha_launcher" -> {
87+
val componentSetting = view.getPackageManager()?.getComponentEnabledSetting(launcherAliasComponent)
88+
componentSetting != null && componentSetting != PackageManager.COMPONENT_ENABLED_STATE_DISABLED
89+
}
8190
else -> throw IllegalArgumentException("No boolean found by this key: $key")
8291
}
8392
}
@@ -97,6 +106,7 @@ class SettingsPresenterImpl @Inject constructor(
97106
if (value) PackageManager.COMPONENT_ENABLED_STATE_DEFAULT else PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
98107
PackageManager.DONT_KILL_APP,
99108
)
109+
"enable_ha_launcher" -> enableLauncherMode(value)
100110
else -> throw IllegalArgumentException("No boolean found by this key: $key")
101111
}
102112
}
@@ -295,4 +305,12 @@ class SettingsPresenterImpl @Inject constructor(
295305
suggestionFlow.emit(null)
296306
}
297307
}
308+
309+
private fun enableLauncherMode(enable: Boolean) {
310+
view.getPackageManager()?.setComponentEnabledSetting(
311+
launcherAliasComponent,
312+
if (enable) PackageManager.COMPONENT_ENABLED_STATE_ENABLED else PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
313+
if (enable) PackageManager.DONT_KILL_APP else 0,
314+
)
315+
}
298316
}

app/src/main/res/xml/preferences.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,20 @@
185185
android:title="@string/manage_widgets"
186186
android:summary="@string/manage_widgets_summary" />
187187
</PreferenceCategory>
188+
<PreferenceCategory
189+
android:title="@string/launcher">
190+
<SwitchPreference
191+
android:key="enable_ha_launcher"
192+
android:icon="@drawable/ic_android_debug_bridge"
193+
app:isPreferenceVisible="true"
194+
android:title="@string/launcher_option_title"
195+
android:summary="@string/launcher_option_summary" />
196+
<Preference
197+
android:key="set_launcher_app"
198+
android:title="@string/default_launcher_prompt"
199+
android:summary="@string/default_launcher_prompt_def"
200+
android:icon="@drawable/ic_home_variant_outline" />
201+
</PreferenceCategory>
188202
<PreferenceCategory
189203
android:title="@string/need_help">
190204
<Preference

common/src/main/res/values/strings.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1384,4 +1384,10 @@
13841384
<string name="thermostat_tile">Thermostat tile</string>
13851385
<string name="climate_heating">Heating</string>
13861386
<string name="climate_cooling">Cooling</string>
1387+
<string name="launcher">Device home screen</string>
1388+
<string name="launcher_option_title">Allow as home app</string>
1389+
<string name="launcher_option_summary">Include Home Assistant in the list of available home apps/launchers that can replace your device\'s home screen</string>
1390+
<string name="default_launcher_prompt">Change home app</string>
1391+
<string name="default_launcher_prompt_def">Open settings to choose your default home app. Currently set to %s.</string>
1392+
<string name="unknown_launcher_label">unknown app</string>
13871393
</resources>

0 commit comments

Comments
 (0)