95 lines
3.8 KiB
Kotlin
95 lines
3.8 KiB
Kotlin
package com.aiosman.ravenow.exp
|
|
|
|
import android.annotation.SuppressLint
|
|
import android.app.Activity
|
|
import android.content.Context
|
|
import android.content.res.Resources
|
|
import android.os.Build
|
|
import android.util.TypedValue
|
|
import android.view.View
|
|
import android.view.ViewGroup
|
|
import android.view.WindowManager
|
|
import androidx.annotation.ColorInt
|
|
//import androidx.appcompat.app.AppCompatActivity
|
|
|
|
private const val COLOR_TRANSPARENT = 0
|
|
|
|
@SuppressLint("ObsoleteSdkInt")
|
|
@JvmOverloads
|
|
fun Activity.immersive(@ColorInt color: Int = COLOR_TRANSPARENT, darkMode: Boolean? = null) {
|
|
when {
|
|
Build.VERSION.SDK_INT >= 21 -> {
|
|
when (color) {
|
|
COLOR_TRANSPARENT -> {
|
|
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
|
|
var systemUiVisibility = window.decorView.systemUiVisibility
|
|
systemUiVisibility = systemUiVisibility or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
|
systemUiVisibility = systemUiVisibility or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
|
window.decorView.systemUiVisibility = systemUiVisibility
|
|
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
|
|
window.statusBarColor = color
|
|
}
|
|
else -> {
|
|
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
|
|
var systemUiVisibility = window.decorView.systemUiVisibility
|
|
systemUiVisibility = systemUiVisibility and View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
|
systemUiVisibility = systemUiVisibility and View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
|
window.decorView.systemUiVisibility = systemUiVisibility
|
|
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
|
|
window.statusBarColor = color
|
|
}
|
|
}
|
|
}
|
|
Build.VERSION.SDK_INT >= 19 -> {
|
|
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
|
|
if (color != COLOR_TRANSPARENT) {
|
|
setTranslucentView(window.decorView as ViewGroup, color)
|
|
}
|
|
}
|
|
}
|
|
if (darkMode != null) {
|
|
darkMode(darkMode)
|
|
}
|
|
}
|
|
|
|
@JvmOverloads
|
|
fun Activity.darkMode(darkMode: Boolean = true) {
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
|
var systemUiVisibility = window.decorView.systemUiVisibility
|
|
systemUiVisibility = if (darkMode) {
|
|
systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
|
|
} else {
|
|
systemUiVisibility and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv()
|
|
}
|
|
window.decorView.systemUiVisibility = systemUiVisibility
|
|
}
|
|
}
|
|
|
|
private fun Context.setTranslucentView(container: ViewGroup, color: Int) {
|
|
if (Build.VERSION.SDK_INT >= 19) {
|
|
var simulateStatusBar: View? = container.findViewById(android.R.id.custom)
|
|
if (simulateStatusBar == null && color != 0) {
|
|
simulateStatusBar = View(container.context)
|
|
simulateStatusBar.id = android.R.id.custom
|
|
val lp = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight)
|
|
container.addView(simulateStatusBar, lp)
|
|
}
|
|
simulateStatusBar?.setBackgroundColor(color)
|
|
}
|
|
}
|
|
|
|
val Context?.statusBarHeight: Int
|
|
get() {
|
|
this ?: return 0
|
|
var result = 24
|
|
val resId = resources.getIdentifier("status_bar_height", "dimen", "android")
|
|
result = if (resId > 0) {
|
|
resources.getDimensionPixelSize(resId)
|
|
} else {
|
|
TypedValue.applyDimension(
|
|
TypedValue.COMPLEX_UNIT_DIP,
|
|
result.toFloat(), Resources.getSystem().displayMetrics
|
|
).toInt()
|
|
}
|
|
return result
|
|
} |