Skip to content

Commit

Permalink
feat: prompt user to set as default launcher on startup
Browse files Browse the repository at this point in the history
  • Loading branch information
JunioJsv committed Feb 15, 2024
1 parent 6f925ac commit 298c048
Show file tree
Hide file tree
Showing 10 changed files with 116 additions and 35 deletions.
4 changes: 2 additions & 2 deletions app/build.gradle.kts
Expand Up @@ -17,8 +17,8 @@ android {
minSdk = 21
targetSdk = 33
compileSdk = 33
versionCode = 138
versionName = "1.5.4"
versionCode = 139
versionName = "1.5.5"
setProperty("archivesBaseName", "$applicationId-v$versionName")
}
androidResources {
Expand Down
27 changes: 27 additions & 0 deletions app/src/main/java/juniojsv/minimum/MinimumActivity.kt
Expand Up @@ -2,6 +2,7 @@ package juniojsv.minimum

import android.content.Intent
import android.content.SharedPreferences
import android.content.pm.PackageManager
import android.os.Bundle
import android.provider.MediaStore
import android.view.Menu
Expand All @@ -12,6 +13,7 @@ import androidx.preference.PreferenceManager
import juniojsv.minimum.databinding.MinimumActivityBinding
import juniojsv.minimum.features.applications.ApplicationsFragment
import juniojsv.minimum.features.preferences.PreferencesActivity
import juniojsv.minimum.utils.SetAsDefaultLauncherDialog

class MinimumActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceChangeListener {
private lateinit var binding: MinimumActivityBinding
Expand All @@ -38,6 +40,27 @@ class MinimumActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenc
}
}
}

SetAsDefaultLauncherDialog(object : SetAsDefaultLauncherDialog.Callbacks() {
override fun onNegativeButtonClicked() {
isPromptingSetAsDefaultLauncher = false
}
}).apply {
if (!isAlreadyDefaultLauncher() && isPromptingSetAsDefaultLauncher) {
show(supportFragmentManager, SetAsDefaultLauncherDialog.TAG)
}
}
}

private fun isAlreadyDefaultLauncher(): Boolean {
return getCurrentLauncherClassName() == componentName.className
}

private fun getCurrentLauncherClassName(): String? {
return packageManager.resolveActivity(Intent(Intent.ACTION_MAIN).apply {
addCategory(Intent.CATEGORY_HOME)
addCategory(Intent.CATEGORY_DEFAULT)
}, PackageManager.MATCH_DEFAULT_ONLY)?.activityInfo?.name
}

override fun onCreateOptionsMenu(menu: Menu): Boolean {
Expand Down Expand Up @@ -79,4 +102,8 @@ class MinimumActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenc
}
}
}

companion object {
var isPromptingSetAsDefaultLauncher = true
}
}
Expand Up @@ -29,38 +29,36 @@ class ApplicationOptionsDialog(
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return activity?.let { activity ->
val options = arrayListOf(
LabeledCallback(
if (application.isPinned) getString(R.string.unpin_of_top)
else getString(R.string.pin_at_top),
callbacks::onTogglePinAtTop
),
LabeledCallback(getString(R.string.information)) {
activity.startActivity(
Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.parse("package:${application.packageName}")
)
val options = arrayListOf(
LabeledCallback(
if (application.isPinned) getString(R.string.unpin_of_top)
else getString(R.string.pin_at_top),
callbacks::onTogglePinAtTop
),
LabeledCallback(getString(R.string.information)) {
requireContext().startActivity(
Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.parse("package:${application.packageName}")
)
},
LabeledCallback(getString(R.string.uninstall)) {
activity.startActivity(
Intent(
ACTION_DELETE,
Uri.parse("package:${application.packageName}")
)
)
},
LabeledCallback(getString(R.string.uninstall)) {
requireContext().startActivity(
Intent(
ACTION_DELETE,
Uri.parse("package:${application.packageName}")
)
},
)
)
},
)

AlertDialog.Builder(activity).apply {
setTitle(application.label)
setItems(
options.map { it.label }.toTypedArray()
) { _, index -> options[index].callback() }
}.create()
} ?: throw IllegalStateException("Activity can't be null")
return AlertDialog.Builder(requireContext()).apply {
setTitle(application.label)
setItems(
options.map { it.label }.toTypedArray()
) { _, index -> options[index].callback() }
}.create()
}

