From 6a9c82bf1b3c6483fa18e0c63b907375c9a70ee1 Mon Sep 17 00:00:00 2001 From: ru2saig <42857541+ru2saig@users.noreply.github.com> Date: Tue, 6 Dec 2022 20:38:36 +0530 Subject: [PATCH 1/6] Detects when an app is longpressed on --- app/src/main/java/com/sduduzog/slimlauncher/MainActivity.kt | 4 ++-- .../com/sduduzog/slimlauncher/adapters/AppDrawerAdapter.kt | 4 +++- .../java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt | 6 ++++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/sduduzog/slimlauncher/MainActivity.kt b/app/src/main/java/com/sduduzog/slimlauncher/MainActivity.kt index e9aee67e..bfe66160 100644 --- a/app/src/main/java/com/sduduzog/slimlauncher/MainActivity.kt +++ b/app/src/main/java/com/sduduzog/slimlauncher/MainActivity.kt @@ -163,13 +163,13 @@ class MainActivity : AppCompatActivity(), } private val gestureDetector = GestureDetector(baseContext, object : SimpleOnGestureListener() { - override fun onLongPress(e: MotionEvent) { + /*override fun onLongPress(e: MotionEvent) { // Open Options val homeView = findViewById(R.id.home_fragment) if(homeView != null) { findNavController(homeView).navigate(R.id.action_homeFragment_to_optionsFragment, null) } - } + }*/ override fun onFling( e1: MotionEvent, diff --git a/app/src/main/java/com/sduduzog/slimlauncher/adapters/AppDrawerAdapter.kt b/app/src/main/java/com/sduduzog/slimlauncher/adapters/AppDrawerAdapter.kt index ca2709c4..bcff03d0 100644 --- a/app/src/main/java/com/sduduzog/slimlauncher/adapters/AppDrawerAdapter.kt +++ b/app/src/main/java/com/sduduzog/slimlauncher/adapters/AppDrawerAdapter.kt @@ -20,7 +20,6 @@ class AppDrawerAdapter( appsRepo: UnlauncherAppsRepository ) : RecyclerView.Adapter() { private val regex = Regex("[!@#\$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>/? ]") - private var apps: List = listOf() private var filteredApps: List = listOf() private var filterQuery = "" @@ -40,6 +39,9 @@ class AppDrawerAdapter( holder.itemView.setOnClickListener { listener.onAppClicked(item) } + holder.itemView.setOnLongClickListener { + listener.onAppLongClicked(item) + } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { diff --git a/app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt b/app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt index 70424d26..2c096285 100644 --- a/app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt +++ b/app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt @@ -8,6 +8,7 @@ import android.os.UserManager import android.provider.AlarmClock import android.provider.CalendarContract import android.provider.MediaStore +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -279,6 +280,11 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener { } inner class AppDrawerListener { + fun onAppLongClicked(app : UnlauncherApp) : Boolean { + Log.i("HomeFragment App Long Clicked", app.toString()) + return true + } + fun onAppClicked(app: UnlauncherApp) { launchApp(app.packageName, app.className, app.userSerial) home_fragment.transitionToStart() From 69f0a8e82316d6e275029243e60e58a39cdb26bd Mon Sep 17 00:00:00 2001 From: ru2saig <42857541+ru2saig@users.noreply.github.com> Date: Thu, 8 Dec 2022 11:24:11 +0530 Subject: [PATCH 2/6] Delegates a longClick event to the app drawer recyclerView when it's visible on screen. --- .../com/sduduzog/slimlauncher/MainActivity.kt | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/sduduzog/slimlauncher/MainActivity.kt b/app/src/main/java/com/sduduzog/slimlauncher/MainActivity.kt index bfe66160..8b7f5263 100644 --- a/app/src/main/java/com/sduduzog/slimlauncher/MainActivity.kt +++ b/app/src/main/java/com/sduduzog/slimlauncher/MainActivity.kt @@ -3,6 +3,7 @@ package com.sduduzog.slimlauncher import android.annotation.SuppressLint import android.content.SharedPreferences import android.content.res.Resources +import android.graphics.Rect import android.os.Bundle import android.util.Log import android.view.GestureDetector @@ -14,6 +15,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.constraintlayout.motion.widget.MotionLayout import androidx.navigation.NavController import androidx.navigation.Navigation.findNavController +import androidx.recyclerview.widget.RecyclerView import com.sduduzog.slimlauncher.utils.* import dagger.hilt.android.AndroidEntryPoint import java.lang.reflect.Method @@ -162,14 +164,32 @@ class MainActivity : AppCompatActivity(), super.onBackPressed() } + private fun isVisible(view: View): Boolean { + if (!view.isShown) { + return false + } + + val actualPosition = Rect() + view.getGlobalVisibleRect(actualPosition) + val screen = Rect(0, 0, Resources.getSystem().displayMetrics.widthPixels, Resources.getSystem().displayMetrics.heightPixels) + return actualPosition.intersect(screen) + } + private val gestureDetector = GestureDetector(baseContext, object : SimpleOnGestureListener() { - /*override fun onLongPress(e: MotionEvent) { + override fun onLongPress(e: MotionEvent) { // Open Options + val recyclerView = findViewById(R.id.app_drawer_fragment_list) val homeView = findViewById(R.id.home_fragment) - if(homeView != null) { - findNavController(homeView).navigate(R.id.action_homeFragment_to_optionsFragment, null) + + if(homeView != null && recyclerView != null) + { + if(isVisible(recyclerView)) + recyclerView.performLongClick() + else // we are in the homeFragment + findNavController(homeView).navigate(R.id.action_homeFragment_to_optionsFragment, null) + } - }*/ + } override fun onFling( e1: MotionEvent, From cc3cfb7ac265249ae165809080d1559b620c055d Mon Sep 17 00:00:00 2001 From: ru2saig <42857541+ru2saig@users.noreply.github.com> Date: Sat, 10 Dec 2022 14:33:03 +0530 Subject: [PATCH 3/6] Added a popup menu, with icons. Does not do any edits, yet --- .../slimlauncher/adapters/AppDrawerAdapter.kt | 2 +- .../slimlauncher/ui/main/HomeFragment.kt | 42 ++++++++++++++++++- app/src/main/res/drawable/ic_app_info.xml | 9 ++++ app/src/main/res/drawable/ic_hide_app.xml | 9 ++++ app/src/main/res/drawable/ic_open_app.xml | 9 ++++ app/src/main/res/drawable/ic_rename_app.xml | 9 ++++ .../main/res/drawable/ic_uninstall_app.xml | 9 ++++ app/src/main/res/menu/app_long_press_menu.xml | 23 ++++++++++ app/src/main/res/values/strings.xml | 5 +++ 9 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/drawable/ic_app_info.xml create mode 100644 app/src/main/res/drawable/ic_hide_app.xml create mode 100644 app/src/main/res/drawable/ic_open_app.xml create mode 100644 app/src/main/res/drawable/ic_rename_app.xml create mode 100644 app/src/main/res/drawable/ic_uninstall_app.xml create mode 100644 app/src/main/res/menu/app_long_press_menu.xml diff --git a/app/src/main/java/com/sduduzog/slimlauncher/adapters/AppDrawerAdapter.kt b/app/src/main/java/com/sduduzog/slimlauncher/adapters/AppDrawerAdapter.kt index bcff03d0..ed7d6f9e 100644 --- a/app/src/main/java/com/sduduzog/slimlauncher/adapters/AppDrawerAdapter.kt +++ b/app/src/main/java/com/sduduzog/slimlauncher/adapters/AppDrawerAdapter.kt @@ -40,7 +40,7 @@ class AppDrawerAdapter( listener.onAppClicked(item) } holder.itemView.setOnLongClickListener { - listener.onAppLongClicked(item) + listener.onAppLongClicked(item, it) } } diff --git a/app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt b/app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt index 2c096285..784c80f2 100644 --- a/app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt +++ b/app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt @@ -10,9 +10,11 @@ import android.provider.CalendarContract import android.provider.MediaStore import android.util.Log import android.view.LayoutInflater +import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.view.inputmethod.InputMethodManager +import android.widget.PopupMenu import androidx.constraintlayout.motion.widget.MotionLayout import androidx.constraintlayout.motion.widget.MotionLayout.TransitionListener import androidx.fragment.app.viewModels @@ -37,6 +39,7 @@ import java.text.SimpleDateFormat import java.util.* import javax.inject.Inject + @AndroidEntryPoint class HomeFragment : BaseFragment(), OnLaunchAppListener { @Inject @@ -280,8 +283,43 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener { } inner class AppDrawerListener { - fun onAppLongClicked(app : UnlauncherApp) : Boolean { - Log.i("HomeFragment App Long Clicked", app.toString()) + fun onAppLongClicked(app : UnlauncherApp, view: View) : Boolean { + val popupMenu = PopupMenu(this@HomeFragment.context, view) + popupMenu.inflate(R.menu.app_long_press_menu) + + popupMenu.setOnMenuItemClickListener { item: MenuItem? -> + + when (item!!.itemId) { + R.id.open -> { + Log.i("HomeFragment Long Pressed", "Open app ${app.packageName}") + } + R.id.info -> { + Log.i( + "HomeFragment Long Pressed", + "Open app ${app.packageName} info in settings" + ) + } + R.id.hide -> { + Log.i("HomeFragment Long Pressed", "Hide app ${app.packageName}") + } + R.id.rename -> { + Log.i("HomeFragment Long Pressed", "Rename app ${app.packageName}") + } + R.id.uninstall -> { + Log.i("HomeFragment Long Pressed", "Uninstall app ${app.packageName}") + } + } + true + } + + val fieldMPopup = PopupMenu::class.java.getDeclaredField("mPopup") + fieldMPopup.isAccessible = true + val mPopup = fieldMPopup.get(popupMenu) + mPopup.javaClass + .getDeclaredMethod("setForceShowIcon", Boolean::class.java) + .invoke(mPopup, true) + + popupMenu.show() return true } diff --git a/app/src/main/res/drawable/ic_app_info.xml b/app/src/main/res/drawable/ic_app_info.xml new file mode 100644 index 00000000..8f88947b --- /dev/null +++ b/app/src/main/res/drawable/ic_app_info.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_hide_app.xml b/app/src/main/res/drawable/ic_hide_app.xml new file mode 100644 index 00000000..1b5757c8 --- /dev/null +++ b/app/src/main/res/drawable/ic_hide_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_open_app.xml b/app/src/main/res/drawable/ic_open_app.xml new file mode 100644 index 00000000..5ef5bb63 --- /dev/null +++ b/app/src/main/res/drawable/ic_open_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_rename_app.xml b/app/src/main/res/drawable/ic_rename_app.xml new file mode 100644 index 00000000..6a9d9a46 --- /dev/null +++ b/app/src/main/res/drawable/ic_rename_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_uninstall_app.xml b/app/src/main/res/drawable/ic_uninstall_app.xml new file mode 100644 index 00000000..4d8ca3e7 --- /dev/null +++ b/app/src/main/res/drawable/ic_uninstall_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/menu/app_long_press_menu.xml b/app/src/main/res/menu/app_long_press_menu.xml new file mode 100644 index 00000000..689ed1e7 --- /dev/null +++ b/app/src/main/res/menu/app_long_press_menu.xml @@ -0,0 +1,23 @@ + + + + + + + + \ 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 7af7f65c..ea0ac3d8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -57,5 +57,10 @@ Remove All Apps "This action will not uninstall your apps." "It is just to confirm if you're clearing this list on purpose" + Open App + App Info + Hide App + Rename App + Uninstall From bc3699086a9185aeebdae11c7d5aafce38f003a0 Mon Sep 17 00:00:00 2001 From: ru2saig <42857541+ru2saig@users.noreply.github.com> Date: Sat, 10 Dec 2022 22:41:48 +0530 Subject: [PATCH 4/6] Added open, info, hide and uninstall actions to the app list popup menu. --- app/src/main/AndroidManifest.xml | 2 +- .../slimlauncher/ui/main/HomeFragment.kt | 27 +++++++++++++------ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7b774e8d..dccbd13e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,10 +6,10 @@ + - when (item!!.itemId) { R.id.open -> { - Log.i("HomeFragment Long Pressed", "Open app ${app.packageName}") + onAppClicked(app) } R.id.info -> { - Log.i( - "HomeFragment Long Pressed", - "Open app ${app.packageName} info in settings" - ) + val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + intent.addCategory(Intent.CATEGORY_DEFAULT) + intent.data = Uri.parse("package:" + app.packageName) + startActivity(intent) } R.id.hide -> { - Log.i("HomeFragment Long Pressed", "Hide app ${app.packageName}") + unlauncherDataSource.unlauncherAppsRepo.updateDisplayInDrawer(app, false) + Toast.makeText(context, "Unhide under Unlauncher's Options > Customize Drawer > Visible Apps", Toast.LENGTH_LONG).show() } R.id.rename -> { Log.i("HomeFragment Long Pressed", "Rename app ${app.packageName}") } R.id.uninstall -> { - Log.i("HomeFragment Long Pressed", "Uninstall app ${app.packageName}") + val intent = Intent(Intent.ACTION_DELETE) + intent.data = Uri.parse("package:" + app.packageName) + startActivity(intent) + //appDrawerAdapter.notifyDataSetChanged() + // TODO: Handle the case when this is done for system apps } } true From a187c64b59a33aef3078705c0e25ce3c350833dc Mon Sep 17 00:00:00 2001 From: ru2saig <42857541+ru2saig@users.noreply.github.com> Date: Sun, 11 Dec 2022 12:45:33 +0530 Subject: [PATCH 5/6] Rename apps so that the names scream. --- .../apps/UnlauncherAppsRepository.kt | 19 +++++++++++++++++++ .../slimlauncher/ui/main/HomeFragment.kt | 5 +---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/sduduzog/slimlauncher/datasource/apps/UnlauncherAppsRepository.kt b/app/src/main/java/com/sduduzog/slimlauncher/datasource/apps/UnlauncherAppsRepository.kt index 85e5520c..b5883d8b 100644 --- a/app/src/main/java/com/sduduzog/slimlauncher/datasource/apps/UnlauncherAppsRepository.kt +++ b/app/src/main/java/com/sduduzog/slimlauncher/datasource/apps/UnlauncherAppsRepository.kt @@ -123,6 +123,25 @@ class UnlauncherAppsRepository( } } + fun updateDisplayName(appToUpdate: UnlauncherApp, displayName: String) { + lifecycleScope.launch { + unlauncherAppsStore.updateData { currentApps -> + val builder = currentApps.toBuilder() + val index = builder.appsList.indexOf(appToUpdate) + if (index >= 0) { + builder.setApps( + index, + appToUpdate.toBuilder().setDisplayName(displayName) + ) + } + + sortAppsAlphabetically(builder) + builder.build() + } + } + } + + fun updateDisplayInDrawer(appToUpdate: UnlauncherApp, displayInDrawer: Boolean) { lifecycleScope.launch { unlauncherAppsStore.updateData { currentApps -> diff --git a/app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt b/app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt index 2bee5e29..263d9dda 100644 --- a/app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt +++ b/app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt @@ -29,11 +29,8 @@ import com.sduduzog.slimlauncher.R import com.sduduzog.slimlauncher.adapters.AppDrawerAdapter import com.sduduzog.slimlauncher.adapters.HomeAdapter import com.sduduzog.slimlauncher.datasource.UnlauncherDataSource -import com.sduduzog.slimlauncher.datasource.apps.UnlauncherAppsRepository -import com.sduduzog.slimlauncher.models.CustomiseAppsViewModel import com.sduduzog.slimlauncher.models.HomeApp import com.sduduzog.slimlauncher.models.MainViewModel -import com.sduduzog.slimlauncher.ui.dialogs.RenameAppDialog import com.sduduzog.slimlauncher.utils.BaseFragment import com.sduduzog.slimlauncher.utils.OnLaunchAppListener import dagger.hilt.android.AndroidEntryPoint @@ -310,7 +307,7 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener { Toast.makeText(context, "Unhide under Unlauncher's Options > Customize Drawer > Visible Apps", Toast.LENGTH_LONG).show() } R.id.rename -> { - Log.i("HomeFragment Long Pressed", "Rename app ${app.packageName}") + unlauncherDataSource.unlauncherAppsRepo.updateDisplayName(app, "AAAAAAAAAAA") } R.id.uninstall -> { val intent = Intent(Intent.ACTION_DELETE) From 9ad6cb82bc39597433487f3904aa5fa0151f969e Mon Sep 17 00:00:00 2001 From: ru2saig <42857541+ru2saig@users.noreply.github.com> Date: Sun, 11 Dec 2022 13:17:26 +0530 Subject: [PATCH 6/6] Added a app rename dialog for the app dialog longclicked popup menu --- .../ui/dialogs/RenameAppDisplayNameDialog.kt | 57 +++++++++++++++++++ .../slimlauncher/ui/main/HomeFragment.kt | 4 +- 2 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/sduduzog/slimlauncher/ui/dialogs/RenameAppDisplayNameDialog.kt diff --git a/app/src/main/java/com/sduduzog/slimlauncher/ui/dialogs/RenameAppDisplayNameDialog.kt b/app/src/main/java/com/sduduzog/slimlauncher/ui/dialogs/RenameAppDisplayNameDialog.kt new file mode 100644 index 00000000..7fd5bd52 --- /dev/null +++ b/app/src/main/java/com/sduduzog/slimlauncher/ui/dialogs/RenameAppDisplayNameDialog.kt @@ -0,0 +1,57 @@ +package com.sduduzog.slimlauncher.ui.dialogs + +import android.app.Dialog +import android.os.Bundle +import android.view.LayoutInflater +import android.widget.EditText +import android.widget.Toast +import androidx.appcompat.app.AlertDialog +import androidx.fragment.app.DialogFragment +import com.jkuester.unlauncher.datastore.UnlauncherApp +import com.sduduzog.slimlauncher.R +import com.sduduzog.slimlauncher.datasource.apps.UnlauncherAppsRepository +import kotlinx.android.synthetic.main.customise_apps_fragment.* + +class RenameAppDisplayNameDialog : DialogFragment() { + private lateinit var app: UnlauncherApp + private lateinit var unlauncherAppsRepo: UnlauncherAppsRepository + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val view = LayoutInflater.from(context).inflate(R.layout.rename_dialog_edit_text, customise_apps_fragment, false) + val editText: EditText = view.findViewById(R.id.rename_editText) + val appName: String = app.displayName + editText.text.append(appName) + val builder = AlertDialog.Builder(requireContext()) + builder.setTitle("Rename $appName") + builder.setView(view) + builder.setPositiveButton("DONE") { _, _ -> + val name = editText.text.toString() + updateApp(name) + } + editText.setOnEditorActionListener { v, _, _ -> + val name = v.text.toString() + updateApp(name) + this@RenameAppDisplayNameDialog.dismiss() + true + } + + return builder.create() + } + + private fun updateApp(newName: String) { + if (newName.isNotEmpty()) { + unlauncherAppsRepo.updateDisplayName(app, newName) + } else { + Toast.makeText(context, "Couldn't save, App name shouldn't be empty", Toast.LENGTH_LONG).show() + } + } + + companion object { + fun getInstance(app: UnlauncherApp, unlauncherAppsRepo : UnlauncherAppsRepository) : RenameAppDisplayNameDialog { + return RenameAppDisplayNameDialog().apply { + this.app = app + this.unlauncherAppsRepo = unlauncherAppsRepo + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt b/app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt index 263d9dda..9c1bbb33 100644 --- a/app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt +++ b/app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt @@ -10,7 +10,6 @@ import android.provider.AlarmClock import android.provider.CalendarContract import android.provider.MediaStore import android.provider.Settings -import android.util.Log import android.view.LayoutInflater import android.view.MenuItem import android.view.View @@ -31,6 +30,7 @@ import com.sduduzog.slimlauncher.adapters.HomeAdapter import com.sduduzog.slimlauncher.datasource.UnlauncherDataSource import com.sduduzog.slimlauncher.models.HomeApp import com.sduduzog.slimlauncher.models.MainViewModel +import com.sduduzog.slimlauncher.ui.dialogs.RenameAppDisplayNameDialog import com.sduduzog.slimlauncher.utils.BaseFragment import com.sduduzog.slimlauncher.utils.OnLaunchAppListener import dagger.hilt.android.AndroidEntryPoint @@ -307,7 +307,7 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener { Toast.makeText(context, "Unhide under Unlauncher's Options > Customize Drawer > Visible Apps", Toast.LENGTH_LONG).show() } R.id.rename -> { - unlauncherDataSource.unlauncherAppsRepo.updateDisplayName(app, "AAAAAAAAAAA") + RenameAppDisplayNameDialog.getInstance(app, unlauncherDataSource.unlauncherAppsRepo).show(childFragmentManager, "AppListAdapter") } R.id.uninstall -> { val intent = Intent(Intent.ACTION_DELETE)