diff options
| author | Tanuj <thetanuj@hotmail.com> | 2023-07-04 12:56:44 +0530 |
|---|---|---|
| committer | Tanuj <thetanuj@hotmail.com> | 2023-07-04 12:56:44 +0530 |
| commit | 369af33fda6bbda1981dca55cf0fdb218b63b726 (patch) | |
| tree | 4d1a995596c40c700cc58dd5c1303957145d4d3d | |
| parent | addcbc342f3a5977c2a78b51e47dfb6a7f78c815 (diff) | |
| download | SidePhOnelauncher-369af33fda6bbda1981dca55cf0fdb218b63b726.tar.gz SidePhOnelauncher-369af33fda6bbda1981dca55cf0fdb218b63b726.tar.bz2 SidePhOnelauncher-369af33fda6bbda1981dca55cf0fdb218b63b726.zip | |
Merge fixes
| -rw-r--r-- | app/src/main/java/app/olauncher/ui/AppDrawerFragment.kt | 260 | ||||
| -rw-r--r-- | app/src/main/res/layout/fragment_app_drawer.xml | 37 | ||||
| -rw-r--r-- | app/src/main/res/values/strings.xml | 11 |
3 files changed, 148 insertions, 160 deletions
diff --git a/app/src/main/java/app/olauncher/ui/AppDrawerFragment.kt b/app/src/main/java/app/olauncher/ui/AppDrawerFragment.kt index 7c3352e..8f45c9a 100644 --- a/app/src/main/java/app/olauncher/ui/AppDrawerFragment.kt +++ b/app/src/main/java/app/olauncher/ui/AppDrawerFragment.kt @@ -1,27 +1,18 @@ package app.olauncher.ui -import android.app.AlertDialog -import android.content.Intent -import android.content.pm.PackageManager -import android.content.pm.ResolveInfo import android.os.Bundle -import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.animation.AnimationUtils -import android.widget.FrameLayout -import android.widget.LinearLayout import android.widget.TextView import androidx.appcompat.widget.SearchView import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController -import androidx.recyclerview.widget.LinearLayoutManager 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 @@ -33,11 +24,11 @@ import app.olauncher.helper.showKeyboard import app.olauncher.helper.showToast import app.olauncher.helper.uninstall -class AppDrawerFragment : Fragment(){ +class AppDrawerFragment : Fragment() { private lateinit var prefs: Prefs private lateinit var adapter: AppDrawerAdapter -// private lateinit var layoutManager: LinearLayoutManagera + private var flag = Constants.FLAG_LAUNCH_APP private var canRename = false @@ -45,9 +36,7 @@ class AppDrawerFragment : Fragment(){ private var _binding: FragmentAppDrawerBinding? = null private val binding get() = _binding!! - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { _binding = FragmentAppDrawerBinding.inflate(inflater, container, false) return binding.root } @@ -79,44 +68,85 @@ class AppDrawerFragment : Fragment(){ } } -private fun initSearch() { - 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 adapter.launchFirstInList() - return true - } - - override fun onQueryTextChange(newText: String): Boolean { - try { - adapter.filter.filter(newText) - binding.appDrawerTip.visibility = View.GONE - binding.appRename.visibility = - if (canRename && newText.isNotBlank()) View.VISIBLE else View.GONE + private fun initSearch() { + 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 + adapter.launchFirstInList() return true - } catch (e: Exception) { - e.printStackTrace() } - return false - } - }) -} - - + override fun onQueryTextChange(newText: String): Boolean { + try { + adapter.filter.filter(newText) + binding.appDrawerTip.visibility = View.GONE + binding.appRename.visibility = if (canRename && newText.isNotBlank()) View.VISIBLE else View.GONE + return true + } catch (e: Exception) { + e.printStackTrace() + } + return false + } + }) + } private fun initAdapter() { - adapter = AppDrawerAdapter(flag, prefs.appLabelAlignment, appClickListener = { - if (it.appPackage.isEmpty()) return@AppDrawerAdapter - viewModel.selectedApp(it, flag) - if (flag == Constants.FLAG_LAUNCH_APP || flag == Constants.FLAG_HIDDEN_APPS) findNavController().popBackStack( - R.id.mainFragment, - false + adapter = AppDrawerAdapter( + flag, + prefs.appLabelAlignment, + appClickListener = { + if (it.appPackage.isEmpty()) + return@AppDrawerAdapter + 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 = { + requireContext().apply { + if (isSystemApp(it.appPackage)) + showToast(getString(R.string.system_app_cannot_delete)) + else + uninstall(it.appPackage) + } + }, + appHideListener = { appModel, position -> + adapter.appFilteredList.removeAt(position) + adapter.notifyItemRemoved(position) + adapter.appsList.remove(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) + } + }, + appRenameListener = { appModel, renameLabel -> + prefs.setAppRenameLabel(appModel.appPackage, renameLabel) + viewModel.getAppList() + } ) binding.recyclerView.adapter = adapter binding.recyclerView.addOnScrollListener(getRecyclerViewOnScrollListener()) @@ -127,95 +157,65 @@ private fun initSearch() { private fun initObservers() { viewModel.firstOpen.observe(viewLifecycleOwner) { + if (it) binding.appDrawerTip.visibility = View.VISIBLE + binding.appDrawerTip.isSelected = true if (it && flag == Constants.FLAG_LAUNCH_APP) { binding.appDrawerTip.visibility = View.VISIBLE binding.appDrawerTip.isSelected = true } } - }, appHideListener = { appModel, position -> - adapter.appFilteredList.removeAt(position) - adapter.notifyItemRemoved(position) - adapter.appsList.remove(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) - } - }, appRenameListener = { appModel, renameLabel -> - prefs.setAppRenameLabel(appModel.appPackage, renameLabel) - viewModel.getAppList() - }) - binding.recyclerView.adapter = adapter - binding.recyclerView.addOnScrollListener(getRecyclerViewOnScrollListener()) - binding.recyclerView.itemAnimator = null - binding.recyclerView.layoutAnimation = - AnimationUtils.loadLayoutAnimation(requireContext(), R.anim.layout_anim_from_bottom) -} - -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()) } + 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()) } + } } -} -private fun initClickListeners() { - binding.appDrawerTip.setOnClickListener { - binding.appDrawerTip.isSelected = false - binding.appDrawerTip.isSelected = true - } - binding.appRename.setOnClickListener { - val name = binding.search.query.toString().trim() - if (name.isEmpty()) { - requireContext().showToast(getString(R.string.type_a_new_app_name_first)) - binding.search.showKeyboard() - return@setOnClickListener + private fun initClickListeners() { + binding.appDrawerTip.setOnClickListener { + binding.appDrawerTip.isSelected = false + binding.appDrawerTip.isSelected = true } + binding.appRename.setOnClickListener { + val name = binding.search.query.toString().trim() + if (name.isEmpty()) { + requireContext().showToast(getString(R.string.type_a_new_app_name_first)) + binding.search.showKeyboard() + return@setOnClickListener + } - 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 { - return object : RecyclerView.OnScrollListener() { + private fun getRecyclerViewOnScrollListener(): RecyclerView.OnScrollListener { + return object : RecyclerView.OnScrollListener() { - var onTop = false + var onTop = false - override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { - super.onScrollStateChanged(recyclerView, newState) - when (newState) { + override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { + super.onScrollStateChanged(recyclerView, newState) + when (newState) { - RecyclerView.SCROLL_STATE_DRAGGING -> { - onTop = !recyclerView.canScrollVertically(-1) - if (onTop) binding.search.hideKeyboard() - if (onTop && !recyclerView.canScrollVertically(1)) findNavController().popBackStack() - } + RecyclerView.SCROLL_STATE_DRAGGING -> { + onTop = !recyclerView.canScrollVertically(-1) + if (onTop) binding.search.hideKeyboard() + if (onTop && !recyclerView.canScrollVertically(1)) + findNavController().popBackStack() + } RecyclerView.SCROLL_STATE_IDLE -> { if (!recyclerView.canScrollVertically(1)) { @@ -229,21 +229,19 @@ private fun getRecyclerViewOnScrollListener(): RecyclerView.OnScrollListener { } } } -} override fun onStart() { super.onStart() binding.search.showKeyboard(prefs.autoShowKeyboard) } -override fun onStop() { - binding.search.hideKeyboard() - super.onStop() -} - -override fun onDestroyView() { - super.onDestroyView() - _binding = null -} + override fun onStop() { + binding.search.hideKeyboard() + super.onStop() + } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } }
\ No newline at end of file diff --git a/app/src/main/res/layout/fragment_app_drawer.xml b/app/src/main/res/layout/fragment_app_drawer.xml index 07928a1..a73ddd1 100644 --- a/app/src/main/res/layout/fragment_app_drawer.xml +++ b/app/src/main/res/layout/fragment_app_drawer.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:animateLayoutChanges="true" @@ -62,34 +61,16 @@ android:text="@string/app_drawer_tips" android:visibility="gone" /> - - <LinearLayout + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" - android:orientation="vertical" - android:layout_marginTop="180dp"> - - <androidx.recyclerview.widget.RecyclerView - android:id="@+id/recyclerView" - android:layout_width="282dp" - android:layout_height="0dp" - android:layout_weight="1" - android:clipChildren="false" - android:clipToPadding="false" - android:fadingEdgeLength="24dp" - android:requiresFadingEdge="vertical" - app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> - - <!-- AlphabetFastScroller --> - - </LinearLayout> -<!-- <androidx.recyclerview.widget.RecyclerView--> -<!-- android:id="@+id/alphabetRecyclerView"--> -<!-- android:layout_width="wrap_content"--> -<!-- android:layout_height="wrap_content"--> -<!-- android:layout_gravity="end"--> -<!-- android:layout_marginTop="180dp" />--> - - + android:layout_marginTop="180dp" + android:layout_marginBottom="24dp" + android:clipChildren="false" + android:clipToPadding="false" + android:fadingEdgeLength="24dp" + android:requiresFadingEdge="vertical" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> </FrameLayout>
\ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 078d8b7..aab4f44 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,7 +1,9 @@ <resources> <string name="app_name" translatable="false">Olauncher</string> - <string name="app" translatable="false">App</string> + <string name="app">App</string> <string name="set_as_default_launcher">Set as default launcher</string> + <string name="app_text_color">Text color</string> + <string name="double_tap_to_lock_screen">Double tap to lock</string> <string name="admin_permission_message">Olauncher promises to use lock screen permission responsibly. Olauncher does not collect or share any data.</string> <string name="about">About</string> <string name="off">Off</string> @@ -36,6 +38,7 @@ <string name="_7">7</string> <string name="_8">8</string> <string name="app_drawer_tips">Tip: Start typing an app name to auto-launch it</string> + <string name="okay">Okay</string> <string name="cool">Cool!</string> <string name="double_tap_lock_is_enabled_message">If double tap lock disables fingerprint or face unlock, open Olauncher settings, tap on \'experimental\' and follow the instructions. Thank you.</string> <string name="auto_show_keyboard">Auto show keyboard</string> @@ -49,6 +52,8 @@ <string name="system_default">System</string> <string name="dark">Dark</string> <string name="light">Light</string> + <string name="double_tap_lock_uninstall_message">Double tap to lock enabled. + \n\nNote: Turn this OFF first if you decide to delete Olauncher.</string> <string name="welcome_to_olauncher_settings">Our About page on the bottom has answers to all your questions. Don\'t forget. :) \n\nThank you.</string> <string name="rate_us_message">Hey, if you find Olauncher useful, a 5-star rating will make us very happy. :) @@ -59,7 +64,11 @@ <string name="accessibility_service_description">The accessibility permission is required to enable double tap to lock. Any data acquired by Olauncher via this service will not leave your device.</string> <string name="lock_layout_description" translatable="false">lock layout description to be used a unique id to lock screen</string> <string name="support_olauncher_for_free">Support Olauncher for free by using our Amazon affiliate link.</string> + <string name="support_olauncher_message">Every time you buy something using our link, we get a small commission. Please save the link and use it whenever you shop online.\nThank you!</string> + <string name="open">Open link</string> + <string name="copy">Copy</string> <string name="close">Close</string> + <string name="not_now">Not now</string> <string name="public_roadmap">Olauncher public roadmap</string> <string name="instagram">Instagram</string> <string name="twitter">Twitter</string> |
