diff --git a/app/src/main/java/com/sopt/umbba_android/data/model/response/ListQuestionAnswerResponseDto.kt b/app/src/main/java/com/sopt/umbba_android/data/model/response/ListQuestionAnswerResponseDto.kt index 91d29838..f9600707 100644 --- a/app/src/main/java/com/sopt/umbba_android/data/model/response/ListQuestionAnswerResponseDto.kt +++ b/app/src/main/java/com/sopt/umbba_android/data/model/response/ListQuestionAnswerResponseDto.kt @@ -16,6 +16,8 @@ data class ListQuestionAnswerResponseDto( data class QnaData( @SerialName("qna_id") val qnaId: Long?, + @SerialName("index") + val index: Int?, @SerialName("section") val section: String?, @SerialName("topic") diff --git a/app/src/main/java/com/sopt/umbba_android/data/model/response/LogOutResponseDto.kt b/app/src/main/java/com/sopt/umbba_android/data/model/response/LogOutResponseDto.kt new file mode 100644 index 00000000..a597220d --- /dev/null +++ b/app/src/main/java/com/sopt/umbba_android/data/model/response/LogOutResponseDto.kt @@ -0,0 +1,12 @@ +package com.sopt.umbba_android.data.model.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class LogOutResponseDto( + @SerialName("status") + val status: Int, + @SerialName("message") + val message: String +) \ No newline at end of file diff --git a/app/src/main/java/com/sopt/umbba_android/data/model/response/QuestionAnswerResponseDto.kt b/app/src/main/java/com/sopt/umbba_android/data/model/response/QuestionAnswerResponseDto.kt index 290589ef..b0cead05 100644 --- a/app/src/main/java/com/sopt/umbba_android/data/model/response/QuestionAnswerResponseDto.kt +++ b/app/src/main/java/com/sopt/umbba_android/data/model/response/QuestionAnswerResponseDto.kt @@ -16,6 +16,8 @@ data class QuestionAnswerResponseDto( data class QnaData( @SerialName("qna_id") val qnaId: Long?, + @SerialName("index") + val index: Int?, @SerialName("section") val section: String?, @SerialName("topic") diff --git a/app/src/main/java/com/sopt/umbba_android/data/repository/SettingRepositoryImpl.kt b/app/src/main/java/com/sopt/umbba_android/data/repository/SettingRepositoryImpl.kt index 880cc1d0..205bb2a3 100644 --- a/app/src/main/java/com/sopt/umbba_android/data/repository/SettingRepositoryImpl.kt +++ b/app/src/main/java/com/sopt/umbba_android/data/repository/SettingRepositoryImpl.kt @@ -1,13 +1,20 @@ package com.sopt.umbba_android.data.repository import com.sopt.umbba_android.data.datasource.SettingRemoteDataSource +import com.sopt.umbba_android.data.model.response.LogOutResponseDto import com.sopt.umbba_android.domain.repository.SettingRepository +import timber.log.Timber class SettingRepositoryImpl(private val settingRemoteDataSource: SettingRemoteDataSource) : SettingRepository { - override suspend fun logout() { - TODO("Not yet implemented") - } + override suspend fun logout():Result = + runCatching { + settingRemoteDataSource.logout() + }.onSuccess { + Timber.e("로그아웃 성공") + }.onFailure { + Timber.e("로그아웃 실패") + } override suspend fun deleteAccount() { TODO("Not yet implemented") diff --git a/app/src/main/java/com/sopt/umbba_android/data/service/SettingService.kt b/app/src/main/java/com/sopt/umbba_android/data/service/SettingService.kt index e51769d3..0f8f2892 100644 --- a/app/src/main/java/com/sopt/umbba_android/data/service/SettingService.kt +++ b/app/src/main/java/com/sopt/umbba_android/data/service/SettingService.kt @@ -1,6 +1,10 @@ package com.sopt.umbba_android.data.service +import com.sopt.umbba_android.data.model.response.LogOutResponseDto +import retrofit2.http.PATCH + interface SettingService { - suspend fun logout() + @PATCH("/log-out") + suspend fun logout(): LogOutResponseDto suspend fun deleteAccount() } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/umbba_android/domain/repository/SettingRepository.kt b/app/src/main/java/com/sopt/umbba_android/domain/repository/SettingRepository.kt index 7ea619b5..e3a66b9a 100644 --- a/app/src/main/java/com/sopt/umbba_android/domain/repository/SettingRepository.kt +++ b/app/src/main/java/com/sopt/umbba_android/domain/repository/SettingRepository.kt @@ -1,6 +1,8 @@ package com.sopt.umbba_android.domain.repository +import com.sopt.umbba_android.data.model.response.LogOutResponseDto + interface SettingRepository { - suspend fun logout() + suspend fun logout():Result suspend fun deleteAccount() } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/umbba_android/presentation/MainActivity.kt b/app/src/main/java/com/sopt/umbba_android/presentation/MainActivity.kt index 86377d31..5de3164c 100644 --- a/app/src/main/java/com/sopt/umbba_android/presentation/MainActivity.kt +++ b/app/src/main/java/com/sopt/umbba_android/presentation/MainActivity.kt @@ -17,19 +17,6 @@ class MainActivity : BindingActivity(R.layout.activity_main super.onCreate(savedInstanceState) initView() setBottomNav() - getToken() - } - - private fun getToken(){ - FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task -> - if (!task.isSuccessful) { - Log.e("hyeon", "Fetching FCM registration token failed", task.exception) - return@OnCompleteListener - } - // Get new FCM registration token - val token = task.result - Log.e("hyeon", token.toString()) - }) } private fun initView() { diff --git a/app/src/main/java/com/sopt/umbba_android/presentation/qna/AnswerActivity.kt b/app/src/main/java/com/sopt/umbba_android/presentation/qna/AnswerActivity.kt index 87b912a4..9de1ffe5 100644 --- a/app/src/main/java/com/sopt/umbba_android/presentation/qna/AnswerActivity.kt +++ b/app/src/main/java/com/sopt/umbba_android/presentation/qna/AnswerActivity.kt @@ -12,11 +12,11 @@ import com.sopt.umbba_android.util.binding.BindingActivity class AnswerActivity : BindingActivity(R.layout.activity_answer), View.OnClickListener { - private val answerViewModel: AnswerViewModel by viewModels { ViewModelFactory(this) } + private val viewModel: AnswerViewModel by viewModels { ViewModelFactory(this) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.clickListener = this - binding.vm = answerViewModel + binding.vm = viewModel setQuestionTitle() } @@ -24,7 +24,7 @@ class AnswerActivity : BindingActivity(R.layout.activity_ when (view?.id) { R.id.iv_qna_back -> showBackDialog() R.id.iv_check -> { - if (!answerViewModel.answer.value.isNullOrBlank()) { + if (!viewModel.answer.value.isNullOrBlank()) { showConfirmDialog() } } @@ -40,8 +40,8 @@ class AnswerActivity : BindingActivity(R.layout.activity_ with(binding) { tvQuestion.text = intent.getStringExtra("question") tvTopic.text = intent.getStringExtra("topic") - val appbarTitle = intent.getStringExtra("section").toString() - layoutAppbar.titleText = appbarTitle + viewModel.appbarTitle.value = intent.getStringExtra("section") + layoutAppbar.titleText = viewModel.appbarTitle.value Log.e("hyeon", intent.getStringExtra("section").toString()) } } @@ -53,7 +53,7 @@ class AnswerActivity : BindingActivity(R.layout.activity_ putString("question", intent.getStringExtra("question")) putString("topic", intent.getStringExtra("topic")) putString("section", intent.getStringExtra("section")) - putString("answer", answerViewModel.answer.value) + putString("answer", viewModel.answer.value) } // 이 부분은 변수 안쓰고.. 코드 쓰고 싶음 (일단 서버연결 완료되면 해보고, 테스트도 해보자잉) confirmDialog.apply { arguments = bundle diff --git a/app/src/main/java/com/sopt/umbba_android/presentation/qna/ConfirmAnswerDialogFragment.kt b/app/src/main/java/com/sopt/umbba_android/presentation/qna/ConfirmAnswerDialogFragment.kt index 41e338c0..91d78852 100644 --- a/app/src/main/java/com/sopt/umbba_android/presentation/qna/ConfirmAnswerDialogFragment.kt +++ b/app/src/main/java/com/sopt/umbba_android/presentation/qna/ConfirmAnswerDialogFragment.kt @@ -63,7 +63,7 @@ class ConfirmAnswerDialogFragment : DialogFragment() { Toast.makeText(requireActivity(), "답변이 전송되었습니다.", Toast.LENGTH_SHORT).show() answerViewModel.postAnswer(AnswerRequestDto(arguments?.getString("answer"))) Log.e("hyeon", "answer 값은 = ${arguments?.getString("answer")}") - AnswerActivity().finish() + activity?.finish() dismiss() } } diff --git a/app/src/main/java/com/sopt/umbba_android/presentation/qna/QuestionAnswerActivity.kt b/app/src/main/java/com/sopt/umbba_android/presentation/qna/QuestionAnswerActivity.kt index dec44de3..b063e84d 100644 --- a/app/src/main/java/com/sopt/umbba_android/presentation/qna/QuestionAnswerActivity.kt +++ b/app/src/main/java/com/sopt/umbba_android/presentation/qna/QuestionAnswerActivity.kt @@ -35,11 +35,13 @@ class QuestionAnswerActivity : private fun observeQnaViewFlag() { val qnaId = intent.getLongExtra("questionId", -1) Log.e("hyeon", "qnaId activity에서" + qnaId.toString()) - if (qnaId == -1.toLong()) { + if (qnaId == -1L) { viewModel.getQuestionAnswer() + viewModel.isBeforeList.value = false observeQnaResponse() } else { viewModel.getListQuestionAnswer(qnaId) + viewModel.isBeforeList.value = true observeListQnaResponse() } } @@ -143,7 +145,7 @@ class QuestionAnswerActivity : with(binding) { tvAnswerOther.setLayerType(View.LAYER_TYPE_SOFTWARE, null).apply { if (isBlur) tvAnswerOther.paint.maskFilter = - BlurMaskFilter(13f, BlurMaskFilter.Blur.NORMAL) + BlurMaskFilter(16f, BlurMaskFilter.Blur.NORMAL) else tvAnswerOther.paint.maskFilter = null } } diff --git a/app/src/main/java/com/sopt/umbba_android/presentation/qna/viewmodel/AnswerViewModel.kt b/app/src/main/java/com/sopt/umbba_android/presentation/qna/viewmodel/AnswerViewModel.kt index e5df1cea..e6cc02d0 100644 --- a/app/src/main/java/com/sopt/umbba_android/presentation/qna/viewmodel/AnswerViewModel.kt +++ b/app/src/main/java/com/sopt/umbba_android/presentation/qna/viewmodel/AnswerViewModel.kt @@ -6,4 +6,5 @@ import androidx.lifecycle.ViewModel class AnswerViewModel : ViewModel() { var answer = MutableLiveData() + var appbarTitle = MutableLiveData() } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/umbba_android/presentation/qna/viewmodel/QuestionAnswerViewModel.kt b/app/src/main/java/com/sopt/umbba_android/presentation/qna/viewmodel/QuestionAnswerViewModel.kt index 7d19ed04..7dee5626 100644 --- a/app/src/main/java/com/sopt/umbba_android/presentation/qna/viewmodel/QuestionAnswerViewModel.kt +++ b/app/src/main/java/com/sopt/umbba_android/presentation/qna/viewmodel/QuestionAnswerViewModel.kt @@ -22,8 +22,8 @@ class QuestionAnswerViewModel(private val questionAnswerRepositoryImpl: Question var isOpponentAnswer = MutableLiveData() var appbarSection = MutableLiveData() - var isBeforeList = MutableLiveData(false) - var qnaId = MutableLiveData(-1) + + var isBeforeList = MutableLiveData() fun getQuestionAnswer() { viewModelScope.launch { diff --git a/app/src/main/java/com/sopt/umbba_android/presentation/setting/ManageAccountActivity.kt b/app/src/main/java/com/sopt/umbba_android/presentation/setting/ManageAccountActivity.kt index cf3668da..74e7e065 100644 --- a/app/src/main/java/com/sopt/umbba_android/presentation/setting/ManageAccountActivity.kt +++ b/app/src/main/java/com/sopt/umbba_android/presentation/setting/ManageAccountActivity.kt @@ -2,21 +2,26 @@ package com.sopt.umbba_android.presentation.setting import android.content.Intent import android.os.Bundle +import android.util.Log import android.view.View +import android.widget.Toast import androidx.activity.viewModels import com.sopt.umbba_android.R import com.sopt.umbba_android.databinding.ActivityManageAccountBinding +import com.sopt.umbba_android.presentation.login.LoginActivity import com.sopt.umbba_android.presentation.setting.viewmodel.ManageAccountViewModel +import com.sopt.umbba_android.util.ViewModelFactory import com.sopt.umbba_android.util.binding.BindingActivity class ManageAccountActivity : BindingActivity(R.layout.activity_manage_account), View.OnClickListener { - private val manageAccountViewModel by viewModels() + private val viewModel: ManageAccountViewModel by viewModels { ViewModelFactory(this) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.clickListener = this setClickEvent() + observeResponseStatus() } override fun onClick(view: View?) { @@ -25,10 +30,20 @@ class ManageAccountActivity : } } + private fun observeResponseStatus() { + viewModel.responseStatus.observe(this@ManageAccountActivity) { + if (it == 200) { + val intent = Intent(this, LoginActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + startActivity(intent) + } + } + } + private fun setClickEvent() { with(binding) { clLogout.setOnClickListener { - manageAccountViewModel.logout() + viewModel.logout() } clDeleteAccount.setOnClickListener { startActivity(Intent(this@ManageAccountActivity, DeleteAccountActivity::class.java)) diff --git a/app/src/main/java/com/sopt/umbba_android/presentation/setting/SettingFragment.kt b/app/src/main/java/com/sopt/umbba_android/presentation/setting/SettingFragment.kt index cb861aab..3c18358f 100644 --- a/app/src/main/java/com/sopt/umbba_android/presentation/setting/SettingFragment.kt +++ b/app/src/main/java/com/sopt/umbba_android/presentation/setting/SettingFragment.kt @@ -1,17 +1,37 @@ package com.sopt.umbba_android.presentation.setting +import android.Manifest import android.content.Intent +import android.content.pm.PackageManager import android.net.Uri import android.os.Bundle import android.view.View +import androidx.core.content.ContextCompat import com.sopt.umbba_android.R import com.sopt.umbba_android.databinding.FragmentSettingBinding import com.sopt.umbba_android.util.binding.BindingFragment +import com.sopt.umbba_android.util.fcm.MyFirebaseMessagingService class SettingFragment : BindingFragment(R.layout.fragment_setting) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setClickEvent() + checkNotificationPermission() + setSwitchNotification() + } + + private fun setSwitchNotification() { + binding.switchNotification.setOnCheckedChangeListener { buttonView, isChecked -> + MyFirebaseMessagingService().isSwitchChecked.value = isChecked + } + } + + private fun checkNotificationPermission() { + MyFirebaseMessagingService().isSwitchChecked.value = (ContextCompat.checkSelfPermission( + requireContext(), + Manifest.permission.POST_NOTIFICATIONS + ) == PackageManager.PERMISSION_GRANTED) + binding.switchNotification.isChecked = MyFirebaseMessagingService().isSwitchChecked.value!! } private fun setClickEvent() { diff --git a/app/src/main/java/com/sopt/umbba_android/presentation/setting/viewmodel/ManageAccountViewModel.kt b/app/src/main/java/com/sopt/umbba_android/presentation/setting/viewmodel/ManageAccountViewModel.kt index cbb70428..cc84bd2c 100644 --- a/app/src/main/java/com/sopt/umbba_android/presentation/setting/viewmodel/ManageAccountViewModel.kt +++ b/app/src/main/java/com/sopt/umbba_android/presentation/setting/viewmodel/ManageAccountViewModel.kt @@ -1,5 +1,7 @@ package com.sopt.umbba_android.presentation.setting.viewmodel +import android.util.Log +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.sopt.umbba_android.data.repository.SettingRepositoryImpl @@ -7,9 +9,19 @@ import kotlinx.coroutines.launch class ManageAccountViewModel(private val settingRepositoryImpl: SettingRepositoryImpl) : ViewModel() { - fun logout() { + + var responseStatus = MutableLiveData() + fun logout(): Int? { viewModelScope.launch { settingRepositoryImpl.logout() + .onSuccess { response -> + Log.e("hyeon", "logout 성공") + responseStatus.value = response.status + }.onFailure { error -> + Log.e("hyeon", "logout 실패 " + error.message) + responseStatus.value = -1 + } } + return responseStatus.value } } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/umbba_android/util/ViewModelFactory.kt b/app/src/main/java/com/sopt/umbba_android/util/ViewModelFactory.kt index 793c9850..dd291d99 100644 --- a/app/src/main/java/com/sopt/umbba_android/util/ViewModelFactory.kt +++ b/app/src/main/java/com/sopt/umbba_android/util/ViewModelFactory.kt @@ -7,18 +7,17 @@ import com.sopt.umbba_android.data.datasource.HomeRemoteDataSource import com.sopt.umbba_android.data.datasource.ListRemoteDataSource import com.sopt.umbba_android.data.datasource.LoginRemoteDataSource import com.sopt.umbba_android.data.datasource.QuestionAnswerRemoteDataSource -import com.sopt.umbba_android.data.model.ServicePool import com.sopt.umbba_android.data.repository.HomeRepositoryImpl import com.sopt.umbba_android.data.repository.ListRepositoryImpl import com.sopt.umbba_android.data.repository.LoginRepositoryImpl import com.sopt.umbba_android.data.repository.QuestionAnswerRepositoryImpl -import com.sopt.umbba_android.data.service.LoginService import com.sopt.umbba_android.presentation.home.viewmodel.HomeViewModel import com.sopt.umbba_android.presentation.list.viewmodel.ListViewModel import com.sopt.umbba_android.presentation.login.viewmodel.LoginViewModel import com.sopt.umbba_android.presentation.qna.viewmodel.AnswerViewModel import com.sopt.umbba_android.presentation.qna.viewmodel.ConfirmAnswerDialogFragmentViewModel import com.sopt.umbba_android.presentation.qna.viewmodel.QuestionAnswerViewModel +import com.sopt.umbba_android.presentation.setting.viewmodel.ManageAccountViewModel class ViewModelFactory(private val context: Context) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { @@ -55,14 +54,6 @@ class ViewModelFactory(private val context: Context) : ViewModelProvider.Factory ) ) as T } - - if (modelClass.isAssignableFrom(LoginViewModel::class.java)) { - return LoginViewModel( - LoginRepositoryImpl( - LoginRemoteDataSource() - ) - ) as T - } throw IllegalArgumentException("Unknown ViewModel Class") } } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/umbba_android/util/fcm/MyFirebaseMessagingService.kt b/app/src/main/java/com/sopt/umbba_android/util/fcm/MyFirebaseMessagingService.kt index 5486b757..fa35a52d 100644 --- a/app/src/main/java/com/sopt/umbba_android/util/fcm/MyFirebaseMessagingService.kt +++ b/app/src/main/java/com/sopt/umbba_android/util/fcm/MyFirebaseMessagingService.kt @@ -5,9 +5,9 @@ import android.app.NotificationManager import android.app.PendingIntent import android.content.Context import android.content.Intent -import android.os.Build import android.util.Log import androidx.core.app.NotificationCompat +import androidx.lifecycle.MutableLiveData import com.google.android.gms.tasks.OnCompleteListener import com.google.firebase.messaging.FirebaseMessaging import com.google.firebase.messaging.FirebaseMessagingService @@ -17,6 +17,8 @@ import com.sopt.umbba_android.presentation.qna.QuestionAnswerActivity import timber.log.Timber class MyFirebaseMessagingService : FirebaseMessagingService() { + var isSwitchChecked = MutableLiveData(false) + override fun onNewToken(token: String) { super.onNewToken(token) Timber.tag("hyeon").e("fcm token : " + token) @@ -26,7 +28,15 @@ class MyFirebaseMessagingService : FirebaseMessagingService() { super.onMessageReceived(message) Timber.tag("hyeon").e(message.notification.toString()) Timber.tag("hyeon").e(message.data.toString()) - createNotification(message) + setNotificationOnOff(isSwitchChecked.value!!, message) + } + + private fun setNotificationOnOff(isSwitchChecked: Boolean, message: RemoteMessage) { + if (isSwitchChecked) { + createNotification(message) + } else { + Log.e("hyeon", "알림 끈 상태") + } } private fun createNotification(message: RemoteMessage) { diff --git a/app/src/main/res/layout/activity_answer.xml b/app/src/main/res/layout/activity_answer.xml index ab0b976f..59b25acb 100644 --- a/app/src/main/res/layout/activity_answer.xml +++ b/app/src/main/res/layout/activity_answer.xml @@ -34,7 +34,6 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:titleText="@{``}" app:visibleCheck="@{true}" /> @@ -137,11 +137,13 @@