Skip to content

Commit dd336df

Browse files
authored
Merge pull request #88 from stslex/dev
dev
2 parents 3a35b90 + 9c0b69c commit dd336df

21 files changed

Lines changed: 217 additions & 57 deletions

File tree

.github/workflows/android_build.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,18 @@ jobs:
4343
echo "storePassword=$KEYSTORE_STORE_PASSWORD" >> keystore.properties
4444
echo "keyPassword=$KEYSTORE_KEY_PASSWORD" >> keystore.properties
4545
46+
- name: Cache Gradle
47+
uses: actions/cache@v4
48+
with:
49+
path: ~/.gradle/caches/
50+
key: cache-clean-gradle-${{ matrix.os }}-${{ matrix.jdk }}
51+
52+
- name: Cache Gradle Wrapper
53+
uses: actions/cache@v4
54+
with:
55+
path: ~/.gradle/wrapper/
56+
key: cache-clean-wrapper-${{ matrix.os }}-${{ matrix.jdk }}
57+
4658
- name: Grant execute permission for gradlew
4759
run: chmod +x gradlew
4860

.github/workflows/android_deploy_beta.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ jobs:
2626
ruby-version: '3.3'
2727

2828
- name: Cache Ruby - Bundler
29-
uses: actions/cache@v2
29+
uses: actions/cache@v4
3030
with:
3131
path: vendor/bundle
3232
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
@@ -41,13 +41,13 @@ jobs:
4141
cache: gradle
4242

4343
- name: Cache Gradle
44-
uses: actions/cache@v1
44+
uses: actions/cache@v4
4545
with:
4646
path: ~/.gradle/caches/
4747
key: cache-clean-gradle-${{ matrix.os }}-${{ matrix.jdk }}
4848

4949
- name: Cache Gradle Wrapper
50-
uses: actions/cache@v1
50+
uses: actions/cache@v4
5151
with:
5252
path: ~/.gradle/wrapper/
5353
key: cache-clean-wrapper-${{ matrix.os }}-${{ matrix.jdk }}

.github/workflows/android_deploy_prod.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ jobs:
2424
ruby-version: '3.3'
2525

2626
- name: Cache Ruby - Bundler
27-
uses: actions/cache@v2
27+
uses: actions/cache@v4
2828
with:
2929
path: vendor/bundle
3030
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
@@ -39,13 +39,13 @@ jobs:
3939
cache: gradle
4040

4141
- name: Cache Gradle
42-
uses: actions/cache@v1
42+
uses: actions/cache@v4
4343
with:
4444
path: ~/.gradle/caches/
4545
key: cache-clean-gradle-${{ matrix.os }}-${{ matrix.jdk }}
4646

4747
- name: Cache Gradle Wrapper
48-
uses: actions/cache@v1
48+
uses: actions/cache@v4
4949
with:
5050
path: ~/.gradle/wrapper/
5151
key: cache-clean-wrapper-${{ matrix.os }}-${{ matrix.jdk }}

app/src/main/java/st/slex/csplashscreen/ui/InitialApp.kt

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,14 @@ import androidx.compose.material3.Scaffold
1414
import androidx.compose.runtime.Composable
1515
import androidx.compose.runtime.DisposableEffect
1616
import androidx.compose.runtime.Stable
17-
import androidx.compose.runtime.getValue
18-
import androidx.compose.runtime.mutableStateOf
19-
import androidx.compose.runtime.remember
20-
import androidx.compose.runtime.setValue
2117
import androidx.compose.ui.Modifier
2218
import androidx.compose.ui.graphics.Color
2319
import androidx.compose.ui.unit.dp
2420
import com.google.accompanist.systemuicontroller.rememberSystemUiController
25-
import st.slex.csplashscreen.core.core.Logger
2621
import st.slex.csplashscreen.core.navigation.Screen
2722
import st.slex.csplashscreen.ui.components.NavHostControllerHolder
2823
import st.slex.csplashscreen.ui.components.NavigationHost
29-
import st.slex.csplashscreen.ui.components.bottom_appbar.BottomAppBarResource
30-
import st.slex.csplashscreen.ui.components.bottom_appbar.BottomAppBarResource.Companion.getByRoute
24+
import st.slex.csplashscreen.ui.components.bottom_appbar.BottomAppBarResource.Companion.isAppbar
3125
import st.slex.csplashscreen.ui.components.bottom_appbar.MainBottomAppBar
3226

