diff --git a/CHANGELOG.md b/CHANGELOG.md index c90e711b..13487911 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Changed +- The app will now prompt to set as default launcher on startup ([#230]) ## [1.2.0] - 2025-07-15 ### Added @@ -68,6 +70,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#106]: https://github.com/FossifyOrg/Launcher/issues/106 [#115]: https://github.com/FossifyOrg/Launcher/issues/115 [#182]: https://github.com/FossifyOrg/Launcher/issues/182 +[#230]: https://github.com/FossifyOrg/Launcher/issues/230 [Unreleased]: https://github.com/FossifyOrg/Launcher/compare/1.2.0...HEAD [1.2.0]: https://github.com/FossifyOrg/Launcher/compare/1.1.4...1.2.0 diff --git a/app/src/main/kotlin/org/fossify/home/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/home/activities/MainActivity.kt index dd66f39e..a942bc0e 100644 --- a/app/src/main/kotlin/org/fossify/home/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/home/activities/MainActivity.kt @@ -21,6 +21,7 @@ import android.graphics.drawable.Drawable import android.os.Bundle import android.os.Handler import android.os.Looper +import android.provider.Settings import android.provider.Telephony import android.telecom.TelecomManager import android.view.ContextThemeWrapper @@ -164,6 +165,10 @@ class MainActivity : SimpleActivity(), FlingListener { clickedGridItem = it ) } + + if (!isDefaultLauncher()) { + requestHomeRole() + } } override fun onNewIntent(intent: Intent) { @@ -775,7 +780,7 @@ class MainActivity : SimpleActivity(), FlingListener { Gravity.TOP or Gravity.END ).apply { inflate(R.menu.menu_home_screen) - menu.findItem(R.id.set_as_default).isVisible = isQPlus() && !isDefaultLauncher() + menu.findItem(R.id.set_as_default).isVisible = !isDefaultLauncher() setOnMenuItemClickListener { item -> when (item.itemId) { R.id.widgets -> showWidgetsFragment() @@ -841,6 +846,18 @@ class MainActivity : SimpleActivity(), FlingListener { } private fun launchSetAsDefaultIntent() { + val intents = listOf( + Intent(Settings.ACTION_HOME_SETTINGS), + Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS), + Intent(Settings.ACTION_SETTINGS) + ) + val intent = intents.firstOrNull { it.resolveActivity(packageManager) != null } + if (intent != null) { + startActivity(intent) + } + } + + private fun requestHomeRole() { if (isQPlus()) { startActivityForResult( roleManager.createRequestRoleIntent(RoleManager.ROLE_HOME), diff --git a/app/src/main/kotlin/org/fossify/home/extensions/Context.kt b/app/src/main/kotlin/org/fossify/home/extensions/Context.kt index a705f668..2a93b5b3 100644 --- a/app/src/main/kotlin/org/fossify/home/extensions/Context.kt +++ b/app/src/main/kotlin/org/fossify/home/extensions/Context.kt @@ -1,14 +1,18 @@ package org.fossify.home.extensions -import android.annotation.TargetApi import android.app.role.RoleManager import android.appwidget.AppWidgetProviderInfo +import android.content.ComponentName import android.content.Context +import android.content.Intent +import android.content.IntentFilter import android.content.pm.LauncherApps import android.graphics.drawable.Drawable import android.os.Build import android.os.Process import android.util.Size +import androidx.annotation.RequiresApi +import org.fossify.commons.helpers.isQPlus import org.fossify.commons.helpers.isSPlus import org.fossify.home.databases.AppsDatabase import org.fossify.home.helpers.Config @@ -31,7 +35,7 @@ val Context.homeScreenGridItemsDB: HomeScreenGridItemsDao val Context.hiddenIconsDB: HiddenIconsDao get() = AppsDatabase.getInstance(applicationContext).HiddenIconsDao() -@get:TargetApi(Build.VERSION_CODES.Q) +@get:RequiresApi(Build.VERSION_CODES.Q) val Context.roleManager: RoleManager get() = getSystemService(RoleManager::class.java) @@ -76,9 +80,20 @@ fun Context.getCellCount(size: Int): Int { return max(tiles, 1) } -@TargetApi(Build.VERSION_CODES.Q) fun Context.isDefaultLauncher(): Boolean { - return with(roleManager) { - isRoleAvailable(RoleManager.ROLE_HOME) && isRoleHeld(RoleManager.ROLE_HOME) + return if (isQPlus()) { + with(roleManager) { + isRoleAvailable(RoleManager.ROLE_HOME) && isRoleHeld(RoleManager.ROLE_HOME) + } + } else { + val filters = ArrayList() + val activities = ArrayList() + @Suppress("DEPRECATION") + packageManager.getPreferredActivities(filters, activities, null) + return activities.indices.any { i -> + activities[i].packageName == packageName && + filters[i].hasAction(Intent.ACTION_MAIN) && + filters[i].hasCategory(Intent.CATEGORY_HOME) + } } }