From f40cee392ed4df619128a9d33a339364fee32f27 Mon Sep 17 00:00:00 2001 From: Finn M Glas Date: Sat, 30 May 2020 00:42:23 +0200 Subject: [PATCH 1/3] Create a appmenu to be opened by three dots This menu is located in the `ChooseActivity`, helps managing apps (info / delete) --- .../com/finnmglas/launcher/ChooseActivity.kt | 5 ++- .../launcher/choose/AppsRecyclerAdapter.kt | 33 +++++++++++++++---- app/src/main/res/layout/recycler_apps_row.xml | 2 +- app/src/main/res/menu/menu_app.xml | 7 ++++ app/src/main/res/values/icons.xml | 3 +- 5 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 app/src/main/res/menu/menu_app.xml diff --git a/app/src/main/java/com/finnmglas/launcher/ChooseActivity.kt b/app/src/main/java/com/finnmglas/launcher/ChooseActivity.kt index f84a2e5..3b9b2bd 100644 --- a/app/src/main/java/com/finnmglas/launcher/ChooseActivity.kt +++ b/app/src/main/java/com/finnmglas/launcher/ChooseActivity.kt @@ -12,7 +12,6 @@ import com.finnmglas.launcher.choose.AppsRecyclerAdapter import com.finnmglas.launcher.extern.* import kotlinx.android.synthetic.main.activity_choose.* - class ChooseActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -67,6 +66,10 @@ class ChooseActivity : AppCompatActivity() { finish() } + override fun onResume() { + super.onResume() + } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_UNINSTALL) { diff --git a/app/src/main/java/com/finnmglas/launcher/choose/AppsRecyclerAdapter.kt b/app/src/main/java/com/finnmglas/launcher/choose/AppsRecyclerAdapter.kt index 70ce1a1..3e1e88a 100644 --- a/app/src/main/java/com/finnmglas/launcher/choose/AppsRecyclerAdapter.kt +++ b/app/src/main/java/com/finnmglas/launcher/choose/AppsRecyclerAdapter.kt @@ -3,20 +3,20 @@ package com.finnmglas.launcher.choose import android.app.Activity import android.content.Context import android.content.Intent -import android.content.pm.ApplicationInfo import android.content.pm.PackageManager import android.net.Uri import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView +import android.widget.PopupMenu import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.finnmglas.launcher.R import com.finnmglas.launcher.extern.FontAwesome import com.finnmglas.launcher.extern.REQUEST_CHOOSE_APP import com.finnmglas.launcher.extern.REQUEST_UNINSTALL - +import com.finnmglas.launcher.extern.openAppSettings class AppsRecyclerAdapter(val activity: Activity, val action: String?, val forApp: String?): RecyclerView.Adapter() { @@ -62,11 +62,30 @@ class AppsRecyclerAdapter(val activity: Activity, val action: String?, val forAp viewHolder.textView.text = appLabel viewHolder.img.setImageDrawable(appIcon) - viewHolder.delete.setOnClickListener{ - val intent = Intent(Intent.ACTION_UNINSTALL_PACKAGE) - intent.data = Uri.parse("package:$appPackageName") - intent.putExtra(Intent.EXTRA_RETURN_RESULT, true) - activity.startActivityForResult(intent, REQUEST_UNINSTALL) + viewHolder.delete.setOnClickListener{ //creating a popup menu + + val popup = PopupMenu(activity, viewHolder.delete) + popup.inflate(R.menu.menu_app) + + popup.setOnMenuItemClickListener { + when (it.itemId) { + R.id.app_menu_delete -> { // delete + val intent = Intent(Intent.ACTION_UNINSTALL_PACKAGE) + intent.data = Uri.parse("package:$appPackageName") + intent.putExtra(Intent.EXTRA_RETURN_RESULT, true) + activity.startActivityForResult(intent, REQUEST_UNINSTALL) + + true + } + R.id.app_menu_info -> { // open app settings + openAppSettings(appPackageName, activity) + true + } + else -> false + } + } + + popup.show() } viewHolder.delete.visibility = if(isSystemApp || action == "pick") View.INVISIBLE else View.VISIBLE diff --git a/app/src/main/res/layout/recycler_apps_row.xml b/app/src/main/res/layout/recycler_apps_row.xml index 8e8e667..51f50b5 100644 --- a/app/src/main/res/layout/recycler_apps_row.xml +++ b/app/src/main/res/layout/recycler_apps_row.xml @@ -36,7 +36,7 @@ android:layout_width="20sp" android:layout_height="wrap_content" android:gravity="center" - android:text="@string/fas_trash" + android:text="@string/fas_three_dots" android:textSize="20sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/menu/menu_app.xml b/app/src/main/res/menu/menu_app.xml new file mode 100644 index 0000000..eabf26f --- /dev/null +++ b/app/src/main/res/menu/menu_app.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/app/src/main/res/values/icons.xml b/app/src/main/res/values/icons.xml index 0a96570..dcc0cc7 100644 --- a/app/src/main/res/values/icons.xml +++ b/app/src/main/res/values/icons.xml @@ -11,7 +11,8 @@ - + + From 2399f35cc18f65b7b6ed81db5ee01bb59871bc3a Mon Sep 17 00:00:00 2001 From: Finn M Glas Date: Sat, 30 May 2020 00:58:33 +0200 Subject: [PATCH 2/3] Add translations for three dot menu And adjust variable names --- .../com/finnmglas/launcher/choose/AppsRecyclerAdapter.kt | 8 ++++---- app/src/main/res/layout/recycler_apps_row.xml | 4 ++-- app/src/main/res/menu/menu_app.xml | 4 ++-- app/src/main/res/values-de/strings.xml | 5 ++++- app/src/main/res/values-fr/strings.xml | 5 ++++- app/src/main/res/values/strings.xml | 3 +++ 6 files changed, 19 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/finnmglas/launcher/choose/AppsRecyclerAdapter.kt b/app/src/main/java/com/finnmglas/launcher/choose/AppsRecyclerAdapter.kt index 3e1e88a..c70f59a 100644 --- a/app/src/main/java/com/finnmglas/launcher/choose/AppsRecyclerAdapter.kt +++ b/app/src/main/java/com/finnmglas/launcher/choose/AppsRecyclerAdapter.kt @@ -27,7 +27,7 @@ class AppsRecyclerAdapter(val activity: Activity, val action: String?, val forAp View.OnClickListener { var textView: TextView = itemView.findViewById(R.id.choose_row_app_name) var img: ImageView = itemView.findViewById(R.id.choose_row_app_icon) as ImageView - var delete: FontAwesome = itemView.findViewById(R.id.choose_row_app_delete) + var menuDots: FontAwesome = itemView.findViewById(R.id.choose_row_app_menu) override fun onClick(v: View) { val pos = adapterPosition @@ -62,9 +62,9 @@ class AppsRecyclerAdapter(val activity: Activity, val action: String?, val forAp viewHolder.textView.text = appLabel viewHolder.img.setImageDrawable(appIcon) - viewHolder.delete.setOnClickListener{ //creating a popup menu + viewHolder.menuDots.setOnClickListener{ //creating a popup menu - val popup = PopupMenu(activity, viewHolder.delete) + val popup = PopupMenu(activity, viewHolder.menuDots) popup.inflate(R.menu.menu_app) popup.setOnMenuItemClickListener { @@ -88,7 +88,7 @@ class AppsRecyclerAdapter(val activity: Activity, val action: String?, val forAp popup.show() } - viewHolder.delete.visibility = if(isSystemApp || action == "pick") View.INVISIBLE else View.VISIBLE + viewHolder.menuDots.visibility = if(isSystemApp || action == "pick") View.INVISIBLE else View.VISIBLE } override fun getItemCount(): Int { return appsList.size } diff --git a/app/src/main/res/layout/recycler_apps_row.xml b/app/src/main/res/layout/recycler_apps_row.xml index 51f50b5..b5146df 100644 --- a/app/src/main/res/layout/recycler_apps_row.xml +++ b/app/src/main/res/layout/recycler_apps_row.xml @@ -27,12 +27,12 @@ android:text="" android:textSize="20sp" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@+id/choose_row_app_delete" + app:layout_constraintEnd_toStartOf="@+id/choose_row_app_menu" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + android:title="@string/app_menu_delete_text" /> + android:title="@string/app_menu_info_text" /> diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ad8e44d..ef3a368 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -23,8 +23,11 @@ Lautstärke - Doppelklick Langer Klick - App wählen + + Deinstallieren + App Info + Launcher wählen Zurücksetzen All deine Einstellungen gehen verloren. Weitermachen? diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 23362b9..97bd459 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -23,8 +23,11 @@ Baisser volume Double clic Clic long - Choisir App + + Désinstaller + Informations + Choisir Launcher Réinitialiser Vous allez supprimer toutes vos préférences. Continuer? diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4e29162..9e65424 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -33,6 +33,9 @@ Long Click Choose App + Uninstall + App Info + Select Launcher Reset Settings You are going to discard all your preferences. Continue? From d74783a3fd91d1be45ac95f6b99df0d71eb3ed71 Mon Sep 17 00:00:00 2001 From: Finn M Glas Date: Sat, 30 May 2020 01:23:05 +0200 Subject: [PATCH 3/3] A few related fixes + Prevent opening app when clicking close to 3 dots icon + Enable dark popup background on older APIs + Prevent closing `ChooseActivity` when app is uninstalled --- .../main/java/com/finnmglas/launcher/ChooseActivity.kt | 5 ++++- .../finnmglas/launcher/choose/AppsRecyclerAdapter.kt | 3 +++ app/src/main/res/layout/recycler_apps_row.xml | 4 ++-- app/src/main/res/values/styles.xml | 10 ++++++++++ 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/finnmglas/launcher/ChooseActivity.kt b/app/src/main/java/com/finnmglas/launcher/ChooseActivity.kt index 3b9b2bd..7c1c533 100644 --- a/app/src/main/java/com/finnmglas/launcher/ChooseActivity.kt +++ b/app/src/main/java/com/finnmglas/launcher/ChooseActivity.kt @@ -12,6 +12,8 @@ import com.finnmglas.launcher.choose.AppsRecyclerAdapter import com.finnmglas.launcher.extern.* import kotlinx.android.synthetic.main.activity_choose.* +var intendedChoosePause = false // know when to close + class ChooseActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -63,11 +65,12 @@ class ChooseActivity : AppCompatActivity() { override fun onPause() { super.onPause() intendedSettingsPause = false - finish() + if(!intendedChoosePause) finish() } override fun onResume() { super.onResume() + intendedChoosePause = false } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { diff --git a/app/src/main/java/com/finnmglas/launcher/choose/AppsRecyclerAdapter.kt b/app/src/main/java/com/finnmglas/launcher/choose/AppsRecyclerAdapter.kt index c70f59a..df1ed41 100644 --- a/app/src/main/java/com/finnmglas/launcher/choose/AppsRecyclerAdapter.kt +++ b/app/src/main/java/com/finnmglas/launcher/choose/AppsRecyclerAdapter.kt @@ -17,6 +17,7 @@ import com.finnmglas.launcher.extern.FontAwesome import com.finnmglas.launcher.extern.REQUEST_CHOOSE_APP import com.finnmglas.launcher.extern.REQUEST_UNINSTALL import com.finnmglas.launcher.extern.openAppSettings +import com.finnmglas.launcher.intendedChoosePause class AppsRecyclerAdapter(val activity: Activity, val action: String?, val forApp: String?): RecyclerView.Adapter() { @@ -70,6 +71,7 @@ class AppsRecyclerAdapter(val activity: Activity, val action: String?, val forAp popup.setOnMenuItemClickListener { when (it.itemId) { R.id.app_menu_delete -> { // delete + intendedChoosePause = true val intent = Intent(Intent.ACTION_UNINSTALL_PACKAGE) intent.data = Uri.parse("package:$appPackageName") intent.putExtra(Intent.EXTRA_RETURN_RESULT, true) @@ -78,6 +80,7 @@ class AppsRecyclerAdapter(val activity: Activity, val action: String?, val forAp true } R.id.app_menu_info -> { // open app settings + intendedChoosePause = true openAppSettings(appPackageName, activity) true } diff --git a/app/src/main/res/layout/recycler_apps_row.xml b/app/src/main/res/layout/recycler_apps_row.xml index b5146df..80da072 100644 --- a/app/src/main/res/layout/recycler_apps_row.xml +++ b/app/src/main/res/layout/recycler_apps_row.xml @@ -33,8 +33,8 @@ @style/Widget.AppCompat.Button.Colored @color/finnmglasTheme_accent_color + @style/PopupMenuCustom + true @style/WindowFadeTransition @@ -27,6 +29,8 @@ @style/Widget.AppCompat.Button.Colored @color/darkTheme_accent_color + @style/PopupMenuCustom + true @style/WindowFadeTransition @@ -37,10 +41,16 @@ @style/Widget.AppCompat.Button.Colored #252827 + @style/PopupMenuCustom + true @style/WindowFadeTransition + +