Skip to content

Commit 12bd16b

Browse files
committed
refactor & new feat
1 parent 9b6fb24 commit 12bd16b

File tree

21 files changed

+200
-38
lines changed

21 files changed

+200
-38
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
3-
3+
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
44
</manifest>
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.espressodev.gptmap.core.common.network_monitor
2+
3+
import android.content.Context
4+
import android.net.ConnectivityManager
5+
import android.net.Network
6+
import android.net.NetworkCapabilities
7+
import android.net.NetworkRequest
8+
import androidx.core.content.getSystemService
9+
import dagger.hilt.android.qualifiers.ApplicationContext
10+
import kotlinx.coroutines.channels.awaitClose
11+
import kotlinx.coroutines.flow.Flow
12+
import kotlinx.coroutines.flow.callbackFlow
13+
import kotlinx.coroutines.flow.conflate
14+
import javax.inject.Inject
15+
16+
class ConnectivityManagerNetworkMonitor @Inject constructor(
17+
@ApplicationContext private val context: Context,
18+
): NetworkMonitor {
19+
override val isOnline: Flow<Boolean> = callbackFlow {
20+
val connectivityManager = context.getSystemService<ConnectivityManager>()
21+
if (connectivityManager == null) {
22+
channel.trySend(false)
23+
channel.close()
24+
return@callbackFlow
25+
}
26+
27+
val callback = object : ConnectivityManager.NetworkCallback() {
28+
private val networks = mutableSetOf<Network>()
29+
30+
override fun onAvailable(network: Network) {
31+
networks += network
32+
channel.trySend(true)
33+
}
34+
35+
override fun onLost(network: Network) {
36+
networks -= network
37+
channel.trySend(networks.isNotEmpty())
38+
}
39+
}
40+
41+
val request = NetworkRequest.Builder()
42+
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
43+
.build()
44+
connectivityManager.registerNetworkCallback(request, callback)
45+
46+
/**
47+
* Sends the latest connectivity status to the underlying channel.
48+
*/
49+
channel.trySend(connectivityManager.isCurrentlyConnected())
50+
51+
awaitClose {
52+
connectivityManager.unregisterNetworkCallback(callback)
53+
}
54+
}
55+
.conflate()
56+
57+
private fun ConnectivityManager.isCurrentlyConnected() = activeNetwork
58+
?.let(::getNetworkCapabilities)
59+
?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) ?: false
60+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.espressodev.gptmap.core.common.network_monitor
2+
3+
import dagger.Binds
4+
import dagger.Module
5+
import dagger.hilt.InstallIn
6+
import dagger.hilt.android.components.ActivityComponent
7+
import kotlinx.coroutines.flow.Flow
8+
9+
interface NetworkMonitor {
10+
val isOnline: Flow<Boolean>
11+
}
12+
13+
@Module
14+
@InstallIn(ActivityComponent::class)
15+
abstract class NetworkModule {
16+
17+
@Binds
18+
abstract fun bindsNetworkMonitor(networkMonitor: ConnectivityManagerNetworkMonitor): NetworkMonitor
19+
}

core/common/src/main/kotlin/com/espressodev/gptmap/core/common/snackbar/SnackbarManager.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,25 @@ import androidx.annotation.StringRes
44
import kotlinx.coroutines.flow.MutableStateFlow
55
import kotlinx.coroutines.flow.StateFlow
66
import kotlinx.coroutines.flow.asStateFlow
7+
import kotlinx.coroutines.flow.update
78

