Skip to content

Commit

Permalink
Merge pull request #60 from egorikftp/v1.2.5
Browse files Browse the repository at this point in the history
v1.2.5
  • Loading branch information
egorikftp committed Nov 7, 2023
2 parents 563099f + 1643b8e commit a46837d
Show file tree
Hide file tree
Showing 115 changed files with 2,152 additions and 986 deletions.
4 changes: 3 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -119,10 +119,12 @@ dependencies {
implementation(libs.firebase.database)
implementation(libs.firebase.firestore)

implementation(platform(libs.koin.bom))
implementation(libs.koin.android)
implementation(libs.koin.compose)

implementation(libs.decompose)
implementation(libs.decompose.compose.jetpack)
implementation(libs.immutable.collections)
implementation(libs.google.maps)
implementation(libs.google.material)
implementation(libs.mvikotlin.extensions)
Expand Down
1 change: 0 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
android:localeConfig="@xml/locales_config"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:enableOnBackInvokedCallback="true"
android:theme="@style/SplashTheme">

<activity
Expand Down
15 changes: 13 additions & 2 deletions app/src/main/java/com/egoriku/grodnoroads/RoadsApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import android.app.Application
import com.egoriku.grodnoroads.analytics.di.analyticsModule
import com.egoriku.grodnoroads.crashlytics.config.CrashlyticsConfig
import com.egoriku.grodnoroads.crashlytics.di.crashlyticsModule
import com.egoriku.grodnoroads.extensions.logD
import com.egoriku.grodnoroads.koin.appScopeModule
import com.egoriku.grodnoroads.location.di.locationModule
import com.egoriku.grodnoroads.map.data.di.mapDataModule
Expand All @@ -17,19 +18,29 @@ import com.egoriku.grodnoroads.setting.appearance.di.appearanceModule
import com.egoriku.grodnoroads.setting.faq.di.faqModule
import com.egoriku.grodnoroads.setting.map.di.mapSettingsModule
import com.egoriku.grodnoroads.setting.whatsnew.di.whatsNewModule
import com.google.android.gms.maps.MapsInitializer
import com.google.android.gms.maps.MapsInitializer.Renderer
import com.google.android.gms.maps.OnMapsSdkInitializedCallback
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin

class RoadsApplication : Application() {
class RoadsApplication : Application(), OnMapsSdkInitializedCallback {

override fun onCreate() {
super.onCreate()
MapsInitializer.initialize(applicationContext, Renderer.LATEST, this)

CrashlyticsConfig.isCollectionEnabled(!BuildConfig.DEBUG)

initKoin()
}

override fun onMapsSdkInitialized(renderer: Renderer) {
when (renderer) {
Renderer.LATEST -> logD("The latest version of the renderer is used.")
Renderer.LEGACY -> logD("The legacy version of the renderer is used.")
}
}

private fun initKoin() {
startKoin {
androidContext(this@RoadsApplication)
Expand Down
6 changes: 3 additions & 3 deletions app/src/main/java/com/egoriku/grodnoroads/koin/KoinModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import com.arkivanov.mvikotlin.main.store.DefaultStoreFactory
import com.egoriku.grodnoroads.component.AppBuildConfigImpl
import com.egoriku.grodnoroads.shared.appcomponent.AppBuildConfig
import com.egoriku.grodnoroads.shared.appsettings.extension.dataStore
import com.google.firebase.database.ktx.database
import com.google.firebase.firestore.ktx.firestore
import com.google.firebase.ktx.Firebase
import com.google.firebase.Firebase
import com.google.firebase.database.database
import com.google.firebase.firestore.firestore
import org.koin.core.module.dsl.bind
import org.koin.core.module.dsl.singleOf
import org.koin.dsl.module
Expand Down
168 changes: 101 additions & 67 deletions app/src/main/java/com/egoriku/grodnoroads/screen/main/MainUi.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.egoriku.grodnoroads.screen.main

import androidx.compose.animation.core.animateDpAsState
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.*
import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass.Companion.Expanded
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
Expand All @@ -17,11 +19,15 @@ import androidx.compose.ui.unit.dp
import com.arkivanov.decompose.extensions.compose.jetpack.stack.Children
import com.arkivanov.decompose.extensions.compose.jetpack.subscribeAsState
import com.arkivanov.decompose.router.stack.ChildStack
import com.egoriku.grodnoroads.foundation.animation.HorizontalSlideAnimatedVisibility
import com.egoriku.grodnoroads.foundation.animation.VerticalSlideAnimatedVisibility
import com.egoriku.grodnoroads.foundation.core.rememberMutableState
import com.egoriku.grodnoroads.foundation.theme.tonalElevation
import com.egoriku.grodnoroads.map.MapScreen
import com.egoriku.grodnoroads.screen.main.MainComponent.Child
import com.egoriku.grodnoroads.setting.screen.SettingsScreen
import com.egoriku.grodnoroads.util.LocalWindowSizeClass
import kotlinx.collections.immutable.persistentListOf

private val NavigationBarHeight: Dp = 80.dp

Expand All @@ -34,42 +40,52 @@ fun MainUi(component: MainComponent) {
when (windowSizeClass.widthSizeClass) {
Expanded -> {
HorizontalOrientationLayout(
childStack = childStack,
component = component
childStack = { childStack },
onSelectTab = component::onSelectTab,
activeIndex = { childStack.active.instance.index }
)
}

else -> {
VerticalOrientationLayout(
childStack = childStack,
component = component
childStack = { childStack },
onSelectTab = component::onSelectTab,
activeIndex = { childStack.active.instance.index }
)
}
}
}

@Composable
private fun VerticalOrientationLayout(
childStack: ChildStack<*, Child>,
component: MainComponent
childStack: () -> ChildStack<*, Child>,
activeIndex: () -> Int,
onSelectTab: (Int) -> Unit,
) {
val bottomNavItems = remember { listOf(Screen.Map, Screen.Settings) }
val bottomNavItems = remember { persistentListOf(Screen.Map, Screen.Settings) }
var isShowBottomBar by rememberMutableState { true }

val bottomPadding by animateDpAsState(
targetValue = if (isShowBottomBar) NavigationBarHeight else 0.dp,
label = "bottomPadding"
)

val contentPaddingValues = WindowInsets
.navigationBars
.add(WindowInsets(bottom = NavigationBarHeight))
.add(WindowInsets(bottom = bottomPadding))
.asPaddingValues()

Box(modifier = Modifier.fillMaxSize()) {
Children(
modifier = Modifier.fillMaxSize(1f),
stack = childStack,
modifier = Modifier.fillMaxSize(),
stack = childStack(),
) { created ->
when (val child = created.instance) {
is Child.Map -> {
MapScreen(
contentPadding = contentPaddingValues,
component = child.component
component = child.component,
onBottomNavigationVisibilityChange = { isShowBottomBar = it }
)
}

Expand All @@ -81,83 +97,101 @@ private fun VerticalOrientationLayout(
}

val tonalElevation = MaterialTheme.tonalElevation
NavigationBar(
modifier = Modifier
.align(Alignment.BottomStart)
.clip(RoundedCornerShape(topStart = 28.dp, topEnd = 28.dp)),
tonalElevation = tonalElevation
VerticalSlideAnimatedVisibility(
visible = isShowBottomBar,
modifier = Modifier.align(Alignment.BottomStart)
) {
bottomNavItems.forEach { screen ->
NavigationBarItem(
selected = screen.index == childStack.active.instance.index,
onClick = { component.onSelectTab(index = screen.index) },
colors = NavigationBarItemDefaults.colors(
unselectedIconColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.45f),
unselectedTextColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.45f),
indicatorColor = MaterialTheme.colorScheme.surfaceColorAtElevation(
tonalElevation
)
),
icon = {
Icon(
painter = painterResource(id = screen.iconRes),
contentDescription = null
)
},
label = {
Text(text = stringResource(id = screen.labelId))
}
)
NavigationBar(
modifier = Modifier.clip(RoundedCornerShape(topStart = 28.dp, topEnd = 28.dp)),
tonalElevation = tonalElevation
) {
bottomNavItems.forEach { screen ->
NavigationBarItem(
colors = NavigationBarItemDefaults.colors(
unselectedIconColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.45f),
unselectedTextColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.45f),
indicatorColor = MaterialTheme.colorScheme.surfaceColorAtElevation(
tonalElevation
)
),
selected = screen.index == activeIndex(),
onClick = { onSelectTab(screen.index) },
icon = {
Icon(
painter = painterResource(id = screen.iconRes),
contentDescription = null
)
},
label = {
Text(text = stringResource(id = screen.labelId))
}
)
}
}
}
}
}

@Composable
private fun HorizontalOrientationLayout(
childStack: ChildStack<*, Child>,
component: MainComponent
childStack: () -> ChildStack<*, Child>,
activeIndex: () -> Int,
onSelectTab: (Int) -> Unit,
) {
val bottomNavItems = remember { listOf(Screen.Map, Screen.Settings) }
val bottomNavItems = remember { persistentListOf(Screen.Map, Screen.Settings) }
var isHideBottomBar by rememberMutableState { false }

Row(modifier = Modifier.fillMaxSize()) {
val tonalElevation = MaterialTheme.tonalElevation
val containerColor = MaterialTheme.colorScheme.surfaceColorAtElevation(tonalElevation)
val leftPadding by animateDpAsState(
targetValue = if (isHideBottomBar) NavigationBarHeight else 0.dp,
label = "leftPadding"
)
val contentPaddingValues = WindowInsets(left = leftPadding).asPaddingValues()

NavigationRail(containerColor = containerColor) {
bottomNavItems.forEach { screen ->
NavigationRailItem(
colors = NavigationRailItemDefaults.colors(
unselectedIconColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.45f),
unselectedTextColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.45f),
indicatorColor = containerColor
),
selected = screen.index == childStack.active.instance.index,
onClick = { component.onSelectTab(index = screen.index) },
icon = {
Icon(
painter = painterResource(id = screen.iconRes),
contentDescription = null
)
}
)
}
}
Box(modifier = Modifier.fillMaxSize()) {
Children(
modifier = Modifier.weight(1f),
stack = childStack,
modifier = Modifier.fillMaxSize(),
stack = childStack(),
) { created ->
when (val child = created.instance) {
is Child.Map -> MapScreen(
contentPadding = PaddingValues(),
component = child.component
contentPadding = contentPaddingValues,
component = child.component,
onBottomNavigationVisibilityChange = { isHideBottomBar = it }
)

is Child.Settings -> SettingsScreen(
contentPadding = PaddingValues(),
contentPadding = contentPaddingValues,
settingsComponent = child.component
)
}
}
val tonalElevation = MaterialTheme.tonalElevation
val containerColor = MaterialTheme.colorScheme.surfaceColorAtElevation(tonalElevation)

HorizontalSlideAnimatedVisibility(isHideBottomBar) {
NavigationRail(containerColor = containerColor) {
bottomNavItems.forEach { screen ->
NavigationRailItem(
colors = NavigationRailItemDefaults.colors(
unselectedIconColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(
alpha = 0.45f
),
unselectedTextColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(
alpha = 0.45f
),
indicatorColor = containerColor
),
selected = screen.index == activeIndex(),
onClick = { onSelectTab(screen.index) },
icon = {
Icon(
painter = painterResource(id = screen.iconRes),
contentDescription = null
)
}
)
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
@file:Suppress("unused")

import com.android.build.api.dsl.ApplicationExtension
import com.egoriku.grodnoroads.extension.kotlinOptions
import com.egoriku.grodnoroads.internal.configureKotlinAndroidToolchain
import com.egoriku.grodnoroads.internal.libs
import org.gradle.api.JavaVersion
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.configure
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion

class AndroidApplicationPlugin : Plugin<Project> {

Expand All @@ -20,6 +22,11 @@ class AndroidApplicationPlugin : Plugin<Project> {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}

kotlinOptions {
freeCompilerArgs = listOf("-Xcontext-receivers")
languageVersion = KotlinVersion.KOTLIN_1_9.version
}
}
configureKotlinAndroidToolchain()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
@file:Suppress("unused")

import com.android.build.gradle.LibraryExtension
import com.egoriku.grodnoroads.extension.kotlinOptions
import com.egoriku.grodnoroads.internal.configureKotlinAndroidToolchain
import com.egoriku.grodnoroads.internal.libs
import org.gradle.api.JavaVersion
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.configure
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion

class AndroidLibraryPlugin : Plugin<Project> {

Expand Down Expand Up @@ -43,6 +45,11 @@ class AndroidLibraryPlugin : Plugin<Project> {
buildConfig = false
}

kotlinOptions {
freeCompilerArgs = listOf("-Xcontext-receivers")
languageVersion = KotlinVersion.KOTLIN_1_9.version
}

compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.egoriku.grodnoroads.extension

import com.android.build.api.dsl.CommonExtension
import org.gradle.api.plugins.ExtensionAware
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions

fun CommonExtension<*, *, *, *, *>.kotlinOptions(block: KotlinJvmOptions.() -> Unit) {
(this as ExtensionAware).extensions.configure("kotlinOptions", block)
}
Loading

0 comments on commit a46837d

Please sign in to comment.