mirror of
https://github.com/FossifyOrg/Launcher.git
synced 2026-02-05 21:32:42 -05:00
Ensure proper paddings are applied to fragments
Also fixed transparent drawer background color on Android 8
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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? {
|
||||
|
||||
Reference in New Issue
Block a user