diff --git a/app/build.gradle b/app/build.gradle index c75bb3d..103ce56 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { minSdkVersion 21 targetSdkVersion 35 compileSdk 35 - versionCode 40 - versionName "0.1.0" + versionCode 39 + versionName "0.0.23" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/de/jrpie/android/launcher/Functions.kt b/app/src/main/java/de/jrpie/android/launcher/Functions.kt index d5e8d13..57f13a5 100644 --- a/app/src/main/java/de/jrpie/android/launcher/Functions.kt +++ b/app/src/main/java/de/jrpie/android/launcher/Functions.kt @@ -194,7 +194,7 @@ fun getApps( loadList.add(detailedAppInfo) } } - loadList.sortBy { it.getCustomLabel(context) } + loadList.sortBy { it.getCustomLabel(context).toString() } var end = System.currentTimeMillis() Log.i(LOG_TAG, "${loadList.size} apps loaded (${end - start}ms)") diff --git a/app/src/main/java/de/jrpie/android/launcher/apps/PrivateSpace.kt b/app/src/main/java/de/jrpie/android/launcher/apps/PrivateSpace.kt index e44ff1c..a1241af 100644 --- a/app/src/main/java/de/jrpie/android/launcher/apps/PrivateSpace.kt +++ b/app/src/main/java/de/jrpie/android/launcher/apps/PrivateSpace.kt @@ -91,7 +91,6 @@ fun isPrivateSpaceLocked(context: Context): Boolean { val privateSpaceUser = getPrivateSpaceUser(context) ?: return false return userManager.isQuietModeEnabled(privateSpaceUser) } - fun lockPrivateSpace(context: Context, lock: Boolean) { if (!isPrivateSpaceSupported()) { return @@ -124,16 +123,10 @@ fun togglePrivateSpaceLock(context: Context) { } fun hidePrivateSpaceWhenLocked(context: Context): Boolean { - // Trying to access the setting as a 3rd party launcher raises a security exception. - // This is an Android bug: https://issuetracker.google.com/issues/352276244#comment5 - // The logic for this is implemented. - // TODO: replace this once the Android bug is fixed - return false - // TODO: perhaps this should be cached - // https://cs.android.com/android/platform/superproject/main/+/main:packages/apps/Launcher3/src/com/android/launcher3/util/SettingsCache.java;l=61;drc=56bf7ad33bc9d5ed3c18e7abefeec5c177ec75d7 - // val key = "hide_privatespace_entry_point" - // return Settings.Secure.getInt(context.contentResolver, key, 0) == 1 + // https://cs.android.com/android/platform/superproject/main/+/main:packages/apps/Launcher3/src/com/android/launcher3/util/SettingsCache.java;l=61;drc=56bf7ad33bc9d5ed3c18e7abefeec5c177ec75d7 + val key = "hide_privatespace_entry_point" + return Settings.Secure.getInt(context.contentResolver, key, 0) == 1 } diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/Helper.kt b/app/src/main/java/de/jrpie/android/launcher/ui/Helper.kt index 1ca4d2b..b8fc82e 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/Helper.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/Helper.kt @@ -27,14 +27,10 @@ fun View.blink( } // Taken from: https://stackoverflow.com/a/30340794/12787264 -fun ImageView.transformGrayscale(grayscale: Boolean) { - this.colorFilter = if (grayscale) { - ColorMatrixColorFilter(ColorMatrix().apply { - setSaturation(0f) - }) - } else { - null - } +fun ImageView.transformGrayscale() { + this.colorFilter = ColorMatrixColorFilter(ColorMatrix().apply { + setSaturation(0f) + }) } diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt index 64bd850..95ed56e 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt @@ -1,6 +1,7 @@ package de.jrpie.android.launcher.ui.list import android.app.Activity +import android.content.Context import android.content.Intent import android.content.res.Resources import android.graphics.Rect @@ -32,6 +33,16 @@ import de.jrpie.android.launcher.ui.list.apps.ListFragmentApps import de.jrpie.android.launcher.ui.list.other.ListFragmentOther +// TODO: Better solution for this intercommunication functionality (used in list-fragments) +var intention = ListActivity.ListActivityIntention.VIEW +var favoritesVisibility: AppFilter.Companion.AppSetVisibility = + AppFilter.Companion.AppSetVisibility.VISIBLE +var privateSpaceVisibility: AppFilter.Companion.AppSetVisibility = + AppFilter.Companion.AppSetVisibility.VISIBLE +var hiddenVisibility: AppFilter.Companion.AppSetVisibility = + AppFilter.Companion.AppSetVisibility.HIDDEN +var forGesture: String? = null + /** * The [ListActivity] is the most general purpose activity in Launcher: * - used to view all apps and edit their settings @@ -41,19 +52,11 @@ import de.jrpie.android.launcher.ui.list.other.ListFragmentOther */ class ListActivity : AppCompatActivity(), UIObject { private lateinit var binding: ListBinding - var intention = ListActivityIntention.VIEW - var favoritesVisibility: AppFilter.Companion.AppSetVisibility = - AppFilter.Companion.AppSetVisibility.VISIBLE - var privateSpaceVisibility: AppFilter.Companion.AppSetVisibility = - AppFilter.Companion.AppSetVisibility.VISIBLE - var hiddenVisibility: AppFilter.Companion.AppSetVisibility = - AppFilter.Companion.AppSetVisibility.HIDDEN - var forGesture: String? = null private fun updateLockIcon(locked: Boolean) { if ( - // only show lock for VIEW intention + // only show lock for VIEW intention (intention != ListActivityIntention.VIEW) // hide lock when private space does not exist || !isPrivateSpaceSetUp(this) @@ -258,7 +261,7 @@ private val TAB_TITLES = arrayOf( * The [ListSectionsPagerAdapter] returns the fragment, * which corresponds to the selected tab in [ListActivity]. */ -class ListSectionsPagerAdapter(private val activity: ListActivity, fm: FragmentManager) : +class ListSectionsPagerAdapter(private val context: Context, fm: FragmentManager) : FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { override fun getItem(position: Int): Fragment { @@ -270,11 +273,11 @@ class ListSectionsPagerAdapter(private val activity: ListActivity, fm: FragmentM } override fun getPageTitle(position: Int): CharSequence { - return activity.resources.getString(TAB_TITLES[position]) + return context.resources.getString(TAB_TITLES[position]) } override fun getCount(): Int { - return when (activity.intention) { + return when (intention) { ListActivity.ListActivityIntention.VIEW -> 1 else -> 2 } diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt index c4428b7..1f275e4 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt @@ -47,7 +47,6 @@ class AppsRecyclerAdapter( private val apps = (activity.applicationContext as Application).apps private val appsListDisplayed: MutableList = mutableListOf() - private val grayscale = LauncherPreferences.theme().monochromeIcons() // temporarily disable auto launch var disableAutoLaunch: Boolean = false @@ -80,19 +79,20 @@ class AppsRecyclerAdapter( override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { var appLabel = appsListDisplayed[i].getCustomLabel(activity) - val appIcon = appsListDisplayed[i].getIcon(activity) - - viewHolder.img.transformGrayscale(grayscale) - viewHolder.img.setImageDrawable(appIcon.constantState?.newDrawable() ?: appIcon) - if (layout.useBadgedText) { appLabel = activity.packageManager.getUserBadgedLabel( appLabel, appsListDisplayed[i].getUser(activity) ).toString() } - viewHolder.textView.text = appLabel + val appIcon = appsListDisplayed[i].getIcon(activity) + + viewHolder.textView.text = appLabel + viewHolder.img.setImageDrawable(appIcon) + + if (LauncherPreferences.theme().monochromeIcons()) + viewHolder.img.transformGrayscale() // decide when to show the options popup menu about if (intention == ListActivity.ListActivityIntention.VIEW) { diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ListFragmentApps.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ListFragmentApps.kt index 1a55bbb..a02c50f 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ListFragmentApps.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ListFragmentApps.kt @@ -17,6 +17,11 @@ import de.jrpie.android.launcher.databinding.ListAppsBinding import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.ui.UIObject import de.jrpie.android.launcher.ui.list.ListActivity +import de.jrpie.android.launcher.ui.list.favoritesVisibility +import de.jrpie.android.launcher.ui.list.forGesture +import de.jrpie.android.launcher.ui.list.hiddenVisibility +import de.jrpie.android.launcher.ui.list.intention +import de.jrpie.android.launcher.ui.list.privateSpaceVisibility import de.jrpie.android.launcher.ui.openSoftKeyboard @@ -49,7 +54,7 @@ class ListFragmentApps : Fragment(), UIObject { .registerOnSharedPreferenceChangeListener(sharedPreferencesListener) binding.listAppsCheckBoxFavorites.isChecked = - ((activity as? ListActivity)?.favoritesVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) + (favoritesVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) } override fun onStop() { @@ -62,17 +67,16 @@ class ListFragmentApps : Fragment(), UIObject { override fun setOnClicks() {} override fun adjustLayout() { - val listActivity = activity as? ListActivity ?: return appsRecyclerAdapter = AppsRecyclerAdapter( - listActivity, binding.root, listActivity.intention, listActivity.forGesture, + requireActivity(), binding.root, intention, forGesture, appFilter = AppFilter( requireContext(), "", - favoritesVisibility = listActivity.favoritesVisibility, - privateSpaceVisibility = listActivity.privateSpaceVisibility, - hiddenVisibility = listActivity.hiddenVisibility + favoritesVisibility = favoritesVisibility, + privateSpaceVisibility = privateSpaceVisibility, + hiddenVisibility = hiddenVisibility ), layout = LauncherPreferences.list().layout() ) @@ -120,8 +124,7 @@ class ListFragmentApps : Fragment(), UIObject { if (newText == " " && !appsRecyclerAdapter.disableAutoLaunch && - (activity as? ListActivity)?.intention - == ListActivity.ListActivityIntention.VIEW && + intention == ListActivity.ListActivityIntention.VIEW && LauncherPreferences.functionality().searchAutoLaunch() ) { appsRecyclerAdapter.disableAutoLaunch = true @@ -138,17 +141,17 @@ class ListFragmentApps : Fragment(), UIObject { }) binding.listAppsCheckBoxFavorites.setOnClickListener { - listActivity.favoritesVisibility = + favoritesVisibility = if (binding.listAppsCheckBoxFavorites.isChecked) { AppFilter.Companion.AppSetVisibility.EXCLUSIVE } else { AppFilter.Companion.AppSetVisibility.VISIBLE } - appsRecyclerAdapter.setFavoritesVisibility(listActivity.favoritesVisibility) + appsRecyclerAdapter.setFavoritesVisibility(favoritesVisibility) (activity as? ListActivity)?.updateTitle() } - if (listActivity.intention == ListActivity.ListActivityIntention.VIEW + if (intention == ListActivity.ListActivityIntention.VIEW && LauncherPreferences.functionality().searchAutoOpenKeyboard() ) { binding.listAppsSearchview.openSoftKeyboard(requireContext()) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/other/OtherRecyclerAdapter.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/other/OtherRecyclerAdapter.kt index 70d5376..dfba334 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/other/OtherRecyclerAdapter.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/other/OtherRecyclerAdapter.kt @@ -11,7 +11,7 @@ import androidx.recyclerview.widget.RecyclerView import de.jrpie.android.launcher.R import de.jrpie.android.launcher.REQUEST_CHOOSE_APP import de.jrpie.android.launcher.actions.LauncherAction -import de.jrpie.android.launcher.ui.list.ListActivity +import de.jrpie.android.launcher.ui.list.forGesture /** * The [OtherRecyclerAdapter] will only be displayed in the ListActivity, @@ -36,7 +36,7 @@ class OtherRecyclerAdapter(val activity: Activity) : val pos = bindingAdapterPosition val content = othersList[pos] - (activity as? ListActivity)?.forGesture?.let { returnChoiceIntent(it, content) } + forGesture?.let { returnChoiceIntent(it, content) } } init { diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/settings/actions/SettingsFragmentActionsRecycler.kt b/app/src/main/java/de/jrpie/android/launcher/ui/settings/actions/SettingsFragmentActionsRecycler.kt index 630b5b0..1f91913 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/settings/actions/SettingsFragmentActionsRecycler.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/settings/actions/SettingsFragmentActionsRecycler.kt @@ -143,7 +143,9 @@ class ActionsRecyclerAdapter(val activity: Activity) : val description = gesture.getDescription(activity) viewHolder.descriptionTextView.text = description - viewHolder.img.transformGrayscale(LauncherPreferences.theme().monochromeIcons()) + + if (LauncherPreferences.theme().monochromeIcons()) + viewHolder.img.transformGrayscale() updateViewHolder(gesture, viewHolder) viewHolder.img.setOnClickListener { chooseApp(gesture) } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4512b62..a051a67 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -179,7 +179,7 @@ Hide paused apps Hide private space from app list Layout of app list - Reverse the app list + Reverse app list Default Text diff --git a/fastlane/metadata/android/en-US/changelogs/40.txt b/fastlane/metadata/android/en-US/changelogs/40.txt deleted file mode 100644 index b457e2f..0000000 --- a/fastlane/metadata/android/en-US/changelogs/40.txt +++ /dev/null @@ -1,13 +0,0 @@ -* Pinned shortcuts can now be added to app list -* New action: adjust volume (thank you, zabrinu!) -* Added option to hide navigation bar (thank you, acanoe!) -* Added option to reverse the app list (thank you, spacefrogg!) -* Show question mark icon when an unknown app is bound to a gesture - -* Improved German translation -* Improved Portuguese translation (thank you, "Vossa Excelencia"!) - -* Fixed detection of long click gesture -* Fixed blurred text in dialogs -* Fixed a crash when private space is locked after app restarts (thank you, alexytomi!) -* Fixed some additional bugs