Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions common/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest>

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>
55 changes: 55 additions & 0 deletions common/src/main/java/com/project200/common/utils/NetworkMonitor.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.project200.common.utils
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Core network module로 빼는건 어떤가요

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋은 생각인 것 같습니다!
추후 모듈로 분리하는 pr 따로 올리겠습니다


import android.Manifest
import android.content.Context
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkRequest
import androidx.annotation.RequiresPermission
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.callbackFlow
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class NetworkMonitor
@Inject
constructor(
@ApplicationContext context: Context,
) {
private val connectivityManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

// 현재 인터넷 연결 여부 확인
@RequiresPermission(Manifest.permission.ACCESS_NETWORK_STATE)
fun isCurrentlyConnected(): Boolean {
val activeNetwork = connectivityManager.activeNetwork ?: return false
val capabilities = connectivityManager.getNetworkCapabilities(activeNetwork) ?: return false
return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
}

// 네트워크 상태 변경 감지 Flow
val networkState =
callbackFlow {
val callback =
object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
trySend(true)
}

override fun onLost(network: Network) {
trySend(false)
}
}

val request =
NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build()

connectivityManager.registerNetworkCallback(request, callback)
awaitClose { connectivityManager.unregisterNetworkCallback(callback) }
}
}
4 changes: 2 additions & 2 deletions data/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest>

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>
13 changes: 13 additions & 0 deletions data/src/main/java/com/project200/data/api/ChatApiService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.project200.data.api

import com.project200.data.dto.BaseResponse
import com.project200.data.dto.TicketResponse
import retrofit2.http.POST
import retrofit2.http.Path

interface ChatApiService {
@POST("api/v1/chat-rooms/{chatroomId}/ticket")
suspend fun getChatTicket(
@Path("chatroomId") chatroomId: Long,
): BaseResponse<TicketResponse>
}
8 changes: 8 additions & 0 deletions data/src/main/java/com/project200/data/di/NetworkModule.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.project200.data.di

import com.project200.data.api.ApiService
import com.project200.data.api.ChatApiService
import com.project200.data.utils.FcmTokenProvider
import com.project200.data.utils.LocalDateAdapter
import com.project200.data.utils.LocalDateTimeAdapter
Expand Down Expand Up @@ -71,6 +72,7 @@ object NetworkModule {
.addInterceptor(tokenInterceptor)
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.pingInterval(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.build()
}
Expand Down Expand Up @@ -100,4 +102,10 @@ object NetworkModule {
fun provideApiService(retrofit: Retrofit): ApiService {
return retrofit.create(ApiService::class.java)
}

@Provides
@Singleton
fun provideChatApiService(retrofit: Retrofit): ChatApiService {
return retrofit.create(ChatApiService::class.java)
}
}
6 changes: 6 additions & 0 deletions data/src/main/java/com/project200/data/di/RepositoryModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.project200.data.di
import com.project200.data.impl.AddressRepositoryImpl
import com.project200.data.impl.AppUpdateRepositoryImpl
import com.project200.data.impl.AuthRepositoryImpl
import com.project200.data.impl.ChatSocketRepositoryImpl
import com.project200.data.impl.ChattingRepositoryImpl
import com.project200.data.impl.ExerciseRecordRepositoryImpl
import com.project200.data.impl.FcmRepositoryImpl
Expand All @@ -15,6 +16,7 @@ import com.project200.data.impl.TimerRepositoryImpl
import com.project200.domain.repository.AddressRepository
import com.project200.domain.repository.AppUpdateRepository
import com.project200.domain.repository.AuthRepository
import com.project200.domain.repository.ChatSocketRepository
import com.project200.domain.repository.ChattingRepository
import com.project200.domain.repository.ExerciseRecordRepository
import com.project200.domain.repository.FcmRepository
Expand Down Expand Up @@ -77,6 +79,10 @@ abstract class RepositoryModule {
@Singleton
abstract fun bindChattingRepository(chattingRepositoryImpl: ChattingRepositoryImpl): ChattingRepository

@Binds
@Singleton
abstract fun bindChatSocketRepository(chatSocketRepositoryImpl: ChatSocketRepositoryImpl): ChatSocketRepository

@Binds
@Singleton
abstract fun bindNotificationRepository(notificationRepositoryImpl: NotificationRepositoryImpl): NotificationRepository
Expand Down
35 changes: 35 additions & 0 deletions data/src/main/java/com/project200/data/dto/ChattingDTO.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.project200.data.dto

import com.project200.domain.model.SocketType
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import java.time.LocalDateTime

Expand Down Expand Up @@ -62,3 +64,36 @@ data class PostMessageResponse(
data class PostChatMessageRequest(
val content: String,
)

// 티켓 발급 응답
@JsonClass(generateAdapter = true)
data class TicketResponse(
@Json(name = "chatTicket")
val chatTicket: String,
)

@JsonClass(generateAdapter = true)
data class SocketChatMessage(
@Json(name = "webSocketType")
val type: SocketType,
val data: SocketChatMessageDTO? = null,
)

@JsonClass(generateAdapter = true)
data class SocketChatMessageDTO(
val chatId: Long,
val senderId: String?,
val senderNickname: String?,
val senderProfileUrl: String?,
val senderThumbnailUrl: String?,
val chatContent: String,
val chatType: String,
val sentAt: LocalDateTime,
)

@JsonClass(generateAdapter = true)
data class SocketChatRequest(
@Json(name = "webSocketType")
val type: SocketType,
val content: String?,
)
Loading