Skip to content

Commit

Permalink
Introduces the ability to rename apps. Additionally it fixes Issue #117
Browse files Browse the repository at this point in the history
… (#119)

* Add feature app rename

* Fix Issue #117
  • Loading branch information
fs-sifat authored Mar 12, 2024
1 parent 02eed07 commit 165e0bb
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 16 deletions.
22 changes: 15 additions & 7 deletions app/src/main/kotlin/rasel/lunar/launcher/apps/AppDrawer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ import rasel.lunar.launcher.helpers.Constants.Companion.KEY_KEYBOARD_SEARCH
import rasel.lunar.launcher.helpers.Constants.Companion.KEY_QUICK_LAUNCH
import rasel.lunar.launcher.helpers.Constants.Companion.KEY_SCROLLBAR_HEIGHT
import rasel.lunar.launcher.helpers.Constants.Companion.KEY_STATUS_BAR
import rasel.lunar.launcher.helpers.Constants.Companion.PREFS_APP_NAMES
import rasel.lunar.launcher.helpers.Constants.Companion.PREFS_SETTINGS
import java.text.Normalizer
import java.util.*
Expand All @@ -75,13 +76,14 @@ internal class AppDrawer : Fragment() {
private val numberPattern = Pattern.compile("[0-9]")
private val alphabetPattern = Pattern.compile("[A-Z]")
@JvmStatic var settingsPrefs: SharedPreferences? = null
@JvmStatic var appNamesPrefs: SharedPreferences? = null
@JvmStatic var alphabetList = mutableListOf<String>()
@JvmStatic var letterPreview: MaterialTextView? = null

fun listenScroll(letter: String) {
packageList.clear()
for (resolver in packageInfoList) {
val appName = resolver.loadLabel(packageManager).toString()
val appName = appNamesPrefs?.getString(resolver.activityInfo.packageName, resolver.loadLabel(packageManager).toString())!!
when {
letter == "#" -> {
if (numberPattern.matcher(appName.first().uppercase()).matches()) {
Expand All @@ -101,14 +103,15 @@ internal class AppDrawer : Fragment() {
}
}
}
appsAdapter?.updateData(packageList)
appsAdapter?.updateData(packageList.sortedBy { it.appName.lowercase() })
}
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
binding = AppDrawerBinding.inflate(inflater, container, false)

settingsPrefs = requireContext().getSharedPreferences(PREFS_SETTINGS, 0)
appNamesPrefs = requireContext().getSharedPreferences(PREFS_APP_NAMES, 0)
layoutType = settingsPrefs!!.getInt(KEY_APPS_LAYOUT, 0)
packageManager = lActivity?.packageManager
appsAdapter = AppsAdapter(layoutType, packageManager!!, childFragmentManager, binding.appsCount)
Expand Down Expand Up @@ -185,7 +188,7 @@ internal class AppDrawer : Fragment() {
}

/* update app list with app and package name */
private fun fetchApps() {
fun fetchApps() {
packageInfoList = (if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
packageManager?.queryIntentActivities(
Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER),
Expand All @@ -203,12 +206,15 @@ internal class AppDrawer : Fragment() {
/* add package and app names to the list */
packageList.clear()
for (resolver in packageInfoList) {
packageList.add(Packages(resolver.activityInfo.packageName, resolver.loadLabel(packageManager).toString()))
packageList.add(Packages(
resolver.activityInfo.packageName, appNamesPrefs?.getString(resolver.activityInfo.packageName,
resolver.loadLabel(packageManager).toString())!!
))
}

when {
packageList.size < 1 -> return
else -> appsAdapter?.updateData(packageList)
else -> appsAdapter?.updateData(packageList.sortedBy { it.appName.lowercase() })
}
}

Expand Down Expand Up @@ -241,7 +247,9 @@ internal class AppDrawer : Fragment() {
/* check each app name and add if it matches the search string */
packageList.clear()
for (resolver in packageInfoList) {
resolver.loadLabel(packageManager).toString().let {
val appName = appNamesPrefs?.getString(resolver.activityInfo.packageName, resolver.loadLabel(packageManager).toString())!!

appName.let {
if (normalize(it).contains(searchString)) {
packageList.add(Packages(resolver.activityInfo.packageName, it))
}
Expand All @@ -250,7 +258,7 @@ internal class AppDrawer : Fragment() {

if (packageList.size == 1 && settingsPrefs!!.getBoolean(KEY_QUICK_LAUNCH, true))
startActivity(packageManager?.getLaunchIntentForPackage(packageList[0].packageName))
else appsAdapter?.updateData(packageList)
else appsAdapter?.updateData(packageList.sortedBy { it.appName.lowercase() })
}

private fun normalize(str: String): String {
Expand Down
48 changes: 47 additions & 1 deletion app/src/main/kotlin/rasel/lunar/launcher/apps/AppMenu.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import android.annotation.SuppressLint
import android.app.ActivityOptions
import android.content.ActivityNotFoundException
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
Expand All @@ -32,9 +33,11 @@ import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.Settings
import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Toast
Expand All @@ -48,6 +51,7 @@ import com.google.android.material.button.MaterialButtonToggleGroup
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import rasel.lunar.launcher.LauncherActivity.Companion.lActivity
import rasel.lunar.launcher.R
import rasel.lunar.launcher.apps.AppDrawer.Companion.appNamesPrefs
import rasel.lunar.launcher.databinding.ActivityBrowserDialogBinding
import rasel.lunar.launcher.databinding.AppInfoDialogBinding
import rasel.lunar.launcher.databinding.AppMenuBinding
Expand All @@ -70,6 +74,7 @@ internal class AppMenu : BottomSheetDialogFragment() {
private lateinit var packageName: String
private lateinit var packageManager: PackageManager
private lateinit var appInfo: ApplicationInfo
private lateinit var defAppName: String

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
binding = AppMenuBinding.inflate(inflater, container, false)
Expand All @@ -87,8 +92,13 @@ internal class AppMenu : BottomSheetDialogFragment() {
packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA)
}

/* get default app name */
val resolve = packageManager.resolveActivity(Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER).setPackage(packageName), 0)
defAppName = resolve?.loadLabel(packageManager).toString()

/* set application name and package name */
binding.appName.text = packageManager.getApplicationLabel(appInfo)
binding.appName.setText(appNamesPrefs?.getString(packageName, defAppName))
binding.appName.hint = defAppName
binding.appPackage.text = packageName
/* favorite apps */
favoriteApps()
Expand All @@ -105,6 +115,7 @@ internal class AppMenu : BottomSheetDialogFragment() {
copyToClipboard(requireContext(), packageName)
}

appName()
binding.detailedInfo.setOnClickListener { detailedInfo() }
binding.activityBrowser.setOnClickListener { activityBrowser() }
binding.appStore.setOnClickListener { appStore() }
Expand Down Expand Up @@ -165,6 +176,41 @@ internal class AppMenu : BottomSheetDialogFragment() {
}
}

private fun appName()
{
binding.appName.setOnFocusChangeListener { _, hasFocus ->
if (hasFocus) {
binding.appName.minWidth = resources.getDimensionPixelOffset(R.dimen.twoSeventySix)
}
else {
val imm = requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(binding.appName.windowToken, 0)

binding.appName.minWidth = resources.getDimensionPixelOffset(R.dimen.zero)
binding.appName.apply {
if (text!!.isBlank()) setText(defAppName)
else setText(text!!.trim())

if (text.toString() == defAppName) appNamesPrefs?.edit()!!.remove(packageName).apply()
else appNamesPrefs?.edit()!!.putString(packageName, text.toString()).apply()

(requireParentFragment() as AppDrawer).fetchApps()
}
}
}

binding.appName.setOnKeyListener { _, keyCode, event ->
if (event.action == KeyEvent.ACTION_DOWN)
{
if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_BACK) {
binding.appName.clearFocus()
return@setOnKeyListener true
}
}
false
}
}

/* detailed info dialog */
@SuppressLint("SetTextI18n")
private fun detailedInfo() {
Expand Down
6 changes: 5 additions & 1 deletion app/src/main/kotlin/rasel/lunar/launcher/apps/AppsAdapter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.updatePadding
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentManager
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
Expand Down Expand Up @@ -103,7 +104,10 @@ internal class AppsAdapter(

/* on long click - open app menu */
setOnLongClickListener {
AppMenu().show(fragmentManager, item.packageName)
AppMenu().let {
it.setStyle(DialogFragment.STYLE_NORMAL, R.style.BottomSheetDialog)
it.show(fragmentManager, item.packageName)
}
true
}
}
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/kotlin/rasel/lunar/launcher/helpers/Constants.kt
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,9 @@ internal class Constants {
const val requestPickWidget = 103
const val requestCreateWidget = 104

/* app names */
const val PREFS_APP_NAMES = "rasel.lunar.launcher.APP_NAMES"

/* favorite apps */
const val PREFS_FAVORITE_APPS = "rasel.lunar.launcher.FAVORITE_APPS"
const val KEY_APP_NO_ = "app_no_"
Expand Down
30 changes: 23 additions & 7 deletions app/src/main/res/layout/app_menu.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,32 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:padding="@dimen/twelve">
android:padding="@dimen/twelve"
android:clickable="true"
android:focusableInTouchMode="true">

<com.google.android.material.textview.MaterialTextView
android:id="@+id/appName"
style="@style/TextAppearance.Material3.TitleLarge"
android:layout_width="wrap_content"
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/appNameInputLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
app:hintEnabled="false"
app:boxStrokeWidth="@dimen/zero"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toTopOf="parent" >

<com.google.android.material.textfield.TextInputEditText
android:id="@+id/appName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="@dimen/zero"
android:gravity="center"
android:padding="@dimen/eight"
android:inputType="textNoSuggestions"
android:textAppearance="@style/TextAppearance.Material3.TitleLarge" />

</com.google.android.material.textfield.TextInputLayout>

<com.google.android.material.button.MaterialButton
android:id="@+id/appPackage"
Expand All @@ -23,7 +39,7 @@
android:layout_marginTop="@dimen/eight"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/appName" />
app:layout_constraintTop_toBottomOf="@+id/appNameInputLayout" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/activityBrowser"
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/styles.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

<style name="BottomSheetDialog" parent="Theme.Material3.DayNight.BottomSheetDialog">
<item name="android:windowSoftInputMode">adjustResize</item>
<item name="android:navigationBarColor">?attr/colorSurface</item>
</style>

<style name="SettingsNavBar">
Expand Down

0 comments on commit 165e0bb

Please sign in to comment.