3327
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@@ -41,16 +35,6 @@ fun InitialApp(
4135
val systemUiController = rememberSystemUiController()
4236
val isDarkTheme = isSystemInDarkTheme()
4337

44-
var currentDestination by remember {
45-
mutableStateOf<Screen?>(Screen.Home)
46-
}
47-
48-
navControllerHolder.navController.addOnDestinationChangedListener { _, destination, _ ->
49-
Logger.d("current route: ${destination.route}")
50-
currentDestination = destination.route?.let(::getByRoute)
51-
Logger.d("currentDestination: ${currentDestination}")
52-
}
53-
5438
DisposableEffect(systemUiController, isDarkTheme) {
5539
systemUiController.setSystemBarsColor(
5640
color = Color.Transparent,
@@ -65,13 +49,13 @@ fun InitialApp(
6549
containerColor = MaterialTheme.colorScheme.background,
6650
bottomBar = {
6751
AnimatedVisibility(
68-
visible = BottomAppBarResource.isAppbar(currentDestination),
52+
visible = navControllerHolder.bottomBarDestination.value.isAppbar(),
6953
enter = slideInVertically(tween(300)) { it },
7054
exit = slideOutVertically(tween(300)) { it }
7155
) {
7256
MainBottomAppBar(
7357
onBottomAppBarClick = onBottomAppBarClick,
74-
currentDestination = currentDestination
58+
currentDestination = navControllerHolder.bottomBarDestination
7559
)
7660
}
7761
},

app/src/main/java/st/slex/csplashscreen/ui/MainActivity.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@ import androidx.activity.ComponentActivity
55
import androidx.activity.compose.setContent
66
import androidx.compose.runtime.remember
77
import androidx.core.view.WindowCompat
8-
import androidx.navigation.compose.rememberNavController
98
import org.koin.androidx.compose.koinViewModel
109
import org.koin.compose.getKoin
1110
import st.slex.csplashscreen.core.ui.theme.AppTheme
1211
import st.slex.csplashscreen.navigation.BaseNavigationHolder
13-
import st.slex.csplashscreen.ui.components.NavHostControllerHolder
12+
import st.slex.csplashscreen.ui.components.NavHostControllerHolder.Companion.rememberNavHostControllerHolder
1413

1514
class MainActivity : ComponentActivity() {
1615

@@ -20,7 +19,7 @@ class MainActivity : ComponentActivity() {
2019
WindowCompat.setDecorFitsSystemWindows(window, false)
2120
setContent {
2221
AppTheme {
23-
val navHostControllerHolder = NavHostControllerHolder(rememberNavController())
22+
val navHostControllerHolder = rememberNavHostControllerHolder()
2423
getKoin().get<BaseNavigationHolder>().setNavController(navHostControllerHolder)
2524

2625
val viewModel = koinViewModel<InitialAppViewModel>()
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package st.slex.csplashscreen.ui.components
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.DisposableEffect
5+
import androidx.compose.runtime.Stable
6+
import androidx.compose.runtime.State
7+
import androidx.compose.runtime.mutableStateOf
8+
import androidx.compose.runtime.remember
9+
import androidx.navigation.NavController.OnDestinationChangedListener
10+
import androidx.navigation.NavHostController
11+
import androidx.navigation.compose.rememberNavController
12+
import st.slex.csplashscreen.core.navigation.Screen
13+
import st.slex.csplashscreen.ui.components.bottom_appbar.BottomAppBarResource
14+
15+
@Stable
16+
class NavHostControllerHolder private constructor(
17+
val navController: NavHostController,
18+
val bottomBarDestination: State<Screen?>
19+
) {
20+
21+
companion object {
22+
23+
@Composable
24+
fun rememberNavHostControllerHolder(): NavHostControllerHolder {
25+
val controller = rememberNavController()
26+
val bottomBarDestination = remember {
27+
mutableStateOf<Screen?>(Screen.Home)
28+
}
29+
DisposableEffect(controller) {
30+
val listener = OnDestinationChangedListener { _, destination, _ ->
31+
bottomBarDestination.value =
32+
destination.route?.let(BottomAppBarResource::getByRoute)
33+
}
34+
controller.addOnDestinationChangedListener(listener)
35+
onDispose {
36+
controller.removeOnDestinationChangedListener(listener)
37+
}
38+
}
39+
return remember(controller) {
40+
NavHostControllerHolder(
41+
navController = controller,
42+
bottomBarDestination = bottomBarDestination
43+
)
44+
}
45+
}
46+
}
47+
}

app/src/main/java/st/slex/csplashscreen/ui/components/NavigationHost.kt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,16 @@ import androidx.compose.runtime.Composable
66
import androidx.compose.runtime.CompositionLocalProvider
77
import androidx.compose.runtime.Stable
88
import androidx.compose.ui.Modifier
9-
import androidx.navigation.NavHostController
109
import androidx.navigation.compose.NavHost
1110
import st.slex.csplashscreen.core.navigation.Screen
1211
import st.slex.csplashscreen.core.ui.theme.LocalSharedTransitionScope
1312
import st.slex.csplashscreen.feature.collection.navigation.singleCollectionGraph
1413
import st.slex.csplashscreen.feature.favourite.navigation.favouriteGraph
15-
import st.slex.csplashscreen.feature.photo_detail.navigation.imageDetailGraph
1614
import st.slex.csplashscreen.feature.home.navigation.homeGraph
15+
import st.slex.csplashscreen.feature.photo_detail.navigation.imageDetailGraph
1716
import st.slex.csplashscreen.feature.search.navigation.searchPhotosGraph
1817
import st.slex.csplashscreen.feature.user.navigation.userGraph
1918

20-
@Stable
21-
class NavHostControllerHolder(val navController: NavHostController)
22-
2319
@OptIn(ExperimentalSharedTransitionApi::class)
2420
@Composable
2521
@Stable

app/src/main/java/st/slex/csplashscreen/ui/components/bottom_appbar/BottomAppBarNavigation.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import androidx.compose.material3.NavigationBar
88
import androidx.compose.material3.NavigationBarItem
99
import androidx.compose.material3.Text
1010
import androidx.compose.runtime.Composable
11+
import androidx.compose.runtime.State
1112
import androidx.compose.runtime.remember
1213
import androidx.compose.ui.Modifier
1314
import androidx.compose.ui.res.stringResource
@@ -16,7 +17,7 @@ import st.slex.csplashscreen.core.navigation.Screen
1617
@Composable
1718
fun MainBottomAppBar(
1819
onBottomAppBarClick: (Screen) -> Unit,
19-
currentDestination: Screen?
20+
currentDestination: State<Screen?>
2021
) {
2122
NavigationBar(
2223
modifier = Modifier
@@ -26,7 +27,7 @@ fun MainBottomAppBar(
2627
BottomAppBarResource
2728
.entries
2829
.forEach { item ->
29-
val isSelected = currentDestination == item.screen
30+
val isSelected = currentDestination.value == item.screen
3031
BottomAppBarItem(
3132
item = item,
3233
isSelected = isSelected,

app/src/main/java/st/slex/csplashscreen/ui/components/bottom_appbar/BottomAppBarResource.kt

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import st.slex.csplashscreen.core.navigation.Screen
1313
import st.slex.csplashscreen.core.navigation.Screen.Favourite
1414
import st.slex.csplashscreen.core.navigation.Screen.Home
1515
import st.slex.csplashscreen.core.navigation.Screen.SearchPhotosScreen
16-
import kotlin.reflect.KClass
1716

1817
enum class BottomAppBarResource(
1918
val unselectedIcon: ImageVector,
@@ -44,16 +43,12 @@ enum class BottomAppBarResource(
4443

4544
companion object {
4645

47-
fun isAppbar(screen: Any?): Boolean = entries.any { it.screen == screen }
46+
fun Screen?.isAppbar(): Boolean = entries.any { it.screen == this }
4847

49-
fun getByRoute(route: String): Screen? = when {
50-
Home::class.checkScreen(route) -> HOME
51-
SearchPhotosScreen::class.checkScreen(route) -> SEARCH
52-
Favourite::class.checkScreen(route) -> FAVOURITE
53-
else -> null
48+
fun getByRoute(
49+
route: String
50+
): Screen? = BottomAppBarResource.entries.find { entry ->
51+
route.startsWith(checkNotNull(entry.screen.javaClass.canonicalName))
5452
}?.screen
55-
56-
private fun <T : Screen> KClass<T>.checkScreen(route: String): Boolean =
57-
route.contains(simpleName.orEmpty())
5853
}
5954
}

core/core/src/main/java/st/slex/csplashscreen/core/core/Logger.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,17 @@ object Logger {
2828
val currentTag = "$DEFAULT_TAG:${tag.orEmpty()}"
2929
Log.d(currentTag, message)
3030
}
31-
}
31+
32+
fun i(
33+
message: String,
34+
tag: String? = null,
35+
throwable: Throwable? = null,
36+
) {
37+
if (BuildConfig.DEBUG.not()) return
38+
val currentTag = "$DEFAULT_TAG:${tag.orEmpty()}"
39+
Log.i(currentTag, message, throwable)
40+
}
41+
42+
fun tag(tag: String): LoggerTag = LoggerTag(tag)
43+
}
44+

0 commit comments

Comments
 (0)