summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTanuj <thetanuj@hotmail.com>2023-02-09 00:57:03 +0530
committerTanuj <thetanuj@hotmail.com>2023-02-09 00:57:03 +0530
commit54deda83b1606b02250da3d6ae3fcd82cc4b3e84 (patch)
tree29b883bf523efee430fffd23490127b859940266
parentf1e6fd46ca45a7caa756c5dc989c34de89544113 (diff)
downloadSidePhOnelauncher-54deda83b1606b02250da3d6ae3fcd82cc4b3e84.tar.gz
SidePhOnelauncher-54deda83b1606b02250da3d6ae3fcd82cc4b3e84.tar.bz2
SidePhOnelauncher-54deda83b1606b02250da3d6ae3fcd82cc4b3e84.zip
Code refactor - app drawer fragment
-rw-r--r--app/src/main/java/app/olauncher/MainViewModel.kt4
-rw-r--r--app/src/main/java/app/olauncher/helper/Extensions.kt18
-rw-r--r--app/src/main/java/app/olauncher/helper/Utils.kt4
-rw-r--r--app/src/main/java/app/olauncher/ui/AppDrawerAdapter.kt2
-rw-r--r--app/src/main/java/app/olauncher/ui/AppDrawerFragment.kt279
-rw-r--r--app/src/main/java/app/olauncher/ui/HomeFragment.kt4
-rw-r--r--app/src/main/java/app/olauncher/ui/SettingsFragment.kt15
-rw-r--r--app/src/main/res/values-xxhdpi/dimens.xml2
-rw-r--r--app/src/main/res/values-xxxhdpi/dimens.xml2
9 files changed, 147 insertions, 183 deletions
diff --git a/app/src/main/java/app/olauncher/MainViewModel.kt b/app/src/main/java/app/olauncher/MainViewModel.kt
index fd19834..8558ee2 100644
--- a/app/src/main/java/app/olauncher/MainViewModel.kt
+++ b/app/src/main/java/app/olauncher/MainViewModel.kt
@@ -159,9 +159,9 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
}
}
- fun getAppList(showHiddenApps: Boolean = false) {
+ fun getAppList(includeHiddenApps: Boolean = false) {
viewModelScope.launch {
- appList.value = getAppsList(appContext, showHiddenApps)
+ appList.value = getAppsList(appContext, includeHiddenApps)
}
}
diff --git a/app/src/main/java/app/olauncher/helper/Extensions.kt b/app/src/main/java/app/olauncher/helper/Extensions.kt
new file mode 100644
index 0000000..5ea808c
--- /dev/null
+++ b/app/src/main/java/app/olauncher/helper/Extensions.kt
@@ -0,0 +1,18 @@
+package app.olauncher.helper
+
+import android.content.Context
+import android.view.View
+import android.view.inputmethod.InputMethodManager
+
+fun View.hideKeyboard() {
+ val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+ imm.hideSoftInputFromWindow(windowToken, 0)
+}
+
+fun View.showKeyboard() {
+ if (this.requestFocus())
+ postDelayed({
+ val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+ imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
+ }, 100)
+}
diff --git a/app/src/main/java/app/olauncher/helper/Utils.kt b/app/src/main/java/app/olauncher/helper/Utils.kt
index f0d2cd3..7c41b28 100644
--- a/app/src/main/java/app/olauncher/helper/Utils.kt
+++ b/app/src/main/java/app/olauncher/helper/Utils.kt
@@ -52,7 +52,7 @@ fun Context.showToast(stringResource: Int, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, getString(stringResource), duration).show()
}
-suspend fun getAppsList(context: Context, showHiddenApps: Boolean = false): MutableList<AppModel> {
+suspend fun getAppsList(context: Context, includeHiddenApps: Boolean = false): MutableList<AppModel> {
return withContext(Dispatchers.IO) {
val appList: MutableList<AppModel> = mutableListOf()
@@ -66,7 +66,7 @@ suspend fun getAppsList(context: Context, showHiddenApps: Boolean = false): Muta
for (profile in userManager.userProfiles) {
for (app in launcherApps.getActivityList(null, profile)) {
- if (showHiddenApps && app.applicationInfo.packageName != BuildConfig.APPLICATION_ID)
+ if (includeHiddenApps && app.applicationInfo.packageName != BuildConfig.APPLICATION_ID)
appList.add(
AppModel(
app.label.toString(),
diff --git a/app/src/main/java/app/olauncher/ui/AppDrawerAdapter.kt b/app/src/main/java/app/olauncher/ui/AppDrawerAdapter.kt
index 0665d69..a3cb8b5 100644
--- a/app/src/main/java/app/olauncher/ui/AppDrawerAdapter.kt
+++ b/app/src/main/java/app/olauncher/ui/AppDrawerAdapter.kt
@@ -33,6 +33,8 @@ class AppDrawerAdapter(
val DIFF_CALLBACK = object : DiffUtil.ItemCallback<AppModel>() {
override fun areItemsTheSame(oldItem: AppModel, newItem: AppModel): Boolean =
oldItem.appPackage == newItem.appPackage
+ && oldItem.user == newItem.user
+ && oldItem.activityClassName == newItem.activityClassName
override fun areContentsTheSame(oldItem: AppModel, newItem: AppModel): Boolean =
oldItem == newItem
diff --git a/app/src/main/java/app/olauncher/ui/AppDrawerFragment.kt b/app/src/main/java/app/olauncher/ui/AppDrawerFragment.kt
index efab4f7..5cb297b 100644
--- a/app/src/main/java/app/olauncher/ui/AppDrawerFragment.kt
+++ b/app/src/main/java/app/olauncher/ui/AppDrawerFragment.kt
@@ -1,22 +1,17 @@
package app.olauncher.ui
-import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.AnimationUtils
-import android.view.inputmethod.InputMethodManager
import android.widget.TextView
-import androidx.appcompat.widget.SearchView
import androidx.fragment.app.Fragment
-import androidx.lifecycle.Observer
-import androidx.lifecycle.ViewModelProvider
+import androidx.fragment.app.activityViewModels
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.RecyclerView
import app.olauncher.MainViewModel
import app.olauncher.R
-import app.olauncher.data.AppModel
import app.olauncher.data.Constants
import app.olauncher.data.Prefs
import app.olauncher.databinding.FragmentAppDrawerBinding
@@ -25,8 +20,12 @@ import app.olauncher.helper.*
class AppDrawerFragment : Fragment() {
private lateinit var prefs: Prefs
- private lateinit var viewModel: MainViewModel
+ private lateinit var adapter: AppDrawerAdapter
+ private var flag = Constants.FLAG_LAUNCH_APP
+ private var canRename = false
+
+ private val viewModel: MainViewModel by activityViewModels()
private var _binding: FragmentAppDrawerBinding? = null
private val binding get() = _binding!!
@@ -38,189 +37,122 @@ class AppDrawerFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
prefs = Prefs(requireContext())
- viewModel = activity?.run {
- ViewModelProvider(this)[MainViewModel::class.java]
- } ?: throw Exception("Invalid Activity")
+ requireArguments().apply {
+ flag = getInt(Constants.Key.FLAG, Constants.FLAG_LAUNCH_APP)
+ canRename = getBoolean(Constants.Key.RENAME, false)
+ }
+ initViews()
+ initAdapter()
+ initObservers()
+ initClickListeners()
+ }
- val flag = arguments?.getInt(Constants.Key.FLAG, Constants.FLAG_LAUNCH_APP) ?: Constants.FLAG_LAUNCH_APP
- val rename = arguments?.getBoolean(Constants.Key.RENAME, false) ?: false
- if (rename) {
- binding.appRename.setOnClickListener { renameListener(flag) }
- if (prefs.renameTipShown.not()) {
- binding.appDrawerTip.text = getString(R.string.tip_start_typing_for_rename)
- binding.appDrawerTip.visibility = View.VISIBLE
- prefs.renameTipShown = true
- }
+ private fun initViews() {
+ if (flag == Constants.FLAG_HIDDEN_APPS) binding.search.queryHint = "Hidden apps"
+ if (canRename && prefs.renameTipShown.not()) {
+ binding.appDrawerTip.text = getString(R.string.tip_start_typing_for_rename)
+ binding.appDrawerTip.visibility = View.VISIBLE
+ prefs.renameTipShown = true
}
+ try {
+ val searchTextView = binding.search.findViewById<TextView>(R.id.search_src_text)
+ if (searchTextView != null) searchTextView.gravity = prefs.appLabelAlignment
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
- val appAdapter = AppDrawerAdapter(
+ private fun initAdapter() {
+ adapter = AppDrawerAdapter(
flag,
prefs.appLabelAlignment,
- appClickListener(viewModel, flag),
- appInfoListener(),
- appDeleteListener(),
- appShowHideListener()
+ clickListener = {
+ viewModel.selectedApp(it, flag)
+ if (flag == Constants.FLAG_LAUNCH_APP || flag == Constants.FLAG_HIDDEN_APPS)
+ findNavController().popBackStack(R.id.mainFragment, false)
+ else
+ findNavController().popBackStack()
+ },
+ appInfoListener = {
+ openAppInfo(
+ requireContext(),
+ it.user,
+ it.appPackage
+ )
+ findNavController().popBackStack(R.id.mainFragment, false)
+ },
+ appDeleteListener = {
+ if (requireContext().isSystemApp(it.appPackage))
+ requireContext().showToast("System app, cannot delete")
+ else
+ requireContext().uninstall(it.appPackage)
+ },
+ appHideListener = { flag, appModel ->
+ val newSet = mutableSetOf<String>()
+ newSet.addAll(prefs.hiddenApps)
+
+ if (flag == Constants.FLAG_HIDDEN_APPS) {
+ newSet.remove(appModel.appPackage) // for backward compatibility
+ newSet.remove(appModel.appPackage + "|" + appModel.user.toString())
+ } else
+ newSet.add(appModel.appPackage + "|" + appModel.user.toString())
+
+ prefs.hiddenApps = newSet
+ if (newSet.isEmpty()) findNavController().popBackStack()
+ if (prefs.firstHide) {
+ prefs.firstHide = false
+ viewModel.showMessageDialog(getString(R.string.hidden_apps_message))
+ findNavController().navigate(R.id.action_appListFragment_to_settingsFragment2)
+ }
+ }
)
-
- val searchTextView = binding.search.findViewById<TextView>(R.id.search_src_text)
- if (searchTextView != null) searchTextView.gravity = prefs.appLabelAlignment
-
- initViewModel(flag, viewModel, appAdapter)
-
- binding.recyclerView.adapter = appAdapter
+ binding.recyclerView.adapter = adapter
binding.recyclerView.addOnScrollListener(getRecyclerViewOnScrollListener())
binding.recyclerView.itemAnimator = null
binding.recyclerView.layoutAnimation =
AnimationUtils.loadLayoutAnimation(requireContext(), R.anim.layout_anim_from_bottom)
-
- if (flag == Constants.FLAG_HIDDEN_APPS) binding.search.queryHint = "Hidden apps"
- binding.search.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
- override fun onQueryTextSubmit(query: String?): Boolean {
- if (query?.startsWith("!") == true)
- requireContext().openUrl(Constants.URL_DUCK_SEARCH + query.replace(" ", "%20"))
- else
- appAdapter.launchFirstInList()
- return false
- }
-
- override fun onQueryTextChange(newText: String): Boolean {
- try {
- appAdapter.filter.filter(newText.trim())
- binding.appDrawerTip.visibility = View.GONE
- binding.appRename.visibility = if (rename && newText.isNotBlank()) View.VISIBLE else View.GONE
- } catch (e: Exception) {
- e.printStackTrace()
- }
- return false
- }
- })
- binding.appDrawerTip.setOnClickListener {
- binding.appDrawerTip.isSelected = false
- binding.appDrawerTip.isSelected = true
- }
}
- private fun initViewModel(flag: Int, viewModel: MainViewModel, appAdapter: AppDrawerAdapter) {
- viewModel.hiddenApps.observe(viewLifecycleOwner, Observer {
- if (flag != Constants.FLAG_HIDDEN_APPS) return@Observer
- if (it.isNullOrEmpty()) {
- findNavController().popBackStack()
- return@Observer
- }
- populateAppList(it, appAdapter)
- })
-
- viewModel.appList.observe(viewLifecycleOwner, Observer {
- if (it == null
- || it == appAdapter.appsList
- || flag == Constants.FLAG_HIDDEN_APPS
- ) return@Observer
- populateAppList(it, appAdapter)
- })
-
+ private fun initObservers() {
viewModel.firstOpen.observe(viewLifecycleOwner) {
if (it) binding.appDrawerTip.visibility = View.VISIBLE
binding.appDrawerTip.isSelected = true
}
+ if (flag == Constants.FLAG_HIDDEN_APPS)
+ viewModel.hiddenApps.observe(viewLifecycleOwner) {
+ it?.let { adapter.setAppList(it.toMutableList()) }
+ }
+ else
+ viewModel.appList.observe(viewLifecycleOwner) {
+ it?.let { adapter.setAppList(it.toMutableList()) }
+ }
}
- override fun onStart() {
- super.onStart()
- binding.search.showKeyboard()
- }
-
- override fun onStop() {
- binding.search.hideKeyboard()
- super.onStop()
- }
-
- private fun View.hideKeyboard() {
- view?.clearFocus()
- val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
- imm.hideSoftInputFromWindow(windowToken, 0)
- }
-
- private fun View.showKeyboard(forceShowKeyboard: Boolean = false) {
- if (!prefs.autoShowKeyboard && !forceShowKeyboard) return
- binding.search.postDelayed({
- binding.search.requestFocus()
- val imm = requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
- imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
- }, 100)
- }
-
- private fun populateAppList(apps: List<AppModel>, appAdapter: AppDrawerAdapter) {
-// val animation = AnimationUtils.loadLayoutAnimation(requireContext(), R.anim.layout_anim_from_bottom)
-// binding.recyclerView.layoutAnimation = animation
- appAdapter.setAppList(apps.toMutableList())
- }
-
- private fun appClickListener(viewModel: MainViewModel, flag: Int): (appModel: AppModel) -> Unit =
- { appModel ->
- viewModel.selectedApp(appModel, flag)
- if (flag == Constants.FLAG_LAUNCH_APP || flag == Constants.FLAG_HIDDEN_APPS)
- findNavController().popBackStack(R.id.mainFragment, false)
- else
- findNavController().popBackStack()
- }
-
- private fun appInfoListener(): (appModel: AppModel) -> Unit =
- { appModel ->
- openAppInfo(
- requireContext(),
- appModel.user,
- appModel.appPackage
- )
- findNavController().popBackStack(R.id.mainFragment, false)
- }
-
- private fun appDeleteListener(): (appModel: AppModel) -> Unit =
- { appModel ->
- if (requireContext().isSystemApp(appModel.appPackage))
- requireContext().showToast("System app, cannot delete")
- else
- requireContext().uninstall(appModel.appPackage)
+ private fun initClickListeners() {
+ binding.appDrawerTip.setOnClickListener {
+ binding.appDrawerTip.isSelected = false
+ binding.appDrawerTip.isSelected = true
}
-
- private fun appShowHideListener(): (flag: Int, appModel: AppModel) -> Unit =
- { flag, appModel ->
- val newSet = mutableSetOf<String>()
- newSet.addAll(prefs.hiddenApps)
-
- if (flag == Constants.FLAG_HIDDEN_APPS) {
- newSet.remove(appModel.appPackage) // for backward compatibility
- newSet.remove(appModel.appPackage + "|" + appModel.user.toString())
- } else newSet.add(appModel.appPackage + "|" + appModel.user.toString())
-
- prefs.hiddenApps = newSet
-
- if (newSet.isEmpty()) findNavController().popBackStack()
- if (prefs.firstHide) {
- prefs.firstHide = false
- viewModel.showMessageDialog(getString(R.string.hidden_apps_message))
- findNavController().navigate(R.id.action_appListFragment_to_settingsFragment2)
+ binding.appRename.setOnClickListener {
+ val name = binding.search.query.toString().trim()
+ if (name.isEmpty()) {
+ requireContext().showToast("Type a new app name first")
+ binding.search.showKeyboard()
+ return@setOnClickListener
}
- }
- private fun renameListener(flag: Int) {
- val name = binding.search.query.toString().trim()
- if (name.isEmpty()) {
- requireContext().showToast("Type a new app name first")
- binding.search.showKeyboard(true)
- return
- }
-
- when (flag) {
- Constants.FLAG_SET_HOME_APP_1 -> prefs.appName1 = name
- Constants.FLAG_SET_HOME_APP_2 -> prefs.appName2 = name
- Constants.FLAG_SET_HOME_APP_3 -> prefs.appName3 = name
- Constants.FLAG_SET_HOME_APP_4 -> prefs.appName4 = name
- Constants.FLAG_SET_HOME_APP_5 -> prefs.appName5 = name
- Constants.FLAG_SET_HOME_APP_6 -> prefs.appName6 = name
- Constants.FLAG_SET_HOME_APP_7 -> prefs.appName7 = name
- Constants.FLAG_SET_HOME_APP_8 -> prefs.appName8 = name
+ when (flag) {
+ Constants.FLAG_SET_HOME_APP_1 -> prefs.appName1 = name
+ Constants.FLAG_SET_HOME_APP_2 -> prefs.appName2 = name
+ Constants.FLAG_SET_HOME_APP_3 -> prefs.appName3 = name
+ Constants.FLAG_SET_HOME_APP_4 -> prefs.appName4 = name
+ Constants.FLAG_SET_HOME_APP_5 -> prefs.appName5 = name
+ Constants.FLAG_SET_HOME_APP_6 -> prefs.appName6 = name
+ Constants.FLAG_SET_HOME_APP_7 -> prefs.appName7 = name
+ Constants.FLAG_SET_HOME_APP_8 -> prefs.appName8 = name
+ }
+ findNavController().popBackStack()
}
- findNavController().popBackStack()
}
private fun getRecyclerViewOnScrollListener(): RecyclerView.OnScrollListener {
@@ -252,6 +184,17 @@ class AppDrawerFragment : Fragment() {
}
}
+ override fun onStart() {
+ super.onStart()
+ if (prefs.autoShowKeyboard)
+ binding.search.showKeyboard()
+ }
+
+ override fun onStop() {
+ binding.search.hideKeyboard()
+ super.onStop()
+ }
+
override fun onDestroyView() {
super.onDestroyView()
_binding = null
diff --git a/app/src/main/java/app/olauncher/ui/HomeFragment.kt b/app/src/main/java/app/olauncher/ui/HomeFragment.kt
index f4a79e6..709195c 100644
--- a/app/src/main/java/app/olauncher/ui/HomeFragment.kt
+++ b/app/src/main/java/app/olauncher/ui/HomeFragment.kt
@@ -277,8 +277,8 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener
)
}
- private fun showAppList(flag: Int, rename: Boolean = false, showHiddenApps: Boolean = false) {
- viewModel.getAppList(showHiddenApps)
+ private fun showAppList(flag: Int, rename: Boolean = false, includeHiddenApps: Boolean = false) {
+ viewModel.getAppList(includeHiddenApps)
try {
findNavController().navigate(
R.id.action_mainFragment_to_appListFragment,
diff --git a/app/src/main/java/app/olauncher/ui/SettingsFragment.kt b/app/src/main/java/app/olauncher/ui/SettingsFragment.kt
index 1efb462..35e0894 100644
--- a/app/src/main/java/app/olauncher/ui/SettingsFragment.kt
+++ b/app/src/main/java/app/olauncher/ui/SettingsFragment.kt
@@ -278,11 +278,13 @@ class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongClickListe
}
private fun populateDateTime() {
- binding.dateTime.text = getString(when (prefs.dateTimeVisibility) {
- Constants.DateTime.DATE_ONLY -> R.string.date
- Constants.DateTime.ON -> R.string.on
- else -> R.string.off
- })
+ binding.dateTime.text = getString(
+ when (prefs.dateTimeVisibility) {
+ Constants.DateTime.DATE_ONLY -> R.string.date
+ Constants.DateTime.ON -> R.string.on
+ else -> R.string.off
+ }
+ )
}
private fun showStatusBar() {
@@ -544,8 +546,7 @@ class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongClickListe
requireContext().showToast("Long press to enable")
return
}
-
- viewModel.getAppList()
+ viewModel.getAppList(true)
findNavController().navigate(
R.id.action_settingsFragment_to_appListFragment,
bundleOf(Constants.Key.FLAG to flag)
diff --git a/app/src/main/res/values-xxhdpi/dimens.xml b/app/src/main/res/values-xxhdpi/dimens.xml
index fec4188..e0a0559 100644
--- a/app/src/main/res/values-xxhdpi/dimens.xml
+++ b/app/src/main/res/values-xxhdpi/dimens.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <dimen name="text_large">22sp</dimen>
+ <dimen name="text_large">24sp</dimen>
<dimen name="text_small">16sp</dimen>
<dimen name="app_padding_vertical">12dp</dimen>
<dimen name="home_app_padding_vertical">10dp</dimen>
diff --git a/app/src/main/res/values-xxxhdpi/dimens.xml b/app/src/main/res/values-xxxhdpi/dimens.xml
index c410eaf..0afbd45 100644
--- a/app/src/main/res/values-xxxhdpi/dimens.xml
+++ b/app/src/main/res/values-xxxhdpi/dimens.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <dimen name="text_large">24sp</dimen>
+ <dimen name="text_large">26sp</dimen>
<dimen name="text_small">16sp</dimen>
<dimen name="app_padding_vertical">16dp</dimen>
<dimen name="home_app_padding_vertical">14dp</dimen>