Skip to content

Commit 38fa635

Browse files
authored
Merge pull request #220 from YAPP-Github/refactor/#219-status_bar_icon_color
[Refactor/#219] 상단바 아이콘 색상 변경 로직 수정
2 parents 53de51b + b45a2cc commit 38fa635

5 files changed

Lines changed: 105 additions & 11 deletions

File tree

app/src/main/java/com/threegap/bitnagil/MainNavHost.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,15 @@ import com.threegap.bitnagil.presentation.screen.splash.SplashScreenContainer
2727
import com.threegap.bitnagil.presentation.screen.terms.TermsAgreementScreenContainer
2828
import com.threegap.bitnagil.presentation.screen.webview.BitnagilWebViewScreen
2929
import com.threegap.bitnagil.presentation.screen.withdrawal.WithdrawalScreenContainer
30+
import com.threegap.bitnagil.presentation.util.statusbar.NavStatusBarEffect
3031

3132
@Composable
3233
fun MainNavHost(
3334
navigator: MainNavigator,
3435
modifier: Modifier = Modifier,
3536
) {
37+
NavStatusBarEffect(navController = navigator.navController)
38+
3639
NavHost(
3740
navController = navigator.navController,
3841
startDestination = navigator.startDestination,

app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavHost.kt

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,13 @@ package com.threegap.bitnagil.navigation.home
33
import android.annotation.SuppressLint
44
import android.app.Activity
55
import androidx.activity.compose.BackHandler
6-
import androidx.activity.compose.LocalActivity
76
import androidx.compose.foundation.background
87
import androidx.compose.foundation.layout.Box
98
import androidx.compose.foundation.layout.WindowInsets
109
import androidx.compose.foundation.layout.fillMaxSize
1110
import androidx.compose.foundation.layout.padding
1211
import androidx.compose.material3.Scaffold
1312
import androidx.compose.runtime.Composable
14-
import androidx.compose.runtime.LaunchedEffect
1513
import androidx.compose.runtime.getValue
1614
import androidx.compose.runtime.mutableLongStateOf
1715
import androidx.compose.runtime.mutableStateOf
@@ -31,8 +29,8 @@ import com.threegap.bitnagil.designsystem.modifier.clickableWithoutRipple
3129
import com.threegap.bitnagil.presentation.screen.home.HomeScreenContainer
3230
import com.threegap.bitnagil.presentation.screen.mypage.MyPageScreenContainer
3331
import com.threegap.bitnagil.presentation.screen.recommendroutine.RecommendRoutineScreenContainer
32+
import com.threegap.bitnagil.presentation.util.statusbar.NavStatusBarEffect
3433
import com.threegap.bitnagil.presentation.util.toast.GlobalBitnagilToast
35-
import com.threegap.bitnagil.util.setStatusBarContentColor
3634

3735
@Composable
3836
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@@ -54,11 +52,7 @@ fun HomeNavHost(
5452

5553
DoubleBackButtonPressedHandler()
5654

57-
val activity = LocalActivity.current
58-
val isHomeTab = navigator.isHomeRoute
59-
LaunchedEffect(isHomeTab) {
60-
activity?.setStatusBarContentColor(isLightContent = isHomeTab)
61-
}
55+
NavStatusBarEffect(navController = navigator.navController)
6256

6357
val selectedBottomTab = navigator.currentHomeRoute ?: navigator.startDestination
6458

app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavigator.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@ class HomeNavigator(
2323
}
2424
}
2525

26-
val isHomeRoute: Boolean
27-
@Composable get() = currentHomeRoute == HomeRoute.Home
28-
2926
@Composable
3027
fun shouldShowFloatingAction(): Boolean = currentHomeRoute?.showFloatingButton == true
3128

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.threegap.bitnagil.presentation.util.statusbar
2+
3+
import androidx.activity.compose.LocalActivity
4+
import androidx.compose.runtime.Composable
5+
import androidx.compose.runtime.LaunchedEffect
6+
import androidx.compose.runtime.getValue
7+
import androidx.lifecycle.Lifecycle
8+
import androidx.lifecycle.repeatOnLifecycle
9+
import androidx.navigation.NavController
10+
import androidx.navigation.compose.currentBackStackEntryAsState
11+
12+
@Composable
13+
fun NavStatusBarEffect(navController: NavController) {
14+
val activity = LocalActivity.current
15+
val navBackStackEntry by navController.currentBackStackEntryAsState()
16+
17+
LaunchedEffect(navBackStackEntry) {
18+
navBackStackEntry?.repeatOnLifecycle(Lifecycle.State.RESUMED) {
19+
activity?.window?.let { window ->
20+
StatusBarAppearanceManager.applyStatusBarColorByLuminance(window)
21+
}
22+
}
23+
}
24+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.threegap.bitnagil.presentation.util.statusbar
2+
3+
import android.graphics.Bitmap
4+
import android.graphics.Color
5+
import android.graphics.Rect
6+
import android.os.Handler
7+
import android.os.Looper
8+
import android.view.PixelCopy
9+
import android.view.Window
10+
import androidx.core.graphics.createBitmap
11+
import androidx.core.view.ViewCompat
12+
import androidx.core.view.WindowInsetsCompat
13+
import androidx.core.graphics.get
14+
import androidx.core.view.WindowInsetsControllerCompat
15+
16+
object StatusBarAppearanceManager {
17+
private const val LUMINANCE_THRESHOLD = 150
18+
19+
fun applyStatusBarColorByLuminance(window: Window) {
20+
val height = getStatusBarHeight(window = window)
21+
if (height <= 0) return
22+
23+
captureStatusBarBitmap(
24+
window = window,
25+
height = height,
26+
) { bmp ->
27+
bmp?.let {
28+
val lum = calculateLuminance(it)
29+
WindowInsetsControllerCompat(window, window.decorView).isAppearanceLightStatusBars = (lum > LUMINANCE_THRESHOLD)
30+
it.recycle()
31+
}
32+
}
33+
}
34+
35+
private fun getStatusBarHeight(window: Window): Int {
36+
val decorView = window.decorView
37+
val insets = ViewCompat.getRootWindowInsets(decorView)
38+
return insets?.getInsets(WindowInsetsCompat.Type.statusBars())?.top ?: 0
39+
}
40+
41+
private fun captureStatusBarBitmap(
42+
window: Window,
43+
height: Int,
44+
onResult: (Bitmap?) -> Unit
45+
) {
46+
val width = window.decorView.width
47+
if (width <= 0) {
48+
onResult(null)
49+
return
50+
}
51+
52+
val rect = Rect(0, 0, window.decorView.width, height)
53+
val bmp = createBitmap(rect.width(), rect.height())
54+
55+
try {
56+
PixelCopy.request(window, rect, bmp, { result ->
57+
if (result == PixelCopy.SUCCESS) {
58+
onResult(bmp)
59+
} else {
60+
bmp.recycle()
61+
onResult(null)
62+
}
63+
}, Handler(Looper.getMainLooper()))
64+
} catch (_: Exception) {
65+
bmp.recycle()
66+
onResult(null)
67+
}
68+
}
69+
70+
private fun calculateLuminance(bitmap: Bitmap): Int {
71+
val x = bitmap.width / 2
72+
val y = bitmap.height / 2
73+
val px = bitmap[x, y]
74+
return (0.299 * Color.red(px) + 0.587 * Color.green(px) + 0.114 * Color.blue(px)).toInt()
75+
}
76+
}

0 commit comments

Comments
 (0)