Skip to content

Commit 3c5e0c1

Browse files
committed
✨ 네트워크 연결 상태를 repository로 노출
1 parent a38d451 commit 3c5e0c1

File tree

5 files changed

+122
-5
lines changed

5 files changed

+122
-5
lines changed

data/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
33

4+
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
45
</manifest>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.whyranoid.data.di
2+
3+
import android.content.Context
4+
import com.whyranoid.data.running.NetworkRepositoryImpl
5+
import com.whyranoid.domain.repository.NetworkRepository
6+
import dagger.Module
7+
import dagger.Provides
8+
import dagger.hilt.InstallIn
9+
import dagger.hilt.android.qualifiers.ApplicationContext
10+
import dagger.hilt.components.SingletonComponent
11+
import javax.inject.Singleton
12+
13+
@Module
14+
@InstallIn(SingletonComponent::class)
15+
class ConnectionModule {
16+
17+
@Provides
18+
@Singleton
19+
fun provideNetworkRepository(@ApplicationContext context: Context): NetworkRepository {
20+
return NetworkRepositoryImpl(context)
21+
}
22+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package com.whyranoid.data.running
2+
3+
import android.content.BroadcastReceiver
4+
import android.content.Context
5+
import android.content.Intent
6+
import android.content.IntentFilter
7+
import android.net.ConnectivityManager
8+
import android.net.Network
9+
import android.net.NetworkCapabilities
10+
import android.os.Build
11+
import com.whyranoid.domain.repository.NetworkRepository
12+
import kotlinx.coroutines.flow.MutableStateFlow
13+
import kotlinx.coroutines.flow.asStateFlow
14+
15+
class NetworkRepositoryImpl(private val context: Context) :
16+
NetworkRepository {
17+
18+
private val _networkConnectionState = MutableStateFlow(getCurrentNetwork())
19+
override fun getNetworkConnectionState() = _networkConnectionState.asStateFlow()
20+
21+
private val connectivityManager =
22+
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
23+
24+
private val connectivityCallback = object : ConnectivityManager.NetworkCallback() {
25+
override fun onAvailable(network: Network) {
26+
emitNetworkConnectionState(true)
27+
}
28+
29+
override fun onLost(network: Network) {
30+
emitNetworkConnectionState(false)
31+
}
32+
}
33+
private val connectivityReceiver = object : BroadcastReceiver() {
34+
override fun onReceive(context: Context?, intent: Intent?) {
35+
if (context != null && context.isConnected) {
36+
emitNetworkConnectionState(true)
37+
} else {
38+
emitNetworkConnectionState(false)
39+
}
40+
}
41+
}
42+
43+
override fun addNetworkConnectionCallback() {
44+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
45+
connectivityManager.registerDefaultNetworkCallback(connectivityCallback)
46+
} else {
47+
context.registerReceiver(
48+
connectivityReceiver,
49+
IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
50+
)
51+
}
52+
}
53+
54+
override fun removeNetworkConnectionCallback() {
55+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
56+
connectivityManager.unregisterNetworkCallback(connectivityCallback)
57+
} else {
58+
context.unregisterReceiver(connectivityReceiver)
59+
}
60+
}
61+
62+
private fun getCurrentNetwork(): Boolean {
63+
return try {
64+
val networkCapabilities =
65+
connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
66+
networkCapabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) == true
67+
} catch (e: Exception) {
68+
false
69+
}
70+
}
71+
72+
private fun emitNetworkConnectionState(currentState: Boolean) {
73+
_networkConnectionState.value = currentState
74+
}
75+
}
76+
77+
val Context.isConnected: Boolean
78+
get() = (getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager)?.activeNetworkInfo?.isConnected == true
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.whyranoid.domain.repository
2+
3+
import kotlinx.coroutines.flow.StateFlow
4+
5+
interface NetworkRepository {
6+
7+
fun getNetworkConnectionState(): StateFlow<Boolean>
8+
9+
fun addNetworkConnectionCallback()
10+
11+
fun removeNetworkConnectionCallback()
12+
}

presentation/src/main/java/com/whyranoid/presentation/runningstart/RunningStartViewModel.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ package com.whyranoid.presentation.runningstart
22

33
import androidx.lifecycle.ViewModel
44
import androidx.lifecycle.viewModelScope
5+
import com.whyranoid.domain.repository.NetworkRepository
56
import com.whyranoid.domain.usecase.GetRunnerCountUseCase
6-
import com.whyranoid.presentation.util.networkconnection.NetworkConnectionStateHolder
77
import com.whyranoid.presentation.util.networkconnection.NetworkState
88
import com.whyranoid.runningdata.RunningDataManager
99
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -12,20 +12,24 @@ import kotlinx.coroutines.flow.MutableSharedFlow
1212
import kotlinx.coroutines.flow.SharingStarted
1313
import kotlinx.coroutines.flow.asSharedFlow
1414
import kotlinx.coroutines.flow.debounce
15+
import kotlinx.coroutines.flow.map
1516
import kotlinx.coroutines.flow.stateIn
1617
import kotlinx.coroutines.launch
1718
import javax.inject.Inject
1819

1920
@HiltViewModel
2021
class RunningStartViewModel @Inject constructor(
2122
getRunnerCountUseCase: GetRunnerCountUseCase,
22-
private val networkConnectionStateHolder: NetworkConnectionStateHolder
23+
private val networkRepository: NetworkRepository
2324
) : ViewModel() {
2425

2526
val runningDataManager = RunningDataManager.getInstance()
2627

2728
@OptIn(FlowPreview::class)
28-
val networkState = networkConnectionStateHolder.networkConnectionState
29+
val networkState = networkRepository.getNetworkConnectionState()
30+
.map { isConnected ->
31+
if (isConnected) NetworkState.Connection else NetworkState.DisConnection
32+
}
2933
.debounce(500)
3034
.stateIn(
3135
scope = viewModelScope,
@@ -51,10 +55,10 @@ class RunningStartViewModel @Inject constructor(
5155
}
5256

5357
fun startObservingNetworkState() {
54-
networkConnectionStateHolder.startObservingState()
58+
networkRepository.addNetworkConnectionCallback()
5559
}
5660

5761
fun finishObservingNetworkState() {
58-
networkConnectionStateHolder.finishObservingState()
62+
networkRepository.removeNetworkConnectionCallback()
5963
}
6064
}

0 commit comments

Comments
 (0)