Skip to content

Commit

Permalink
modify getStatusBarHeight and getNavigationBarHeight method, fixes #21
Browse files Browse the repository at this point in the history
  • Loading branch information
Zackratos committed Jan 7, 2021
1 parent c0cbf0f commit 1499142
Show file tree
Hide file tree
Showing 9 changed files with 58 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,18 @@ import android.os.Build
import android.view.View
import com.zackratos.ultimatebarx.library.core.addNavigationBarBottomPadding
import com.zackratos.ultimatebarx.library.core.addStatusBarTopPadding
import com.zackratos.ultimatebarx.library.extension.getNavigationBarHeight
import com.zackratos.ultimatebarx.library.extension.getStatusBarHeight

/**
* @Author : zhangwenchao
* @Date : 2021/1/5 8:29 PM
* @email : [email protected]
* @Describe :
*/
fun Context.getStatusBarHeight() = UltimateBarXManager.getInstance().getStatusBarHeight(this)
fun Context.getStatusBarHeight() = getStatusBarHeight()

fun Context.getNavigationBarHeight() = UltimateBarXManager.getInstance().getNavigationBarHeight(this)
fun Context.getNavigationBarHeight() = getNavigationBarHeight()

fun View.addStatusBarTopPadding() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) addStatusBarTopPadding()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.zackratos.ultimatebarx.library

import android.content.Context
import android.graphics.Color
import android.os.Build
import androidx.annotation.ColorInt
Expand All @@ -10,9 +9,7 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.LifecycleOwner
import com.zackratos.ultimatebarx.library.bean.BarConfig
import com.zackratos.ultimatebarx.library.extension.getNavigationBarHeight
import com.zackratos.ultimatebarx.library.extension.getRom
import com.zackratos.ultimatebarx.library.extension.getStatusBarHeight
import com.zackratos.ultimatebarx.library.rom.Rom
import java.lang.reflect.Field

