diff --git a/app/build.gradle b/app/build.gradle index 1462bad..1ce5ccf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,9 @@ plugins { id 'org.jetbrains.kotlin.android' id 'kotlin-parcelize' id 'org.jetbrains.kotlin.plugin.serialization' version '1.9.0' + id 'com.google.dagger.hilt.android' + id 'kotlin-android' + id 'kotlin-kapt' } Properties properties = new Properties() @@ -74,4 +77,7 @@ dependencies { implementation("com.squareup.okhttp3:logging-interceptor") implementation ("com.github.bumptech.glide:glide:4.16.0") + + implementation 'com.google.dagger:hilt-android:2.51' + kapt 'com.google.dagger:hilt-compiler:2.51.1' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 16fcdd1..e97c83e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ @@ -29,10 +30,10 @@ diff --git a/app/src/main/java/com/sopt/now/NowSopt.kt b/app/src/main/java/com/sopt/now/NowSopt.kt new file mode 100644 index 0000000..e087b64 --- /dev/null +++ b/app/src/main/java/com/sopt/now/NowSopt.kt @@ -0,0 +1,21 @@ +package com.sopt.now + +import android.app.Application +import android.content.Context +import androidx.appcompat.app.AppCompatDelegate +import dagger.hilt.android.HiltAndroidApp + +@HiltAndroidApp +class NowSopt : Application() { + override fun onCreate() { + super.onCreate() + appContext = applicationContext + + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) + } + + companion object { + lateinit var appContext: Context + private set + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/datasource/AuthDataSource.kt b/app/src/main/java/com/sopt/now/data/datasource/AuthDataSource.kt new file mode 100644 index 0000000..d6546fe --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/datasource/AuthDataSource.kt @@ -0,0 +1,14 @@ +package com.sopt.now.data.datasource + +import com.sopt.now.data.dto.request.RequestLoginDto +import com.sopt.now.data.dto.request.RequestSignUpDto +import com.sopt.now.data.dto.response.ResponseLoginDto +import com.sopt.now.data.dto.response.ResponseSignUpDto +import retrofit2.Response +import javax.inject.Singleton + +@Singleton +interface AuthDataSource { + suspend fun signUp(request: RequestSignUpDto): Response + suspend fun login(request: RequestLoginDto): Response +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/datasource/FriendDataSource.kt b/app/src/main/java/com/sopt/now/data/datasource/FriendDataSource.kt new file mode 100644 index 0000000..e233ddc --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/datasource/FriendDataSource.kt @@ -0,0 +1,10 @@ +package com.sopt.now.data.datasource + +import com.sopt.now.data.dto.response.ResponseFriendsDto +import retrofit2.Response +import javax.inject.Singleton + +@Singleton +interface FriendDataSource { + suspend fun getFriends(page: Int): Response +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/datasource/UserDataSource.kt b/app/src/main/java/com/sopt/now/data/datasource/UserDataSource.kt new file mode 100644 index 0000000..128fd8b --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/datasource/UserDataSource.kt @@ -0,0 +1,13 @@ +package com.sopt.now.data.datasource + +import com.sopt.now.data.dto.request.RequestChangePwdDto +import com.sopt.now.data.dto.response.ResponseChangePwdDto +import com.sopt.now.data.dto.response.ResponseUserInfoDto +import retrofit2.Response +import javax.inject.Singleton + +@Singleton +interface UserDataSource { + suspend fun getUserInfo(userId: Int): Response + suspend fun changeUserPwd(userId: Int, pwd: RequestChangePwdDto): Response +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/datasourceImpl/AuthDataSourceImpl.kt b/app/src/main/java/com/sopt/now/data/datasourceImpl/AuthDataSourceImpl.kt new file mode 100644 index 0000000..1d8fa90 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/datasourceImpl/AuthDataSourceImpl.kt @@ -0,0 +1,24 @@ +package com.sopt.now.data.datasourceImpl + +import com.sopt.now.data.datasource.AuthDataSource +import com.sopt.now.data.dto.request.RequestLoginDto +import com.sopt.now.data.dto.request.RequestSignUpDto +import com.sopt.now.data.dto.response.ResponseLoginDto +import com.sopt.now.data.dto.response.ResponseSignUpDto +import com.sopt.now.data.service.AuthService +import retrofit2.Response +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class AuthDataSourceImpl @Inject constructor( + private val authService: AuthService +) : AuthDataSource { + override suspend fun signUp(request: RequestSignUpDto): Response { + return authService.signUp(request) + } + + override suspend fun login(request: RequestLoginDto): Response { + return authService.login(request) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/datasourceImpl/FriendDataSourceImpl.kt b/app/src/main/java/com/sopt/now/data/datasourceImpl/FriendDataSourceImpl.kt new file mode 100644 index 0000000..83db98f --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/datasourceImpl/FriendDataSourceImpl.kt @@ -0,0 +1,17 @@ +package com.sopt.now.data.datasourceImpl + +import com.sopt.now.data.datasource.FriendDataSource +import com.sopt.now.data.dto.response.ResponseFriendsDto +import com.sopt.now.data.service.FriendService +import retrofit2.Response +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class FriendDataSourceImpl @Inject constructor( + private val friendService: FriendService +) : FriendDataSource { + override suspend fun getFriends(page: Int): Response { + return friendService.getFriends(page) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/datasourceImpl/UserDataSourceImpl.kt b/app/src/main/java/com/sopt/now/data/datasourceImpl/UserDataSourceImpl.kt new file mode 100644 index 0000000..2e02b62 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/datasourceImpl/UserDataSourceImpl.kt @@ -0,0 +1,26 @@ +package com.sopt.now.data.datasourceImpl + +import com.sopt.now.data.datasource.UserDataSource +import com.sopt.now.data.dto.request.RequestChangePwdDto +import com.sopt.now.data.dto.response.ResponseChangePwdDto +import com.sopt.now.data.dto.response.ResponseUserInfoDto +import com.sopt.now.data.service.UserService +import retrofit2.Response +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class UserDataSourceImpl @Inject constructor( + private val userService: UserService +) : UserDataSource { + override suspend fun getUserInfo(userId: Int): Response { + return userService.getUserInfo(userId) + } + + override suspend fun changeUserPwd( + userId: Int, + pwd: RequestChangePwdDto + ): Response { + return userService.changeUserPwd(userId, pwd) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/di/DataModule.kt b/app/src/main/java/com/sopt/now/data/di/DataModule.kt new file mode 100644 index 0000000..d8bbdd5 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/di/DataModule.kt @@ -0,0 +1,73 @@ +package com.sopt.now.data.di + +import com.sopt.now.data.datasource.AuthDataSource +import com.sopt.now.data.datasource.FriendDataSource +import com.sopt.now.data.datasource.UserDataSource +import com.sopt.now.data.datasourceImpl.AuthDataSourceImpl +import com.sopt.now.data.datasourceImpl.FriendDataSourceImpl +import com.sopt.now.data.datasourceImpl.UserDataSourceImpl +import com.sopt.now.data.repositoryImpl.AuthRepositoryImpl +import com.sopt.now.data.repositoryImpl.FriendRepositoryImpl +import com.sopt.now.data.repositoryImpl.UserRepositoryImpl +import com.sopt.now.data.service.AuthService +import com.sopt.now.data.service.FriendService +import com.sopt.now.data.service.UserService +import com.sopt.now.domain.repository.AuthRepository +import com.sopt.now.domain.repository.FriendRepository +import com.sopt.now.domain.repository.UserRepository +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object DataModule { + @Singleton + @Provides + fun provideAuthDataSource( + authService: AuthService + ): AuthDataSource { + return AuthDataSourceImpl(authService) + } + + @Singleton + @Provides + fun provideAuthRepository( + authDataSource: AuthDataSource + ): AuthRepository { + return AuthRepositoryImpl(authDataSource) + } + @Singleton + @Provides + fun provideUserDataSource( + userService: UserService + ): UserDataSource { + return UserDataSourceImpl(userService) + } + + @Singleton + @Provides + fun provideUserRepository( + userDataSource: UserDataSource + ): UserRepository { + return UserRepositoryImpl(userDataSource) + } + + @Singleton + @Provides + fun provideFriendDataSource( + friendService: FriendService + ): FriendDataSource { + return FriendDataSourceImpl(friendService) + } + + @Singleton + @Provides + fun provideFriendRepository( + friendDataSource: FriendDataSource + ): FriendRepository { + return FriendRepositoryImpl(friendDataSource) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/di/NetworkModule.kt b/app/src/main/java/com/sopt/now/data/di/NetworkModule.kt new file mode 100644 index 0000000..2b56f02 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/di/NetworkModule.kt @@ -0,0 +1,67 @@ +package com.sopt.now.data.di + +import android.util.Log +import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory +import com.sopt.now.BuildConfig.AUTH_BASE_URL +import com.sopt.now.BuildConfig.FRIEND_BASE_URL +import com.sopt.now.data.service.AuthService +import com.sopt.now.data.service.FriendService +import com.sopt.now.data.service.UserService +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import kotlinx.serialization.json.Json +import okhttp3.Interceptor +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object NetworkModule { + private const val CONTENT_TYPE = "application/json" + private val json: Json = Json { + ignoreUnknownKeys = true + } + + private fun getLogOkHttpClient(): Interceptor { + val loggingInterceptor = HttpLoggingInterceptor { message -> + Log.d("OkHttp", message) + } + loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY + return loggingInterceptor + } + + private val okHttpClient = OkHttpClient.Builder() + .addInterceptor(getLogOkHttpClient()) + .build() + + @Singleton + @Provides + fun provideRetrofit(): Retrofit.Builder { + return Retrofit.Builder() + .addConverterFactory(json.asConverterFactory(CONTENT_TYPE.toMediaType())) + .client(okHttpClient) + } + + @Singleton + @Provides + fun provideAuthService(retrofit: Retrofit.Builder): AuthService { + return retrofit.baseUrl(AUTH_BASE_URL).build().create(AuthService::class.java) + } + + @Singleton + @Provides + fun provideUserService(retrofit: Retrofit.Builder): UserService { + return retrofit.baseUrl(AUTH_BASE_URL).build().create(UserService::class.java) + } + + @Singleton + @Provides + fun provideFriendService(retrofit: Retrofit.Builder): FriendService { + return retrofit.baseUrl(FRIEND_BASE_URL).build().create(FriendService::class.java) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/remote/request/RequestChangePwdDto.kt b/app/src/main/java/com/sopt/now/data/dto/request/RequestChangePwdDto.kt similarity index 90% rename from app/src/main/java/com/sopt/now/remote/request/RequestChangePwdDto.kt rename to app/src/main/java/com/sopt/now/data/dto/request/RequestChangePwdDto.kt index d6f6914..0892694 100644 --- a/app/src/main/java/com/sopt/now/remote/request/RequestChangePwdDto.kt +++ b/app/src/main/java/com/sopt/now/data/dto/request/RequestChangePwdDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.remote.request +package com.sopt.now.data.dto.request import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/remote/request/RequestLoginDto.kt b/app/src/main/java/com/sopt/now/data/dto/request/RequestLoginDto.kt similarity index 86% rename from app/src/main/java/com/sopt/now/remote/request/RequestLoginDto.kt rename to app/src/main/java/com/sopt/now/data/dto/request/RequestLoginDto.kt index 05e8c0f..696d54b 100644 --- a/app/src/main/java/com/sopt/now/remote/request/RequestLoginDto.kt +++ b/app/src/main/java/com/sopt/now/data/dto/request/RequestLoginDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.remote.request +package com.sopt.now.data.dto.request import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/remote/request/RequestSignUpDto.kt b/app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt similarity index 90% rename from app/src/main/java/com/sopt/now/remote/request/RequestSignUpDto.kt rename to app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt index 7106e3e..ff95896 100644 --- a/app/src/main/java/com/sopt/now/remote/request/RequestSignUpDto.kt +++ b/app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.remote.request +package com.sopt.now.data.dto.request import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/remote/response/ResponseChangePwdDto.kt b/app/src/main/java/com/sopt/now/data/dto/response/ResponseChangePwdDto.kt similarity index 85% rename from app/src/main/java/com/sopt/now/remote/response/ResponseChangePwdDto.kt rename to app/src/main/java/com/sopt/now/data/dto/response/ResponseChangePwdDto.kt index 92c756a..e5febda 100644 --- a/app/src/main/java/com/sopt/now/remote/response/ResponseChangePwdDto.kt +++ b/app/src/main/java/com/sopt/now/data/dto/response/ResponseChangePwdDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.remote.response +package com.sopt.now.data.dto.response import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/remote/response/ResponseFriendsDto.kt b/app/src/main/java/com/sopt/now/data/dto/response/ResponseFriendsDto.kt similarity index 58% rename from app/src/main/java/com/sopt/now/remote/response/ResponseFriendsDto.kt rename to app/src/main/java/com/sopt/now/data/dto/response/ResponseFriendsDto.kt index 2d8a3b0..45efc90 100644 --- a/app/src/main/java/com/sopt/now/remote/response/ResponseFriendsDto.kt +++ b/app/src/main/java/com/sopt/now/data/dto/response/ResponseFriendsDto.kt @@ -1,5 +1,6 @@ -package com.sopt.now.remote.response +package com.sopt.now.data.dto.response +import com.sopt.now.domain.entity.FriendEntity import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -14,24 +15,10 @@ data class ResponseFriendsDto( @SerialName("total_pages") val totalPages: Int, @SerialName("data") - val `data`: List, + val `data`: List, @SerialName("support") val support: Support ) { - @Serializable - data class Data( - @SerialName("id") - val id: Int, - @SerialName("email") - val email: String, - @SerialName("first_name") - val firstName: String, - @SerialName("last_name") - val lastName: String, - @SerialName("avatar") - val avatar: String - ) - @Serializable data class Support( @SerialName("url") diff --git a/app/src/main/java/com/sopt/now/remote/response/ResponseLoginDto.kt b/app/src/main/java/com/sopt/now/data/dto/response/ResponseLoginDto.kt similarity index 85% rename from app/src/main/java/com/sopt/now/remote/response/ResponseLoginDto.kt rename to app/src/main/java/com/sopt/now/data/dto/response/ResponseLoginDto.kt index 7098a2d..6c6e79f 100644 --- a/app/src/main/java/com/sopt/now/remote/response/ResponseLoginDto.kt +++ b/app/src/main/java/com/sopt/now/data/dto/response/ResponseLoginDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.remote.response +package com.sopt.now.data.dto.response import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/remote/response/ResponseSignUpDto.kt b/app/src/main/java/com/sopt/now/data/dto/response/ResponseSignUpDto.kt similarity index 85% rename from app/src/main/java/com/sopt/now/remote/response/ResponseSignUpDto.kt rename to app/src/main/java/com/sopt/now/data/dto/response/ResponseSignUpDto.kt index 7a35329..9220331 100644 --- a/app/src/main/java/com/sopt/now/remote/response/ResponseSignUpDto.kt +++ b/app/src/main/java/com/sopt/now/data/dto/response/ResponseSignUpDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.remote.response +package com.sopt.now.data.dto.response import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/remote/response/ResponseUserInfoDto.kt b/app/src/main/java/com/sopt/now/data/dto/response/ResponseUserInfoDto.kt similarity index 76% rename from app/src/main/java/com/sopt/now/remote/response/ResponseUserInfoDto.kt rename to app/src/main/java/com/sopt/now/data/dto/response/ResponseUserInfoDto.kt index 069ab79..945a87e 100644 --- a/app/src/main/java/com/sopt/now/remote/response/ResponseUserInfoDto.kt +++ b/app/src/main/java/com/sopt/now/data/dto/response/ResponseUserInfoDto.kt @@ -1,6 +1,6 @@ -package com.sopt.now.remote.response +package com.sopt.now.data.dto.response -import com.sopt.now.util.user.User +import com.sopt.now.presentation.home.User import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/data/repositoryImpl/AuthRepositoryImpl.kt b/app/src/main/java/com/sopt/now/data/repositoryImpl/AuthRepositoryImpl.kt new file mode 100644 index 0000000..12a3ac6 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/repositoryImpl/AuthRepositoryImpl.kt @@ -0,0 +1,24 @@ +package com.sopt.now.data.repositoryImpl + +import com.sopt.now.data.datasource.AuthDataSource +import com.sopt.now.data.dto.request.RequestLoginDto +import com.sopt.now.data.dto.request.RequestSignUpDto +import com.sopt.now.data.dto.response.ResponseLoginDto +import com.sopt.now.data.dto.response.ResponseSignUpDto +import com.sopt.now.domain.repository.AuthRepository +import retrofit2.Response +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class AuthRepositoryImpl @Inject constructor( + private val authDataSource: AuthDataSource +) : AuthRepository { + override suspend fun signUp(request: RequestSignUpDto): Response { + return authDataSource.signUp(request) + } + + override suspend fun login(request: RequestLoginDto): Response { + return authDataSource.login(request) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/repositoryImpl/FriendRepositoryImpl.kt b/app/src/main/java/com/sopt/now/data/repositoryImpl/FriendRepositoryImpl.kt new file mode 100644 index 0000000..188d121 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/repositoryImpl/FriendRepositoryImpl.kt @@ -0,0 +1,17 @@ +package com.sopt.now.data.repositoryImpl + +import com.sopt.now.data.datasource.FriendDataSource +import com.sopt.now.data.dto.response.ResponseFriendsDto +import com.sopt.now.domain.repository.FriendRepository +import retrofit2.Response +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class FriendRepositoryImpl @Inject constructor( + private val friendDataSource: FriendDataSource +) : FriendRepository { + override suspend fun getFriends(page: Int): Response { + return friendDataSource.getFriends(page) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/repositoryImpl/UserRepositoryImpl.kt b/app/src/main/java/com/sopt/now/data/repositoryImpl/UserRepositoryImpl.kt new file mode 100644 index 0000000..e6e8079 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/repositoryImpl/UserRepositoryImpl.kt @@ -0,0 +1,26 @@ +package com.sopt.now.data.repositoryImpl + +import com.sopt.now.data.datasource.UserDataSource +import com.sopt.now.data.dto.request.RequestChangePwdDto +import com.sopt.now.data.dto.response.ResponseChangePwdDto +import com.sopt.now.data.dto.response.ResponseUserInfoDto +import com.sopt.now.domain.repository.UserRepository +import retrofit2.Response +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class UserRepositoryImpl @Inject constructor( + private val userDataSource: UserDataSource +) : UserRepository { + override suspend fun getUserInfo(userId: Int): Response { + return userDataSource.getUserInfo(userId) + } + + override suspend fun changeUserPwd( + userId: Int, + request: RequestChangePwdDto + ): Response { + return userDataSource.changeUserPwd(userId, request) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/remote/service/AuthService.kt b/app/src/main/java/com/sopt/now/data/service/AuthService.kt similarity index 57% rename from app/src/main/java/com/sopt/now/remote/service/AuthService.kt rename to app/src/main/java/com/sopt/now/data/service/AuthService.kt index 97e78d7..f8426b1 100644 --- a/app/src/main/java/com/sopt/now/remote/service/AuthService.kt +++ b/app/src/main/java/com/sopt/now/data/service/AuthService.kt @@ -1,10 +1,9 @@ -package com.sopt.now.remote.service +package com.sopt.now.data.service -import com.sopt.now.remote.request.RequestLoginDto -import com.sopt.now.remote.request.RequestSignUpDto -import com.sopt.now.remote.response.ResponseLoginDto -import com.sopt.now.remote.response.ResponseSignUpDto -import retrofit2.Call +import com.sopt.now.data.dto.request.RequestLoginDto +import com.sopt.now.data.dto.request.RequestSignUpDto +import com.sopt.now.data.dto.response.ResponseLoginDto +import com.sopt.now.data.dto.response.ResponseSignUpDto import retrofit2.Response import retrofit2.http.Body import retrofit2.http.POST diff --git a/app/src/main/java/com/sopt/now/remote/service/FriendService.kt b/app/src/main/java/com/sopt/now/data/service/FriendService.kt similarity index 73% rename from app/src/main/java/com/sopt/now/remote/service/FriendService.kt rename to app/src/main/java/com/sopt/now/data/service/FriendService.kt index b0d07fa..f960634 100644 --- a/app/src/main/java/com/sopt/now/remote/service/FriendService.kt +++ b/app/src/main/java/com/sopt/now/data/service/FriendService.kt @@ -1,6 +1,6 @@ -package com.sopt.now.remote.service +package com.sopt.now.data.service -import com.sopt.now.remote.response.ResponseFriendsDto +import com.sopt.now.data.dto.response.ResponseFriendsDto import retrofit2.Call import retrofit2.Response import retrofit2.http.GET diff --git a/app/src/main/java/com/sopt/now/remote/service/UserService.kt b/app/src/main/java/com/sopt/now/data/service/UserService.kt similarity index 70% rename from app/src/main/java/com/sopt/now/remote/service/UserService.kt rename to app/src/main/java/com/sopt/now/data/service/UserService.kt index 655cde3..e9abb70 100644 --- a/app/src/main/java/com/sopt/now/remote/service/UserService.kt +++ b/app/src/main/java/com/sopt/now/data/service/UserService.kt @@ -1,8 +1,8 @@ -package com.sopt.now.remote.service +package com.sopt.now.data.service -import com.sopt.now.remote.request.RequestChangePwdDto -import com.sopt.now.remote.response.ResponseChangePwdDto -import com.sopt.now.remote.response.ResponseUserInfoDto +import com.sopt.now.data.dto.request.RequestChangePwdDto +import com.sopt.now.data.dto.response.ResponseChangePwdDto +import com.sopt.now.data.dto.response.ResponseUserInfoDto import retrofit2.Call import retrofit2.Response import retrofit2.http.Body diff --git a/app/src/main/java/com/sopt/now/domain/entity/FriendEntity.kt b/app/src/main/java/com/sopt/now/domain/entity/FriendEntity.kt new file mode 100644 index 0000000..870ef57 --- /dev/null +++ b/app/src/main/java/com/sopt/now/domain/entity/FriendEntity.kt @@ -0,0 +1,18 @@ +package com.sopt.now.domain.entity + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class FriendEntity( + @SerialName("id") + val id: Int, + @SerialName("email") + val email: String, + @SerialName("first_name") + val firstName: String, + @SerialName("last_name") + val lastName: String, + @SerialName("avatar") + val avatar: String +) \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt b/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt new file mode 100644 index 0000000..2556fa2 --- /dev/null +++ b/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt @@ -0,0 +1,16 @@ +package com.sopt.now.domain.repository + +import com.sopt.now.data.dto.request.RequestLoginDto +import com.sopt.now.data.dto.request.RequestSignUpDto +import com.sopt.now.data.dto.response.ResponseLoginDto +import com.sopt.now.data.dto.response.ResponseSignUpDto +import com.sopt.now.data.service.AuthService +import retrofit2.Response +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +interface AuthRepository{ + suspend fun signUp(request: RequestSignUpDto): Response + suspend fun login(request: RequestLoginDto): Response +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/repository/FriendRepository.kt b/app/src/main/java/com/sopt/now/domain/repository/FriendRepository.kt new file mode 100644 index 0000000..c871123 --- /dev/null +++ b/app/src/main/java/com/sopt/now/domain/repository/FriendRepository.kt @@ -0,0 +1,10 @@ +package com.sopt.now.domain.repository + +import com.sopt.now.data.dto.response.ResponseFriendsDto +import retrofit2.Response +import javax.inject.Singleton + +@Singleton +interface FriendRepository { + suspend fun getFriends(page: Int): Response +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/repository/UserRepository.kt b/app/src/main/java/com/sopt/now/domain/repository/UserRepository.kt new file mode 100644 index 0000000..1d9f4f4 --- /dev/null +++ b/app/src/main/java/com/sopt/now/domain/repository/UserRepository.kt @@ -0,0 +1,13 @@ +package com.sopt.now.domain.repository + +import com.sopt.now.data.dto.request.RequestChangePwdDto +import com.sopt.now.data.dto.response.ResponseChangePwdDto +import com.sopt.now.data.dto.response.ResponseUserInfoDto +import retrofit2.Response +import javax.inject.Singleton + +@Singleton +interface UserRepository { + suspend fun getUserInfo(userId: Int): Response + suspend fun changeUserPwd(userId: Int, request: RequestChangePwdDto) : Response +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/ui/changePwd/ChangePwdActivity.kt b/app/src/main/java/com/sopt/now/presentation/changePwd/ChangePwdActivity.kt similarity index 83% rename from app/src/main/java/com/sopt/now/ui/changePwd/ChangePwdActivity.kt rename to app/src/main/java/com/sopt/now/presentation/changePwd/ChangePwdActivity.kt index 339c259..d5b38a5 100644 --- a/app/src/main/java/com/sopt/now/ui/changePwd/ChangePwdActivity.kt +++ b/app/src/main/java/com/sopt/now/presentation/changePwd/ChangePwdActivity.kt @@ -1,16 +1,19 @@ -package com.sopt.now.ui.changePwd +package com.sopt.now.presentation.changePwd import android.os.Bundle import android.widget.Toast import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import com.sopt.now.data.dto.request.RequestChangePwdDto import com.sopt.now.databinding.ActivityChangePwdBinding -import com.sopt.now.remote.request.RequestChangePwdDto -import com.sopt.now.ui.main.MainViewModel.Companion.USER_INFO +import com.sopt.now.presentation.main.MainViewModel.Companion.USER_INFO +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class ChangePwdActivity : AppCompatActivity() { private lateinit var binding: ActivityChangePwdBinding - private val viewModel by viewModels() + private val viewModel: ChangePwdViewModel by viewModels() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityChangePwdBinding.inflate(layoutInflater) diff --git a/app/src/main/java/com/sopt/now/ui/changePwd/ChangePwdState.kt b/app/src/main/java/com/sopt/now/presentation/changePwd/ChangePwdState.kt similarity index 65% rename from app/src/main/java/com/sopt/now/ui/changePwd/ChangePwdState.kt rename to app/src/main/java/com/sopt/now/presentation/changePwd/ChangePwdState.kt index 80e48f9..67bee5f 100644 --- a/app/src/main/java/com/sopt/now/ui/changePwd/ChangePwdState.kt +++ b/app/src/main/java/com/sopt/now/presentation/changePwd/ChangePwdState.kt @@ -1,4 +1,4 @@ -package com.sopt.now.ui.changePwd +package com.sopt.now.presentation.changePwd data class ChangePwdState( val isSuccess: Boolean, diff --git a/app/src/main/java/com/sopt/now/ui/changePwd/ChangePwdViewModel.kt b/app/src/main/java/com/sopt/now/presentation/changePwd/ChangePwdViewModel.kt similarity index 69% rename from app/src/main/java/com/sopt/now/ui/changePwd/ChangePwdViewModel.kt rename to app/src/main/java/com/sopt/now/presentation/changePwd/ChangePwdViewModel.kt index a78c3ac..8bdbd31 100644 --- a/app/src/main/java/com/sopt/now/ui/changePwd/ChangePwdViewModel.kt +++ b/app/src/main/java/com/sopt/now/presentation/changePwd/ChangePwdViewModel.kt @@ -1,14 +1,19 @@ -package com.sopt.now.ui.changePwd +package com.sopt.now.presentation.changePwd import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sopt.now.remote.request.RequestChangePwdDto -import com.sopt.now.ui.base.ServicePool.userService +import com.sopt.now.data.dto.request.RequestChangePwdDto +import com.sopt.now.domain.repository.UserRepository +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch +import javax.inject.Inject -class ChangePwdViewModel : ViewModel() { +@HiltViewModel +class ChangePwdViewModel @Inject constructor( + private val userRepository: UserRepository +) : ViewModel() { private val _changePwdState = MutableLiveData() val changePwdState: LiveData get() = _changePwdState @@ -16,7 +21,7 @@ class ChangePwdViewModel : ViewModel() { fun changePwd(userId: Int, request: RequestChangePwdDto) { viewModelScope.launch { runCatching { - userService.changeUserPwd(userId, request) + userRepository.changeUserPwd(userId, request) }.onSuccess { if (it.code() in 200..299) { _changePwdState.value = ChangePwdState(true, "비밀번호 변경 성공") diff --git a/app/src/main/java/com/sopt/now/util/friend/Friend.kt b/app/src/main/java/com/sopt/now/presentation/home/Friend.kt similarity index 73% rename from app/src/main/java/com/sopt/now/util/friend/Friend.kt rename to app/src/main/java/com/sopt/now/presentation/home/Friend.kt index 4f794b2..647493b 100644 --- a/app/src/main/java/com/sopt/now/util/friend/Friend.kt +++ b/app/src/main/java/com/sopt/now/presentation/home/Friend.kt @@ -1,4 +1,4 @@ -package com.sopt.now.util.friend +package com.sopt.now.presentation.home data class Friend( val profileImage: String, diff --git a/app/src/main/java/com/sopt/now/util/friend/FriendAdapter.kt b/app/src/main/java/com/sopt/now/presentation/home/FriendAdapter.kt similarity index 93% rename from app/src/main/java/com/sopt/now/util/friend/FriendAdapter.kt rename to app/src/main/java/com/sopt/now/presentation/home/FriendAdapter.kt index 3996a75..29157d1 100644 --- a/app/src/main/java/com/sopt/now/util/friend/FriendAdapter.kt +++ b/app/src/main/java/com/sopt/now/presentation/home/FriendAdapter.kt @@ -1,12 +1,10 @@ -package com.sopt.now.util.friend +package com.sopt.now.presentation.home -import com.sopt.now.util.user.User import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.sopt.now.databinding.ItemFriendBinding import com.sopt.now.databinding.ItemUserBinding -import com.sopt.now.util.user.UserViewHolder class FriendAdapter() : RecyclerView.Adapter() { private var friendList: List = emptyList() diff --git a/app/src/main/java/com/sopt/now/util/friend/FriendViewHolder.kt b/app/src/main/java/com/sopt/now/presentation/home/FriendViewHolder.kt similarity index 87% rename from app/src/main/java/com/sopt/now/util/friend/FriendViewHolder.kt rename to app/src/main/java/com/sopt/now/presentation/home/FriendViewHolder.kt index cf3fe28..d4dfcad 100644 --- a/app/src/main/java/com/sopt/now/util/friend/FriendViewHolder.kt +++ b/app/src/main/java/com/sopt/now/presentation/home/FriendViewHolder.kt @@ -1,8 +1,7 @@ -package com.sopt.now.util.friend +package com.sopt.now.presentation.home import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide -import com.bumptech.glide.load.resource.bitmap.CircleCrop import com.sopt.now.R import com.sopt.now.databinding.ItemFriendBinding diff --git a/app/src/main/java/com/sopt/now/ui/home/HomeFragment.kt b/app/src/main/java/com/sopt/now/presentation/home/HomeFragment.kt similarity index 82% rename from app/src/main/java/com/sopt/now/ui/home/HomeFragment.kt rename to app/src/main/java/com/sopt/now/presentation/home/HomeFragment.kt index e6d47bd..9a12d6a 100644 --- a/app/src/main/java/com/sopt/now/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/sopt/now/presentation/home/HomeFragment.kt @@ -1,18 +1,18 @@ -package com.sopt.now.ui.home +package com.sopt.now.presentation.home import android.os.Bundle import android.view.View import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.GridLayoutManager import com.sopt.now.databinding.FragmentHomeBinding -import com.sopt.now.ui.base.BindingFragment -import com.sopt.now.ui.main.MainViewModel.Companion.LOGIN_INFO -import com.sopt.now.util.friend.FriendAdapter -import com.sopt.now.util.user.User +import com.sopt.now.presentation.main.MainViewModel.Companion.LOGIN_INFO +import com.sopt.now.util.BindingFragment +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class HomeFragment() : BindingFragment(FragmentHomeBinding::inflate) { private val friendAdapter by lazy { FriendAdapter() } - private val viewModel by activityViewModels() + private val viewModel: HomeViewModel by activityViewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/app/src/main/java/com/sopt/now/ui/home/HomeViewModel.kt b/app/src/main/java/com/sopt/now/presentation/home/HomeViewModel.kt similarity index 74% rename from app/src/main/java/com/sopt/now/ui/home/HomeViewModel.kt rename to app/src/main/java/com/sopt/now/presentation/home/HomeViewModel.kt index ce05954..306583b 100644 --- a/app/src/main/java/com/sopt/now/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/sopt/now/presentation/home/HomeViewModel.kt @@ -1,18 +1,22 @@ -package com.sopt.now.ui.home +package com.sopt.now.presentation.home import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sopt.now.ui.base.ServicePool.friendService -import com.sopt.now.ui.base.ServicePool.userService -import com.sopt.now.util.friend.Friend -import com.sopt.now.util.user.User +import com.sopt.now.domain.repository.FriendRepository +import com.sopt.now.domain.repository.UserRepository +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import retrofit2.HttpException +import javax.inject.Inject -class HomeViewModel : ViewModel() { +@HiltViewModel +class HomeViewModel @Inject constructor( + private val friendRepository: FriendRepository, + private val userRepository: UserRepository +) : ViewModel() { private val _friends = MutableLiveData>() val friends: LiveData> get() = _friends @@ -24,7 +28,7 @@ class HomeViewModel : ViewModel() { fun fetchFriends(page: Int) { viewModelScope.launch { runCatching { - friendService.getFriends(page) + friendRepository.getFriends(page) }.onSuccess { val friends = it.body()?.data ?: emptyList() _friends.postValue(friends.map { Friend(it.avatar, it.firstName, it.email) }) @@ -43,7 +47,7 @@ class HomeViewModel : ViewModel() { fun fetchUserInfo(userId: Int) { viewModelScope.launch { runCatching { - userService.getUserInfo(userId) + userRepository.getUserInfo(userId) }.onSuccess { _userInfo.value = it.body()?.data }.onFailure { diff --git a/app/src/main/java/com/sopt/now/util/user/User.kt b/app/src/main/java/com/sopt/now/presentation/home/User.kt similarity index 80% rename from app/src/main/java/com/sopt/now/util/user/User.kt rename to app/src/main/java/com/sopt/now/presentation/home/User.kt index c06f1eb..114083f 100644 --- a/app/src/main/java/com/sopt/now/util/user/User.kt +++ b/app/src/main/java/com/sopt/now/presentation/home/User.kt @@ -1,4 +1,4 @@ -package com.sopt.now.util.user +package com.sopt.now.presentation.home import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/util/user/UserViewHolder.kt b/app/src/main/java/com/sopt/now/presentation/home/UserViewHolder.kt similarity index 90% rename from app/src/main/java/com/sopt/now/util/user/UserViewHolder.kt rename to app/src/main/java/com/sopt/now/presentation/home/UserViewHolder.kt index 40b8562..fef69ab 100644 --- a/app/src/main/java/com/sopt/now/util/user/UserViewHolder.kt +++ b/app/src/main/java/com/sopt/now/presentation/home/UserViewHolder.kt @@ -1,4 +1,4 @@ -package com.sopt.now.util.user +package com.sopt.now.presentation.home import androidx.recyclerview.widget.RecyclerView import com.sopt.now.databinding.ItemUserBinding diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt b/app/src/main/java/com/sopt/now/presentation/login/LoginActivity.kt similarity index 88% rename from app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt rename to app/src/main/java/com/sopt/now/presentation/login/LoginActivity.kt index e04f3cf..9058603 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt +++ b/app/src/main/java/com/sopt/now/presentation/login/LoginActivity.kt @@ -1,4 +1,4 @@ -package com.sopt.now.ui.login +package com.sopt.now.presentation.login import android.content.Intent import android.os.Bundle @@ -8,15 +8,17 @@ import androidx.activity.viewModels import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import com.sopt.now.R +import com.sopt.now.data.dto.request.RequestLoginDto import com.sopt.now.databinding.ActivityLoginBinding -import com.sopt.now.remote.request.RequestLoginDto -import com.sopt.now.ui.main.MainActivity -import com.sopt.now.ui.main.MainViewModel.Companion.LOGIN_INFO -import com.sopt.now.ui.signUp.SignUpActivity +import com.sopt.now.presentation.main.MainActivity +import com.sopt.now.presentation.main.MainViewModel.Companion.LOGIN_INFO +import com.sopt.now.presentation.signUp.SignUpActivity +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class LoginActivity : AppCompatActivity() { private lateinit var binding: ActivityLoginBinding - private val viewModel by viewModels() + private val viewModel: LoginViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginState.kt b/app/src/main/java/com/sopt/now/presentation/login/LoginState.kt similarity index 73% rename from app/src/main/java/com/sopt/now/ui/login/LoginState.kt rename to app/src/main/java/com/sopt/now/presentation/login/LoginState.kt index 2341c47..bd7c309 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginState.kt +++ b/app/src/main/java/com/sopt/now/presentation/login/LoginState.kt @@ -1,4 +1,4 @@ -package com.sopt.now.ui.login +package com.sopt.now.presentation.login data class LoginState( val isSuccess: Boolean, diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt b/app/src/main/java/com/sopt/now/presentation/login/LoginViewModel.kt similarity index 70% rename from app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt rename to app/src/main/java/com/sopt/now/presentation/login/LoginViewModel.kt index 4fe16e5..3cd0b56 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt +++ b/app/src/main/java/com/sopt/now/presentation/login/LoginViewModel.kt @@ -1,14 +1,19 @@ -package com.sopt.now.ui.login +package com.sopt.now.presentation.login import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sopt.now.remote.request.RequestLoginDto -import com.sopt.now.ui.base.ServicePool.authService +import com.sopt.now.data.dto.request.RequestLoginDto +import com.sopt.now.domain.repository.AuthRepository +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch +import javax.inject.Inject -class LoginViewModel : ViewModel() { +@HiltViewModel +class LoginViewModel @Inject constructor( + private val authRepository: AuthRepository +) : ViewModel() { private val _loginState = MutableLiveData() val loginState: LiveData get() = _loginState @@ -16,7 +21,7 @@ class LoginViewModel : ViewModel() { fun login(request: RequestLoginDto) { viewModelScope.launch { runCatching { - authService.login(request) + authRepository.login(request) }.onSuccess { if (it.code() in 200..299) { val userId = it.headers()["location"] diff --git a/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt b/app/src/main/java/com/sopt/now/presentation/main/MainActivity.kt similarity index 85% rename from app/src/main/java/com/sopt/now/ui/main/MainActivity.kt rename to app/src/main/java/com/sopt/now/presentation/main/MainActivity.kt index 3ce6685..1d0a8d5 100644 --- a/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt +++ b/app/src/main/java/com/sopt/now/presentation/main/MainActivity.kt @@ -1,15 +1,16 @@ -package com.sopt.now.ui.main +package com.sopt.now.presentation.main import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import com.sopt.now.R import com.sopt.now.databinding.ActivityMainBinding -import com.sopt.now.ui.home.HomeFragment -import com.sopt.now.ui.mypage.MyPageFragment -import com.sopt.now.ui.search.SearchFragment - +import com.sopt.now.presentation.home.HomeFragment +import com.sopt.now.presentation.mypage.MyPageFragment +import com.sopt.now.presentation.search.SearchFragment +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt b/app/src/main/java/com/sopt/now/presentation/main/MainViewModel.kt similarity index 82% rename from app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt rename to app/src/main/java/com/sopt/now/presentation/main/MainViewModel.kt index 00a3a15..020d9b5 100644 --- a/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt +++ b/app/src/main/java/com/sopt/now/presentation/main/MainViewModel.kt @@ -1,4 +1,4 @@ -package com.sopt.now.ui.main +package com.sopt.now.presentation.main import androidx.lifecycle.ViewModel diff --git a/app/src/main/java/com/sopt/now/ui/mypage/MyPageFragment.kt b/app/src/main/java/com/sopt/now/presentation/mypage/MyPageFragment.kt similarity index 81% rename from app/src/main/java/com/sopt/now/ui/mypage/MyPageFragment.kt rename to app/src/main/java/com/sopt/now/presentation/mypage/MyPageFragment.kt index 8e0c515..c37eaa0 100644 --- a/app/src/main/java/com/sopt/now/ui/mypage/MyPageFragment.kt +++ b/app/src/main/java/com/sopt/now/presentation/mypage/MyPageFragment.kt @@ -1,4 +1,4 @@ -package com.sopt.now.ui.mypage +package com.sopt.now.presentation.mypage import android.content.Context.MODE_PRIVATE import android.content.Intent @@ -8,15 +8,17 @@ import androidx.appcompat.app.AlertDialog import androidx.fragment.app.activityViewModels import com.sopt.now.R import com.sopt.now.databinding.FragmentMyPageBinding -import com.sopt.now.ui.base.BindingFragment -import com.sopt.now.ui.changePwd.ChangePwdActivity -import com.sopt.now.ui.login.LoginActivity -import com.sopt.now.ui.login.LoginActivity.Companion.PREF_KEY -import com.sopt.now.ui.main.MainViewModel.Companion.LOGIN_INFO -import com.sopt.now.ui.main.MainViewModel.Companion.USER_INFO +import com.sopt.now.presentation.changePwd.ChangePwdActivity +import com.sopt.now.presentation.login.LoginActivity +import com.sopt.now.presentation.login.LoginActivity.Companion.PREF_KEY +import com.sopt.now.presentation.main.MainViewModel.Companion.LOGIN_INFO +import com.sopt.now.presentation.main.MainViewModel.Companion.USER_INFO +import com.sopt.now.util.BindingFragment +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class MyPageFragment() : BindingFragment(FragmentMyPageBinding::inflate) { - private val viewModel by activityViewModels() + private val viewModel: MyPageViewModel by activityViewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/app/src/main/java/com/sopt/now/ui/mypage/MyPageViewModel.kt b/app/src/main/java/com/sopt/now/presentation/mypage/MyPageViewModel.kt similarity index 65% rename from app/src/main/java/com/sopt/now/ui/mypage/MyPageViewModel.kt rename to app/src/main/java/com/sopt/now/presentation/mypage/MyPageViewModel.kt index 1ccf1ed..929766b 100644 --- a/app/src/main/java/com/sopt/now/ui/mypage/MyPageViewModel.kt +++ b/app/src/main/java/com/sopt/now/presentation/mypage/MyPageViewModel.kt @@ -1,15 +1,18 @@ -package com.sopt.now.ui.mypage +package com.sopt.now.presentation.mypage import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sopt.now.remote.response.ResponseUserInfoDto -import com.sopt.now.ui.base.ServicePool.userService +import com.sopt.now.data.dto.response.ResponseUserInfoDto +import com.sopt.now.domain.repository.UserRepository import kotlinx.coroutines.launch +import javax.inject.Inject -class MyPageViewModel : ViewModel() { +class MyPageViewModel @Inject constructor( + private val userRepository: UserRepository +) : ViewModel() { private val _userInfo = MutableLiveData() val userInfo: LiveData get() = _userInfo @@ -17,7 +20,7 @@ class MyPageViewModel : ViewModel() { fun fetchUserInfo(userId: Int) { viewModelScope.launch { runCatching { - userService.getUserInfo(userId) + userRepository.getUserInfo(userId) }.onSuccess { _userInfo.postValue(it.body()) }.onFailure { diff --git a/app/src/main/java/com/sopt/now/ui/search/SearchFragment.kt b/app/src/main/java/com/sopt/now/presentation/search/SearchFragment.kt similarity index 65% rename from app/src/main/java/com/sopt/now/ui/search/SearchFragment.kt rename to app/src/main/java/com/sopt/now/presentation/search/SearchFragment.kt index ad2a8ea..87ab701 100644 --- a/app/src/main/java/com/sopt/now/ui/search/SearchFragment.kt +++ b/app/src/main/java/com/sopt/now/presentation/search/SearchFragment.kt @@ -1,7 +1,7 @@ -package com.sopt.now.ui.search +package com.sopt.now.presentation.search import com.sopt.now.databinding.FragmentSearchBinding -import com.sopt.now.ui.base.BindingFragment +import com.sopt.now.util.BindingFragment class SearchFragment : BindingFragment(FragmentSearchBinding::inflate) { diff --git a/app/src/main/java/com/sopt/now/ui/signUp/SignUpActivity.kt b/app/src/main/java/com/sopt/now/presentation/signUp/SignUpActivity.kt similarity index 86% rename from app/src/main/java/com/sopt/now/ui/signUp/SignUpActivity.kt rename to app/src/main/java/com/sopt/now/presentation/signUp/SignUpActivity.kt index e79f3ad..fd319ad 100644 --- a/app/src/main/java/com/sopt/now/ui/signUp/SignUpActivity.kt +++ b/app/src/main/java/com/sopt/now/presentation/signUp/SignUpActivity.kt @@ -1,15 +1,18 @@ -package com.sopt.now.ui.signUp +package com.sopt.now.presentation.signUp import android.os.Bundle import android.widget.Toast import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import com.sopt.now.data.dto.request.RequestSignUpDto import com.sopt.now.databinding.ActivitySignUpBinding -import com.sopt.now.remote.request.RequestSignUpDto +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class SignUpActivity : AppCompatActivity() { private lateinit var binding: ActivitySignUpBinding - private val viewModel by viewModels() + private val viewModel: SignUpViewModel by viewModels() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivitySignUpBinding.inflate(layoutInflater) diff --git a/app/src/main/java/com/sopt/now/ui/signUp/SignUpState.kt b/app/src/main/java/com/sopt/now/presentation/signUp/SignUpState.kt similarity index 65% rename from app/src/main/java/com/sopt/now/ui/signUp/SignUpState.kt rename to app/src/main/java/com/sopt/now/presentation/signUp/SignUpState.kt index 30efd38..8fd04e2 100644 --- a/app/src/main/java/com/sopt/now/ui/signUp/SignUpState.kt +++ b/app/src/main/java/com/sopt/now/presentation/signUp/SignUpState.kt @@ -1,4 +1,4 @@ -package com.sopt.now.ui.signUp +package com.sopt.now.presentation.signUp data class SignUpState( val isSuccess: Boolean, diff --git a/app/src/main/java/com/sopt/now/ui/signUp/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/presentation/signUp/SignUpViewModel.kt similarity index 69% rename from app/src/main/java/com/sopt/now/ui/signUp/SignUpViewModel.kt rename to app/src/main/java/com/sopt/now/presentation/signUp/SignUpViewModel.kt index bcc4b59..f882ebd 100644 --- a/app/src/main/java/com/sopt/now/ui/signUp/SignUpViewModel.kt +++ b/app/src/main/java/com/sopt/now/presentation/signUp/SignUpViewModel.kt @@ -1,14 +1,20 @@ -package com.sopt.now.ui.signUp +package com.sopt.now.presentation.signUp + import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sopt.now.remote.request.RequestSignUpDto -import com.sopt.now.ui.base.ServicePool.authService +import com.sopt.now.data.dto.request.RequestSignUpDto +import com.sopt.now.domain.repository.AuthRepository +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch +import javax.inject.Inject -class SignUpViewModel : ViewModel() { +@HiltViewModel +class SignUpViewModel @Inject constructor( + private val authRepository: AuthRepository +) : ViewModel() { private val _signUpState = MutableLiveData() val signUpState: LiveData get() = _signUpState @@ -16,7 +22,7 @@ class SignUpViewModel : ViewModel() { fun signUp(request: RequestSignUpDto) { viewModelScope.launch { runCatching { - authService.signUp(request) + authRepository.signUp(request) }.onSuccess { if (it.code() in 200..299) { _signUpState.value = SignUpState(true, "회원가입 성공") diff --git a/app/src/main/java/com/sopt/now/ui/base/ApiFactory.kt b/app/src/main/java/com/sopt/now/ui/base/ApiFactory.kt deleted file mode 100644 index cfdf390..0000000 --- a/app/src/main/java/com/sopt/now/ui/base/ApiFactory.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.sopt.now.ui.base - -import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory -import com.sopt.now.BuildConfig.AUTH_BASE_URL -import com.sopt.now.BuildConfig.FRIEND_BASE_URL -import com.sopt.now.remote.service.AuthService -import com.sopt.now.remote.service.FriendService -import com.sopt.now.remote.service.UserService -import kotlinx.serialization.json.Json -import okhttp3.MediaType.Companion.toMediaType -import retrofit2.Retrofit - -object ApiFactory { - private const val CONTENT_TYPE = "application/json" - - fun retrofit(url: String): Retrofit { - return Retrofit.Builder() - .baseUrl(url) - .addConverterFactory(Json.asConverterFactory(CONTENT_TYPE.toMediaType())) - .build() - } - - inline fun create(url: String): T = retrofit(url).create(T::class.java) -} - -object ServicePool { - val userService by lazy { ApiFactory.create(AUTH_BASE_URL) } - val authService by lazy { ApiFactory.create(AUTH_BASE_URL) } - val friendService by lazy { ApiFactory.create(FRIEND_BASE_URL) } -} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/util/BaseViewModelFactory.kt b/app/src/main/java/com/sopt/now/util/BaseViewModelFactory.kt new file mode 100644 index 0000000..b14b1ca --- /dev/null +++ b/app/src/main/java/com/sopt/now/util/BaseViewModelFactory.kt @@ -0,0 +1,10 @@ +package com.sopt.now.util + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider + +class BaseViewModelFactory(private val creator: () -> T) : ViewModelProvider.Factory { + override fun create(modelClass: Class): V { + return creator() as V + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/ui/base/BindingFragment.kt b/app/src/main/java/com/sopt/now/util/BindingFragment.kt similarity index 96% rename from app/src/main/java/com/sopt/now/ui/base/BindingFragment.kt rename to app/src/main/java/com/sopt/now/util/BindingFragment.kt index 49a65df..96a1a3a 100644 --- a/app/src/main/java/com/sopt/now/ui/base/BindingFragment.kt +++ b/app/src/main/java/com/sopt/now/util/BindingFragment.kt @@ -1,4 +1,4 @@ -package com.sopt.now.ui.base +package com.sopt.now.util import android.os.Bundle import android.view.LayoutInflater diff --git a/app/src/main/res/layout/activity_change_pwd.xml b/app/src/main/res/layout/activity_change_pwd.xml index 8a1c32a..c7b8d3e 100644 --- a/app/src/main/res/layout/activity_change_pwd.xml +++ b/app/src/main/res/layout/activity_change_pwd.xml @@ -6,7 +6,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:padding="50dp" - tools:context=".ui.changePwd.ChangePwdActivity"> + tools:context=".presentation.changePwd.ChangePwdActivity"> + tools:context=".presentation.login.LoginActivity"> + tools:context=".presentation.main.MainActivity"> + tools:context=".presentation.signUp.SignUpActivity"> + tools:context=".presentation.home.HomeFragment"> + tools:context=".presentation.main.MainActivity"> + tools:context=".presentation.search.SearchFragment">