From e014db8034f2c8d4b80b92fa488e141f8be4ef6c Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 12 Jun 2022 15:46:30 +0530 Subject: [PATCH 1/6] Show a placeholder when no items are available --- .../applauncher/activities/MainActivity.kt | 57 ++++++++++++++++--- .../applauncher/adapters/LaunchersAdapter.kt | 11 +++- app/src/main/res/layout/activity_main.xml | 31 ++++++++++ 3 files changed, 87 insertions(+), 12 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt index 6a4ae54..bb867bf 100644 --- a/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt @@ -33,6 +33,8 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { private var mStoredPrimaryColor = 0 private var mStoredTextColor = 0 + private val emptyViews by lazy { arrayOf(add_icons_placeholder, no_items_placeholder) } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) @@ -43,13 +45,9 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { setupGridLayoutManager() fab.setOnClickListener { - if (allLaunchers != null) { - val shownLaunchers = (launchers_grid.adapter as LaunchersAdapter).launchers - AddLaunchersDialog(this, allLaunchers!!, shownLaunchers) { - setupLaunchers() - } - } + fabClicked() } + setupEmptyView() } override fun onResume() { @@ -58,7 +56,8 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { getGridAdapter()?.updateTextColor(getProperTextColor()) } - if (mStoredPrimaryColor != getProperPrimaryColor()) { + val properPrimaryColor = getProperPrimaryColor() + if (mStoredPrimaryColor != properPrimaryColor) { getGridAdapter()?.apply { updatePrimaryColor() notifyDataSetChanged() @@ -66,7 +65,8 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { } updateTextColors(coordinator_layout) - launchers_fastscroller.updateColors(getProperPrimaryColor()) + add_icons_placeholder.setTextColor(properPrimaryColor) + launchers_fastscroller.updateColors(properPrimaryColor) } override fun onPause() { @@ -126,13 +126,20 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { checkInvalidApps() initZoomListener() setupAdapter(displayedLaunchers) + maybeShowEmptyView(displayedLaunchers) } private fun setupAdapter(launchers: ArrayList) { AppLauncher.sorting = config.sorting launchers.sort() - LaunchersAdapter(this, launchers, this, launchers_grid) { + LaunchersAdapter( + activity = this, + launchers = launchers, + listener = this, + recyclerView = launchers_grid, + onItemsRemoved = ::onItemsRemoved, + ) { hideKeyboard() val launchIntent = packageManager.getLaunchIntentForPackage((it as AppLauncher).packageName) if (launchIntent != null) { @@ -256,4 +263,36 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { checkWhatsNew(this, BuildConfig.VERSION_CODE) } } + + private fun fabClicked() { + if (allLaunchers != null) { + val shownLaunchers = (launchers_grid.adapter as LaunchersAdapter).launchers + AddLaunchersDialog(this, allLaunchers!!, shownLaunchers) { + setupLaunchers() + } + } + } + + private fun setupEmptyView() { + val properPrimaryColor = getProperPrimaryColor() + add_icons_placeholder.underlineText() + add_icons_placeholder.setTextColor(properPrimaryColor) + add_icons_placeholder.setOnClickListener { + fabClicked() + } + } + + private fun onItemsRemoved() { + maybeShowEmptyView() + } + + private fun maybeShowEmptyView(displayedLaunchers: ArrayList = dbHelper.getLaunchers()) { + if (displayedLaunchers.isEmpty()) { + launchers_fastscroller.fadeOut() + emptyViews.forEach { it.fadeIn() } + } else { + emptyViews.forEach { it.fadeOut() } + launchers_fastscroller.fadeIn() + } + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/applauncher/adapters/LaunchersAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/applauncher/adapters/LaunchersAdapter.kt index 5fa2aa2..7c67f50 100644 --- a/app/src/main/kotlin/com/simplemobiletools/applauncher/adapters/LaunchersAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/applauncher/adapters/LaunchersAdapter.kt @@ -27,8 +27,12 @@ import kotlinx.android.synthetic.main.item_launcher_label.view.* import java.util.* class LaunchersAdapter( - activity: SimpleActivity, val launchers: ArrayList, val listener: RefreshRecyclerViewListener?, - recyclerView: MyRecyclerView, itemClick: (Any) -> Unit + activity: SimpleActivity, + val launchers: ArrayList, + val listener: RefreshRecyclerViewListener?, + recyclerView: MyRecyclerView, + var onItemsRemoved: (() -> Unit)? = null, + itemClick: (Any) -> Unit ) : MyRecyclerViewAdapter(activity, recyclerView, itemClick), ItemTouchHelperContract, RecyclerViewFastScroller.OnPopupTextUpdate { private var isChangingOrder = false @@ -171,10 +175,11 @@ class LaunchersAdapter( } } - launchers.removeAll(removeLaunchers) + launchers.removeAll(removeLaunchers.toSet()) activity.dbHelper.deleteLaunchers(removeIds) positions.sortDescending() removeSelectedItems(positions) + onItemsRemoved?.invoke() } private fun setupView(view: View, launcher: AppLauncher, holder: ViewHolder) { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 6aab43a..a9be5bd 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,6 +1,7 @@ @@ -10,6 +11,36 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> + + + + Date: Sun, 12 Jun 2022 15:48:22 +0530 Subject: [PATCH 2/6] Use rounded ripple drawable for text button --- app/src/main/res/layout/activity_main.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index a9be5bd..7ed1dbc 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -33,7 +33,7 @@ android:layout_height="wrap_content" android:layout_below="@+id/no_items_placeholder" android:layout_centerHorizontal="true" - android:background="?attr/selectableItemBackground" + android:background="@drawable/ripple_all_corners" android:gravity="center" android:padding="@dimen/activity_margin" android:text="@string/manage_visible_app_icons" From 1c6585e5f95ec485a3664c30df8de3b084720636 Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 12 Jun 2022 16:58:40 +0530 Subject: [PATCH 3/6] Convert `emptyViews` to an ordinary property --- .../applauncher/activities/MainActivity.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt index bb867bf..7b83581 100644 --- a/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt @@ -4,6 +4,7 @@ import android.content.Intent import android.os.Bundle import android.view.Menu import android.view.MenuItem +import android.view.View import com.simplemobiletools.applauncher.BuildConfig import com.simplemobiletools.applauncher.R import com.simplemobiletools.applauncher.adapters.LaunchersAdapter @@ -33,12 +34,13 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { private var mStoredPrimaryColor = 0 private var mStoredTextColor = 0 - private val emptyViews by lazy { arrayOf(add_icons_placeholder, no_items_placeholder) } + private var emptyViews: ArrayList? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) appLaunched(BuildConfig.APPLICATION_ID) + setupEmptyView() setupLaunchers() checkWhatsNewDialog() storeStateVariables() @@ -47,7 +49,6 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { fab.setOnClickListener { fabClicked() } - setupEmptyView() } override fun onResume() { @@ -274,6 +275,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { } private fun setupEmptyView() { + emptyViews = arrayListOf(add_icons_placeholder, no_items_placeholder) val properPrimaryColor = getProperPrimaryColor() add_icons_placeholder.underlineText() add_icons_placeholder.setTextColor(properPrimaryColor) @@ -289,9 +291,9 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { private fun maybeShowEmptyView(displayedLaunchers: ArrayList = dbHelper.getLaunchers()) { if (displayedLaunchers.isEmpty()) { launchers_fastscroller.fadeOut() - emptyViews.forEach { it.fadeIn() } + emptyViews?.forEach { it.fadeIn() } } else { - emptyViews.forEach { it.fadeOut() } + emptyViews?.forEach { it.fadeOut() } launchers_fastscroller.fadeIn() } } From 5a777cd02882bcacd0c2c42c9067d8f13fbb36d3 Mon Sep 17 00:00:00 2001 From: Naveen Date: Mon, 13 Jun 2022 20:15:43 +0530 Subject: [PATCH 4/6] Remove global variable --- .../applauncher/activities/MainActivity.kt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt index 7b83581..31a4764 100644 --- a/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt @@ -4,7 +4,6 @@ import android.content.Intent import android.os.Bundle import android.view.Menu import android.view.MenuItem -import android.view.View import com.simplemobiletools.applauncher.BuildConfig import com.simplemobiletools.applauncher.R import com.simplemobiletools.applauncher.adapters.LaunchersAdapter @@ -34,8 +33,6 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { private var mStoredPrimaryColor = 0 private var mStoredTextColor = 0 - private var emptyViews: ArrayList? = null - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) @@ -275,7 +272,6 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { } private fun setupEmptyView() { - emptyViews = arrayListOf(add_icons_placeholder, no_items_placeholder) val properPrimaryColor = getProperPrimaryColor() add_icons_placeholder.underlineText() add_icons_placeholder.setTextColor(properPrimaryColor) @@ -289,11 +285,12 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { } private fun maybeShowEmptyView(displayedLaunchers: ArrayList = dbHelper.getLaunchers()) { + val emptyViews = arrayOf(add_icons_placeholder, no_items_placeholder) if (displayedLaunchers.isEmpty()) { launchers_fastscroller.fadeOut() - emptyViews?.forEach { it.fadeIn() } + emptyViews.forEach { it.fadeIn() } } else { - emptyViews?.forEach { it.fadeOut() } + emptyViews.forEach { it.fadeOut() } launchers_fastscroller.fadeIn() } } From 397ef6d4ec0bfc9988a9e92eb4851331d0f73ab6 Mon Sep 17 00:00:00 2001 From: Naveen Date: Tue, 14 Jun 2022 09:53:49 +0530 Subject: [PATCH 5/6] Remove unnecessary lambda based listener --- .../applauncher/activities/MainActivity.kt | 9 ++------- .../applauncher/adapters/LaunchersAdapter.kt | 5 +++-- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt index 31a4764..1384b7c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt @@ -124,7 +124,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { checkInvalidApps() initZoomListener() setupAdapter(displayedLaunchers) - maybeShowEmptyView(displayedLaunchers) + maybeShowEmptyView() } private fun setupAdapter(launchers: ArrayList) { @@ -136,7 +136,6 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { launchers = launchers, listener = this, recyclerView = launchers_grid, - onItemsRemoved = ::onItemsRemoved, ) { hideKeyboard() val launchIntent = packageManager.getLaunchIntentForPackage((it as AppLauncher).packageName) @@ -280,11 +279,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { } } - private fun onItemsRemoved() { - maybeShowEmptyView() - } - - private fun maybeShowEmptyView(displayedLaunchers: ArrayList = dbHelper.getLaunchers()) { + private fun maybeShowEmptyView() { val emptyViews = arrayOf(add_icons_placeholder, no_items_placeholder) if (displayedLaunchers.isEmpty()) { launchers_fastscroller.fadeOut() diff --git a/app/src/main/kotlin/com/simplemobiletools/applauncher/adapters/LaunchersAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/applauncher/adapters/LaunchersAdapter.kt index 7c67f50..9c9505e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/applauncher/adapters/LaunchersAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/applauncher/adapters/LaunchersAdapter.kt @@ -31,7 +31,6 @@ class LaunchersAdapter( val launchers: ArrayList, val listener: RefreshRecyclerViewListener?, recyclerView: MyRecyclerView, - var onItemsRemoved: (() -> Unit)? = null, itemClick: (Any) -> Unit ) : MyRecyclerViewAdapter(activity, recyclerView, itemClick), ItemTouchHelperContract, RecyclerViewFastScroller.OnPopupTextUpdate { @@ -179,7 +178,9 @@ class LaunchersAdapter( activity.dbHelper.deleteLaunchers(removeIds) positions.sortDescending() removeSelectedItems(positions) - onItemsRemoved?.invoke() + if (launchers.isEmpty()) { + listener?.refreshItems() + } } private fun setupView(view: View, launcher: AppLauncher, holder: ViewHolder) { From 6e36acc19ec738a30c4c808a3dced985e9b011cc Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Tue, 14 Jun 2022 11:36:30 +0200 Subject: [PATCH 6/6] make a listener non nullable --- .../applauncher/adapters/LaunchersAdapter.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/applauncher/adapters/LaunchersAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/applauncher/adapters/LaunchersAdapter.kt index 9c9505e..55d6c6e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/applauncher/adapters/LaunchersAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/applauncher/adapters/LaunchersAdapter.kt @@ -29,7 +29,7 @@ import java.util.* class LaunchersAdapter( activity: SimpleActivity, val launchers: ArrayList, - val listener: RefreshRecyclerViewListener?, + val listener: RefreshRecyclerViewListener, recyclerView: MyRecyclerView, itemClick: (Any) -> Unit ) : MyRecyclerViewAdapter(activity, recyclerView, itemClick), ItemTouchHelperContract, RecyclerViewFastScroller.OnPopupTextUpdate { @@ -128,7 +128,7 @@ class LaunchersAdapter( private fun showEditDialog() { EditDialog(activity, getItemWithKey(selectedKeys.first())!!) { finishActMode() - listener?.refreshItems() + listener.refreshItems() } }