Ensure proper paddings are applied to fragments

Also fixed transparent drawer background color on Android 8
This commit is contained in:
Naveen Singh
2024-10-14 14:13:53 -04:00
parent 3c6b9358ca
commit 17db796ac0
5 changed files with 123 additions and 64 deletions

View File

@@ -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 {

View File

@@ -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
}
}
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)
}
}
}
}

View File

@@ -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<AppLauncher>()
@@ -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)
}
}
}
}
}

View File

@@ -6,7 +6,10 @@ import android.widget.RelativeLayout
import androidx.viewbinding.ViewBinding
import org.fossify.launcher.activities.MainActivity
abstract class MyFragment<BINDING : ViewBinding>(context: Context, attributeSet: AttributeSet) : RelativeLayout(context, attributeSet) {
abstract class MyFragment<BINDING : ViewBinding>(
context: Context,
attributeSet: AttributeSet
) : RelativeLayout(context, attributeSet) {
protected var activity: MainActivity? = null
protected lateinit var binding: BINDING

View File

@@ -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<WidgetsFragmentBinding>(context, attributeSet), WidgetsFragmentListener {
class WidgetsFragment(context: Context, attributeSet: AttributeSet) :
MyFragment<WidgetsFragmentBinding>(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<AppWidget>
appWidgets = appWidgets.sortedWith(
compareBy({ it.appTitle },
{ it.appPackageName },
{ it.widgetTitle })
).toMutableList() as ArrayList<AppWidget>
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? {