diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 01fc6494..4a3b27ee 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -133,6 +133,12 @@ android:screenOrientation="portrait" android:windowSoftInputMode="adjustPan" android:exported="false" /> + + - - @@ -170,7 +168,6 @@ android:name=".presentation.intro.SplashActivity" android:screenOrientation="portrait" android:exported="true"> - @@ -180,7 +177,6 @@ android:screenOrientation="portrait" android:name=".presentation.MainActivity" android:exported="true"> - diff --git a/app/src/main/java/com/umc/ttoklip/data/api/KakaoApi.kt b/app/src/main/java/com/umc/ttoklip/data/api/KakaoApi.kt index 17952915..cdaf8f67 100644 --- a/app/src/main/java/com/umc/ttoklip/data/api/KakaoApi.kt +++ b/app/src/main/java/com/umc/ttoklip/data/api/KakaoApi.kt @@ -8,7 +8,7 @@ import retrofit2.http.Header import retrofit2.http.Query interface KakaoApi { - @GET("v2/local/search/keyword.json") + @GET("v2/local/search/address") fun getSearchKeyword( @Header("Authorization") key: String, @Query("query") query:String diff --git a/app/src/main/java/com/umc/ttoklip/data/api/MyPage2Api.kt b/app/src/main/java/com/umc/ttoklip/data/api/MyPage2Api.kt index 7596b77f..ba889f56 100644 --- a/app/src/main/java/com/umc/ttoklip/data/api/MyPage2Api.kt +++ b/app/src/main/java/com/umc/ttoklip/data/api/MyPage2Api.kt @@ -1,27 +1,27 @@ -package com.umc.ttoklip.data.api - -import com.umc.ttoklip.data.model.ResponseBody -import com.umc.ttoklip.data.model.honeytip.CreateHoneyTipResponse -import com.umc.ttoklip.data.model.mypage.MyPageInfoResponse -import okhttp3.MultipartBody -import okhttp3.RequestBody -import retrofit2.Response -import retrofit2.http.GET -import retrofit2.http.Multipart -import retrofit2.http.PATCH -import retrofit2.http.POST -import retrofit2.http.Part -import retrofit2.http.PartMap - -interface MyPage2Api { - @GET("/api/v1/my-page") - suspend fun getMyPageInfo(): Response> - - @Multipart - @PATCH("/api/v1/my-page/edit") - suspend fun editMyPageInfo( - @Part profileImage: MultipartBody.Part?, - @Part categories:List, - @PartMap params:MutableMap - ): Response> +package com.umc.ttoklip.data.api + +import com.umc.ttoklip.data.model.ResponseBody +import com.umc.ttoklip.data.model.honeytip.CreateHoneyTipResponse +import com.umc.ttoklip.data.model.mypage.MyPageInfoResponse +import okhttp3.MultipartBody +import okhttp3.RequestBody +import retrofit2.Response +import retrofit2.http.GET +import retrofit2.http.Multipart +import retrofit2.http.PATCH +import retrofit2.http.POST +import retrofit2.http.Part +import retrofit2.http.PartMap + +interface MyPage2Api { + @GET("/api/v1/my-page") + suspend fun getMyPageInfo(): Response> + + @Multipart + @PATCH("/api/v1/my-page/edit") + suspend fun editMyPageInfo( + @Part profileImage: MultipartBody.Part?, + @Part categories:List, + @PartMap params:MutableMap + ): Response> } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/data/api/StrangerApi.kt b/app/src/main/java/com/umc/ttoklip/data/api/StrangerApi.kt new file mode 100644 index 00000000..91fc3249 --- /dev/null +++ b/app/src/main/java/com/umc/ttoklip/data/api/StrangerApi.kt @@ -0,0 +1,13 @@ +package com.umc.ttoklip.data.api + +import com.umc.ttoklip.data.model.ResponseBody +import com.umc.ttoklip.data.model.stranger.StrangerResponse +import retrofit2.Response +import retrofit2.http.POST +import retrofit2.http.Query + +interface StrangerApi { + @POST("/api/v1/stranger") + suspend fun getStranger(@Query("nickname") nick: String) + : Response> +} \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/data/api/TermApi.kt b/app/src/main/java/com/umc/ttoklip/data/api/TermApi.kt new file mode 100644 index 00000000..0e2f8582 --- /dev/null +++ b/app/src/main/java/com/umc/ttoklip/data/api/TermApi.kt @@ -0,0 +1,14 @@ +package com.umc.ttoklip.data.api + +import com.umc.ttoklip.data.model.ResponseBody +import com.umc.ttoklip.data.model.signup.TermResponse +import retrofit2.Response +import retrofit2.http.GET +import retrofit2.http.Query + +interface TermApi { + @GET("/api/v1/term") + suspend fun getTerm( + @Query("page") page: Int) + : Response> +} \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/data/model/honeytip/HoneyTipPagingResponse.kt b/app/src/main/java/com/umc/ttoklip/data/model/honeytip/HoneyTipPagingResponse.kt index 6b31e9f6..0b3117de 100644 --- a/app/src/main/java/com/umc/ttoklip/data/model/honeytip/HoneyTipPagingResponse.kt +++ b/app/src/main/java/com/umc/ttoklip/data/model/honeytip/HoneyTipPagingResponse.kt @@ -1,12 +1,12 @@ -package com.umc.ttoklip.data.model.honeytip - -data class HoneyTipPagingResponse( - val data: List, - val category: String, - val totalPage: Int, - val totalElements: Int, - val isFirst: Boolean, - val isLast: Boolean, -) { - constructor(): this(listOf(), "", 0, 0, true, false) -} +package com.umc.ttoklip.data.model.honeytip + +data class HoneyTipPagingResponse( + val data: List, + val category: String, + val totalPage: Int, + val totalElements: Int, + val isFirst: Boolean, + val isLast: Boolean, +) { + constructor(): this(listOf(), "", 0, 0, true, false) +} diff --git a/app/src/main/java/com/umc/ttoklip/data/model/honeytip/request/HoneyTipCommentRequest.kt b/app/src/main/java/com/umc/ttoklip/data/model/honeytip/request/HoneyTipCommentRequest.kt index 10ae314e..1166d177 100644 --- a/app/src/main/java/com/umc/ttoklip/data/model/honeytip/request/HoneyTipCommentRequest.kt +++ b/app/src/main/java/com/umc/ttoklip/data/model/honeytip/request/HoneyTipCommentRequest.kt @@ -1,6 +1,6 @@ -package com.umc.ttoklip.data.model.honeytip.request - -data class HoneyTipCommentRequest( - val comment: String, - val parentCommentId: Int -) +package com.umc.ttoklip.data.model.honeytip.request + +data class HoneyTipCommentRequest( + val comment: String, + val parentCommentId: Int +) diff --git a/app/src/main/java/com/umc/ttoklip/data/model/stranger/StrangerResponse.kt b/app/src/main/java/com/umc/ttoklip/data/model/stranger/StrangerResponse.kt new file mode 100644 index 00000000..b45b5fcb --- /dev/null +++ b/app/src/main/java/com/umc/ttoklip/data/model/stranger/StrangerResponse.kt @@ -0,0 +1,13 @@ +package com.umc.ttoklip.data.model.stranger + +data class StrangerResponse ( + val nickname:String, + val residence:String, + val level:Int, + val experience:ExperienceResponse +) +data class ExperienceResponse( + val current:Int, + val required:Int, + val levelimageurl:String +) \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/data/repository/location/DirectLocationRepository.kt b/app/src/main/java/com/umc/ttoklip/data/repository/location/DirectLocationRepository.kt new file mode 100644 index 00000000..c790509d --- /dev/null +++ b/app/src/main/java/com/umc/ttoklip/data/repository/location/DirectLocationRepository.kt @@ -0,0 +1,8 @@ +package com.umc.ttoklip.data.repository.location + +import com.umc.ttoklip.data.model.KakaoResponse +import retrofit2.Call + +interface DirectLocationRepository { + suspend fun getDirectAddress(address:String): Call +} \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/data/repository/location/DirectLocationRepositoryImpl.kt b/app/src/main/java/com/umc/ttoklip/data/repository/location/DirectLocationRepositoryImpl.kt new file mode 100644 index 00000000..fc60cd38 --- /dev/null +++ b/app/src/main/java/com/umc/ttoklip/data/repository/location/DirectLocationRepositoryImpl.kt @@ -0,0 +1,17 @@ +package com.umc.ttoklip.data.repository.location + +import com.umc.ttoklip.R +import com.umc.ttoklip.data.api.KakaoApi +import com.umc.ttoklip.data.model.KakaoResponse +import retrofit2.Call +import javax.inject.Inject + +class DirectLocationRepositoryImpl @Inject constructor( + private val api: KakaoApi +): DirectLocationRepository { + + override suspend fun getDirectAddress(address: String): Call { + val call = api.getSearchKeyword(R.string.kakao_api_key.toString(), address) + return call + } +} \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/data/repository/search/Search2Repository.kt b/app/src/main/java/com/umc/ttoklip/data/repository/search/Search2Repository.kt index 63a73127..d4ff94fb 100644 --- a/app/src/main/java/com/umc/ttoklip/data/repository/search/Search2Repository.kt +++ b/app/src/main/java/com/umc/ttoklip/data/repository/search/Search2Repository.kt @@ -1,20 +1,20 @@ -package com.umc.ttoklip.data.repository.search - -import com.umc.ttoklip.data.model.CommonResponse -import com.umc.ttoklip.data.model.news.MainNewsResponse -import com.umc.ttoklip.data.model.news.comment.NewsCommentRequest -import com.umc.ttoklip.data.model.news.detail.NewsDetailResponse -import com.umc.ttoklip.data.model.search.NewsSearchResponse -import com.umc.ttoklip.data.model.search.SearchModel -import com.umc.ttoklip.data.model.search.TipSearchResponse -import com.umc.ttoklip.data.model.search.TownSearchResponse -import com.umc.ttoklip.module.NetworkResult - -interface Search2Repository { - - suspend fun getNewsSearch(title : String, sort: String, page: Int): NetworkResult - - suspend fun getTipSearch(title : String, sort: String, page: Int): NetworkResult - - suspend fun getTownSearch(title : String, sort: String, page: Int): NetworkResult +package com.umc.ttoklip.data.repository.search + +import com.umc.ttoklip.data.model.CommonResponse +import com.umc.ttoklip.data.model.news.MainNewsResponse +import com.umc.ttoklip.data.model.news.comment.NewsCommentRequest +import com.umc.ttoklip.data.model.news.detail.NewsDetailResponse +import com.umc.ttoklip.data.model.search.NewsSearchResponse +import com.umc.ttoklip.data.model.search.SearchModel +import com.umc.ttoklip.data.model.search.TipSearchResponse +import com.umc.ttoklip.data.model.search.TownSearchResponse +import com.umc.ttoklip.module.NetworkResult + +interface Search2Repository { + + suspend fun getNewsSearch(title : String, sort: String, page: Int): NetworkResult + + suspend fun getTipSearch(title : String, sort: String, page: Int): NetworkResult + + suspend fun getTownSearch(title : String, sort: String, page: Int): NetworkResult } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/data/repository/search/Search2RepositoryImpl.kt b/app/src/main/java/com/umc/ttoklip/data/repository/search/Search2RepositoryImpl.kt index 8d176b1f..4ebf6b6d 100644 --- a/app/src/main/java/com/umc/ttoklip/data/repository/search/Search2RepositoryImpl.kt +++ b/app/src/main/java/com/umc/ttoklip/data/repository/search/Search2RepositoryImpl.kt @@ -1,69 +1,69 @@ -package com.umc.ttoklip.data.repository.search - -import com.umc.ttoklip.data.api.Search2Api -import com.umc.ttoklip.data.api.SearchApi -import com.umc.ttoklip.data.model.ResponseBody -import com.umc.ttoklip.data.model.search.NewsSearchResponse -import com.umc.ttoklip.data.model.search.SearchModel -import com.umc.ttoklip.data.model.search.TipSearchResponse -import com.umc.ttoklip.data.model.search.TownSearchResponse -import com.umc.ttoklip.module.NetworkResult -import com.umc.ttoklip.module.handleApi -import javax.inject.Inject - -class Search2RepositoryImpl @Inject constructor( - private val api: Search2Api -) : Search2Repository { - - - override suspend fun getNewsSearch( - title: String, - sort: String, - page: Int - ): NetworkResult { - return handleApi({ - api.getSearchNewsApi( - title = title, - sort = sort, - page =page - ) - }) { response: ResponseBody -> - response.result - } - } - - override suspend fun getTipSearch( - title: String, - sort: String, - page: Int - ): NetworkResult { - return handleApi({ - api.getSearchTipApi( - title = title, - sort = sort, - page =page - ) - }) { response: ResponseBody -> - response.result - - } - } - - override suspend fun getTownSearch( - title: String, - sort: String, - page: Int - ): NetworkResult { - return handleApi({ - api.getSearchTownApi( - title = title, - sort = sort, - page =page - ) - }) { response: ResponseBody -> - response.result - } - - } - +package com.umc.ttoklip.data.repository.search + +import com.umc.ttoklip.data.api.Search2Api +import com.umc.ttoklip.data.api.SearchApi +import com.umc.ttoklip.data.model.ResponseBody +import com.umc.ttoklip.data.model.search.NewsSearchResponse +import com.umc.ttoklip.data.model.search.SearchModel +import com.umc.ttoklip.data.model.search.TipSearchResponse +import com.umc.ttoklip.data.model.search.TownSearchResponse +import com.umc.ttoklip.module.NetworkResult +import com.umc.ttoklip.module.handleApi +import javax.inject.Inject + +class Search2RepositoryImpl @Inject constructor( + private val api: Search2Api +) : Search2Repository { + + + override suspend fun getNewsSearch( + title: String, + sort: String, + page: Int + ): NetworkResult { + return handleApi({ + api.getSearchNewsApi( + title = title, + sort = sort, + page =page + ) + }) { response: ResponseBody -> + response.result + } + } + + override suspend fun getTipSearch( + title: String, + sort: String, + page: Int + ): NetworkResult { + return handleApi({ + api.getSearchTipApi( + title = title, + sort = sort, + page =page + ) + }) { response: ResponseBody -> + response.result + + } + } + + override suspend fun getTownSearch( + title: String, + sort: String, + page: Int + ): NetworkResult { + return handleApi({ + api.getSearchTownApi( + title = title, + sort = sort, + page =page + ) + }) { response: ResponseBody -> + response.result + } + + } + } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/data/repository/signup/TermRepository.kt b/app/src/main/java/com/umc/ttoklip/data/repository/signup/TermRepository.kt new file mode 100644 index 00000000..5b4fa81a --- /dev/null +++ b/app/src/main/java/com/umc/ttoklip/data/repository/signup/TermRepository.kt @@ -0,0 +1,8 @@ +package com.umc.ttoklip.data.repository.signup + +import com.umc.ttoklip.data.model.signup.TermResponse +import com.umc.ttoklip.module.NetworkResult + +interface TermRepository { + suspend fun getTerm(page:Int): NetworkResult +} \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/data/repository/signup/TermRepositoryImpl.kt b/app/src/main/java/com/umc/ttoklip/data/repository/signup/TermRepositoryImpl.kt new file mode 100644 index 00000000..ea49f330 --- /dev/null +++ b/app/src/main/java/com/umc/ttoklip/data/repository/signup/TermRepositoryImpl.kt @@ -0,0 +1,17 @@ +package com.umc.ttoklip.data.repository.signup + +import com.umc.ttoklip.data.api.TermApi +import com.umc.ttoklip.data.model.ResponseBody +import com.umc.ttoklip.data.model.signup.SignupResponse +import com.umc.ttoklip.data.model.signup.TermResponse +import com.umc.ttoklip.module.NetworkResult +import com.umc.ttoklip.module.handleApi +import javax.inject.Inject + +class TermRepositoryImpl @Inject constructor( + private val api: TermApi +): TermRepository { + override suspend fun getTerm(page: Int): NetworkResult { + return handleApi({api.getTerm(page)}) {response: ResponseBody ->response.result} + } +} \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/data/repository/stranger/StrangerRepository.kt b/app/src/main/java/com/umc/ttoklip/data/repository/stranger/StrangerRepository.kt new file mode 100644 index 00000000..d8dc1849 --- /dev/null +++ b/app/src/main/java/com/umc/ttoklip/data/repository/stranger/StrangerRepository.kt @@ -0,0 +1,9 @@ +package com.umc.ttoklip.data.repository.stranger + +import com.umc.ttoklip.data.model.signup.SignupResponse +import com.umc.ttoklip.data.model.stranger.StrangerResponse +import com.umc.ttoklip.module.NetworkResult + +interface StrangerRepository { + suspend fun getStranger(nick:String): NetworkResult +} \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/di/KakaoModule.kt b/app/src/main/java/com/umc/ttoklip/di/KakaoModule.kt index 2ddf49d0..ed5eef7b 100644 --- a/app/src/main/java/com/umc/ttoklip/di/KakaoModule.kt +++ b/app/src/main/java/com/umc/ttoklip/di/KakaoModule.kt @@ -1,30 +1,33 @@ package com.umc.ttoklip.di +import android.util.Log import com.umc.ttoklip.R import com.umc.ttoklip.data.api.KakaoApi +import com.umc.ttoklip.data.api.TermApi +import com.umc.ttoklip.data.model.KakaoResponse import dagger.Module +import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory +import javax.inject.Singleton + @Module @InstallIn(SingletonComponent::class) object KakaoModule { - class kakaoAddress { - companion object { - var BASE_URL = R.string.kakao.toString() - var API_KEY = R.string.kakao_api_key.toString() - } - object kakaoApiRetrofitClient { - private val retrofit: Retrofit.Builder by lazy { - Retrofit.Builder() - .baseUrl(BASE_URL) - .addConverterFactory(GsonConverterFactory.create()) - } - val apiService: KakaoApi by lazy { - retrofit.build().create(KakaoApi::class.java) - } - } - } +// private val BASE_URL = R.string.kakao.toString() +// @Provides +// @Singleton +// fun kakaoApiRetrofitClient(keyword: String) { +// val retrofit = Retrofit.Builder() +// .baseUrl(BASE_URL) +// .addConverterFactory(GsonConverterFactory.create()) +// .build() +// val api = retrofit.create(KakaoApi::class.java) +// } } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/di/NetworkModule.kt b/app/src/main/java/com/umc/ttoklip/di/NetworkModule.kt index 139ff661..209a9dfe 100644 --- a/app/src/main/java/com/umc/ttoklip/di/NetworkModule.kt +++ b/app/src/main/java/com/umc/ttoklip/di/NetworkModule.kt @@ -4,6 +4,7 @@ import com.umc.ttoklip.R import com.umc.ttoklip.TtoklipApplication import com.umc.ttoklip.data.api.HomeApi import com.umc.ttoklip.data.api.HoneyTipApi +import com.umc.ttoklip.data.api.KakaoApi import com.umc.ttoklip.data.api.LoginApi import com.umc.ttoklip.data.api.MyPage2Api import com.umc.ttoklip.data.api.MyPageApi @@ -16,6 +17,7 @@ import com.umc.ttoklip.data.api.ReadTogetherApi import com.umc.ttoklip.data.api.Search2Api import com.umc.ttoklip.data.api.SearchApi import com.umc.ttoklip.data.api.SignupApi +import com.umc.ttoklip.data.api.TermApi import com.umc.ttoklip.data.api.TestApi import com.umc.ttoklip.data.api.WriteCommsApi import com.umc.ttoklip.data.api.WriteTogetherApi @@ -30,6 +32,9 @@ import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import retrofit2.converter.scalars.ScalarsConverterFactory +import retrofit2.create +import java.util.concurrent.TimeUnit +import javax.inject.Named import javax.inject.Singleton @Module @@ -53,6 +58,23 @@ object NetworkModule { .build() } + @Provides + @Singleton + @Named("kakaoClient") + fun providesKOkHttpClient(): OkHttpClient { + val interceptor = HttpLoggingInterceptor().apply { + level = HttpLoggingInterceptor.Level.BODY + } + return OkHttpClient.Builder().apply { + + addInterceptor (interceptor) + connectTimeout(5, TimeUnit.SECONDS) + readTimeout(5, TimeUnit.SECONDS) + writeTimeout(5, TimeUnit.SECONDS) + }.build() + } + + @Provides @Singleton fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit { @@ -81,6 +103,20 @@ object NetworkModule { } } + @Provides + @Singleton + @Named("kakao") + fun providesKakaoRetrofit( + @Named("kakaoClient") client: OkHttpClient, + gsonConverterFactory: GsonConverterFactory + ): Retrofit { + return Retrofit.Builder() + .baseUrl(R.string.kakao.toString()) + .addConverterFactory(gsonConverterFactory) + .client(client) + .build() + } + @Provides @Singleton fun provideTestApi(retrofit: Retrofit): TestApi { @@ -117,6 +153,11 @@ object NetworkModule { return retrofit.buildService() } + @Provides + @Singleton + fun provideTermApi(retrofit: Retrofit): TermApi{ + return retrofit.buildService() + } @Provides @Singleton fun provideHomeApi(retrofit: Retrofit): HomeApi { @@ -129,13 +170,18 @@ object NetworkModule { return retrofit.buildService() } - @Provides @Singleton fun provideSignupApi(retrofit: Retrofit): SignupApi { return retrofit.buildService() } + @Provides + @Singleton + fun providesKakaoService(@Named("kakao") retrofit: Retrofit):KakaoApi{ + return retrofit.buildService() + } + @Provides @Singleton fun provideMyPage2Api(retrofit: Retrofit): MyPage2Api{ diff --git a/app/src/main/java/com/umc/ttoklip/presentation/hometown/ReadCommunicationActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/hometown/ReadCommunicationActivity.kt index 2ce093e1..27d45edb 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/hometown/ReadCommunicationActivity.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/hometown/ReadCommunicationActivity.kt @@ -1,182 +1,182 @@ -package com.umc.ttoklip.presentation.hometown - -import android.content.Context -import android.graphics.Rect -import android.view.MotionEvent -import android.view.inputmethod.InputMethodManager -import android.widget.EditText -import androidx.activity.viewModels -import androidx.core.view.isVisible -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.lifecycleScope -import androidx.lifecycle.repeatOnLifecycle -import com.umc.ttoklip.R -import com.umc.ttoklip.data.model.honeytip.ImageUrl -import com.umc.ttoklip.data.model.town.CreateCommentRequest -import com.umc.ttoklip.data.model.town.ReportRequest -import com.umc.ttoklip.databinding.ActivityReadCommunicationBinding -import com.umc.ttoklip.presentation.base.BaseActivity -import com.umc.ttoklip.presentation.hometown.adapter.TownCommentAdapter -import com.umc.ttoklip.presentation.honeytip.adapter.OnReadImageClickListener -import com.umc.ttoklip.presentation.honeytip.adapter.ReadImageRVA -import com.umc.ttoklip.presentation.honeytip.dialog.DeleteDialogFragment -import com.umc.ttoklip.presentation.honeytip.dialog.ReportDialogFragment -import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.launch - -@AndroidEntryPoint -class ReadCommunicationActivity : - BaseActivity(R.layout.activity_read_communication), - OnReadImageClickListener { - private val commentRVA by lazy { - TownCommentAdapter({}, { commentId, reportRequest -> - if (reportRequest != null) { - viewModel.reportComment(commentId, reportRequest) - } else { - viewModel.deleteComment(commentId) - } - }) - } - private val imageAdapter: ReadImageRVA by lazy { - ReadImageRVA(this, this@ReadCommunicationActivity) - } - private val viewModel: ReadCommunicationVIewModel by viewModels() - private var postId = 0L - - override fun initView() { - binding.imageRv.adapter = imageAdapter - binding.commentRv.adapter = commentRVA - binding.reportBtn.bringToFront() - postId = intent.getLongExtra("postId", 0) - viewModel.savePostId(postId) - - binding.backBtn.setOnClickListener { - finish() - } - - binding.dotBtn.setOnClickListener { - binding.reportBtn.isVisible = true - } - - binding.reportBtn.setOnClickListener { - val reportDialog = ReportDialogFragment() - reportDialog.setDialogClickListener(object : ReportDialogFragment.DialogClickListener { - override fun onClick(type: String, content: String) { - viewModel.reportPost(ReportRequest(content = content, reportType = type)) - } - - }) - reportDialog.show(supportFragmentManager, reportDialog.tag) - } - - binding.deleteBtn.setOnClickListener { - val deleteDialog = DeleteDialogFragment() - deleteDialog.setDialogClickListener(object : DeleteDialogFragment.DialogClickListener { - override fun onClick() { - - } - }) - deleteDialog.show(supportFragmentManager, deleteDialog.tag) - } - - binding.cardView.setOnClickListener { - if (binding.commentEt.text.toString().isNotBlank()) { - viewModel.createComment(CreateCommentRequest(binding.commentEt.text.toString(), 0L)) - } - } - } - - override fun initObserver() { - with(lifecycleScope) { - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.postId.collect { - if (it != 0L) { - viewModel.readCommunication(it) - } - } - } - } - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.postContent.collect { response -> - with(binding) { - writerTv.text = response.writer - titleTv.text = response.title - contentT.text = response.content - imageAdapter.submitList(response.imageUrls.map { url -> - ImageUrl( - imageUrl = url.postImageUrl - ) - }) - if (response.likedByCurrentUser) { - likeImg.setImageDrawable(getDrawable(R.drawable.ic_heart_on_20)) - } else { - likeImg.setImageDrawable(getDrawable(R.drawable.ic_heart_off_20)) - } - if (response.scrapedByCurrentUser) { - bookmarkImg.setImageDrawable(getDrawable(R.drawable.ic_bookmark_on_20)) - } else { - bookmarkImg.setImageDrawable(getDrawable(R.drawable.ic_bookmark_off_20)) - } - commentRVA.submitList(response.commentResponse) - } - } - } - } - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.like.collect { - if (it) { - binding.likeImg.setImageDrawable(getDrawable(R.drawable.ic_heart_on_20)) - } else { - binding.likeImg.setImageDrawable(getDrawable(R.drawable.ic_heart_off_20)) - } - } - } - } - - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.scrap.collect { - if (it) { - binding.bookmarkImg.setImageDrawable(getDrawable(R.drawable.ic_bookmark_on_20)) - } else { - binding.bookmarkImg.setImageDrawable(getDrawable(R.drawable.ic_bookmark_off_20)) - } - } - } - } - - - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.scrap.collect { - - } - } - } - } - } - - override fun dispatchTouchEvent(event: MotionEvent?): Boolean { - if (event?.action == MotionEvent.ACTION_DOWN) { - val v = currentFocus - if (v is EditText) { - val outRect = Rect() - v.getGlobalVisibleRect(outRect) - if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) { - v.clearFocus() - val imm: InputMethodManager = - getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - imm.hideSoftInputFromWindow(v.getWindowToken(), 0) - } - } - } - return super.dispatchTouchEvent(event) - } - - override fun onClick(imageUrl: String) { - - } +package com.umc.ttoklip.presentation.hometown + +import android.content.Context +import android.graphics.Rect +import android.view.MotionEvent +import android.view.inputmethod.InputMethodManager +import android.widget.EditText +import androidx.activity.viewModels +import androidx.core.view.isVisible +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import com.umc.ttoklip.R +import com.umc.ttoklip.data.model.honeytip.ImageUrl +import com.umc.ttoklip.data.model.town.CreateCommentRequest +import com.umc.ttoklip.data.model.town.ReportRequest +import com.umc.ttoklip.databinding.ActivityReadCommunicationBinding +import com.umc.ttoklip.presentation.base.BaseActivity +import com.umc.ttoklip.presentation.hometown.adapter.TownCommentAdapter +import com.umc.ttoklip.presentation.honeytip.adapter.OnReadImageClickListener +import com.umc.ttoklip.presentation.honeytip.adapter.ReadImageRVA +import com.umc.ttoklip.presentation.honeytip.dialog.DeleteDialogFragment +import com.umc.ttoklip.presentation.honeytip.dialog.ReportDialogFragment +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch + +@AndroidEntryPoint +class ReadCommunicationActivity : + BaseActivity(R.layout.activity_read_communication), + OnReadImageClickListener { + private val commentRVA by lazy { + TownCommentAdapter({}, { commentId, reportRequest -> + if (reportRequest != null) { + viewModel.reportComment(commentId, reportRequest) + } else { + viewModel.deleteComment(commentId) + } + }) + } + private val imageAdapter: ReadImageRVA by lazy { + ReadImageRVA(this, this@ReadCommunicationActivity) + } + private val viewModel: ReadCommunicationVIewModel by viewModels() + private var postId = 0L + + override fun initView() { + binding.imageRv.adapter = imageAdapter + binding.commentRv.adapter = commentRVA + binding.reportBtn.bringToFront() + postId = intent.getLongExtra("postId", 0) + viewModel.savePostId(postId) + + binding.backBtn.setOnClickListener { + finish() + } + + binding.dotBtn.setOnClickListener { + binding.reportBtn.isVisible = true + } + + binding.reportBtn.setOnClickListener { + val reportDialog = ReportDialogFragment() + reportDialog.setDialogClickListener(object : ReportDialogFragment.DialogClickListener { + override fun onClick(type: String, content: String) { + viewModel.reportPost(ReportRequest(content = content, reportType = type)) + } + + }) + reportDialog.show(supportFragmentManager, reportDialog.tag) + } + + binding.deleteBtn.setOnClickListener { + val deleteDialog = DeleteDialogFragment() + deleteDialog.setDialogClickListener(object : DeleteDialogFragment.DialogClickListener { + override fun onClick() { + + } + }) + deleteDialog.show(supportFragmentManager, deleteDialog.tag) + } + + binding.cardView.setOnClickListener { + if (binding.commentEt.text.toString().isNotBlank()) { + viewModel.createComment(CreateCommentRequest(binding.commentEt.text.toString(), 0L)) + } + } + } + + override fun initObserver() { + with(lifecycleScope) { + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.postId.collect { + if (it != 0L) { + viewModel.readCommunication(it) + } + } + } + } + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.postContent.collect { response -> + with(binding) { + writerTv.text = response.writer + titleTv.text = response.title + contentT.text = response.content + imageAdapter.submitList(response.imageUrls.map { url -> + ImageUrl( + imageUrl = url.postImageUrl + ) + }) + if (response.likedByCurrentUser) { + likeImg.setImageDrawable(getDrawable(R.drawable.ic_heart_on_20)) + } else { + likeImg.setImageDrawable(getDrawable(R.drawable.ic_heart_off_20)) + } + if (response.scrapedByCurrentUser) { + bookmarkImg.setImageDrawable(getDrawable(R.drawable.ic_bookmark_on_20)) + } else { + bookmarkImg.setImageDrawable(getDrawable(R.drawable.ic_bookmark_off_20)) + } + commentRVA.submitList(response.commentResponse) + } + } + } + } + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.like.collect { + if (it) { + binding.likeImg.setImageDrawable(getDrawable(R.drawable.ic_heart_on_20)) + } else { + binding.likeImg.setImageDrawable(getDrawable(R.drawable.ic_heart_off_20)) + } + } + } + } + + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.scrap.collect { + if (it) { + binding.bookmarkImg.setImageDrawable(getDrawable(R.drawable.ic_bookmark_on_20)) + } else { + binding.bookmarkImg.setImageDrawable(getDrawable(R.drawable.ic_bookmark_off_20)) + } + } + } + } + + + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.scrap.collect { + + } + } + } + } + } + + override fun dispatchTouchEvent(event: MotionEvent?): Boolean { + if (event?.action == MotionEvent.ACTION_DOWN) { + val v = currentFocus + if (v is EditText) { + val outRect = Rect() + v.getGlobalVisibleRect(outRect) + if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) { + v.clearFocus() + val imm: InputMethodManager = + getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(v.getWindowToken(), 0) + } + } + } + return super.dispatchTouchEvent(event) + } + + override fun onClick(imageUrl: String) { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/hometown/ReadTogetherActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/hometown/ReadTogetherActivity.kt index 5dfeab32..d7b408f2 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/hometown/ReadTogetherActivity.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/hometown/ReadTogetherActivity.kt @@ -1,185 +1,185 @@ -package com.umc.ttoklip.presentation.hometown - -import android.content.Context -import android.graphics.Rect -import android.text.SpannableString -import android.text.style.ForegroundColorSpan -import android.view.MotionEvent -import android.view.inputmethod.InputMethodManager -import android.widget.EditText -import androidx.activity.viewModels -import androidx.core.view.isVisible -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.lifecycleScope -import androidx.lifecycle.repeatOnLifecycle -import com.umc.ttoklip.R -import com.umc.ttoklip.data.model.honeytip.ImageUrl -import com.umc.ttoklip.data.model.town.CreateCommentRequest -import com.umc.ttoklip.databinding.ActivityReadTogetherBinding -import com.umc.ttoklip.presentation.base.BaseActivity -import com.umc.ttoklip.presentation.hometown.adapter.TownCommentAdapter -import com.umc.ttoklip.presentation.honeytip.adapter.OnReadImageClickListener -import com.umc.ttoklip.presentation.honeytip.adapter.ReadImageRVA -import com.umc.ttoklip.presentation.honeytip.dialog.DeleteDialogFragment -import com.umc.ttoklip.presentation.honeytip.dialog.ReportDialogFragment -import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.launch -import java.util.Random - -@AndroidEntryPoint -class ReadTogetherActivity : - BaseActivity(R.layout.activity_read_together), - OnReadImageClickListener { - private val viewModel: ReadTogetherViewModel by viewModels() - private val imageAdapter: ReadImageRVA by lazy { - ReadImageRVA(this, this@ReadTogetherActivity) - } - private val commentRVA by lazy { - TownCommentAdapter({}, { commentId, reportRequest -> - if (reportRequest != null) { - viewModel.reportComment(commentId, reportRequest) - } else { - viewModel.deleteComment(commentId) - } - }) - } - private var postId = 0L - - override fun initView() { - binding.imageRv.adapter = imageAdapter - binding.commentRv.adapter = commentRVA - binding.vm = viewModel - postId = intent.getLongExtra("postId", 0) - viewModel.savePostId(postId) - binding.reportBtn.bringToFront() - - - binding.deleteBtn.setOnClickListener { - val deleteDialog = DeleteDialogFragment() - deleteDialog.setDialogClickListener(object : DeleteDialogFragment.DialogClickListener { - override fun onClick() { - - } - }) - deleteDialog.show(supportFragmentManager, deleteDialog.tag) - } - binding.backBtn.setOnClickListener { - finish() - } - - binding.dotBtn.setOnClickListener { - binding.reportBtn.isVisible = binding.reportBtn.isVisible.not() - } - - binding.reportBtn.setOnClickListener { - val reportDialog = ReportDialogFragment() - reportDialog.setDialogClickListener(object : ReportDialogFragment.DialogClickListener { - override fun onClick(type: String, content: String) { - - } - - }) - reportDialog.show(supportFragmentManager, reportDialog.tag) - } - val random = Random().nextInt(5) - val amount = getString(R.string.join_stat_format, random, random + 1) - val spannableAmount = SpannableString(amount) - spannableAmount.setSpan( - ForegroundColorSpan(getColor(R.color.blue)), - AMOUNT_STRING_START, - random.toString().length + AMOUNT_STRING_LENGTH, - SPANNABLE_FLAG_ZERO - ) - binding.currentJoinStatTv.text = spannableAmount - - binding.cardView.setOnClickListener { - if (binding.commentEt.text.toString().isNotBlank()) { - viewModel.createComment(CreateCommentRequest(binding.commentEt.text.toString(), 0L)) - } - } - - } - - override fun initObserver() { - with(lifecycleScope) { - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.joinState.collect { - if (it.not()) { - binding.joinBtn.background = - getDrawable(R.drawable.rectangle_corner_10_strok_1_gray40) -// binding.joinBtn.text = getString(R.string.cancel_join) - } else { - binding.joinBtn.background = - getDrawable(R.drawable.yellow_btn_background) -// binding.joinBtn.text = getString(R.string.join_together) - } - } - } - } - - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.postId.collect { - viewModel.readTogether(it) - } - } - } - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.postContent.collect { response -> - with(binding) { - writerTv.text = response.writer - titleT.text = response.title - contentT.text = response.content - imageAdapter.submitList(response.imageUrls.map { url -> - ImageUrl( - imageUrl = url.postImageUrl - ) - }) - commentRVA.submitList(response.commentResponse) - - } - } - } - } - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - - } - } - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - - } - } - } - } - - override fun dispatchTouchEvent(event: MotionEvent?): Boolean { - if (event?.action == MotionEvent.ACTION_DOWN) { - val v = currentFocus - if (v is EditText) { - val outRect = Rect() - v.getGlobalVisibleRect(outRect) - if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) { - v.clearFocus() - val imm: InputMethodManager = - getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - imm.hideSoftInputFromWindow(v.getWindowToken(), 0) - } - } - } - return super.dispatchTouchEvent(event) - } - - companion object { - private const val AMOUNT_STRING_START = 0 - private const val SPANNABLE_FLAG_ZERO = 0 - private const val AMOUNT_STRING_LENGTH = 1 - } - - override fun onClick(imageUrl: String) { - TODO("Not yet implemented") - } +package com.umc.ttoklip.presentation.hometown + +import android.content.Context +import android.graphics.Rect +import android.text.SpannableString +import android.text.style.ForegroundColorSpan +import android.view.MotionEvent +import android.view.inputmethod.InputMethodManager +import android.widget.EditText +import androidx.activity.viewModels +import androidx.core.view.isVisible +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import com.umc.ttoklip.R +import com.umc.ttoklip.data.model.honeytip.ImageUrl +import com.umc.ttoklip.data.model.town.CreateCommentRequest +import com.umc.ttoklip.databinding.ActivityReadTogetherBinding +import com.umc.ttoklip.presentation.base.BaseActivity +import com.umc.ttoklip.presentation.hometown.adapter.TownCommentAdapter +import com.umc.ttoklip.presentation.honeytip.adapter.OnReadImageClickListener +import com.umc.ttoklip.presentation.honeytip.adapter.ReadImageRVA +import com.umc.ttoklip.presentation.honeytip.dialog.DeleteDialogFragment +import com.umc.ttoklip.presentation.honeytip.dialog.ReportDialogFragment +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch +import java.util.Random + +@AndroidEntryPoint +class ReadTogetherActivity : + BaseActivity(R.layout.activity_read_together), + OnReadImageClickListener { + private val viewModel: ReadTogetherViewModel by viewModels() + private val imageAdapter: ReadImageRVA by lazy { + ReadImageRVA(this, this@ReadTogetherActivity) + } + private val commentRVA by lazy { + TownCommentAdapter({}, { commentId, reportRequest -> + if (reportRequest != null) { + viewModel.reportComment(commentId, reportRequest) + } else { + viewModel.deleteComment(commentId) + } + }) + } + private var postId = 0L + + override fun initView() { + binding.imageRv.adapter = imageAdapter + binding.commentRv.adapter = commentRVA + binding.vm = viewModel + postId = intent.getLongExtra("postId", 0) + viewModel.savePostId(postId) + binding.reportBtn.bringToFront() + + + binding.deleteBtn.setOnClickListener { + val deleteDialog = DeleteDialogFragment() + deleteDialog.setDialogClickListener(object : DeleteDialogFragment.DialogClickListener { + override fun onClick() { + + } + }) + deleteDialog.show(supportFragmentManager, deleteDialog.tag) + } + binding.backBtn.setOnClickListener { + finish() + } + + binding.dotBtn.setOnClickListener { + binding.reportBtn.isVisible = binding.reportBtn.isVisible.not() + } + + binding.reportBtn.setOnClickListener { + val reportDialog = ReportDialogFragment() + reportDialog.setDialogClickListener(object : ReportDialogFragment.DialogClickListener { + override fun onClick(type: String, content: String) { + + } + + }) + reportDialog.show(supportFragmentManager, reportDialog.tag) + } + val random = Random().nextInt(5) + val amount = getString(R.string.join_stat_format, random, random + 1) + val spannableAmount = SpannableString(amount) + spannableAmount.setSpan( + ForegroundColorSpan(getColor(R.color.blue)), + AMOUNT_STRING_START, + random.toString().length + AMOUNT_STRING_LENGTH, + SPANNABLE_FLAG_ZERO + ) + binding.currentJoinStatTv.text = spannableAmount + + binding.cardView.setOnClickListener { + if (binding.commentEt.text.toString().isNotBlank()) { + viewModel.createComment(CreateCommentRequest(binding.commentEt.text.toString(), 0L)) + } + } + + } + + override fun initObserver() { + with(lifecycleScope) { + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.joinState.collect { + if (it.not()) { + binding.joinBtn.background = + getDrawable(R.drawable.rectangle_corner_10_strok_1_gray40) +// binding.joinBtn.text = getString(R.string.cancel_join) + } else { + binding.joinBtn.background = + getDrawable(R.drawable.yellow_btn_background) +// binding.joinBtn.text = getString(R.string.join_together) + } + } + } + } + + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.postId.collect { + viewModel.readTogether(it) + } + } + } + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.postContent.collect { response -> + with(binding) { + writerTv.text = response.writer + titleT.text = response.title + contentT.text = response.content + imageAdapter.submitList(response.imageUrls.map { url -> + ImageUrl( + imageUrl = url.postImageUrl + ) + }) + commentRVA.submitList(response.commentResponse) + + } + } + } + } + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + + } + } + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + + } + } + } + } + + override fun dispatchTouchEvent(event: MotionEvent?): Boolean { + if (event?.action == MotionEvent.ACTION_DOWN) { + val v = currentFocus + if (v is EditText) { + val outRect = Rect() + v.getGlobalVisibleRect(outRect) + if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) { + v.clearFocus() + val imm: InputMethodManager = + getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(v.getWindowToken(), 0) + } + } + } + return super.dispatchTouchEvent(event) + } + + companion object { + private const val AMOUNT_STRING_START = 0 + private const val SPANNABLE_FLAG_ZERO = 0 + private const val AMOUNT_STRING_LENGTH = 1 + } + + override fun onClick(imageUrl: String) { + TODO("Not yet implemented") + } } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/hometown/WriteCommunicationActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/hometown/WriteCommunicationActivity.kt index 90cb3606..25c84e13 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/hometown/WriteCommunicationActivity.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/hometown/WriteCommunicationActivity.kt @@ -1,143 +1,143 @@ -package com.umc.ttoklip.presentation.hometown - -import android.content.Context -import android.graphics.Rect -import android.net.Uri -import android.util.Log -import android.view.MotionEvent -import android.view.View -import android.view.inputmethod.InputMethodManager -import android.widget.EditText -import androidx.activity.result.PickVisualMediaRequest -import androidx.activity.result.contract.ActivityResultContracts -import androidx.activity.viewModels -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.lifecycleScope -import androidx.lifecycle.repeatOnLifecycle -import com.umc.ttoklip.R -import com.umc.ttoklip.databinding.ActivityWriteCommunicationBinding -import com.umc.ttoklip.presentation.base.BaseActivity -import com.umc.ttoklip.presentation.honeytip.adapter.Image -import com.umc.ttoklip.presentation.honeytip.adapter.ImageRVA -import com.umc.ttoklip.presentation.honeytip.dialog.ImageDialogFragment -import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.launch - -@AndroidEntryPoint -class WriteCommunicationActivity : - BaseActivity(R.layout.activity_write_communication) { - private val imageAdapter by lazy { - ImageRVA(null) - } - private val viewModel: WriteCommunicationViewModel by viewModels() - private val pickMultipleMedia = registerForActivityResult( - ActivityResultContracts.PickMultipleVisualMedia( - 100 - ) - ) { uris -> - if (uris.isNotEmpty()) { - updateImages(uris) - } else { - Log.d("PhotoPicker", "No media selected") - } - } - - override fun initView() { - binding.vm = viewModel as WriteCommunicationViewModelImpl - initImageRVA() - addImage() - - binding.backBtn.setOnClickListener { - finish() - } - } - - override fun initObserver() { - with(lifecycleScope) { - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.doneButtonActivated.collect { - binding.writeDoneBtn.isEnabled = it - } - } - } - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.title.collect { - viewModel.checkDone() - } - } - } - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.content.collect { - viewModel.checkDone() - } - } - } - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.content.collect { - viewModel.checkDone() - } - } - } - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.images.collect { - Log.d("uri image", it.toString()) - imageAdapter.submitList(it.toList()) - } - } - } - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.closePage.collect { - Log.d("close page", it.toString()) - if (it) finish() - } - } - } - } - } - - private fun initImageRVA() { - binding.imageRv.adapter = imageAdapter - } - - private fun addImage() { - binding.addImageBtn.setOnClickListener { - val imageDialog = ImageDialogFragment() - imageDialog.setDialogClickListener(object : ImageDialogFragment.DialogClickListener { - override fun onClick() { - binding.imageRv.visibility = View.VISIBLE - pickMultipleMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) - } - }) - imageDialog.show(supportFragmentManager, imageDialog.tag) - } - } - - private fun updateImages(uriList: List) { - Log.d("uri", uriList.toString()) - val images = uriList.map { Image(it) } - viewModel.addImages(images) - } - - override fun dispatchTouchEvent(event: MotionEvent?): Boolean { - if (event?.action == MotionEvent.ACTION_DOWN) { - val v = currentFocus - if (v is EditText) { - val outRect = Rect() - v.getGlobalVisibleRect(outRect) - if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) { - v.clearFocus() - val imm: InputMethodManager = - getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - imm.hideSoftInputFromWindow(v.getWindowToken(), 0) - } - } - } - return super.dispatchTouchEvent(event) - } +package com.umc.ttoklip.presentation.hometown + +import android.content.Context +import android.graphics.Rect +import android.net.Uri +import android.util.Log +import android.view.MotionEvent +import android.view.View +import android.view.inputmethod.InputMethodManager +import android.widget.EditText +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts +import androidx.activity.viewModels +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import com.umc.ttoklip.R +import com.umc.ttoklip.databinding.ActivityWriteCommunicationBinding +import com.umc.ttoklip.presentation.base.BaseActivity +import com.umc.ttoklip.presentation.honeytip.adapter.Image +import com.umc.ttoklip.presentation.honeytip.adapter.ImageRVA +import com.umc.ttoklip.presentation.honeytip.dialog.ImageDialogFragment +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch + +@AndroidEntryPoint +class WriteCommunicationActivity : + BaseActivity(R.layout.activity_write_communication) { + private val imageAdapter by lazy { + ImageRVA(null) + } + private val viewModel: WriteCommunicationViewModel by viewModels() + private val pickMultipleMedia = registerForActivityResult( + ActivityResultContracts.PickMultipleVisualMedia( + 100 + ) + ) { uris -> + if (uris.isNotEmpty()) { + updateImages(uris) + } else { + Log.d("PhotoPicker", "No media selected") + } + } + + override fun initView() { + binding.vm = viewModel as WriteCommunicationViewModelImpl + initImageRVA() + addImage() + + binding.backBtn.setOnClickListener { + finish() + } + } + + override fun initObserver() { + with(lifecycleScope) { + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.doneButtonActivated.collect { + binding.writeDoneBtn.isEnabled = it + } + } + } + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.title.collect { + viewModel.checkDone() + } + } + } + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.content.collect { + viewModel.checkDone() + } + } + } + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.content.collect { + viewModel.checkDone() + } + } + } + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.images.collect { + Log.d("uri image", it.toString()) + imageAdapter.submitList(it.toList()) + } + } + } + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.closePage.collect { + Log.d("close page", it.toString()) + if (it) finish() + } + } + } + } + } + + private fun initImageRVA() { + binding.imageRv.adapter = imageAdapter + } + + private fun addImage() { + binding.addImageBtn.setOnClickListener { + val imageDialog = ImageDialogFragment() + imageDialog.setDialogClickListener(object : ImageDialogFragment.DialogClickListener { + override fun onClick() { + binding.imageRv.visibility = View.VISIBLE + pickMultipleMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) + } + }) + imageDialog.show(supportFragmentManager, imageDialog.tag) + } + } + + private fun updateImages(uriList: List) { + Log.d("uri", uriList.toString()) + val images = uriList.map { Image(it) } + viewModel.addImages(images) + } + + override fun dispatchTouchEvent(event: MotionEvent?): Boolean { + if (event?.action == MotionEvent.ACTION_DOWN) { + val v = currentFocus + if (v is EditText) { + val outRect = Rect() + v.getGlobalVisibleRect(outRect) + if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) { + v.clearFocus() + val imm: InputMethodManager = + getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(v.getWindowToken(), 0) + } + } + } + return super.dispatchTouchEvent(event) + } } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/hometown/WriteTogetherActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/hometown/WriteTogetherActivity.kt index 40efb883..3fd70ae8 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/hometown/WriteTogetherActivity.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/hometown/WriteTogetherActivity.kt @@ -1,301 +1,301 @@ -package com.umc.ttoklip.presentation.hometown - -import android.content.Context -import android.content.Intent -import android.graphics.PorterDuff -import android.graphics.PorterDuffColorFilter -import android.graphics.Rect -import android.icu.text.DecimalFormat -import android.net.Uri -import android.text.Editable -import android.text.TextWatcher -import android.util.Log -import android.view.MotionEvent -import android.view.View -import android.view.inputmethod.EditorInfo -import android.view.inputmethod.InputMethodManager -import android.widget.EditText -import androidx.activity.result.ActivityResultLauncher -import androidx.activity.result.PickVisualMediaRequest -import androidx.activity.result.contract.ActivityResultContracts -import androidx.activity.viewModels -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.lifecycleScope -import androidx.lifecycle.repeatOnLifecycle -import com.umc.ttoklip.R -import com.umc.ttoklip.databinding.ActivityWriteTogetherBinding -import com.umc.ttoklip.presentation.base.BaseActivity -import com.umc.ttoklip.presentation.hometown.dialog.InputMaxMemberDialogFragment -import com.umc.ttoklip.presentation.hometown.dialog.TogetherDialog -import com.umc.ttoklip.presentation.honeytip.adapter.Image -import com.umc.ttoklip.presentation.honeytip.adapter.ImageRVA -import com.umc.ttoklip.presentation.honeytip.dialog.ImageDialogFragment -import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.launch - -@AndroidEntryPoint -class WriteTogetherActivity : - BaseActivity(R.layout.activity_write_together) { - private val activityResultLauncher: ActivityResultLauncher = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - val addressIntent = it.data - addressIntent?.let { aIntent -> - val address = aIntent.getStringExtra("address") - val addressDetail = aIntent.getStringExtra("addressDetail") - binding.tradingPlaceTv.setTextColor(getColor(R.color.black)) - binding.tradingPlaceTv.compoundDrawables.forEach { drawable -> - if (drawable != null) { - drawable.colorFilter = - PorterDuffColorFilter(getColor(R.color.black), PorterDuff.Mode.SRC_IN) - } - } - binding.tradingPlaceTv.text = if (!addressDetail.isNullOrBlank()) { - StringBuilder().append(address).append(" (").append(addressDetail).append(")") - .toString() - } else { - StringBuilder().append(address).toString() - } - } - } - private val imageAdapter by lazy { - ImageRVA(null) - } - - private val pickMultipleMedia = registerForActivityResult( - ActivityResultContracts.PickMultipleVisualMedia( - 100 - ) - ) { uris -> - if (uris.isNotEmpty()) { - updateImages(uris) - } else { - Log.d("PhotoPicker", "No media selected") - } - } - private val viewModel: WriteTogetherViewModel by viewModels() - override fun initView() { - binding.vm = viewModel as WriteTogetherViewModelImpl - initImageRVA() - addLink() - addImage() - binding.backBtn.setOnClickListener { - finish() - } - - binding.totalPriceTv.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = - Unit - - override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { - s?.let { - if (it.isBlank()) { - viewModel.setTotalPrice(0) - viewModel.checkDone() - } - } - } - - override fun afterTextChanged(s: Editable?) = Unit - - }) - binding.totalPriceTv.setOnEditorActionListener { v, actionId, event -> - var current = binding.totalPriceTv.text.toString() - if (current.isBlank()) { - viewModel.setTotalPrice(0) - viewModel.checkDone() - } else { - if (current.contains(",")) { - current = current.replace(",", "") - } - viewModel.setTotalPrice(current.toLong()) - if (actionId == EditorInfo.IME_ACTION_NEXT) { - Log.d("price", current) - if (current.length > 3) { - val currentAmount = AMOUNT_FORMAT.format(current.toLong()) - binding.totalPriceTv.setText(currentAmount) -// binding.totalPriceTv.compoundDrawables.forEach { drawable -> -// if (drawable != null) { -// drawable.colorFilter = -// PorterDuffColorFilter( -// getColor(R.color.black), -// PorterDuff.Mode.SRC_IN -// ) -// } -// } - } - } - } - - false - } - - binding.maxMemberTv.setOnClickListener { - val bottomSheet = InputMaxMemberDialogFragment { member -> - viewModel.setTotalMember(member.toLong()) - binding.maxMemberTv.text = getString(R.string.max_member_format, member) - binding.maxMemberTv.compoundDrawables.forEach { drawable -> - if (drawable != null) { - drawable.colorFilter = - PorterDuffColorFilter( - getColor(R.color.black), - PorterDuff.Mode.SRC_IN - ) - } - } - binding.maxMemberTv.hint = "" - } - bottomSheet.show(supportFragmentManager, bottomSheet.tag) - } - - binding.tradingPlaceTv.setOnClickListener { - val intent = Intent(this, TradeLocationActivity::class.java) - activityResultLauncher.launch(intent) - } - } - - override fun initObserver() { - with(lifecycleScope) { - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.doneButtonActivated.collect { - binding.writeDoneBtn.isEnabled = it - } - } - } - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.title.collect { - viewModel.checkDone() - } - } - } - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.content.collect { - viewModel.checkDone() - } - } - } - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.totalPrice.collect { - viewModel.checkDone() - } - } - } - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.totalMember.collect { - viewModel.checkDone() - } - } - } - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.dealPlace.collect { - viewModel.checkDone() - } - } - } - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.openLink.collect { - viewModel.checkDone() - } - } - } - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.content.collect { - viewModel.checkDone() - } - } - } - - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.images.collect { - Log.d("uri image", it.toString()) - imageAdapter.submitList(it.toList()) - } - } - } - - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.doneWriteTogether.collect { - if (it) { - val together = TogetherDialog() - together.setDialogClickListener(object : - TogetherDialog.TogetherDialogClickListener { - override fun onClick() { - viewModel.writeTogether() - } - }) - together.show(supportFragmentManager, together.tag) - } - } - } - } - - launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.closePage.collect { - if (it) finish() - } - } - } - } - } - - private fun addLink() { - binding.addLinkBtn.setOnClickListener { - binding.addLinkBtn.visibility = View.GONE - binding.inputUrlBtn.visibility = View.VISIBLE - } - } - - private fun initImageRVA() { - binding.imageRv.adapter = imageAdapter - } - - private fun addImage() { - binding.addImageBtn.setOnClickListener { - val imageDialog = ImageDialogFragment() - imageDialog.setDialogClickListener(object : ImageDialogFragment.DialogClickListener { - override fun onClick() { - binding.imageRv.visibility = View.VISIBLE - pickMultipleMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) - } - }) - imageDialog.show(supportFragmentManager, imageDialog.tag) - } - } - - private fun updateImages(uriList: List) { - Log.d("uri", uriList.toString()) - val images = uriList.map { Image(it) } - viewModel.addImages(images) - } - - override fun dispatchTouchEvent(event: MotionEvent?): Boolean { - if (event?.action == MotionEvent.ACTION_DOWN) { - val v = currentFocus - if (v is EditText) { - val outRect = Rect() - v.getGlobalVisibleRect(outRect) - if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) { - v.clearFocus() - val imm: InputMethodManager = - getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - imm.hideSoftInputFromWindow(v.getWindowToken(), 0) - } - } - } - return super.dispatchTouchEvent(event) - } - - companion object { - private val AMOUNT_FORMAT = DecimalFormat("#,###") - } +package com.umc.ttoklip.presentation.hometown + +import android.content.Context +import android.content.Intent +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter +import android.graphics.Rect +import android.icu.text.DecimalFormat +import android.net.Uri +import android.text.Editable +import android.text.TextWatcher +import android.util.Log +import android.view.MotionEvent +import android.view.View +import android.view.inputmethod.EditorInfo +import android.view.inputmethod.InputMethodManager +import android.widget.EditText +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts +import androidx.activity.viewModels +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import com.umc.ttoklip.R +import com.umc.ttoklip.databinding.ActivityWriteTogetherBinding +import com.umc.ttoklip.presentation.base.BaseActivity +import com.umc.ttoklip.presentation.hometown.dialog.InputMaxMemberDialogFragment +import com.umc.ttoklip.presentation.hometown.dialog.TogetherDialog +import com.umc.ttoklip.presentation.honeytip.adapter.Image +import com.umc.ttoklip.presentation.honeytip.adapter.ImageRVA +import com.umc.ttoklip.presentation.honeytip.dialog.ImageDialogFragment +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch + +@AndroidEntryPoint +class WriteTogetherActivity : + BaseActivity(R.layout.activity_write_together) { + private val activityResultLauncher: ActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + val addressIntent = it.data + addressIntent?.let { aIntent -> + val address = aIntent.getStringExtra("address") + val addressDetail = aIntent.getStringExtra("addressDetail") + binding.tradingPlaceTv.setTextColor(getColor(R.color.black)) + binding.tradingPlaceTv.compoundDrawables.forEach { drawable -> + if (drawable != null) { + drawable.colorFilter = + PorterDuffColorFilter(getColor(R.color.black), PorterDuff.Mode.SRC_IN) + } + } + binding.tradingPlaceTv.text = if (!addressDetail.isNullOrBlank()) { + StringBuilder().append(address).append(" (").append(addressDetail).append(")") + .toString() + } else { + StringBuilder().append(address).toString() + } + } + } + private val imageAdapter by lazy { + ImageRVA(null) + } + + private val pickMultipleMedia = registerForActivityResult( + ActivityResultContracts.PickMultipleVisualMedia( + 100 + ) + ) { uris -> + if (uris.isNotEmpty()) { + updateImages(uris) + } else { + Log.d("PhotoPicker", "No media selected") + } + } + private val viewModel: WriteTogetherViewModel by viewModels() + override fun initView() { + binding.vm = viewModel as WriteTogetherViewModelImpl + initImageRVA() + addLink() + addImage() + binding.backBtn.setOnClickListener { + finish() + } + + binding.totalPriceTv.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = + Unit + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + s?.let { + if (it.isBlank()) { + viewModel.setTotalPrice(0) + viewModel.checkDone() + } + } + } + + override fun afterTextChanged(s: Editable?) = Unit + + }) + binding.totalPriceTv.setOnEditorActionListener { v, actionId, event -> + var current = binding.totalPriceTv.text.toString() + if (current.isBlank()) { + viewModel.setTotalPrice(0) + viewModel.checkDone() + } else { + if (current.contains(",")) { + current = current.replace(",", "") + } + viewModel.setTotalPrice(current.toLong()) + if (actionId == EditorInfo.IME_ACTION_NEXT) { + Log.d("price", current) + if (current.length > 3) { + val currentAmount = AMOUNT_FORMAT.format(current.toLong()) + binding.totalPriceTv.setText(currentAmount) +// binding.totalPriceTv.compoundDrawables.forEach { drawable -> +// if (drawable != null) { +// drawable.colorFilter = +// PorterDuffColorFilter( +// getColor(R.color.black), +// PorterDuff.Mode.SRC_IN +// ) +// } +// } + } + } + } + + false + } + + binding.maxMemberTv.setOnClickListener { + val bottomSheet = InputMaxMemberDialogFragment { member -> + viewModel.setTotalMember(member.toLong()) + binding.maxMemberTv.text = getString(R.string.max_member_format, member) + binding.maxMemberTv.compoundDrawables.forEach { drawable -> + if (drawable != null) { + drawable.colorFilter = + PorterDuffColorFilter( + getColor(R.color.black), + PorterDuff.Mode.SRC_IN + ) + } + } + binding.maxMemberTv.hint = "" + } + bottomSheet.show(supportFragmentManager, bottomSheet.tag) + } + + binding.tradingPlaceTv.setOnClickListener { + val intent = Intent(this, TradeLocationActivity::class.java) + activityResultLauncher.launch(intent) + } + } + + override fun initObserver() { + with(lifecycleScope) { + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.doneButtonActivated.collect { + binding.writeDoneBtn.isEnabled = it + } + } + } + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.title.collect { + viewModel.checkDone() + } + } + } + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.content.collect { + viewModel.checkDone() + } + } + } + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.totalPrice.collect { + viewModel.checkDone() + } + } + } + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.totalMember.collect { + viewModel.checkDone() + } + } + } + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.dealPlace.collect { + viewModel.checkDone() + } + } + } + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.openLink.collect { + viewModel.checkDone() + } + } + } + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.content.collect { + viewModel.checkDone() + } + } + } + + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.images.collect { + Log.d("uri image", it.toString()) + imageAdapter.submitList(it.toList()) + } + } + } + + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.doneWriteTogether.collect { + if (it) { + val together = TogetherDialog() + together.setDialogClickListener(object : + TogetherDialog.TogetherDialogClickListener { + override fun onClick() { + viewModel.writeTogether() + } + }) + together.show(supportFragmentManager, together.tag) + } + } + } + } + + launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.closePage.collect { + if (it) finish() + } + } + } + } + } + + private fun addLink() { + binding.addLinkBtn.setOnClickListener { + binding.addLinkBtn.visibility = View.GONE + binding.inputUrlBtn.visibility = View.VISIBLE + } + } + + private fun initImageRVA() { + binding.imageRv.adapter = imageAdapter + } + + private fun addImage() { + binding.addImageBtn.setOnClickListener { + val imageDialog = ImageDialogFragment() + imageDialog.setDialogClickListener(object : ImageDialogFragment.DialogClickListener { + override fun onClick() { + binding.imageRv.visibility = View.VISIBLE + pickMultipleMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) + } + }) + imageDialog.show(supportFragmentManager, imageDialog.tag) + } + } + + private fun updateImages(uriList: List) { + Log.d("uri", uriList.toString()) + val images = uriList.map { Image(it) } + viewModel.addImages(images) + } + + override fun dispatchTouchEvent(event: MotionEvent?): Boolean { + if (event?.action == MotionEvent.ACTION_DOWN) { + val v = currentFocus + if (v is EditText) { + val outRect = Rect() + v.getGlobalVisibleRect(outRect) + if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) { + v.clearFocus() + val imm: InputMethodManager = + getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(v.getWindowToken(), 0) + } + } + } + return super.dispatchTouchEvent(event) + } + + companion object { + private val AMOUNT_FORMAT = DecimalFormat("#,###") + } } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/QuestionCommentRVA.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/QuestionCommentRVA.kt index 5f2d6eed..7bc8b83b 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/QuestionCommentRVA.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/QuestionCommentRVA.kt @@ -1,120 +1,120 @@ -package com.umc.ttoklip.presentation.honeytip.adapter - -import android.util.Log -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.viewmodel.viewModelFactory -import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.ListAdapter -import androidx.recyclerview.widget.RecyclerView -import com.umc.ttoklip.TtoklipApplication -import com.umc.ttoklip.data.model.news.comment.NewsCommentResponse -import com.umc.ttoklip.databinding.ItemCommentBinding -import com.umc.ttoklip.databinding.ItemQuestionCommentBinding -import com.umc.ttoklip.databinding.ItemReplyBinding -import com.umc.ttoklip.presentation.honeytip.read.ReadHoneyTipViewModel - -class QuestionCommentRVA (val replyComment: (Int) -> Unit, val ReportOrDelete: (Int, Boolean) -> Unit, val like: (Int, Boolean) -> Unit) : - ListAdapter(differ) { - - inner class ItemViewHolder( - private val binding: ItemQuestionCommentBinding - ) : RecyclerView.ViewHolder(binding.root) { - - fun bind(data: NewsCommentResponse) { - binding.item = data - binding.replyBtn.setOnClickListener { - replyComment(data.commentId) - } - binding.deleteBtn.setOnClickListener { - ReportOrDelete( - data.commentId, - data.writer == TtoklipApplication.prefs.getString("nickname", "") - ) - } - binding.likeBtn.setOnClickListener { - Log.d("commentId", data.commentId.toString()) - like(data.commentId, data.writer == TtoklipApplication.prefs.getString("nickname", "")) - } - } - } - - inner class ItemReplyViewHolder( - private val binding: ItemReplyBinding - ) : RecyclerView.ViewHolder(binding.root) { - - fun bind(data: NewsCommentResponse) { - binding.item = data - - binding.deleteBtn.setOnClickListener { - Log.d("닉네임","${data.writer == TtoklipApplication.prefs.getString("nickname", "")}") - ReportOrDelete( - data.commentId, - data.writer == TtoklipApplication.prefs.getString("nickname", "") - ) - } - } - } - - override fun onCreateViewHolder( - parent: ViewGroup, - viewType: Int - ): RecyclerView.ViewHolder { - return when (viewType) { - 0 -> { - ItemViewHolder( - ItemQuestionCommentBinding.inflate( - LayoutInflater.from(parent.context), - parent, - false - ) - ) - } - - else -> { - ItemReplyViewHolder( - ItemReplyBinding.inflate( - LayoutInflater.from(parent.context), - parent, - false - ) - ) - } - } - } - - override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - when (getItemViewType(position)) { - 0 -> { - (holder as ItemViewHolder).bind(currentList[position]) - } - - else -> { - (holder as ItemReplyViewHolder).bind(currentList[position]) - } - } - } - - override fun getItemViewType(position: Int): Int { - return currentList[position].parentId ?: 0 - } - - companion object { - val differ = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame( - oldItem: NewsCommentResponse, - newItem: NewsCommentResponse - ): Boolean { - return oldItem.commentId == newItem.commentId - } - - override fun areContentsTheSame( - oldItem: NewsCommentResponse, - newItem: NewsCommentResponse - ): Boolean { - return oldItem == newItem - } - } - } +package com.umc.ttoklip.presentation.honeytip.adapter + +import android.util.Log +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewmodel.viewModelFactory +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.umc.ttoklip.TtoklipApplication +import com.umc.ttoklip.data.model.news.comment.NewsCommentResponse +import com.umc.ttoklip.databinding.ItemCommentBinding +import com.umc.ttoklip.databinding.ItemQuestionCommentBinding +import com.umc.ttoklip.databinding.ItemReplyBinding +import com.umc.ttoklip.presentation.honeytip.read.ReadHoneyTipViewModel + +class QuestionCommentRVA (val replyComment: (Int) -> Unit, val ReportOrDelete: (Int, Boolean) -> Unit, val like: (Int, Boolean) -> Unit) : + ListAdapter(differ) { + + inner class ItemViewHolder( + private val binding: ItemQuestionCommentBinding + ) : RecyclerView.ViewHolder(binding.root) { + + fun bind(data: NewsCommentResponse) { + binding.item = data + binding.replyBtn.setOnClickListener { + replyComment(data.commentId) + } + binding.deleteBtn.setOnClickListener { + ReportOrDelete( + data.commentId, + data.writer == TtoklipApplication.prefs.getString("nickname", "") + ) + } + binding.likeBtn.setOnClickListener { + Log.d("commentId", data.commentId.toString()) + like(data.commentId, data.writer == TtoklipApplication.prefs.getString("nickname", "")) + } + } + } + + inner class ItemReplyViewHolder( + private val binding: ItemReplyBinding + ) : RecyclerView.ViewHolder(binding.root) { + + fun bind(data: NewsCommentResponse) { + binding.item = data + + binding.deleteBtn.setOnClickListener { + Log.d("닉네임","${data.writer == TtoklipApplication.prefs.getString("nickname", "")}") + ReportOrDelete( + data.commentId, + data.writer == TtoklipApplication.prefs.getString("nickname", "") + ) + } + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): RecyclerView.ViewHolder { + return when (viewType) { + 0 -> { + ItemViewHolder( + ItemQuestionCommentBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + else -> { + ItemReplyViewHolder( + ItemReplyBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (getItemViewType(position)) { + 0 -> { + (holder as ItemViewHolder).bind(currentList[position]) + } + + else -> { + (holder as ItemReplyViewHolder).bind(currentList[position]) + } + } + } + + override fun getItemViewType(position: Int): Int { + return currentList[position].parentId ?: 0 + } + + companion object { + val differ = object : DiffUtil.ItemCallback() { + override fun areItemsTheSame( + oldItem: NewsCommentResponse, + newItem: NewsCommentResponse + ): Boolean { + return oldItem.commentId == newItem.commentId + } + + override fun areContentsTheSame( + oldItem: NewsCommentResponse, + newItem: NewsCommentResponse + ): Boolean { + return oldItem == newItem + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/QuestionListRVA.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/QuestionListRVA.kt index 35e29fc2..9755997b 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/QuestionListRVA.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/QuestionListRVA.kt @@ -1,77 +1,77 @@ -package com.umc.ttoklip.presentation.honeytip.adapter - -import android.util.Log -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.ListAdapter -import androidx.recyclerview.widget.RecyclerView -import com.umc.ttoklip.data.model.honeytip.HoneyTipMain -import com.umc.ttoklip.databinding.ItemQuestionListBinding -import java.text.SimpleDateFormat -import java.util.Date - -class QuestionListRVA(private var listener: OnQuestionClickListener) : - ListAdapter(object : - DiffUtil.ItemCallback() { - override fun areItemsTheSame( - oldItem: HoneyTipMain, - newItem: HoneyTipMain - ): Boolean { - return oldItem === newItem - } - - override fun areContentsTheSame( - oldItem: HoneyTipMain, - newItem: HoneyTipMain - ): Boolean { - return oldItem == newItem - } - - }) { - private fun calculateDate(writtenDate: String): String { - val currentDate = Date(System.currentTimeMillis()) - - // SimpleDateFormat을 사용하여 문자열을 Date로 변환 - val sdf = SimpleDateFormat("yyyy.MM.dd hh:mm") - - val date = sdf.parse("20$writtenDate") - - // 두 날짜의 차이 계산 - val difference = currentDate.time - date.time - val daysDifference = difference / (24 * 60 * 60 * 1000) - Log.d("날짜 계산", "$currentDate 와 $writtenDate 사이의 날짜 차이: $daysDifference 일") - return if (daysDifference == 0.toLong()) "오늘" else "${daysDifference}일전" - } - - inner class QuestionListViewHolder(private val binding: ItemQuestionListBinding) : - RecyclerView.ViewHolder(binding.root) { - fun bind(honeyTip: HoneyTipMain) { - binding.titleTv.text = honeyTip.title - binding.writerTv.text = honeyTip.writer - binding.dateTv.text = calculateDate(honeyTip.writtenTime) - binding.bodyTv.text = honeyTip.content - binding.commentCountTv.text = honeyTip.commentCount.toString() - - binding.root.setOnClickListener { - listener.onClick(honeyTip) - } - } - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QuestionListViewHolder { - return QuestionListViewHolder( - ItemQuestionListBinding.inflate( - LayoutInflater.from(parent.context), parent, false - ) - ) - } - - override fun onBindViewHolder(holder: QuestionListViewHolder, position: Int) { - holder.bind(currentList[position]) - } -} - -interface OnQuestionClickListener { - fun onClick(honeyTip: HoneyTipMain) +package com.umc.ttoklip.presentation.honeytip.adapter + +import android.util.Log +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.umc.ttoklip.data.model.honeytip.HoneyTipMain +import com.umc.ttoklip.databinding.ItemQuestionListBinding +import java.text.SimpleDateFormat +import java.util.Date + +class QuestionListRVA(private var listener: OnQuestionClickListener) : + ListAdapter(object : + DiffUtil.ItemCallback() { + override fun areItemsTheSame( + oldItem: HoneyTipMain, + newItem: HoneyTipMain + ): Boolean { + return oldItem === newItem + } + + override fun areContentsTheSame( + oldItem: HoneyTipMain, + newItem: HoneyTipMain + ): Boolean { + return oldItem == newItem + } + + }) { + private fun calculateDate(writtenDate: String): String { + val currentDate = Date(System.currentTimeMillis()) + + // SimpleDateFormat을 사용하여 문자열을 Date로 변환 + val sdf = SimpleDateFormat("yyyy.MM.dd hh:mm") + + val date = sdf.parse("20$writtenDate") + + // 두 날짜의 차이 계산 + val difference = currentDate.time - date.time + val daysDifference = difference / (24 * 60 * 60 * 1000) + Log.d("날짜 계산", "$currentDate 와 $writtenDate 사이의 날짜 차이: $daysDifference 일") + return if (daysDifference == 0.toLong()) "오늘" else "${daysDifference}일전" + } + + inner class QuestionListViewHolder(private val binding: ItemQuestionListBinding) : + RecyclerView.ViewHolder(binding.root) { + fun bind(honeyTip: HoneyTipMain) { + binding.titleTv.text = honeyTip.title + binding.writerTv.text = honeyTip.writer + binding.dateTv.text = calculateDate(honeyTip.writtenTime) + binding.bodyTv.text = honeyTip.content + binding.commentCountTv.text = honeyTip.commentCount.toString() + + binding.root.setOnClickListener { + listener.onClick(honeyTip) + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QuestionListViewHolder { + return QuestionListViewHolder( + ItemQuestionListBinding.inflate( + LayoutInflater.from(parent.context), parent, false + ) + ) + } + + override fun onBindViewHolder(holder: QuestionListViewHolder, position: Int) { + holder.bind(currentList[position]) + } +} + +interface OnQuestionClickListener { + fun onClick(honeyTip: HoneyTipMain) } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/intro/SplashActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/intro/SplashActivity.kt index 38128024..9b08eb7a 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/intro/SplashActivity.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/intro/SplashActivity.kt @@ -1,36 +1,36 @@ -package com.umc.ttoklip.presentation.intro - -import android.content.Intent -import android.os.Handler -import android.os.Looper -import com.umc.ttoklip.R -import com.umc.ttoklip.TtoklipApplication -import com.umc.ttoklip.databinding.ActivitySplashBinding -import com.umc.ttoklip.presentation.MainActivity -import com.umc.ttoklip.presentation.base.BaseActivity -import com.umc.ttoklip.presentation.login.LoginActivity - -class SplashActivity:BaseActivity(R.layout.activity_splash) { - override fun initView() { - val handler= Handler(Looper.getMainLooper()) - handler.postDelayed({ - val spf=getSharedPreferences("first", MODE_PRIVATE) - val firstRun=spf.getBoolean("firstRun",true) - //TtoklipApplication.prefs.setBoolean("isFirstLogin", true) - val jwt=TtoklipApplication.prefs.getString("jwt","") - val isFirstLogin=TtoklipApplication.prefs.getBoolean("isFirstLogin",true) - if(firstRun){ - startActivity(Intent(this, IntroActivity::class.java)) - finish() - }else if(jwt.isNotEmpty()&&!isFirstLogin){ - startActivity(Intent(this,MainActivity::class.java)) - finish() - } else{ - startActivity(Intent(this, LoginActivity::class.java)) - finish() - } - },2000) - } - override fun initObserver() { - } +package com.umc.ttoklip.presentation.intro + +import android.content.Intent +import android.os.Handler +import android.os.Looper +import com.umc.ttoklip.R +import com.umc.ttoklip.TtoklipApplication +import com.umc.ttoklip.databinding.ActivitySplashBinding +import com.umc.ttoklip.presentation.MainActivity +import com.umc.ttoklip.presentation.base.BaseActivity +import com.umc.ttoklip.presentation.login.LoginActivity + +class SplashActivity:BaseActivity(R.layout.activity_splash) { + override fun initView() { + val handler= Handler(Looper.getMainLooper()) + handler.postDelayed({ + val spf=getSharedPreferences("first", MODE_PRIVATE) + val firstRun=spf.getBoolean("firstRun",true) + //TtoklipApplication.prefs.setBoolean("isFirstLogin", true) + val jwt=TtoklipApplication.prefs.getString("jwt","") + val isFirstLogin=TtoklipApplication.prefs.getBoolean("isFirstLogin",true) + if(firstRun){ + startActivity(Intent(this, IntroActivity::class.java)) + finish() + }else if(jwt.isNotEmpty()&&!isFirstLogin){ + startActivity(Intent(this,MainActivity::class.java)) + finish() + } else{ + startActivity(Intent(this, LoginActivity::class.java)) + finish() + } + },2000) + } + override fun initObserver() { + } } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/login/LoginActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/login/LoginActivity.kt index 3e9a43b8..cd180aee 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/login/LoginActivity.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/login/LoginActivity.kt @@ -53,6 +53,8 @@ class LoginActivity : BaseActivity(R.layout.activity_login } } NaverIdLoginSDK.authenticate(this, oauthLoginCallback) + //네이버 토큰 임시확인용 + Log.i("NAVER-LOGIN","${NaverIdLoginSDK.getAccessToken()}") } binding.loginKakaoBtn.setOnClickListener { diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/ChooseMainInterestDialogFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/ChooseMainInterestDialogFragment.kt index 5a7f4922..b238c4f9 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/mypage/ChooseMainInterestDialogFragment.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/ChooseMainInterestDialogFragment.kt @@ -24,9 +24,6 @@ class ChooseMainInterestDialogFragment(private val btnClickListener: (List - get() = _newsDetail - - private val _comments = MutableStateFlow(listOf()) - override val comments: StateFlow> - get() = _comments - - private val _imageUrls = MutableStateFlow(listOf()) - override val imageUrls: StateFlow> - get() = _imageUrls - - override val replyCommentParentId = MutableStateFlow(0) - override val commentContent = MutableStateFlow("") - - private val _toast = MutableStateFlow("") - override val toast: MutableStateFlow - get() = _toast - - private val _isLike = MutableStateFlow(false) - override val isLike: MutableStateFlow - get() = _isLike - - private val _isScrap = MutableStateFlow(false) - override val isScrap: MutableStateFlow - get() = _isScrap - - override fun getDetail(id: Int) { - viewModelScope.launch(Dispatchers.IO) { - try { - newsRepository.getDetailNews(id) - .onSuccess { - _newsDetail.emit(it) - //라이크 스크랩 상태 받을 예정 - _isScrap.emit(it.scrapedByCurrentUser) - _isLike.emit(it.likedByCurrentUser) - _comments.emit(it.commentResponses.sortedBy { comment -> - comment.parentId ?: comment.commentId - }) - _imageUrls.emit(it.imageUrlList) - }.onFail { - - }.onException { - throw it - } - } catch (e: Exception) { - e.printStackTrace() - Log.d("예외", "$e") - } - } - } - - override fun postComment(id: Int) { - viewModelScope.launch(Dispatchers.IO) { - try { - newsRepository.postCommentNews( - id, - NewsCommentRequest(commentContent.value, replyCommentParentId.value) - ).onSuccess { - getDetail(id) - }.onFail { - - }.onException { - throw it - } - } catch (e: Exception) { - e.printStackTrace() - Log.d("예외", "$e") - } - } - } - - - override fun deleteComment(id: Int, postId: Int) { - viewModelScope.launch(Dispatchers.IO) { - try { - newsRepository.deleteCommentNews( - id - ).onSuccess { - getDetail(postId) - _toast.emit("댓글을 삭제했습니다.") - }.onFail { - - }.onException { - throw it - } - } catch (e: Exception) { - e.printStackTrace() - Log.d("예외", "$e") - } - } - } - - override fun postLike() { - viewModelScope.launch(Dispatchers.IO) { - try { - newsRepository.postLikeNews( - newsDetail.value.newsletterId - ).onSuccess { - _isLike.emit(true) - _newsDetail.emit(newsDetail.value.copy().also { - it.likeCount += 1 - }) - _toast.emit("뉴스 좋아요") - }.onFail { - - }.onException { - throw it - } - } catch (e: Exception) { - e.printStackTrace() - Log.d("예외", "$e") - } - } - } - - override fun deleteLike() { - viewModelScope.launch(Dispatchers.IO) { - try { - newsRepository.deleteLikeNews( - newsDetail.value.newsletterId - ).onSuccess { - _isLike.emit(false) - _newsDetail.emit(newsDetail.value.copy().also { - it.likeCount -= 1 - }) - _toast.emit("뉴스 좋아요 취소") - }.onFail { - - }.onException { - throw it - } - } catch (e: Exception) { - e.printStackTrace() - Log.d("예외", "$e") - } - } - } - - override fun postScrap() { - viewModelScope.launch(Dispatchers.IO) { - try { - newsRepository.postScrapNews( - newsDetail.value.newsletterId - ).onSuccess { - _isScrap.emit(true) - _newsDetail.emit(newsDetail.value.copy().also { - it.scrapCount += 1 - }) - _toast.emit("뉴스 스크랩") - }.onFail { - - }.onException { - throw it - } - } catch (e: Exception) { - e.printStackTrace() - Log.d("예외", "$e") - } - } - } - - override fun deleteScrap() { - viewModelScope.launch(Dispatchers.IO) { - try { - newsRepository.deleteScrapNews( - newsDetail.value.newsletterId - ).onSuccess { - _isScrap.emit(false) - _newsDetail.emit(newsDetail.value.copy().also { - it.scrapCount -= 1 - }) - _toast.emit("뉴스 스크랩 취소") - }.onFail { - - }.onException { - throw it - } - } catch (e: Exception) { - e.printStackTrace() - Log.d("예외", "$e") - } - } - } - - override fun postReportNews(id: Int, request: ReportRequest) { - viewModelScope.launch(Dispatchers.IO) { - try { - newsRepository.postReportNews( - id, - request - ).onSuccess { - _toast.emit("게시글을 신고했습니다.") - }.onFail { - - }.onException { - throw it - } - } catch (e: Exception) { - e.printStackTrace() - Log.d("예외", "$e") - } - } - } - - override fun postReportComment(id: Int, request: ReportRequest) { - viewModelScope.launch(Dispatchers.IO) { - try { - newsRepository.postReportCommentNews( - id, - request - ).onSuccess { - _toast.emit("댓글을 신고했습니다.") - }.onFail { - - }.onException { - throw it - } - } catch (e: Exception) { - e.printStackTrace() - Log.d("예외", "$e") - } - } - } - - +package com.umc.ttoklip.presentation.news.detail + +import android.util.Log +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.umc.ttoklip.data.model.news.ReportRequest +import com.umc.ttoklip.data.model.news.comment.NewsCommentRequest +import com.umc.ttoklip.data.model.news.comment.NewsCommentResponse +import com.umc.ttoklip.data.model.news.detail.ImageUrl +import com.umc.ttoklip.data.model.news.detail.NewsDetailResponse +import com.umc.ttoklip.data.repository.news.NewsRepository +import com.umc.ttoklip.module.onException +import com.umc.ttoklip.module.onFail +import com.umc.ttoklip.module.onSuccess +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class ArticleViewModelImpl @Inject constructor( + private val newsRepository: NewsRepository +) : ViewModel(), ArticleViewModel { + + private val _newsDetail = MutableStateFlow(NewsDetailResponse()) + override val newsDetail: StateFlow + get() = _newsDetail + + private val _comments = MutableStateFlow(listOf()) + override val comments: StateFlow> + get() = _comments + + private val _imageUrls = MutableStateFlow(listOf()) + override val imageUrls: StateFlow> + get() = _imageUrls + + override val replyCommentParentId = MutableStateFlow(0) + override val commentContent = MutableStateFlow("") + + private val _toast = MutableStateFlow("") + override val toast: MutableStateFlow + get() = _toast + + private val _isLike = MutableStateFlow(false) + override val isLike: MutableStateFlow + get() = _isLike + + private val _isScrap = MutableStateFlow(false) + override val isScrap: MutableStateFlow + get() = _isScrap + + override fun getDetail(id: Int) { + viewModelScope.launch(Dispatchers.IO) { + try { + newsRepository.getDetailNews(id) + .onSuccess { + _newsDetail.emit(it) + //라이크 스크랩 상태 받을 예정 + _isScrap.emit(it.scrapedByCurrentUser) + _isLike.emit(it.likedByCurrentUser) + _comments.emit(it.commentResponses.sortedBy { comment -> + comment.parentId ?: comment.commentId + }) + _imageUrls.emit(it.imageUrlList) + }.onFail { + + }.onException { + throw it + } + } catch (e: Exception) { + e.printStackTrace() + Log.d("예외", "$e") + } + } + } + + override fun postComment(id: Int) { + viewModelScope.launch(Dispatchers.IO) { + try { + newsRepository.postCommentNews( + id, + NewsCommentRequest(commentContent.value, replyCommentParentId.value) + ).onSuccess { + getDetail(id) + }.onFail { + + }.onException { + throw it + } + } catch (e: Exception) { + e.printStackTrace() + Log.d("예외", "$e") + } + } + } + + + override fun deleteComment(id: Int, postId: Int) { + viewModelScope.launch(Dispatchers.IO) { + try { + newsRepository.deleteCommentNews( + id + ).onSuccess { + getDetail(postId) + _toast.emit("댓글을 삭제했습니다.") + }.onFail { + + }.onException { + throw it + } + } catch (e: Exception) { + e.printStackTrace() + Log.d("예외", "$e") + } + } + } + + override fun postLike() { + viewModelScope.launch(Dispatchers.IO) { + try { + newsRepository.postLikeNews( + newsDetail.value.newsletterId + ).onSuccess { + _isLike.emit(true) + _newsDetail.emit(newsDetail.value.copy().also { + it.likeCount += 1 + }) + _toast.emit("뉴스 좋아요") + }.onFail { + + }.onException { + throw it + } + } catch (e: Exception) { + e.printStackTrace() + Log.d("예외", "$e") + } + } + } + + override fun deleteLike() { + viewModelScope.launch(Dispatchers.IO) { + try { + newsRepository.deleteLikeNews( + newsDetail.value.newsletterId + ).onSuccess { + _isLike.emit(false) + _newsDetail.emit(newsDetail.value.copy().also { + it.likeCount -= 1 + }) + _toast.emit("뉴스 좋아요 취소") + }.onFail { + + }.onException { + throw it + } + } catch (e: Exception) { + e.printStackTrace() + Log.d("예외", "$e") + } + } + } + + override fun postScrap() { + viewModelScope.launch(Dispatchers.IO) { + try { + newsRepository.postScrapNews( + newsDetail.value.newsletterId + ).onSuccess { + _isScrap.emit(true) + _newsDetail.emit(newsDetail.value.copy().also { + it.scrapCount += 1 + }) + _toast.emit("뉴스 스크랩") + }.onFail { + + }.onException { + throw it + } + } catch (e: Exception) { + e.printStackTrace() + Log.d("예외", "$e") + } + } + } + + override fun deleteScrap() { + viewModelScope.launch(Dispatchers.IO) { + try { + newsRepository.deleteScrapNews( + newsDetail.value.newsletterId + ).onSuccess { + _isScrap.emit(false) + _newsDetail.emit(newsDetail.value.copy().also { + it.scrapCount -= 1 + }) + _toast.emit("뉴스 스크랩 취소") + }.onFail { + + }.onException { + throw it + } + } catch (e: Exception) { + e.printStackTrace() + Log.d("예외", "$e") + } + } + } + + override fun postReportNews(id: Int, request: ReportRequest) { + viewModelScope.launch(Dispatchers.IO) { + try { + newsRepository.postReportNews( + id, + request + ).onSuccess { + _toast.emit("게시글을 신고했습니다.") + }.onFail { + + }.onException { + throw it + } + } catch (e: Exception) { + e.printStackTrace() + Log.d("예외", "$e") + } + } + } + + override fun postReportComment(id: Int, request: ReportRequest) { + viewModelScope.launch(Dispatchers.IO) { + try { + newsRepository.postReportCommentNews( + id, + request + ).onSuccess { + _toast.emit("댓글을 신고했습니다.") + }.onFail { + + }.onException { + throw it + } + } catch (e: Exception) { + e.printStackTrace() + Log.d("예외", "$e") + } + } + } + + } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/otheruser/OtheruserActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/otheruser/OtheruserActivity.kt new file mode 100644 index 00000000..3ca3b0ed --- /dev/null +++ b/app/src/main/java/com/umc/ttoklip/presentation/otheruser/OtheruserActivity.kt @@ -0,0 +1,15 @@ +package com.umc.ttoklip.presentation.otheruser + +import com.umc.ttoklip.R +import com.umc.ttoklip.databinding.ActivityOtheruserProfileBinding +import com.umc.ttoklip.databinding.ActivitySignupBinding +import com.umc.ttoklip.presentation.base.BaseActivity + +class OtheruserActivity: BaseActivity(R.layout.activity_otheruser_profile) { + override fun initView() { + } + + override fun initObserver() { + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/otheruser/OtheruserViewModel.kt b/app/src/main/java/com/umc/ttoklip/presentation/otheruser/OtheruserViewModel.kt new file mode 100644 index 00000000..e21c1da7 --- /dev/null +++ b/app/src/main/java/com/umc/ttoklip/presentation/otheruser/OtheruserViewModel.kt @@ -0,0 +1,5 @@ +package com.umc.ttoklip.presentation.otheruser + +class OtheruserViewModel { + +} \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/signup/DirectLocationActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/signup/DirectLocationActivity.kt deleted file mode 100644 index 0048314c..00000000 --- a/app/src/main/java/com/umc/ttoklip/presentation/signup/DirectLocationActivity.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.umc.ttoklip.presentation.signup - -import android.util.Log -import androidx.lifecycle.MutableLiveData -import com.umc.ttoklip.R -import com.umc.ttoklip.data.model.KakaoResponse -import com.umc.ttoklip.databinding.ActivityDirectLocationBinding -import com.umc.ttoklip.di.KakaoModule -import com.umc.ttoklip.presentation.base.BaseActivity -import retrofit2.Call -import retrofit2.Response - -class DirectLocationActivity : - BaseActivity(R.layout.activity_direct_location) { - private val kakaoInfo = KakaoModule.kakaoAddress.Companion - private val kakaoApi = KakaoModule.kakaoAddress.kakaoApiRetrofitClient.apiService - - override fun initView() { - callKakaoSearch("서울시 관악구 조원로12길 28") - } - - fun callKakaoSearch(address: String) { - val kakao = MutableLiveData() - kakaoApi.getSearchKeyword(kakaoInfo.API_KEY, query = address) - .enqueue(object : retrofit2.Callback { - override fun onResponse( - call: Call, - response: Response - ) { - kakao.value = response.body() - Log.i("KAKAO SEARCH", "${kakao.value!!.documents[0].address_name}") - } - - override fun onFailure( - call: Call, - t: Throwable - ) { - t.printStackTrace() - } - }) - } - - override fun initObserver() { - } -} \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup3Fragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup3Fragment.kt index 56f233fc..ef54da91 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup3Fragment.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup3Fragment.kt @@ -1,124 +1,138 @@ package com.umc.ttoklip.presentation.signup.fragments import android.content.Context -import androidx.activity.OnBackPressedCallback +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup import androidx.core.os.bundleOf +import androidx.fragment.app.activityViewModels +import androidx.fragment.app.viewModels +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.LinearLayoutManager import com.umc.ttoklip.R import com.umc.ttoklip.databinding.FragmentSignup3Binding +import com.umc.ttoklip.databinding.ItemTermBinding import com.umc.ttoklip.presentation.base.BaseFragment import com.umc.ttoklip.presentation.signup.SignupActivity +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +@AndroidEntryPoint class Signup3Fragment : BaseFragment(R.layout.fragment_signup3) { - var allAgree: Boolean = false - var serviceAgree: Boolean = false - var privacyAgree: Boolean = false - var locationAgree: Boolean = false + private val viewModel: TermViewModel by activityViewModels() + private lateinit var termRVAdapter: TermRVAdapter override fun initObserver() { - + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + launch { + delay(300) + viewModel.termDatas.collect { + termRVAdapter.notifyDataSetChanged() + } + } + launch { + viewModel.nextok.collect { + if (it) { + binding.signup3NextBtn.isClickable = true + binding.signup3NextBtn.setBackgroundResource(R.drawable.rectangle_corner_10_yellow) + binding.signup3NextBtn.setTextAppearance(R.style.TextAppearance_App_16sp_700) + } else { + binding.signup3NextBtn.isClickable = false + binding.signup3NextBtn.setBackgroundResource(R.drawable.rectangle_corner_10_strok_1_black) + binding.signup3NextBtn.setTextAppearance(R.style.TextAppearance_App_16sp_500) + } + } + } + launch{ + viewModel.allCheck.collect{ + if(it){ + binding.signup3AgreeAllIv.visibility=View.VISIBLE + binding.signup3DeagreeAllIv.visibility=View.INVISIBLE + termRVAdapter.notifyDataSetChanged() + }else{ + binding.signup3AgreeAllIv.visibility=View.INVISIBLE + binding.signup3DeagreeAllIv.visibility=View.VISIBLE + termRVAdapter.notifyDataSetChanged() + } + } + } + } + } } override fun initView() { val activity = activity as SignupActivity activity?.setProg(1) - binding.signup3AgreeAllIv.setOnClickListener { - if (allAgree) { - binding.signup3AgreeServiceIv.setImageResource(R.drawable.oval_stroke_1) - binding.signup3AgreePrivacyIv.setImageResource(R.drawable.oval_stroke_1) - binding.signup3AgreeLocationIv.setImageResource(R.drawable.oval_stroke_1) - serviceAgree = false - privacyAgree = false - locationAgree = false - } else { - binding.signup3AgreeServiceIv.setImageResource(R.drawable.oval_double) - binding.signup3AgreePrivacyIv.setImageResource(R.drawable.oval_double) - binding.signup3AgreeLocationIv.setImageResource(R.drawable.oval_double) - serviceAgree = true - privacyAgree = true - locationAgree = true - } - allAgreeCheck() - nextok() - } + //약관 불러오기 + viewModel.getTerm() + //약관 rv 초기화하고 넣기-업데이트는 ovserve에서 + termRVAdapter = TermRVAdapter(viewModel.termDatas.value) + binding.signup3TermsRV.adapter = termRVAdapter + binding.signup3TermsRV.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + - binding.signup3AgreeServiceIv.setOnClickListener { - if(serviceAgree){ - serviceAgree=false - binding.signup3AgreeServiceIv.setImageResource(R.drawable.oval_stroke_1) - }else{ - serviceAgree=true - binding.signup3AgreeServiceIv.setImageResource(R.drawable.oval_double) + //term rv click listener + termRVAdapter.setMyItemClickListener(object : TermRVAdapter.MyItemClickListener { + //fragment 이동 + override fun onItemClick(termId: Int) { } - allAgreeCheck() - nextok() - } - binding.signup3AgreeServiceBtn.setOnClickListener { - activity.updateButtonForTerm() - findNavController().navigate(R.id.action_signup3_fragment_to_signupTerm_fragment, - bundleOf("termType" to "service")) - } - binding.signup3AgreePrivacyIv.setOnClickListener { - if(privacyAgree){ - privacyAgree=false - binding.signup3AgreePrivacyIv.setImageResource(R.drawable.oval_stroke_1) - }else{ - privacyAgree=true - binding.signup3AgreePrivacyIv.setImageResource(R.drawable.oval_double) + //off인 term을 누름 + override fun onCheckTermOn(termId: Int) { + val id=viewModel.termCount.value-termId + viewModel.setTermCheck(id, true) + nextcheck() } - allAgreeCheck() - nextok() - } - binding.signup3AgreePrivacyBtn.setOnClickListener { - activity.updateButtonForTerm() - findNavController().navigate(R.id.action_signup3_fragment_to_signupTerm_fragment, - bundleOf("termType" to "privacy")) - } - binding.signup3AgreeLocationIv.setOnClickListener { - if(locationAgree){ - locationAgree=false - binding.signup3AgreeLocationIv.setImageResource(R.drawable.oval_stroke_1) - }else{ - locationAgree=true - binding.signup3AgreeLocationIv.setImageResource(R.drawable.oval_double) + //on인 term을 누름 + override fun onCheckTermOff(termId: Int) { + val id=viewModel.termCount.value-termId + viewModel.setTermCheck(id, false) + nextcheck() } - allAgreeCheck() - } + }) - binding.signup3AgreeLocationBtn.setOnClickListener { - activity.updateButtonForTerm() - findNavController().navigate(R.id.action_signup3_fragment_to_signupTerm_fragment, - bundleOf("termType" to "location")) + //all check off + binding.signup3AgreeAllIv.setOnClickListener { + viewModel.setTermsCheck(false) + viewModel.allcheck(false) + termRVAdapter.notifyDataSetChanged() + nextcheck() } + //all check on + binding.signup3DeagreeAllIv.setOnClickListener { + viewModel.setTermsCheck(true) + viewModel.allcheck(true) + termRVAdapter.notifyDataSetChanged() + nextcheck() + } + binding.signup3NextBtn.setOnClickListener { - if (serviceAgree && privacyAgree) { + if (viewModel.nextok.value) { findNavController().navigate(R.id.action_signup3_fragment_to_signup4_fragment) } } } - private fun allAgreeCheck() { - if (serviceAgree && privacyAgree && locationAgree) { - allAgree = true - binding.signup3AgreeAllIv.setImageResource(R.drawable.oval_double) - } else { - allAgree = false - binding.signup3AgreeAllIv.setImageResource(R.drawable.oval_stroke_1) - } - } - private fun nextok(){ - if(serviceAgree&&privacyAgree){ - binding.signup3NextBtn.isClickable=true - binding.signup3NextBtn.setBackgroundResource(R.drawable.rectangle_corner_10_yellow) - binding.signup3NextBtn.setTextAppearance(R.style.TextAppearance_App_16sp_700) - }else{ - binding.signup3NextBtn.isClickable=false - binding.signup3NextBtn.setBackgroundResource(R.drawable.rectangle_corner_10_strok_1_black) - binding.signup3NextBtn.setTextAppearance(R.style.TextAppearance_App_16sp_500) + + private fun nextcheck() { + for (term in viewModel.termDatas.value) { + if (term.check == false) { + viewModel.allcheck(false) + viewModel.nextcheck(false) + return + } } + viewModel.allcheck(true) + viewModel.nextcheck(true) } } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup4Fragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup4Fragment.kt index dd367f62..efc92edf 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup4Fragment.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup4Fragment.kt @@ -59,7 +59,7 @@ class Signup4Fragment : BaseFragment(R.layout.fragment_s launch { viewModel.nickcheckbtn.collect { if (it) { - delay(100) + delay(200) viewModel.nickok.collect { if (it) { binding.signup4NickokTv.visibility = View.VISIBLE @@ -164,7 +164,7 @@ class Signup4Fragment : BaseFragment(R.layout.fragment_s val interestType = if (interest.equals("집안일")) "HOUSEWORK" - else if (interest.equals("요리")) "RECIPE" + else if (interest.equals("레시피")) "RECIPE" else if (interest.equals("안전한 생활")) "SAFE_LIVING" else "WELFARE_POLICY" interestArray.add(interestType) diff --git a/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup5Fragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup5Fragment.kt index a466c830..6fae45f5 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup5Fragment.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup5Fragment.kt @@ -3,22 +3,15 @@ package com.umc.ttoklip.presentation.signup.fragments import android.content.Intent import android.os.Bundle import android.widget.SeekBar -import androidx.activity.viewModels import androidx.core.content.ContextCompat -import androidx.fragment.app.activityViewModels -import androidx.fragment.app.viewModels -import androidx.lifecycle.ViewModelProvider import com.umc.ttoklip.R -import com.umc.ttoklip.data.model.signup.SignupRequest import com.umc.ttoklip.databinding.FragmentSignup5Binding import com.umc.ttoklip.presentation.MainActivity import com.umc.ttoklip.presentation.base.BaseFragment import com.umc.ttoklip.presentation.login.LoginActivity -import com.umc.ttoklip.presentation.signup.DirectLocationActivity -import com.umc.ttoklip.presentation.signup.LocationActivity +import com.umc.ttoklip.presentation.signup.location.DirectLocationActivity +import com.umc.ttoklip.presentation.signup.location.LocationActivity import com.umc.ttoklip.presentation.signup.SignupActivity -import com.umc.ttoklip.presentation.signup.SignupViewModel -import dagger.hilt.android.AndroidEntryPoint class Signup5Fragment: BaseFragment(R.layout.fragment_signup5) { diff --git a/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/SignupTermFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/SignupTermFragment.kt index 8d03bce8..ac43a9bf 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/SignupTermFragment.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/SignupTermFragment.kt @@ -2,40 +2,38 @@ package com.umc.ttoklip.presentation.signup.fragments import android.content.Context import androidx.activity.OnBackPressedCallback +import androidx.fragment.app.activityViewModels import com.umc.ttoklip.R import com.umc.ttoklip.databinding.FragmentSignup5Binding import com.umc.ttoklip.databinding.FragmentSignupTermBinding import com.umc.ttoklip.presentation.base.BaseFragment import com.umc.ttoklip.presentation.signup.SignupActivity +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class SignupTermFragment : BaseFragment(R.layout.fragment_signup_term) { - private lateinit var callback:OnBackPressedCallback + private lateinit var callback: OnBackPressedCallback + + private val viewModel: TermViewModel by activityViewModels() override fun initObserver() { } override fun initView() { - var termType = requireArguments().getString("termType") - if (termType.toString().equals("service")) { - binding.signupTermTitleTv.text = getString(R.string.service_term) - binding.signupTermDetailTv.text = getString(R.string.service_term_detail) - } else if (termType.toString().equals("privacy")) { - binding.signupTermTitleTv.text = getString(R.string.privacy_term) - binding.signupTermDetailTv.text = getString(R.string.privacy_term_detail) - } else { - binding.signupTermTitleTv.text = getString(R.string.location_term) - binding.signupTermDetailTv.text = getString(R.string.location_term_detail) - } + val title = arguments?.getString("title") + val content = arguments?.getString("content") + binding.signupTermTitleTv.text = title + binding.signupTermDetailTv.text = content } override fun onAttach(context: Context) { super.onAttach(context) - callback=object:OnBackPressedCallback(true){ + callback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { - val activity=activity as SignupActivity + val activity = activity as SignupActivity activity.termBack() } } - requireActivity().onBackPressedDispatcher.addCallback(this,callback) + requireActivity().onBackPressedDispatcher.addCallback(this, callback) } } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/TermRVAdapter.kt b/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/TermRVAdapter.kt new file mode 100644 index 00000000..ea1047ad --- /dev/null +++ b/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/TermRVAdapter.kt @@ -0,0 +1,75 @@ +package com.umc.ttoklip.presentation.signup.fragments + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.umc.ttoklip.databinding.ItemTermBinding + +class TermRVAdapter(private val termList: ArrayList) : + RecyclerView.Adapter() { + + interface MyItemClickListener { + fun onItemClick(termId: Int) + fun onCheckTermOn(termId: Int) + fun onCheckTermOff(termId: Int) + } + + private lateinit var mItemClickListener: MyItemClickListener + fun setMyItemClickListener(itemClickListener: MyItemClickListener) { + mItemClickListener = itemClickListener + } + + @SuppressLint("NotifyDataSetChanged") + fun checkTerm(){ + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val binding: ItemTermBinding = + ItemTermBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return ViewHolder(binding) + } + + override fun getItemCount(): Int = termList.size + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(termList[position]) + holder.itemView.setOnClickListener { + mItemClickListener.onItemClick(termList[position].termId-1) + } + holder.binding.termAgreeServiceBtn.setOnClickListener { + if(holder.binding.termDetailSv.visibility.equals(View.VISIBLE)){ + holder.binding.termDetailSv.visibility=View.GONE + }else{ + holder.binding.termDetailSv.visibility=View.VISIBLE + } + checkTerm() + } + holder.binding.termAgreeServiceOnIv.setOnClickListener { + mItemClickListener.onCheckTermOff(termList[position].termId) + checkTerm() + } + holder.binding.termAgreeServiceOffIv.setOnClickListener { + mItemClickListener.onCheckTermOn(termList[position].termId) + checkTerm() + } + } + + inner class ViewHolder(val binding: ItemTermBinding) : RecyclerView.ViewHolder(binding.root) { + fun bind(term: TermViewModel.Term) { + binding.termAgreeServiceTv.text = term.title + binding.termDetailTv.text=term.content + if (term.check) { + binding.termAgreeServiceOnIv.visibility = View.VISIBLE + binding.termAgreeServiceOffIv.visibility = View.INVISIBLE + } else { + binding.termAgreeServiceOnIv.visibility = View.INVISIBLE + binding.termAgreeServiceOffIv.visibility = View.VISIBLE + } + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/TermViewModel.kt b/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/TermViewModel.kt index 378e9a1d..307c4138 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/TermViewModel.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/TermViewModel.kt @@ -1,10 +1,71 @@ package com.umc.ttoklip.presentation.signup.fragments +import android.util.Log import androidx.lifecycle.ViewModel -import com.umc.ttoklip.data.repository.signup.SignupRepositoryImpl +import androidx.lifecycle.viewModelScope +import com.umc.ttoklip.R +import com.umc.ttoklip.data.repository.signup.TermRepositoryImpl +import com.umc.ttoklip.module.onFail +import com.umc.ttoklip.module.onSuccess +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch import javax.inject.Inject +@HiltViewModel class TermViewModel @Inject constructor( - private val signupRepository: SignupRepositoryImpl + private val termRepository: TermRepositoryImpl, ) : ViewModel() { + + private val _termDatas= MutableStateFlow>(ArrayList()) + val termDatas: StateFlow> + get() = _termDatas + + private val _nextok= MutableStateFlow(false) + val nextok:StateFlow + get() = _nextok + private val _allCheck= MutableStateFlow(false) + val allCheck:StateFlow + get() = _allCheck + + fun nextcheck(check:Boolean){ + _nextok.value=check + } + fun allcheck(check:Boolean){ + _allCheck.value=check + } + fun setTermsCheck(check:Boolean){ + for(term in _termDatas.value){ + _termDatas.value[term.termId-1].check=check + } + } + fun setTermCheck(position:Int,check:Boolean){ + _termDatas.value[position].check=check + } + fun getTerm() { + viewModelScope.launch { + termRepository.getTerm(0) + .onSuccess { + for(term in it.terms){ + _termDatas.value.add(Term(term.termId,term.title,term.content)) + } + _termCount.value=it.totalElements + Log.i("TERM","term 불러오기 성공") + }.onFail { + Log.d("TERM","term 불러오기 실패") + } + } + } + + private val _termCount=MutableStateFlow(0) + val termCount:StateFlow + get() = _termCount + + data class Term( + val termId: Int, + val title: String, + val content: String, + var check: Boolean = false + ) } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/signup/location/DirectLocationActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/signup/location/DirectLocationActivity.kt new file mode 100644 index 00000000..5d4e3d76 --- /dev/null +++ b/app/src/main/java/com/umc/ttoklip/presentation/signup/location/DirectLocationActivity.kt @@ -0,0 +1,44 @@ +package com.umc.ttoklip.presentation.signup.location + +import android.util.Log +import androidx.lifecycle.MutableLiveData +import com.umc.ttoklip.R +import com.umc.ttoklip.data.model.KakaoResponse +import com.umc.ttoklip.databinding.ActivityDirectLocationBinding +import com.umc.ttoklip.di.KakaoModule +import com.umc.ttoklip.presentation.base.BaseActivity +import retrofit2.Call +import retrofit2.Response + +class DirectLocationActivity : + BaseActivity(R.layout.activity_direct_location) { +// private val kakaoApi = DirectLocationRepositoryImpl + + override fun initView() { + callKakaoSearch("서울시 관악구 조원로12길 28") + } + + fun callKakaoSearch(address: String) { +// val kakao = MutableLiveData() +// kakaoApi.getSearchKeyword(kakaoInfo.API_KEY, query = address) +// .enqueue(object : retrofit2.Callback { +// override fun onResponse( +// call: Call, +// response: Response +// ) { +// kakao.value = response.body() +// Log.i("KAKAO SEARCH", "${kakao.value!!.documents[0].address_name}") +// } +// +// override fun onFailure( +// call: Call, +// t: Throwable +// ) { +// t.printStackTrace() +// } +// }) + } + + override fun initObserver() { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/signup/location/DirectLocationModelView.kt b/app/src/main/java/com/umc/ttoklip/presentation/signup/location/DirectLocationModelView.kt new file mode 100644 index 00000000..a076e404 --- /dev/null +++ b/app/src/main/java/com/umc/ttoklip/presentation/signup/location/DirectLocationModelView.kt @@ -0,0 +1,33 @@ +package com.umc.ttoklip.presentation.signup.location + +import android.util.Log +import androidx.lifecycle.MutableLiveData +import com.umc.ttoklip.data.api.KakaoApi +import com.umc.ttoklip.data.model.KakaoResponse +import com.umc.ttoklip.data.repository.location.DirectLocationRepositoryImpl +import com.umc.ttoklip.di.KakaoModule +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class DirectLocationModelView( + private val kakaoApi:DirectLocationRepositoryImpl +) { + + fun getDirectaddress(){ + +// val call=kakaoApi.getDirectAddress("서울시 관악구 조원로") +// call.enqueue(object: Callback { +// override fun onResponse( +// call: Call, +// response: Response +// ) { +// Log.i("LocaSearch","통신 성공:${response.body()}") +// } +// override fun onFailure(call: Call, t: Throwable) { +// Log.w("LocaSearch","통신 실패: ${t.message}") +// } +// }) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/signup/DirectLocationRVAdapter.kt b/app/src/main/java/com/umc/ttoklip/presentation/signup/location/DirectLocationRVAdapter.kt similarity index 95% rename from app/src/main/java/com/umc/ttoklip/presentation/signup/DirectLocationRVAdapter.kt rename to app/src/main/java/com/umc/ttoklip/presentation/signup/location/DirectLocationRVAdapter.kt index c526ab51..37225564 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/signup/DirectLocationRVAdapter.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/signup/location/DirectLocationRVAdapter.kt @@ -1,4 +1,4 @@ -package com.umc.ttoklip.presentation.signup +package com.umc.ttoklip.presentation.signup.location import android.view.LayoutInflater import android.view.ViewGroup diff --git a/app/src/main/java/com/umc/ttoklip/presentation/signup/LocationActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/signup/location/LocationActivity.kt similarity index 97% rename from app/src/main/java/com/umc/ttoklip/presentation/signup/LocationActivity.kt rename to app/src/main/java/com/umc/ttoklip/presentation/signup/location/LocationActivity.kt index 27235860..2675d52e 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/signup/LocationActivity.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/signup/location/LocationActivity.kt @@ -1,4 +1,4 @@ -package com.umc.ttoklip.presentation.signup +package com.umc.ttoklip.presentation.signup.location import android.Manifest import android.content.Intent @@ -10,7 +10,6 @@ import android.widget.SeekBar import androidx.activity.viewModels import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat -import androidx.fragment.app.viewModels import com.naver.maps.geometry.LatLng import com.naver.maps.map.LocationTrackingMode import com.naver.maps.map.MapFragment @@ -18,13 +17,14 @@ import com.naver.maps.map.NaverMap import com.naver.maps.map.OnMapReadyCallback import com.naver.maps.map.UiSettings import com.naver.maps.map.overlay.CircleOverlay -import com.naver.maps.map.overlay.OverlayImage import com.naver.maps.map.util.FusedLocationSource import com.umc.ttoklip.R import com.umc.ttoklip.databinding.ActivityLocationBinding import com.umc.ttoklip.presentation.MainActivity import com.umc.ttoklip.presentation.base.BaseActivity import com.umc.ttoklip.presentation.login.LoginActivity +import com.umc.ttoklip.presentation.signup.SignupActivity +import com.umc.ttoklip.presentation.signup.SignupViewModel import dagger.hilt.android.AndroidEntryPoint import java.util.Locale @@ -112,7 +112,7 @@ class LocationActivity : startActivity(Intent(this, MainActivity::class.java)) val loginActivity=LoginActivity.loginActivity loginActivity?.finish() - val signupActivity=SignupActivity.signupActivity + val signupActivity= SignupActivity.signupActivity signupActivity?.finish() finish() } diff --git a/app/src/main/res/layout/activity_direct_location.xml b/app/src/main/res/layout/activity_direct_location.xml index dec1e31c..e04f5f0b 100644 --- a/app/src/main/res/layout/activity_direct_location.xml +++ b/app/src/main/res/layout/activity_direct_location.xml @@ -57,15 +57,15 @@ android:layout_marginEnd="10dp" app:tint="@color/gray80" /> - + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_otheruser_profile.xml b/app/src/main/res/layout/activity_otheruser_profile.xml new file mode 100644 index 00000000..4ce2cc48 --- /dev/null +++ b/app/src/main/res/layout/activity_otheruser_profile.xml @@ -0,0 +1,428 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_choose_main_interest.xml b/app/src/main/res/layout/fragment_choose_main_interest.xml index 81a9611a..43c13321 100644 --- a/app/src/main/res/layout/fragment_choose_main_interest.xml +++ b/app/src/main/res/layout/fragment_choose_main_interest.xml @@ -24,11 +24,12 @@ @@ -68,18 +69,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - - + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + app:layout_constraintStart_toStartOf="@id/signup1_desc1_tv" + app:layout_constraintTop_toBottomOf="@id/signup1_desc1_tv" /> + + app:layout_constraintStart_toEndOf="@id/signup1_desc2_tv" + app:layout_constraintTop_toTopOf="@id/signup1_desc2_tv" /> + app:layout_constraintTop_toTopOf="parent" /> + + + + app:layout_constraintStart_toStartOf="@id/signup3_agreeAll_tv" + app:layout_constraintTop_toBottomOf="@id/signup3_agreeAll_tv" /> - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + tools:listitem="@layout/item_term"/> + app:layout_constraintStart_toStartOf="parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_question_comment.xml b/app/src/main/res/layout/item_question_comment.xml index 340eb428..c337b7f4 100644 --- a/app/src/main/res/layout/item_question_comment.xml +++ b/app/src/main/res/layout/item_question_comment.xml @@ -1,129 +1,129 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_question_list.xml b/app/src/main/res/layout/item_question_list.xml index fc93b70a..e72e1e4a 100644 --- a/app/src/main/res/layout/item_question_list.xml +++ b/app/src/main/res/layout/item_question_list.xml @@ -1,88 +1,88 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_term.xml b/app/src/main/res/layout/item_term.xml index 4df08f30..be152f3c 100644 --- a/app/src/main/res/layout/item_term.xml +++ b/app/src/main/res/layout/item_term.xml @@ -11,13 +11,22 @@ + android:visibility="visible"/> + + + app:layout_constraintBottom_toBottomOf="@id/term_agreeService_off_iv" + app:layout_constraintStart_toEndOf="@id/term_agreeService_off_iv" + app:layout_constraintTop_toTopOf="@id/term_agreeService_off_iv" /> + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7a74e618..d3431113 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -34,7 +34,7 @@ 주요 관심사 종류 없음 집안일 - 요리 + 레시피 안전한 생활 사기 복지 · 정책