89
object SnackbarManager {
9-
private val messages: MutableStateFlow<SnackbarMessage?> = MutableStateFlow(null)
10-
val snackbarMessages: StateFlow<SnackbarMessage?>
11-
get() = messages.asStateFlow()
10+
private val messages = MutableStateFlow<SnackbarMessage?>(null)
11+
val snackbarMessages get() = messages.asStateFlow()
1212

1313
fun showMessage(@StringRes message: Int) {
14-
messages.value = SnackbarMessage.ResourceSnackbar(message)
14+
messages.update { SnackbarMessage.ResourceSnackbar(message) }
1515
}
1616

1717
fun showMessage(message: String) {
18-
messages.value = SnackbarMessage.StringSnackbar(message)
18+
messages.update { SnackbarMessage.StringSnackbar(message) }
1919
}
2020

2121
fun showMessage(message: SnackbarMessage) {
22-
messages.value = message
22+
messages.update { message }
2323
}
2424

2525
fun clean() {
26-
messages.value = null
26+
messages.update { null }
2727
}
2828
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.espressodev.gptmap.core.common.splash_navigation
2+
3+
import kotlinx.coroutines.flow.MutableStateFlow
4+
import kotlinx.coroutines.flow.asStateFlow
5+
import kotlinx.coroutines.flow.update
6+
7+
enum class AfterSplashState {
8+
Idle, Map
9+
}
10+
11+
object SplashNavigationManager {
12+
private val _splashNavigationState = MutableStateFlow(AfterSplashState.Idle)
13+
val splashNavigationState get() = _splashNavigationState.asStateFlow()
14+
15+
fun onUserAlreadySignIn() {
16+
_splashNavigationState.update { AfterSplashState.Map }
17+
}
18+
19+
fun onLogout() {
20+
_splashNavigationState.update { AfterSplashState.Idle }
21+
}
22+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.espressodev.gptmap.core.common.util
2+
3+
import android.util.Log
4+
import androidx.compose.runtime.Composable
5+
import androidx.compose.runtime.DisposableEffect
6+
import androidx.compose.runtime.rememberUpdatedState
7+
import androidx.compose.ui.platform.LocalLifecycleOwner
8+
import androidx.lifecycle.Lifecycle
9+
import androidx.lifecycle.LifecycleEventObserver
10+
11+
@Composable
12+
fun LifecycleObserver(tag: String) {
13+
val lifecycleOwner = LocalLifecycleOwner.current
14+
val lifecycle = lifecycleOwner.lifecycle
15+
16+
val currentLifecycle = rememberUpdatedState(newValue = lifecycle.currentState)
17+
18+
DisposableEffect(currentLifecycle) {
19+
val observer = LifecycleEventObserver { _, event ->
20+
when (event) {
21+
Lifecycle.Event.ON_CREATE -> {
22+
Log.d(tag, "ON_CREATE")
23+
}
24+
25+
Lifecycle.Event.ON_START -> {
26+
Log.d(tag, "ON_START")
27+
}
28+
29+
Lifecycle.Event.ON_RESUME -> {
30+
Log.d(tag, "ON_RESUME")
31+
}
32+
33+
Lifecycle.Event.ON_PAUSE -> Log.d(tag, "ON_PAUSE")
34+
Lifecycle.Event.ON_STOP -> Log.d(tag, "ON_STOP")
35+
Lifecycle.Event.ON_DESTROY -> Log.d(tag, "ON_DESTROY")
36+
Lifecycle.Event.ON_ANY -> Log.d(tag, "ON_ANY")
37+
}
38+
}
39+
40+
lifecycle.addObserver(observer)
41+
onDispose {
42+
lifecycle.removeObserver(observer)
43+
}
44+
}
45+
}

core/common/src/main/kotlin/com/espressodev/gptmap/core/common/util/keyboardAsState.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.espressodev.gptmap.core.common.state
1+
package com.espressodev.gptmap.core.common.util
22

33
import android.graphics.Rect
44
import android.util.Log

core/data/src/main/kotlin/com/espressodev/gptmap/core/data/AccountService.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ typealias RevokeAccessResponse = Response<Boolean>
1111
typealias UpdatePasswordResponse = Response<Boolean>
1212

1313
interface AccountService {
14-
val currentUser: FirebaseUser
15-
val userId: String
14+
val userId: String?
15+
val isEmailVerified: Boolean
16+
val firebaseUser: FirebaseUser?
1617
suspend fun firebaseSignUpWithEmailAndPassword(
1718
email: String,
1819
password: String,

core/data/src/main/kotlin/com/espressodev/gptmap/core/data/FirestoreService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ interface FirestoreService {
77
fun saveUser(user: User)
88
suspend fun isUserInDatabase(email: String): Result<Boolean>
99
suspend fun getUser(userId: String): User
10-
fun getUserFlow(userId: String): Flow<User?>
10+
fun getUserFlow(): Flow<User?>
1111
}

core/data/src/main/kotlin/com/espressodev/gptmap/core/data/impl/AccountServiceImpl.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@ import javax.inject.Inject
1717
class AccountServiceImpl @Inject constructor(
1818
private val auth: FirebaseAuth,
1919
) : AccountService {
20-
override val currentUser: FirebaseUser
21-
get() = auth.currentUser ?: throw FirebaseUserIsNullException()
20+
override val userId: String?
21+
get() = auth.currentUser?.uid
2222

23-
override val userId: String
24-
get() = currentUser.uid
23+
override val isEmailVerified: Boolean
24+
get() = auth.currentUser?.isEmailVerified ?: false
25+
26+
override val firebaseUser: FirebaseUser?
27+
get() = auth.currentUser
2528

2629
override suspend fun firebaseSignUpWithEmailAndPassword(
2730
email: String,

0 commit comments

Comments
 (0)