companion object {
Expand Down
Expand Up @@ -224,7 +224,7 @@ class ApplicationsFragment : Fragment(), ApplicationViewHolder.Callbacks, Corout
}

companion object {
val TAG: String = this::class.java.name
const val TAG = "ApplicationsFragment"
private val maxMemory = (Runtime.getRuntime().maxMemory() / 1024).toInt()

private object BitmapCache : LruCache<String, Bitmap>(maxMemory / 8) {
Expand Down
Expand Up @@ -14,6 +14,6 @@ class PreferencesFragment : PreferenceFragmentCompat() {
}

companion object {
val TAG: String = this::class.java.name
const val TAG: String = "PreferencesFragment"
}
}
@@ -0,0 +1,42 @@
package juniojsv.minimum.utils

import android.app.Dialog
import android.content.Intent
import android.os.Bundle
import android.provider.Settings
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatDialogFragment
import juniojsv.minimum.R

class SetAsDefaultLauncherDialog(private val callbacks: Callbacks) : AppCompatDialogFragment() {

abstract class Callbacks {
open fun onPositiveButtonClicked() {}
open fun onNegativeButtonClicked() {}
}

private fun openDefaultLauncherSettings() {
val intent = Intent(Settings.ACTION_HOME_SETTINGS)
startActivity(intent)
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return AlertDialog.Builder(requireContext()).apply {
setTitle(getString(R.string.set_as_default_launcher))
setMessage(getString(R.string.ask_to_set_as_default_launcher))
setPositiveButton(R.string.yes) { dialog, _ ->
callbacks.onPositiveButtonClicked()
openDefaultLauncherSettings()
dialog.dismiss()
}
setNegativeButton(R.string.no) { dialog, _ ->
callbacks.onNegativeButtonClicked()
dialog.dismiss()
}
}.create()
}

companion object {
const val TAG = "SetAsDefaultLauncherDialog"
}
}
4 changes: 3 additions & 1 deletion app/src/main/res/layout/application_grid_variant.xml
Expand Up @@ -4,7 +4,9 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless"
android:gravity="center_horizontal">
android:gravity="center_horizontal"
android:paddingStart="8dp"
android:paddingEnd="8dp">

<include
android:id="@+id/include_application_icon"
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/res/layout/application_list_variant.xml
Expand Up @@ -3,7 +3,9 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?selectableItemBackground">
android:background="?selectableItemBackground"
android:paddingStart="8dp"
android:paddingEnd="8dp">

<include
android:id="@+id/include_application_icon"
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/res/values-pt-rBR/strings.xml
Expand Up @@ -25,4 +25,9 @@
<string name="unpin_of_top">Desafixar do topo</string>
<string name="information">Informações</string>
<string name="search">Pesquisar</string>

<string name="set_as_default_launcher">Definir como Launcher Padrão</string>
<string name="ask_to_set_as_default_launcher">Você deseja definir este aplicativo como o Launcher Padrão?</string>
<string name="yes">Sim</string>
<string name="no">Não</string>
</resources>
5 changes: 5 additions & 0 deletions app/src/main/res/values/strings.xml
Expand Up @@ -40,4 +40,9 @@
<string name="unpin_of_top">Unpin of top</string>
<string name="information">Information</string>
<string name="search">Search</string>

<string name="set_as_default_launcher">Set as Default Launcher</string>
<string name="ask_to_set_as_default_launcher">Do you want to set this app as the Default Launcher?</string>
<string name="yes">Yes</string>
<string name="no">No</string>
</resources>

0 comments on commit 298c048

Please sign in to comment.