diff options
| author | Tanuj <thetanuj@hotmail.com> | 2023-02-09 00:57:03 +0530 |
|---|---|---|
| committer | Tanuj <thetanuj@hotmail.com> | 2023-02-09 00:57:03 +0530 |
| commit | 54deda83b1606b02250da3d6ae3fcd82cc4b3e84 (patch) | |
| tree | 29b883bf523efee430fffd23490127b859940266 | |
| parent | f1e6fd46ca45a7caa756c5dc989c34de89544113 (diff) | |
| download | SidePhOnelauncher-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.kt | 4 | ||||
| -rw-r--r-- | app/src/main/java/app/olauncher/helper/Extensions.kt | 18 | ||||
| -rw-r--r-- | app/src/main/java/app/olauncher/helper/Utils.kt | 4 | ||||
| -rw-r--r-- | app/src/main/java/app/olauncher/ui/AppDrawerAdapter.kt | 2 | ||||
| -rw-r--r-- | app/src/main/java/app/olauncher/ui/AppDrawerFragment.kt | 279 | ||||
| -rw-r--r-- | app/src/main/java/app/olauncher/ui/HomeFragment.kt | 4 | ||||
| -rw-r--r-- | app/src/main/java/app/olauncher/ui/SettingsFragment.kt | 15 | ||||
| -rw-r--r-- | app/src/main/res/values-xxhdpi/dimens.xml | 2 | ||||
| -rw-r--r-- | app/src/main/res/values-xxxhdpi/dimens.xml | 2 |
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> |
