From 17db796ac020eb5afea7d1bb70be7be7889bd6f8 Mon Sep 17 00:00:00 2001 From: Naveen Singh Date: Mon, 14 Oct 2024 14:13:53 -0400 Subject: [PATCH] Ensure proper paddings are applied to fragments Also fixed transparent drawer background color on Android 8 --- .../launcher/activities/MainActivity.kt | 20 +++-- .../org/fossify/launcher/extensions/View.kt | 31 ++++++- .../launcher/fragments/AllAppsFragment.kt | 44 +++------- .../fossify/launcher/fragments/MyFragment.kt | 5 +- .../launcher/fragments/WidgetsFragment.kt | 87 ++++++++++++++----- 5 files changed, 123 insertions(+), 64 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/launcher/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/launcher/activities/MainActivity.kt index 88aaca2..3330961 100644 --- a/app/src/main/kotlin/org/fossify/launcher/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/launcher/activities/MainActivity.kt @@ -37,6 +37,8 @@ import androidx.core.graphics.drawable.toBitmap import androidx.core.graphics.drawable.toDrawable import androidx.core.view.GestureDetectorCompat import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.WindowInsetsCompat.Type import androidx.core.view.isVisible import androidx.core.view.iterator import androidx.viewbinding.ViewBinding @@ -55,7 +57,6 @@ import org.fossify.commons.extensions.toast import org.fossify.commons.extensions.viewBinding import org.fossify.commons.helpers.DARK_GREY import org.fossify.commons.helpers.ensureBackgroundThread -import org.fossify.commons.helpers.isPiePlus import org.fossify.commons.helpers.isQPlus import org.fossify.launcher.BuildConfig import org.fossify.launcher.R @@ -192,13 +193,20 @@ class MainActivity : SimpleActivity(), FlingListener { wasJustPaused = false updateStatusbarColor(Color.TRANSPARENT) - binding.mainHolder.onGlobalLayout { - if (isPiePlus()) { - val addTopPadding = binding.mainHolder.rootWindowInsets?.displayCutout != null - binding.allAppsFragment.root.setupViews(addTopPadding) - binding.widgetsFragment.root.setupViews(addTopPadding) + with(binding.mainHolder) { + onGlobalLayout { + binding.allAppsFragment.root.setupViews() + binding.widgetsFragment.root.setupViews() updateStatusbarColor(Color.TRANSPARENT) } + + setOnApplyWindowInsetsListener { _, insets -> + val windowInsets = WindowInsetsCompat.toWindowInsetsCompat(insets) + val systemBarInsets = windowInsets.getInsets(Type.systemBars() or Type.ime()) + binding.allAppsFragment.root.setPadding(0, systemBarInsets.top, 0, 0) + binding.widgetsFragment.root.setPadding(0, systemBarInsets.top, 0, 0) + insets + } } ensureBackgroundThread { diff --git a/app/src/main/kotlin/org/fossify/launcher/extensions/View.kt b/app/src/main/kotlin/org/fossify/launcher/extensions/View.kt index dcb17af..40ca4d7 100644 --- a/app/src/main/kotlin/org/fossify/launcher/extensions/View.kt +++ b/app/src/main/kotlin/org/fossify/launcher/extensions/View.kt @@ -1,7 +1,16 @@ package org.fossify.launcher.extensions +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.LayerDrawable +import android.view.RoundedCorner.POSITION_TOP_LEFT +import android.view.RoundedCorner.POSITION_TOP_RIGHT import android.view.View import android.view.animation.AccelerateDecelerateInterpolator +import androidx.core.content.res.ResourcesCompat +import org.fossify.commons.R +import org.fossify.commons.extensions.applyColorFilter +import org.fossify.commons.extensions.getProperBackgroundColor +import org.fossify.commons.helpers.isSPlus fun View.animateScale( from: Float, @@ -15,4 +24,24 @@ fun View.animateScale( .withStartAction { scaleX = from scaleY = from - } \ No newline at end of file + } + +fun View.setupDrawerBackground() { + val backgroundColor = context.getProperBackgroundColor() + background = ColorDrawable(backgroundColor) + + val insets = rootWindowInsets + if (isSPlus() && insets != null) { + val topRightCorner = insets.getRoundedCorner(POSITION_TOP_RIGHT)?.radius ?: 0 + val topLeftCorner = insets.getRoundedCorner(POSITION_TOP_LEFT)?.radius ?: 0 + if (topRightCorner > 0 && topLeftCorner > 0) { + background = ResourcesCompat.getDrawable( + context.resources, R.drawable.bottom_sheet_bg, context.theme + ).apply { + (this as LayerDrawable) + .findDrawableByLayerId(R.id.bottom_sheet_background) + .applyColorFilter(backgroundColor) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/org/fossify/launcher/fragments/AllAppsFragment.kt b/app/src/main/kotlin/org/fossify/launcher/fragments/AllAppsFragment.kt index a9e8e6f..c0b1e59 100644 --- a/app/src/main/kotlin/org/fossify/launcher/fragments/AllAppsFragment.kt +++ b/app/src/main/kotlin/org/fossify/launcher/fragments/AllAppsFragment.kt @@ -2,22 +2,15 @@ package org.fossify.launcher.fragments import android.annotation.SuppressLint import android.content.Context -import android.graphics.drawable.ColorDrawable -import android.graphics.drawable.LayerDrawable import android.util.AttributeSet import android.view.MotionEvent -import android.view.RoundedCorner.POSITION_TOP_LEFT -import android.view.RoundedCorner.POSITION_TOP_RIGHT import android.view.Surface import android.view.WindowManager -import androidx.core.content.res.ResourcesCompat import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.OnScrollListener import org.fossify.commons.R -import org.fossify.commons.extensions.applyColorFilter import org.fossify.commons.extensions.beGone import org.fossify.commons.extensions.beVisibleIf -import org.fossify.commons.extensions.getProperBackgroundColor import org.fossify.commons.extensions.getProperPrimaryColor import org.fossify.commons.extensions.getProperTextColor import org.fossify.commons.extensions.hideKeyboard @@ -26,15 +19,14 @@ import org.fossify.commons.extensions.navigationBarOnBottom import org.fossify.commons.extensions.navigationBarOnSide import org.fossify.commons.extensions.navigationBarWidth import org.fossify.commons.extensions.normalizeString -import org.fossify.commons.extensions.statusBarHeight import org.fossify.commons.helpers.isRPlus -import org.fossify.commons.helpers.isSPlus import org.fossify.commons.views.MyGridLayoutManager import org.fossify.launcher.activities.MainActivity import org.fossify.launcher.adapters.LaunchersAdapter import org.fossify.launcher.databinding.AllAppsFragmentBinding import org.fossify.launcher.extensions.config import org.fossify.launcher.extensions.launchApp +import org.fossify.launcher.extensions.setupDrawerBackground import org.fossify.launcher.helpers.ITEM_TYPE_ICON import org.fossify.launcher.interfaces.AllAppsListener import org.fossify.launcher.models.AppLauncher @@ -48,7 +40,6 @@ class AllAppsFragment( private var lastTouchCoords = Pair(0f, 0f) var touchDownY = -1 var ignoreTouches = false - var hasTopPadding = false private var launchers = emptyList() @@ -66,6 +57,11 @@ class AllAppsFragment( } } + override fun onAttachedToWindow() { + super.onAttachedToWindow() + setupDrawerBackground() + } + @SuppressLint("NotifyDataSetChanged") fun onResume() { if (binding.allAppsGrid.layoutManager == null || binding.allAppsGrid.adapter == null) { @@ -184,7 +180,7 @@ class AllAppsFragment( } } - fun setupViews(addTopPadding: Boolean = hasTopPadding) { + fun setupViews() { if (activity == null) { return } @@ -195,6 +191,7 @@ class AllAppsFragment( var leftListPadding = 0 var rightListPadding = 0 + // TODO: Use WindowInsets API if (activity!!.navigationBarOnBottom) { bottomListPadding = activity!!.navigationBarHeight leftListPadding = 0 @@ -218,7 +215,7 @@ class AllAppsFragment( binding.allAppsGrid.setPadding( 0, 0, - resources.getDimension(org.fossify.commons.R.dimen.medium_margin).toInt(), + resources.getDimension(R.dimen.medium_margin).toInt(), bottomListPadding ) binding.allAppsFastscroller.setPadding(leftListPadding, 0, rightListPadding, 0) @@ -230,10 +227,7 @@ class AllAppsFragment( } }) - hasTopPadding = addTopPadding - val topPadding = if (addTopPadding) activity!!.statusBarHeight else 0 - setPadding(0, topPadding, 0, 0) - setupRoundedBackground() + setupDrawerBackground() getAdapter()?.updateTextColor(context.getProperTextColor()) binding.searchBar.beVisibleIf(context.config.showSearchBar) @@ -290,22 +284,4 @@ class AllAppsFragment( return false } - - private fun setupRoundedBackground() { - val backgroundColor = context.getProperBackgroundColor() - background = ColorDrawable(backgroundColor) - if (isSPlus()) { - val insets = rootWindowInsets - val topRightCorner = insets.getRoundedCorner(POSITION_TOP_RIGHT)?.radius ?: 0 - val topLeftCorner = insets.getRoundedCorner(POSITION_TOP_LEFT)?.radius ?: 0 - if (topRightCorner > 0 && topLeftCorner > 0) { - background = ResourcesCompat.getDrawable( - context.resources, R.drawable.bottom_sheet_bg, context.theme - ).apply { - (this as LayerDrawable).findDrawableByLayerId(R.id.bottom_sheet_background) - .applyColorFilter(backgroundColor) - } - } - } - } } diff --git a/app/src/main/kotlin/org/fossify/launcher/fragments/MyFragment.kt b/app/src/main/kotlin/org/fossify/launcher/fragments/MyFragment.kt index 57b4937..eebf424 100644 --- a/app/src/main/kotlin/org/fossify/launcher/fragments/MyFragment.kt +++ b/app/src/main/kotlin/org/fossify/launcher/fragments/MyFragment.kt @@ -6,7 +6,10 @@ import android.widget.RelativeLayout import androidx.viewbinding.ViewBinding import org.fossify.launcher.activities.MainActivity -abstract class MyFragment(context: Context, attributeSet: AttributeSet) : RelativeLayout(context, attributeSet) { +abstract class MyFragment( + context: Context, + attributeSet: AttributeSet +) : RelativeLayout(context, attributeSet) { protected var activity: MainActivity? = null protected lateinit var binding: BINDING diff --git a/app/src/main/kotlin/org/fossify/launcher/fragments/WidgetsFragment.kt b/app/src/main/kotlin/org/fossify/launcher/fragments/WidgetsFragment.kt index faa9120..a762842 100644 --- a/app/src/main/kotlin/org/fossify/launcher/fragments/WidgetsFragment.kt +++ b/app/src/main/kotlin/org/fossify/launcher/fragments/WidgetsFragment.kt @@ -6,13 +6,19 @@ import android.content.Context import android.content.Intent import android.content.pm.LauncherApps import android.content.pm.PackageManager -import android.graphics.drawable.ColorDrawable import android.os.Process import android.util.AttributeSet import android.view.MotionEvent import android.view.Surface import android.view.WindowManager -import org.fossify.commons.extensions.* +import org.fossify.commons.extensions.getProperPrimaryColor +import org.fossify.commons.extensions.getProperTextColor +import org.fossify.commons.extensions.navigationBarHeight +import org.fossify.commons.extensions.navigationBarOnBottom +import org.fossify.commons.extensions.navigationBarOnSide +import org.fossify.commons.extensions.navigationBarWidth +import org.fossify.commons.extensions.showErrorToast +import org.fossify.commons.extensions.toast import org.fossify.commons.helpers.ensureBackgroundThread import org.fossify.commons.helpers.isRPlus import org.fossify.launcher.R @@ -21,16 +27,21 @@ import org.fossify.launcher.adapters.WidgetsAdapter import org.fossify.launcher.databinding.WidgetsFragmentBinding import org.fossify.launcher.extensions.config import org.fossify.launcher.extensions.getInitialCellSize +import org.fossify.launcher.extensions.setupDrawerBackground import org.fossify.launcher.helpers.ITEM_TYPE_SHORTCUT import org.fossify.launcher.helpers.ITEM_TYPE_WIDGET import org.fossify.launcher.interfaces.WidgetsFragmentListener -import org.fossify.launcher.models.* +import org.fossify.launcher.models.AppWidget +import org.fossify.launcher.models.HomeScreenGridItem +import org.fossify.launcher.models.WidgetsListItem +import org.fossify.launcher.models.WidgetsListItemsHolder +import org.fossify.launcher.models.WidgetsListSection -class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment(context, attributeSet), WidgetsFragmentListener { +class WidgetsFragment(context: Context, attributeSet: AttributeSet) : + MyFragment(context, attributeSet), WidgetsFragmentListener { private var lastTouchCoords = Pair(0f, 0f) var touchDownY = -1 var ignoreTouches = false - var hasTopPadding = false @SuppressLint("ClickableViewAccessibility") override fun setupFragment(activity: MainActivity) { @@ -47,11 +58,12 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment } } - fun onConfigurationChanged() { - if (binding.widgetsList == null) { - return - } + override fun onAttachedToWindow() { + super.onAttachedToWindow() + setupDrawerBackground() + } + fun onConfigurationChanged() { binding.widgetsList.scrollToPosition(0) setupViews() @@ -81,7 +93,8 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment // pull the whole fragment down if it is scrolled way to the top and the users pulls it even further if (touchDownY != -1) { - shouldIntercept = touchDownY - event.y.toInt() < 0 && binding.widgetsList.computeVerticalScrollOffset() == 0 + shouldIntercept = + touchDownY - event.y.toInt() < 0 && binding.widgetsList.computeVerticalScrollOffset() == 0 if (shouldIntercept) { activity?.startHandlingTouches(touchDownY) touchDownY = -1 @@ -107,19 +120,33 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment val appTitle = appMetadata.appTitle val appIcon = appMetadata.appIcon val widgetTitle = info.loadLabel(packageManager) - val widgetPreviewImage = info.loadPreviewImage(context, resources.displayMetrics.densityDpi) ?: appIcon + val widgetPreviewImage = + info.loadPreviewImage(context, resources.displayMetrics.densityDpi) ?: appIcon val cellSize = context.getInitialCellSize(info, info.minWidth, info.minHeight) val widthCells = cellSize.width val heightCells = cellSize.height val className = info.provider.className val widget = - AppWidget(appPackageName, appTitle, appIcon, widgetTitle, widgetPreviewImage, widthCells, heightCells, false, className, info, null) + AppWidget( + appPackageName, + appTitle, + appIcon, + widgetTitle, + widgetPreviewImage, + widthCells, + heightCells, + false, + className, + info, + null + ) appWidgets.add(widget) } // show also the widgets that are technically shortcuts val intent = Intent(Intent.ACTION_CREATE_SHORTCUT, null) - val list = packageManager.queryIntentActivities(intent, PackageManager.PERMISSION_GRANTED) + val list = + packageManager.queryIntentActivities(intent, PackageManager.PERMISSION_GRANTED) for (info in list) { val componentInfo = info.activityInfo.applicationInfo val appTitle = componentInfo.loadLabel(packageManager).toString() @@ -127,12 +154,32 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment val appMetadata = getAppMetadataFromPackage(appPackageName) ?: continue val appIcon = appMetadata.appIcon val widgetTitle = info.loadLabel(packageManager).toString() - val widgetPreviewImage = packageManager.getDrawable(componentInfo.packageName, info.iconResource, componentInfo) - val widget = AppWidget(appPackageName, appTitle, appIcon, widgetTitle, widgetPreviewImage, 0, 0, true, "", null, info.activityInfo) + val widgetPreviewImage = packageManager.getDrawable( + componentInfo.packageName, + info.iconResource, + componentInfo + ) + val widget = AppWidget( + appPackageName, + appTitle, + appIcon, + widgetTitle, + widgetPreviewImage, + 0, + 0, + true, + "", + null, + info.activityInfo + ) appWidgets.add(widget) } - appWidgets = appWidgets.sortedWith(compareBy({ it.appTitle }, { it.appPackageName }, { it.widgetTitle })).toMutableList() as ArrayList + appWidgets = appWidgets.sortedWith( + compareBy({ it.appTitle }, + { it.appPackageName }, + { it.widgetTitle }) + ).toMutableList() as ArrayList splitWidgetsByApps(appWidgets) } } @@ -179,7 +226,7 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment } } - fun setupViews(addTopPadding: Boolean = hasTopPadding) { + fun setupViews() { if (activity == null) { return } @@ -212,12 +259,8 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment binding.widgetsList.setPadding(0, 0, 0, bottomListPadding) binding.widgetsFastscroller.setPadding(leftListPadding, 0, rightListPadding, 0) - - hasTopPadding = addTopPadding - val topPadding = if (addTopPadding) activity!!.statusBarHeight else 0 - setPadding(0, topPadding, 0, 0) - background = ColorDrawable(context.getProperBackgroundColor()) (binding.widgetsList.adapter as? WidgetsAdapter)?.updateTextColor(context.getProperTextColor()) + setupDrawerBackground() } private fun getAppMetadataFromPackage(packageName: String): WidgetsListSection? {