Expand All @@ -33,24 +30,6 @@ internal class UltimateBarXManager private constructor(){

internal val rom: Rom by lazy { getRom() }

private var statusBarHeight: Int = -1

internal fun getStatusBarHeight(context: Context): Int {
if (statusBarHeight < 0) {
statusBarHeight = context.getStatusBarHeight()
}
return statusBarHeight
}

private var navigationBarHeight: Int = -1

internal fun getNavigationBarHeight(context: Context): Int {
if (navigationBarHeight < 0) {
navigationBarHeight = context.getNavigationBarHeight()
}
return navigationBarHeight
}

internal val fragmentViewFiled: Field by lazy { Fragment::class.java.getDeclaredField("mView").apply { isAccessible = true } }
// 保存 Activity 的 StatusBar 是否设置过
private val staDefMap: MutableMap<String, Boolean> by lazy { ArrayMap<String, Boolean>() }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import com.zackratos.ultimatebarx.library.UltimateBarXObserver
import com.zackratos.ultimatebarx.library.bean.BarConfig
import com.zackratos.ultimatebarx.library.extension.barTransparent
import com.zackratos.ultimatebarx.library.extension.getColorInt
import com.zackratos.ultimatebarx.library.extension.getNavigationBarHeight
import com.zackratos.ultimatebarx.library.extension.getStatusBarHeight
import com.zackratos.ultimatebarx.library.view.*

/**
Expand Down Expand Up @@ -195,7 +197,7 @@ private fun ViewGroup.getCreator(tag: Tag): Creator {
private fun ViewGroup.setStatusBarPadding(context: Context, fitWindow: Boolean) {
setPadding(
paddingLeft,
if (fitWindow) manager.getStatusBarHeight(context) else 0,
if (fitWindow) context.getStatusBarHeight() else 0,
paddingRight,
paddingBottom
)
Expand All @@ -206,7 +208,7 @@ private fun ViewGroup.setNavigationBarPadding(context: Context, fitWindow: Boole
paddingLeft,
paddingTop,
paddingRight,
if (fitWindow) manager.getNavigationBarHeight(context) else 0
if (fitWindow) context.getNavigationBarHeight() else 0
)
}

Expand All @@ -225,15 +227,15 @@ private fun View.updateBackground(config: BarConfig) {
*/
@RequiresApi(Build.VERSION_CODES.KITKAT)
internal fun View.addStatusBarTopPadding() {
setPadding(paddingLeft, paddingTop + manager.getStatusBarHeight(context), paddingRight, paddingBottom)
setPadding(paddingLeft, paddingTop + context.getStatusBarHeight(), paddingRight, paddingBottom)
val lp = layoutParams
if (lp.height != ViewGroup.LayoutParams.MATCH_PARENT && lp.height != ViewGroup.LayoutParams.WRAP_CONTENT) {
lp.height += manager.getStatusBarHeight(context)
lp.height += context.getStatusBarHeight()
layoutParams = lp
return
}
post {
lp.height = height + manager.getStatusBarHeight(context)
lp.height = height + context.getStatusBarHeight()
layoutParams = lp
}
}
Expand All @@ -248,15 +250,15 @@ internal fun View.addNavigationBarBottomPadding() {
if (ctx is FragmentActivity && !manager.rom.navigationBarExist(ctx)) {
return
}
setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom + manager.getNavigationBarHeight(context))
setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom + context.getNavigationBarHeight())
val lp = layoutParams
if (lp.height != ViewGroup.LayoutParams.MATCH_PARENT && lp.height != ViewGroup.LayoutParams.WRAP_CONTENT) {
lp.height += manager.getNavigationBarHeight(context)
lp.height += context.getNavigationBarHeight()
layoutParams = lp
return
}
post {
lp.height = height + manager.getNavigationBarHeight(context)
lp.height = height + context.getNavigationBarHeight()
layoutParams = lp
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package com.zackratos.ultimatebarx.library.extension

import android.content.Context
import android.graphics.Point
import android.os.Build
import android.view.WindowManager
import androidx.annotation.ColorInt
import androidx.annotation.ColorRes
import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat

/**
Expand All @@ -21,3 +25,11 @@ internal fun Context.getNavigationBarHeight() = getBarHeight("navigation_bar_hei

@ColorInt
internal fun Context.getColorInt(@ColorRes colorRes: Int): Int = ContextCompat.getColor(this, colorRes)

@RequiresApi(Build.VERSION_CODES.KITKAT)
internal fun Context.getScreenHeight(): Int {
val wm = getSystemService(Context.WINDOW_SERVICE) as WindowManager
val point = Point()
wm.defaultDisplay.getRealSize(point)
return point.y
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ abstract class BaseRom: Rom {
@RequiresApi(Build.VERSION_CODES.KITKAT)
override fun navigationBarExist(activity: FragmentActivity): Boolean {
if (fullScreenGestureOn(activity)) {
if (screenIndicatorOn(activity)) {
return true
}
return false
}
return activity.commonNavigationBarExist()
Expand All @@ -25,4 +28,8 @@ abstract class BaseRom: Rom {
@RequiresApi(Build.VERSION_CODES.KITKAT)
protected abstract fun fullScreenGestureOn(activity: FragmentActivity): Boolean

// 是否开启了手势提示线
@RequiresApi(Build.VERSION_CODES.KITKAT)
protected open fun screenIndicatorOn(activity: FragmentActivity): Boolean = false

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import android.os.Build
import android.provider.Settings
import androidx.annotation.RequiresApi
import androidx.fragment.app.FragmentActivity
import com.zackratos.ultimatebarx.library.extension.getNavigationBarHeight
import com.zackratos.ultimatebarx.library.extension.getScreenHeight

/**
* @Author : zhangwenchao
Expand All @@ -17,4 +19,11 @@ internal class MiuiRom: BaseRom() {
override fun fullScreenGestureOn(activity: FragmentActivity): Boolean {
return Settings.Global.getInt(activity.contentResolver, "force_fsg_nav_bar", -1) > 0
}

@RequiresApi(Build.VERSION_CODES.KITKAT)
override fun screenIndicatorOn(activity: FragmentActivity): Boolean {
val navigationBarHeight = activity.getNavigationBarHeight()
val screenHeight = activity.getScreenHeight()
return navigationBarHeight > 0 && screenHeight / navigationBarHeight > 30
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
import android.widget.FrameLayout
import com.zackratos.ultimatebarx.library.extension.getNavigationBarHeight
import com.zackratos.ultimatebarx.library.extension.getStatusBarHeight

/**
* @Author : Zackratos
Expand All @@ -21,7 +23,7 @@ internal class FrameLayoutCreator(private val frameLayout: FrameLayout, tag: Tag
statusBar = View(context).apply {
layoutParams = FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
manager.getStatusBarHeight(context)
context.getStatusBarHeight()
).apply { gravity = Gravity.TOP }
}
statusBar.tag = tag.statusBarViewTag()
Expand All @@ -30,7 +32,7 @@ internal class FrameLayoutCreator(private val frameLayout: FrameLayout, tag: Tag
statusBar.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
statusBar.layoutParams = (statusBar.layoutParams as FrameLayout.LayoutParams)
.apply { topMargin = if (fitWindow) -manager.getStatusBarHeight(context) else 0 }
.apply { topMargin = if (fitWindow) -context.getStatusBarHeight() else 0 }
statusBar.viewTreeObserver.removeGlobalOnLayoutListener(this)
}
})
Expand All @@ -43,7 +45,7 @@ internal class FrameLayoutCreator(private val frameLayout: FrameLayout, tag: Tag
navigationBar = View(context).apply {
layoutParams = FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
manager.getNavigationBarHeight(context)
context.getNavigationBarHeight()
).apply { gravity = Gravity.BOTTOM }
}
navigationBar.tag = tag.navigationBarViewTag()
Expand All @@ -52,7 +54,7 @@ internal class FrameLayoutCreator(private val frameLayout: FrameLayout, tag: Tag
navigationBar.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
navigationBar.layoutParams = (navigationBar.layoutParams as FrameLayout.LayoutParams)
.apply { bottomMargin = if (fitWindow) -manager.getNavigationBarHeight(context) else 0 }
.apply { bottomMargin = if (fitWindow) -context.getNavigationBarHeight() else 0 }
navigationBar.viewTreeObserver.removeGlobalOnLayoutListener(this)
}
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
import android.widget.RelativeLayout
import com.zackratos.ultimatebarx.library.extension.getNavigationBarHeight
import com.zackratos.ultimatebarx.library.extension.getStatusBarHeight

/**
* @Author : Zackratos
Expand All @@ -20,7 +22,7 @@ internal class RelativeLayoutCreator(private val relativeLayout: RelativeLayout,
statusBar = View(context).apply {
layoutParams = RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
manager.getStatusBarHeight(context)
context.getStatusBarHeight()
).apply { addRule(RelativeLayout.ALIGN_PARENT_TOP) }
}
statusBar.tag = tag.statusBarViewTag()
Expand All @@ -29,7 +31,7 @@ internal class RelativeLayoutCreator(private val relativeLayout: RelativeLayout,
statusBar.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
statusBar.layoutParams = (statusBar.layoutParams as RelativeLayout.LayoutParams)
.apply { topMargin = if (fitWindow) -manager.getStatusBarHeight(context) else 0 }
.apply { topMargin = if (fitWindow) -context.getStatusBarHeight() else 0 }
statusBar.viewTreeObserver.removeGlobalOnLayoutListener(this)
}
})
Expand All @@ -42,7 +44,7 @@ internal class RelativeLayoutCreator(private val relativeLayout: RelativeLayout,
navigationBar = View(context).apply {
layoutParams = RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
manager.getNavigationBarHeight(context)
context.getNavigationBarHeight()
).apply { addRule(RelativeLayout.ALIGN_PARENT_BOTTOM) }
}
navigationBar.tag = tag.navigationBarViewTag()
Expand All @@ -51,7 +53,7 @@ internal class RelativeLayoutCreator(private val relativeLayout: RelativeLayout,
navigationBar.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
navigationBar.layoutParams = (navigationBar.layoutParams as RelativeLayout.LayoutParams)
.apply { bottomMargin = if (fitWindow) -manager.getNavigationBarHeight(context) else 0 }
.apply { bottomMargin = if (fitWindow) -context.getNavigationBarHeight() else 0 }
navigationBar.viewTreeObserver.removeGlobalOnLayoutListener(this)
}
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import android.content.Context
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
import com.zackratos.ultimatebarx.library.extension.getNavigationBarHeight
import com.zackratos.ultimatebarx.library.extension.getStatusBarHeight

/**
* @Author : Zackratos
Expand All @@ -18,7 +20,7 @@ internal class ViewGroupCreator(private val viewGroup: ViewGroup?, tag: Tag): Ba
if (statusBar == null) {
statusBar = View(context)
statusBar.tag = tag.statusBarViewTag()
viewGroup?.addView(statusBar, ViewGroup.LayoutParams.MATCH_PARENT, manager.getStatusBarHeight(context))
viewGroup?.addView(statusBar, ViewGroup.LayoutParams.MATCH_PARENT, context.getStatusBarHeight())
}
statusBar.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
Expand All @@ -43,7 +45,7 @@ internal class ViewGroupCreator(private val viewGroup: ViewGroup?, tag: Tag): Ba
if (navigationBar == null) {
navigationBar = View(context)
navigationBar.tag = tag.navigationBarViewTag()
viewGroup?.addView(navigationBar, ViewGroup.LayoutParams.MATCH_PARENT, manager.getNavigationBarHeight(context))
viewGroup?.addView(navigationBar, ViewGroup.LayoutParams.MATCH_PARENT, context.getNavigationBarHeight())
}
navigationBar.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
Expand Down

0 comments on commit 1499142

Please sign in to comment.