From dca96b81a6e0335ca1b0d2295d482dfe2b229138 Mon Sep 17 00:00:00 2001 From: blueme0 Date: Fri, 9 Feb 2024 21:37:59 +0900 Subject: [PATCH 01/11] =?UTF-8?q?[fix/#132]=20=EC=86=8C=EC=85=9C=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EC=9B=B9=EB=B7=B0=20disable=20CookieManag?= =?UTF-8?q?er?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../teumteum/presentation/signin/SocialWebViewActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/signin/SocialWebViewActivity.kt b/app/src/main/java/com/teumteum/teumteum/presentation/signin/SocialWebViewActivity.kt index ef2b230f..fd8e0176 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/signin/SocialWebViewActivity.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/signin/SocialWebViewActivity.kt @@ -50,7 +50,7 @@ class SocialWebViewActivity provider = intent.getStringExtra(EXTRA_KEY_PROVIDER).toString() initProvider(provider) - initCookieManager() +// initCookieManager() initAppBarLayout() initWebView() observer() From a5284e4f763f03c475e00d7c676d0c0557c94b8b Mon Sep 17 00:00:00 2001 From: blueme0 Date: Mon, 12 Feb 2024 10:56:37 +0900 Subject: [PATCH 02/11] =?UTF-8?q?[feat/#133]=20=EC=95=8C=EB=A6=BC=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20UI=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 3 + .../presentation/home/HomeFragment.kt | 8 +- .../notification/AlertsListActivity.kt | 78 ++++++++++++++++++ .../notification/AlertsListAdapter.kt | 80 +++++++++++++++++++ .../main/res/layout/activity_alerts_list.xml | 75 +++++++++++++++++ app/src/main/res/layout/item_alerts_list.xml | 55 +++++++++++++ app/src/main/res/values/strings.xml | 3 + .../com/teumteum/domain/entity/TeumAlert.kt | 12 +++ 8 files changed, 313 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/teumteum/teumteum/presentation/notification/AlertsListActivity.kt create mode 100644 app/src/main/java/com/teumteum/teumteum/presentation/notification/AlertsListAdapter.kt create mode 100644 app/src/main/res/layout/activity_alerts_list.xml create mode 100644 app/src/main/res/layout/item_alerts_list.xml create mode 100644 core/domain/src/main/java/com/teumteum/domain/entity/TeumAlert.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d5d22693..59290604 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -108,6 +108,9 @@ + )?.openActivitySlideAnimation() + } + } ) ) } diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/notification/AlertsListActivity.kt b/app/src/main/java/com/teumteum/teumteum/presentation/notification/AlertsListActivity.kt new file mode 100644 index 00000000..3c6a8e1e --- /dev/null +++ b/app/src/main/java/com/teumteum/teumteum/presentation/notification/AlertsListActivity.kt @@ -0,0 +1,78 @@ +package com.teumteum.teumteum.presentation.notification + +import android.os.Bundle +import com.teumteum.base.BindingActivity +import com.teumteum.base.component.appbar.AppBarLayout +import com.teumteum.base.component.appbar.AppBarMenu +import com.teumteum.base.databinding.LayoutCommonAppbarBinding +import com.teumteum.domain.entity.TeumAlert +import com.teumteum.teumteum.R +import com.teumteum.teumteum.databinding.ActivityAlertsListBinding + +class AlertsListActivity + : BindingActivity(R.layout.activity_alerts_list), AppBarLayout { + + private lateinit var adapter: AlertsListAdapter + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + initAppBarLayout() + initList() + } + + override val appBarBinding: LayoutCommonAppbarBinding + get() = binding.appBar + + override fun initAppBarLayout() { + setAppBarHeight(48) + + addMenuToLeft( + AppBarMenu.IconStyle( + resourceId = R.drawable.ic_arrow_left_l, + useRippleEffect = false, + clickEvent = ::finish + ) + ) + setAppBarTitleText(R.string.alerts_list_title) + } + + private fun initItems() { + adapter.setItems(listOf( + TeumAlert("틈 채우기", "한별님이 당신을 추천했어요!", RECOMMEND_USER, "2024-01-30T16:33:00", false), + TeumAlert("틈 채우기", "한별님이 당신을 추천했어요!", RECOMMEND_USER, "2024-01-31T16:33:00", false), + TeumAlert("틈 채우기", "한별님이 당신을 추천했어요!", RECOMMEND_USER, "2024-02-10T16:33:00", false), + TeumAlert("틈 채우기", "한별님이 당신을 추천했어요!", RECOMMEND_USER, "2024-02-11T16:33:00", false), + TeumAlert("틈 채우기", "한별님이 당신을 추천했어요!", RECOMMEND_USER, "2024-02-12T09:33:00", false), + TeumAlert("틈 채우기", "한별님이 당신을 추천했어요!", RECOMMEND_USER, "2024-02-12T10:33:00", false) + )) + } + + private fun initList() { + adapter = AlertsListAdapter { + when (it.type) { + // 알림 리스트에서 클릭 시 이동하는 정책이 있다면 + BEFORE_MEETING -> { + // 틈틈으로 이동 + // openActivitySlideAnimation() + } + END_MEETING -> { + // 해당 모임 종료 화면으로 이동 + // openActivitySlideAnimation() + } + RECOMMEND_USER -> { + // 마이페이지로 이동 + // openActivitySlideAnimation() + } + } + } + initItems() + binding.rvAlertsList.adapter = adapter + } + + companion object { + private const val BEFORE_MEETING = "BEFORE_MEETING" + private const val END_MEETING = "END_MEETING" + private const val RECOMMEND_USER = "RECOMMEND_USER" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/notification/AlertsListAdapter.kt b/app/src/main/java/com/teumteum/teumteum/presentation/notification/AlertsListAdapter.kt new file mode 100644 index 00000000..018876cb --- /dev/null +++ b/app/src/main/java/com/teumteum/teumteum/presentation/notification/AlertsListAdapter.kt @@ -0,0 +1,80 @@ +package com.teumteum.teumteum.presentation.notification + +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.teumteum.base.R.* +import com.teumteum.base.util.extension.setOnSingleClickListener +import com.teumteum.domain.entity.TeumAlert +import com.teumteum.teumteum.databinding.ItemAlertsListBinding +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter + +class AlertsListAdapter(private val itemClick: (TeumAlert) -> (Unit)) : + RecyclerView.Adapter() { + private val alertList = mutableListOf() + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): AlertsListViewHolder { + val binding = ItemAlertsListBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + return AlertsListViewHolder(binding, parent.context, itemClick) + } + + override fun onBindViewHolder(holder: AlertsListViewHolder, position: Int) { + holder.onBind(alertList[position]) + } + + override fun getItemCount(): Int = alertList.size + + fun setItems(newItems: List) { + alertList.clear() + alertList.addAll(newItems.sortedByDescending { + LocalDateTime.parse(it.createdAt, DateTimeFormatter.ISO_LOCAL_DATE_TIME) + }) + notifyDataSetChanged() + } + + class AlertsListViewHolder( + private val binding: ItemAlertsListBinding, + private val context: Context, + private val itemClick: (TeumAlert) -> (Unit) + ) : RecyclerView.ViewHolder(binding.root) { + + fun onBind(item: TeumAlert) { + binding.tvTitle.text = item.title + binding.tvContent.text = item.body + binding.tvTime.text = getTimeDifference(item.createdAt) + + if (!item.isRead) { + binding.root.setBackgroundColor(context.getColor(color.elevation_level01)) + } else { + binding.root.setBackgroundColor(context.getColor(color.transparent)) + } + binding.root.setOnSingleClickListener { + itemClick(item) + } + } + + private fun getTimeDifference(inputDateTime: String): String { + val currentTime = LocalDateTime.now() + val formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME + val inputTime = LocalDateTime.parse(inputDateTime, formatter) + + val diffInMinutes = java.time.Duration.between(inputTime, currentTime).toMinutes() + val diffInHours = java.time.Duration.between(inputTime, currentTime).toHours() + + return when { + diffInMinutes < 60 -> "${diffInMinutes}분 전" + diffInHours < 24 -> "${diffInHours}시간 전" + else -> "${inputTime.monthValue}월 ${inputTime.dayOfMonth}일" + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_alerts_list.xml b/app/src/main/res/layout/activity_alerts_list.xml new file mode 100644 index 00000000..759e9a94 --- /dev/null +++ b/app/src/main/res/layout/activity_alerts_list.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_alerts_list.xml b/app/src/main/res/layout/item_alerts_list.xml new file mode 100644 index 00000000..5f1ffb40 --- /dev/null +++ b/app/src/main/res/layout/item_alerts_list.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + \ 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 da7142de..db0550c9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -338,5 +338,8 @@ 서로의 관심사 틈을 채우기 teum_notification_channel + 알림 + 알림이 아직 없어요 + 최대 한 달 전까지의 알림을 확인할 수 있어요 \ No newline at end of file diff --git a/core/domain/src/main/java/com/teumteum/domain/entity/TeumAlert.kt b/core/domain/src/main/java/com/teumteum/domain/entity/TeumAlert.kt new file mode 100644 index 00000000..18ad702c --- /dev/null +++ b/core/domain/src/main/java/com/teumteum/domain/entity/TeumAlert.kt @@ -0,0 +1,12 @@ +package com.teumteum.domain.entity + +import kotlinx.serialization.Serializable + +@Serializable +data class TeumAlert ( + val title: String, + val body: String, + val type: String, + val createdAt: String, + val isRead: Boolean +) \ No newline at end of file From 7a4d63c09a082e6c65c89a9eea2ae333946e2853 Mon Sep 17 00:00:00 2001 From: blueme0 Date: Mon, 12 Feb 2024 11:39:57 +0900 Subject: [PATCH 03/11] =?UTF-8?q?[feat/#133]=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20-=20=ED=91=B8=EC=8B=9C=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=20on/off=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../teumteum/config/TeumMessagingService.kt | 20 ++++++++++--------- .../setting/viewModel/SettingViewModel.kt | 5 +++-- .../data/local/TeumTeumDataStoreImpl.kt | 5 +++++ .../data/repository/SettingRepositoryImpl.kt | 8 +++++++- .../com/teumteum/domain/TeumTeumDataStore.kt | 1 + .../domain/repository/SettingRepository.kt | 2 ++ 6 files changed, 29 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/teumteum/teumteum/config/TeumMessagingService.kt b/app/src/main/java/com/teumteum/teumteum/config/TeumMessagingService.kt index 8eb945c1..64ad7b3a 100644 --- a/app/src/main/java/com/teumteum/teumteum/config/TeumMessagingService.kt +++ b/app/src/main/java/com/teumteum/teumteum/config/TeumMessagingService.kt @@ -52,15 +52,17 @@ class TeumMessagingService : FirebaseMessagingService() { override fun onMessageReceived(message: RemoteMessage) { super.onMessageReceived(message) - if (dataStore.isLogin) { - if (message.data.isNotEmpty() && message.data["title"].toString() != EMPTY) { - sendNotificationAlarm( - Message(message.data["title"].toString(), message.data["content"].toString()) - ) - } - else { - message.notification?.let { - sendNotificationAlarm(Message(it.title.toString(), it.body.toString())) + if (dataStore.onNotification) { + if (dataStore.isLogin) { + if (message.data.isNotEmpty() && message.data["title"].toString() != EMPTY) { + sendNotificationAlarm( + Message(message.data["title"].toString(), message.data["content"].toString()) + ) + } + else { + message.notification?.let { + sendNotificationAlarm(Message(it.title.toString(), it.body.toString())) + } } } } diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/mypage/setting/viewModel/SettingViewModel.kt b/app/src/main/java/com/teumteum/teumteum/presentation/mypage/setting/viewModel/SettingViewModel.kt index 19881687..51278d8a 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/mypage/setting/viewModel/SettingViewModel.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/mypage/setting/viewModel/SettingViewModel.kt @@ -142,11 +142,12 @@ class SettingViewModel @Inject constructor( return false } - private val _alarmState = MutableStateFlow(false) + private val _alarmState = MutableStateFlow(settingRepository.getNotification()) val alarmState: StateFlow = _alarmState.asStateFlow() fun onToggleChange(newToggleState: Boolean) { - _alarmState.value = newToggleState + settingRepository.setNotification(newToggleState) + _alarmState.value = settingRepository.getNotification() } private val _settingStatus = MutableStateFlow(SettingStatus.DEFAULT) diff --git a/core/data/src/main/java/com/teumteum/data/local/TeumTeumDataStoreImpl.kt b/core/data/src/main/java/com/teumteum/data/local/TeumTeumDataStoreImpl.kt index 3d9f5e1d..98d79a96 100644 --- a/core/data/src/main/java/com/teumteum/data/local/TeumTeumDataStoreImpl.kt +++ b/core/data/src/main/java/com/teumteum/data/local/TeumTeumDataStoreImpl.kt @@ -37,6 +37,10 @@ class TeumTeumDataStoreImpl @Inject constructor( get() = userPref.getBoolean(PREF_ASKED_NOTIFICATION, false) set(value) = userPref.edit { putBoolean(PREF_ASKED_NOTIFICATION, value)} + override var onNotification: Boolean + get() = userPref.getBoolean(PREF_ON_NOTIFICATION, true) + set(value) = userPref.edit { putBoolean(PREF_ON_NOTIFICATION, value)} + override fun clearLocalPref() = userPref.edit { clear() } companion object { @@ -47,5 +51,6 @@ class TeumTeumDataStoreImpl @Inject constructor( private const val PREF_IS_FIRST_AFTER_INSTALL = "IS_FIRST_AFTER_INSTALL" private const val PREF_DEVICE_TOKEN = "DEVICE_TOKEN" private const val PREF_ASKED_NOTIFICATION = "ASKED_NOTIFICATION" + private const val PREF_ON_NOTIFICATION = "ON_NOTIFICATION" } } diff --git a/core/data/src/main/java/com/teumteum/data/repository/SettingRepositoryImpl.kt b/core/data/src/main/java/com/teumteum/data/repository/SettingRepositoryImpl.kt index a4cc5d8c..e1395815 100644 --- a/core/data/src/main/java/com/teumteum/data/repository/SettingRepositoryImpl.kt +++ b/core/data/src/main/java/com/teumteum/data/repository/SettingRepositoryImpl.kt @@ -9,7 +9,8 @@ import com.teumteum.domain.repository.SettingRepository import javax.inject.Inject class SettingRepositoryImpl @Inject constructor( - private val dataSource: RemoteSettingDataSource + private val dataSource: RemoteSettingDataSource, + private val dataStore: TeumTeumDataStore ): SettingRepository { override suspend fun logOut(): Result { return runCatching { @@ -47,5 +48,10 @@ class SettingRepositoryImpl @Inject constructor( } } + override fun setNotification(isActivated: Boolean) { + dataStore.onNotification = isActivated + } + + override fun getNotification(): Boolean = dataStore.onNotification } \ No newline at end of file diff --git a/core/domain/src/main/java/com/teumteum/domain/TeumTeumDataStore.kt b/core/domain/src/main/java/com/teumteum/domain/TeumTeumDataStore.kt index 7953fc9a..7aba189b 100644 --- a/core/domain/src/main/java/com/teumteum/domain/TeumTeumDataStore.kt +++ b/core/domain/src/main/java/com/teumteum/domain/TeumTeumDataStore.kt @@ -9,6 +9,7 @@ interface TeumTeumDataStore { var userInfo: String var deviceToken: String var askedNotification: Boolean + var onNotification: Boolean fun clearLocalPref() } diff --git a/core/domain/src/main/java/com/teumteum/domain/repository/SettingRepository.kt b/core/domain/src/main/java/com/teumteum/domain/repository/SettingRepository.kt index 0c979cf2..1bdd98cb 100644 --- a/core/domain/src/main/java/com/teumteum/domain/repository/SettingRepository.kt +++ b/core/domain/src/main/java/com/teumteum/domain/repository/SettingRepository.kt @@ -8,4 +8,6 @@ interface SettingRepository { suspend fun signOut(withDrawReasons: WithDrawReasons): Result suspend fun getMyPageOpenMeeting(participantUserId: Long): Result> suspend fun getMyPageClosedMeeting(participantUserId: Long): Result> + fun setNotification(isActivated: Boolean) + fun getNotification(): Boolean } \ No newline at end of file From 3176f4443c15c6a9a0d1d710635d99a6723e8186 Mon Sep 17 00:00:00 2001 From: blueme0 Date: Mon, 12 Feb 2024 14:05:27 +0900 Subject: [PATCH 04/11] =?UTF-8?q?[feat/#133]=20=EC=95=8C=EB=A6=BC=20type?= =?UTF-8?q?=20=EB=B3=84=EB=A1=9C=20=ED=99=94=EB=A9=B4=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../teumteum/config/TeumMessagingService.kt | 23 +++++++++-------- .../teumteum/presentation/MainActivity.kt | 25 +++++++++++++++++-- .../presentation/splash/SplashActivity.kt | 15 ++++++++++- .../com/teumteum/domain/entity/Message.kt | 9 +++++++ 4 files changed, 59 insertions(+), 13 deletions(-) create mode 100644 core/domain/src/main/java/com/teumteum/domain/entity/Message.kt diff --git a/app/src/main/java/com/teumteum/teumteum/config/TeumMessagingService.kt b/app/src/main/java/com/teumteum/teumteum/config/TeumMessagingService.kt index 64ad7b3a..06e28073 100644 --- a/app/src/main/java/com/teumteum/teumteum/config/TeumMessagingService.kt +++ b/app/src/main/java/com/teumteum/teumteum/config/TeumMessagingService.kt @@ -11,6 +11,7 @@ import com.google.firebase.messaging.RemoteMessage import com.teumteum.data.model.request.toDeviceToken import com.teumteum.data.service.UserService import com.teumteum.domain.TeumTeumDataStore +import com.teumteum.domain.entity.Message import com.teumteum.teumteum.R import com.teumteum.teumteum.presentation.splash.SplashActivity import dagger.hilt.android.AndroidEntryPoint @@ -54,16 +55,17 @@ class TeumMessagingService : FirebaseMessagingService() { if (dataStore.onNotification) { if (dataStore.isLogin) { - if (message.data.isNotEmpty() && message.data["title"].toString() != EMPTY) { - sendNotificationAlarm( - Message(message.data["title"].toString(), message.data["content"].toString()) - ) + val alertMessage = Message("", "", "") + if (message.data.isNotEmpty()) { + alertMessage.title = message.notification?.title.toString() + alertMessage.body = message.notification?.body.toString() + alertMessage.type = message.data["type"].toString() } - else { - message.notification?.let { - sendNotificationAlarm(Message(it.title.toString(), it.body.toString())) - } + if (alertMessage.type == END_MEETING) { + alertMessage.meetingId = message.data["meetingId"]?.toInt() + alertMessage.participants = message.data["participants"]?.toList()?.map { it.digitToInt() } } + if (alertMessage.title.isNotEmpty()) sendNotificationAlarm(alertMessage) } } } @@ -72,6 +74,8 @@ class TeumMessagingService : FirebaseMessagingService() { val requestCode = (System.currentTimeMillis() % 10000).toInt() val intent = Intent(this, SplashActivity::class.java) intent.putExtra("isFromAlarm", true) + intent.putExtra("message", message) + Timber.tag("teum-alerts").d("message: ${message.title}, ${message.type}, ${message.body}, ${message.meetingId}, ${message.participants.toString()}") intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) val pendingIntent = PendingIntent.getActivity( @@ -96,7 +100,6 @@ class TeumMessagingService : FirebaseMessagingService() { companion object { const val EMPTY = "null" + private const val END_MEETING = "END_MEETING" } - - private data class Message(var title: String, var body: String) } \ No newline at end of file diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/MainActivity.kt b/app/src/main/java/com/teumteum/teumteum/presentation/MainActivity.kt index d05ff5d5..99a433cb 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/MainActivity.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/MainActivity.kt @@ -15,6 +15,7 @@ import androidx.navigation.ui.setupWithNavController import com.teumteum.base.BindingActivity import com.teumteum.base.util.extension.boolExtra import com.teumteum.base.util.extension.intExtra +import com.teumteum.domain.entity.Message import com.teumteum.teumteum.R import com.teumteum.teumteum.databinding.ActivityMainBinding import com.teumteum.teumteum.presentation.home.HomeFragmentDirections @@ -44,7 +45,20 @@ class MainActivity : BindingActivity(R.layout.activity_main if (isFromAlarm) { - val action = HomeFragmentDirections.actionHomeFragmentToFragmentFamiliar() + val message = intent.getSerializableExtra(MESSAGE) as Message + var action = HomeFragmentDirections.actionHomeFragmentToFragmentFamiliar() + when (message.type) { + BEFORE_MEETING -> { + } + END_MEETING -> { +// val meetingId = message.meetingId +// val participants = message.participants +// action = HomeFragmentDirections.{홈 -> 유저리뷰로 이동하는 navi} + } + RECOMMEND_USER -> { + action = HomeFragmentDirections.actionHomeFragmentToFragmentMyPage() + } + } val navHostFragment = supportFragmentManager.findFragmentById(R.id.fl_main) as NavHostFragment navHostFragment.navController.navigate(action) } @@ -138,7 +152,14 @@ class MainActivity : BindingActivity(R.layout.activity_main } fun getIntent(context: Context, id: Int, isFromAlarm: Boolean = false) = Intent(context, MainActivity::class.java).apply { putExtra("id", id) - putExtra("isFromAlarm", isFromAlarm) + putExtra(IS_FROM_ALARM, isFromAlarm) } + + private const val IS_FROM_ALARM = "isFromAlarm" + private const val MESSAGE = "message" + + private const val BEFORE_MEETING = "BEFORE_MEETING" + private const val END_MEETING = "END_MEETING" + private const val RECOMMEND_USER = "RECOMMEND_USER" } } diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/splash/SplashActivity.kt b/app/src/main/java/com/teumteum/teumteum/presentation/splash/SplashActivity.kt index 681d39ed..db620d33 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/splash/SplashActivity.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/splash/SplashActivity.kt @@ -1,6 +1,7 @@ package com.teumteum.teumteum.presentation.splash import android.content.Intent +import android.os.Build import android.os.Bundle import android.os.Handler import android.os.Looper @@ -9,6 +10,7 @@ import androidx.appcompat.app.AlertDialog import androidx.lifecycle.lifecycleScope import com.teumteum.base.BindingActivity import com.teumteum.base.util.extension.defaultSnackBar +import com.teumteum.domain.entity.Message import com.teumteum.teumteum.R import com.teumteum.teumteum.databinding.ActivitySplashBinding import com.teumteum.teumteum.presentation.MainActivity @@ -25,15 +27,23 @@ class SplashActivity private val viewModel by viewModels() private var isFromAlarm = false + private var message = Message("", "", "") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) isFromAlarm = intent.getBooleanExtra(IS_FROM_ALARM, false) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) getMessage() checkNetwork() setUpObserver() } + private fun getMessage() { + if (isFromAlarm) { + message = intent.getSerializableExtra(MESSAGE) as Message + } + } + private fun setUpObserver() { viewModel.myInfo.observe(this) { AuthUtils.setMyInfo(context = this, myInfo = it) @@ -108,7 +118,9 @@ class SplashActivity } private fun startHomeScreen() { - startActivity(MainActivity.getIntent(this, -1, isFromAlarm = isFromAlarm)) + val intent = MainActivity.getIntent(this, -1, isFromAlarm = isFromAlarm) + if (isFromAlarm) intent.putExtra(MESSAGE, message) + startActivity(intent) finish() } @@ -118,5 +130,6 @@ class SplashActivity const val HAVE_TO_SIGN_IN = 2 const val IS_FROM_ALARM = "isFromAlarm" + const val MESSAGE = "message" } } \ No newline at end of file diff --git a/core/domain/src/main/java/com/teumteum/domain/entity/Message.kt b/core/domain/src/main/java/com/teumteum/domain/entity/Message.kt new file mode 100644 index 00000000..a11f403d --- /dev/null +++ b/core/domain/src/main/java/com/teumteum/domain/entity/Message.kt @@ -0,0 +1,9 @@ +package com.teumteum.domain.entity + +data class Message( + var title: String, + var body: String, + var type: String, + var meetingId: Int? = -1, + var participants: List? = listOf() +): java.io.Serializable \ No newline at end of file From be6876df2df6c5ca2c4969664eed2c12a18c5bf0 Mon Sep 17 00:00:00 2001 From: blueme0 Date: Mon, 12 Feb 2024 15:05:20 +0900 Subject: [PATCH 05/11] =?UTF-8?q?[feat/#133]=20=EC=95=8C=EB=A6=BC=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=84=9C=EB=B2=84=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notification/AlertsListActivity.kt | 32 ++++++++++++++- .../notification/AlertsViewModel.kt | 40 +++++++++++++++++++ .../datasource/remote/RemoteUserDataSource.kt | 5 +++ .../data/repository/UserRepositoryImpl.kt | 6 +++ .../com/teumteum/data/service/UserService.kt | 4 ++ .../java/com/teumteum/domain/entity/Alerts.kt | 8 ++++ .../domain/repository/UserRepository.kt | 4 +- 7 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/teumteum/teumteum/presentation/notification/AlertsViewModel.kt create mode 100644 core/domain/src/main/java/com/teumteum/domain/entity/Alerts.kt diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/notification/AlertsListActivity.kt b/app/src/main/java/com/teumteum/teumteum/presentation/notification/AlertsListActivity.kt index 3c6a8e1e..54177ac5 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/notification/AlertsListActivity.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/notification/AlertsListActivity.kt @@ -1,24 +1,37 @@ package com.teumteum.teumteum.presentation.notification import android.os.Bundle +import androidx.activity.viewModels +import androidx.core.view.isVisible +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope import com.teumteum.base.BindingActivity import com.teumteum.base.component.appbar.AppBarLayout import com.teumteum.base.component.appbar.AppBarMenu import com.teumteum.base.databinding.LayoutCommonAppbarBinding +import com.teumteum.base.util.extension.defaultToast import com.teumteum.domain.entity.TeumAlert import com.teumteum.teumteum.R import com.teumteum.teumteum.databinding.ActivityAlertsListBinding +import com.teumteum.teumteum.presentation.group.GroupListUiState +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +@AndroidEntryPoint class AlertsListActivity : BindingActivity(R.layout.activity_alerts_list), AppBarLayout { private lateinit var adapter: AlertsListAdapter + private val viewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) initAppBarLayout() initList() + viewModel.getAlerts() + observe() } override val appBarBinding: LayoutCommonAppbarBinding @@ -48,6 +61,24 @@ class AlertsListActivity )) } + private fun observe() { + viewModel.alertsData.flowWithLifecycle(lifecycle) + .onEach { + binding.clEmpty.isVisible = it is AlertsListUiState.Empty + binding.tvNoticeEmpty.isVisible = it !is AlertsListUiState.Empty + binding.rvAlertsList.isVisible = it !is AlertsListUiState.Empty + when (it) { + is AlertsListUiState.SetAlerts -> { + adapter.setItems(it.data) + } + is AlertsListUiState.Failure -> { + defaultToast(it.msg) + } + else -> {} + } + }.launchIn(lifecycleScope) + } + private fun initList() { adapter = AlertsListAdapter { when (it.type) { @@ -66,7 +97,6 @@ class AlertsListActivity } } } - initItems() binding.rvAlertsList.adapter = adapter } diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/notification/AlertsViewModel.kt b/app/src/main/java/com/teumteum/teumteum/presentation/notification/AlertsViewModel.kt new file mode 100644 index 00000000..d5df66e9 --- /dev/null +++ b/app/src/main/java/com/teumteum/teumteum/presentation/notification/AlertsViewModel.kt @@ -0,0 +1,40 @@ +package com.teumteum.teumteum.presentation.notification + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.teumteum.domain.entity.TeumAlert +import com.teumteum.domain.repository.UserRepository +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 AlertsViewModel @Inject constructor( + private val repository: UserRepository +) : ViewModel() { + + private val _alertsData = MutableStateFlow(AlertsListUiState.Init) + val alertsData: StateFlow = _alertsData + + fun getAlerts() { + viewModelScope.launch { + repository.getAlerts() + .onSuccess { + if (it.alerts.isEmpty()) _alertsData.value = AlertsListUiState.Empty + else _alertsData.value = AlertsListUiState.SetAlerts(it.alerts) + } + .onFailure { + _alertsData.value = AlertsListUiState.Failure("알림 가져오기 실패") + } + } + } +} + +sealed interface AlertsListUiState { + object Init : AlertsListUiState + object Empty : AlertsListUiState + data class SetAlerts(val data: List) : AlertsListUiState + data class Failure(val msg: String) : AlertsListUiState +} \ No newline at end of file diff --git a/core/data/src/main/java/com/teumteum/data/datasource/remote/RemoteUserDataSource.kt b/core/data/src/main/java/com/teumteum/data/datasource/remote/RemoteUserDataSource.kt index 484ac2d6..da4901a2 100644 --- a/core/data/src/main/java/com/teumteum/data/datasource/remote/RemoteUserDataSource.kt +++ b/core/data/src/main/java/com/teumteum/data/datasource/remote/RemoteUserDataSource.kt @@ -3,6 +3,7 @@ package com.teumteum.data.datasource.remote import com.teumteum.data.model.request.RequestDeviceToken import com.teumteum.data.model.request.RequestUserInfoWithOAuthId import com.teumteum.data.service.UserService +import com.teumteum.domain.entity.Alerts import com.teumteum.domain.entity.Friend import com.teumteum.domain.entity.FriendRecommend import com.teumteum.domain.entity.SignUpResult @@ -59,4 +60,8 @@ class RemoteUserDataSource @Inject constructor( suspend fun patchDeviceToken(token: RequestDeviceToken): Boolean { return service.patchDeviceToken(token).isSuccessful } + + suspend fun getAlerts(): Alerts { + return service.getAlerts() + } } \ No newline at end of file diff --git a/core/data/src/main/java/com/teumteum/data/repository/UserRepositoryImpl.kt b/core/data/src/main/java/com/teumteum/data/repository/UserRepositoryImpl.kt index 11ef331c..ac565ba2 100644 --- a/core/data/src/main/java/com/teumteum/data/repository/UserRepositoryImpl.kt +++ b/core/data/src/main/java/com/teumteum/data/repository/UserRepositoryImpl.kt @@ -5,6 +5,7 @@ import com.google.gson.GsonBuilder import com.teumteum.domain.TeumTeumDataStore import com.teumteum.data.datasource.remote.RemoteUserDataSource import com.teumteum.data.model.request.RequestUserInfo +import com.teumteum.domain.entity.Alerts import com.teumteum.domain.entity.Friend import com.teumteum.domain.entity.FriendMyPage import com.teumteum.domain.entity.FriendRecommend @@ -101,4 +102,9 @@ class UserRepositoryImpl @Inject constructor( } } + override suspend fun getAlerts(): Result { + return runCatching { + dataSource.getAlerts() + } + } } \ No newline at end of file diff --git a/core/data/src/main/java/com/teumteum/data/service/UserService.kt b/core/data/src/main/java/com/teumteum/data/service/UserService.kt index 7264e55d..490dc399 100644 --- a/core/data/src/main/java/com/teumteum/data/service/UserService.kt +++ b/core/data/src/main/java/com/teumteum/data/service/UserService.kt @@ -2,6 +2,7 @@ package com.teumteum.data.service import com.teumteum.data.model.request.RequestDeviceToken import com.teumteum.data.model.request.RequestUserInfoWithOAuthId +import com.teumteum.domain.entity.Alerts import com.teumteum.domain.entity.Friend import com.teumteum.domain.entity.FriendRecommend import com.teumteum.domain.entity.SignUpResult @@ -65,5 +66,8 @@ interface UserService { suspend fun patchDeviceToken( @Body token: RequestDeviceToken ): Response + + @GET("alerts") + suspend fun getAlerts(): Alerts } diff --git a/core/domain/src/main/java/com/teumteum/domain/entity/Alerts.kt b/core/domain/src/main/java/com/teumteum/domain/entity/Alerts.kt new file mode 100644 index 00000000..9e5c33d7 --- /dev/null +++ b/core/domain/src/main/java/com/teumteum/domain/entity/Alerts.kt @@ -0,0 +1,8 @@ +package com.teumteum.domain.entity + +import kotlinx.serialization.Serializable + +@Serializable +data class Alerts( + val alerts: List +) diff --git a/core/domain/src/main/java/com/teumteum/domain/repository/UserRepository.kt b/core/domain/src/main/java/com/teumteum/domain/repository/UserRepository.kt index 5590b65d..0872547e 100644 --- a/core/domain/src/main/java/com/teumteum/domain/repository/UserRepository.kt +++ b/core/domain/src/main/java/com/teumteum/domain/repository/UserRepository.kt @@ -1,5 +1,6 @@ package com.teumteum.domain.repository +import com.teumteum.domain.entity.Alerts import com.teumteum.domain.entity.Friend import com.teumteum.domain.entity.FriendRecommend import com.teumteum.domain.entity.Friends @@ -25,6 +26,5 @@ interface UserRepository { suspend fun updateUserInfo(user: UserInfo): Result suspend fun getFriendInfo(userId: Long): UserInfo? suspend fun postFriend(userId: Long): Result - - + suspend fun getAlerts(): Result } \ No newline at end of file From eae9b5c3352b0b5550857a7b84e2d2b55710a41a Mon Sep 17 00:00:00 2001 From: blueme0 Date: Mon, 12 Feb 2024 15:41:18 +0900 Subject: [PATCH 06/11] =?UTF-8?q?[feat/#132]=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=ED=9B=84=EB=A9=B4=20=EC=97=B0=EA=B2=B0=20=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/signup/complete/CardCompleteFragment.kt | 5 +++-- .../teumteum/presentation/signup/fix/CardFixFragment.kt | 7 ++++--- .../presentation/signup/intro/CardIntroActivity.kt | 7 ++++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/signup/complete/CardCompleteFragment.kt b/app/src/main/java/com/teumteum/teumteum/presentation/signup/complete/CardCompleteFragment.kt index 91f0f75e..9d853b57 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/signup/complete/CardCompleteFragment.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/signup/complete/CardCompleteFragment.kt @@ -55,16 +55,17 @@ class CardCompleteFragment val interests = mutableListOf() for (i in interestField.value) { - interests.add(Interest("#$i")) + interests.add(Interest(i)) } for (i in interestSelf.value) { - interests.add(Interest("#$i")) + interests.add(Interest(i)) } binding.cardviewBack.apply { tvGoalContent.text = goalText.value CHARACTER_CARD_LIST_BACK[characterId.value]?.let { ivCharacter.setImageResource(it) } submitInterestList(interests) isModify = false + setIsModifyDetail(false) // isModifyDetail = false } } diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/signup/fix/CardFixFragment.kt b/app/src/main/java/com/teumteum/teumteum/presentation/signup/fix/CardFixFragment.kt index 4bbbae7c..d2cdbd71 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/signup/fix/CardFixFragment.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/signup/fix/CardFixFragment.kt @@ -65,12 +65,13 @@ class CardFixFragment val interests = mutableListOf() for (i in interestField.value) { - interests.add(Interest("#$i")) + interests.add(Interest(i)) } for (i in interestSelf.value) { - interests.add(Interest("#$i")) + interests.add(Interest(i)) } binding.cardviewBack.apply { + setIsModifyDetail(true) tvGoalContent.text = goalText.value SignupUtils.CHARACTER_CARD_LIST_BACK[characterId.value]?.let { ivCharacter.setImageResource(it) } submitInterestList(interests) @@ -182,7 +183,7 @@ class CardFixFragment navigateTo() } } - rvInterests.setOnSingleClickListener { + interestAdapter.onAddItemClick = { (activity as SignUpActivity).apply { showNextButtonOnFixingField() navigateTo() diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/signup/intro/CardIntroActivity.kt b/app/src/main/java/com/teumteum/teumteum/presentation/signup/intro/CardIntroActivity.kt index 234bcbfe..a3e9d15c 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/signup/intro/CardIntroActivity.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/signup/intro/CardIntroActivity.kt @@ -76,6 +76,7 @@ class CardIntroActivity ) binding.cardviewBack.submitInterestList(interests) binding.cardviewBack.isModify = false + binding.cardviewBack.setIsModifyDetail(false) // binding.cardviewBack.isModifyDetail = false } } @@ -119,8 +120,8 @@ class CardIntroActivity } companion object { - const val INTEREST_EXAMPLE_1 = "#사이드 프로젝트" - const val INTEREST_EXAMPLE_2 = "#네트워킹" - const val INTEREST_EXAMPLE_3 = "#모여서 각자 일하기" + const val INTEREST_EXAMPLE_1 = "사이드 프로젝트" + const val INTEREST_EXAMPLE_2 = "네트워킹" + const val INTEREST_EXAMPLE_3 = "모여서 각자 일하기" } } \ No newline at end of file From d08ead13d9885241ba24d565a2bfcefcf110913a Mon Sep 17 00:00:00 2001 From: blueme0 Date: Mon, 12 Feb 2024 15:59:18 +0900 Subject: [PATCH 07/11] =?UTF-8?q?[fix/#132]=20common=20dialog=20=EC=B7=A8?= =?UTF-8?q?=EC=86=8C=20=EB=B2=84=ED=8A=BC=20=ED=85=8D=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=83=89=EC=83=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/fragment_common_dialog.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/fragment_common_dialog.xml b/app/src/main/res/layout/fragment_common_dialog.xml index f2932000..0fa9adf7 100644 --- a/app/src/main/res/layout/fragment_common_dialog.xml +++ b/app/src/main/res/layout/fragment_common_dialog.xml @@ -72,7 +72,7 @@ android:padding="12dp" android:stateListAnimator="@null" android:text="@{dialogConfig.negativeButtonText}" - android:textColor="@color/text_button_primary_default" + android:textColor="@color/text_button_alternative" android:textSize="15sp" app:layout_constraintBottom_toBottomOf="@id/btn_common_dialog_positive" app:layout_constraintEnd_toStartOf="@id/btn_common_dialog_positive" From d5fdf956d700ba657038c7570aa387ad7bdce845 Mon Sep 17 00:00:00 2001 From: blueme0 Date: Mon, 12 Feb 2024 16:00:58 +0900 Subject: [PATCH 08/11] =?UTF-8?q?[fix/#132]=20=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=EA=B6=8C=ED=95=9C=20=EC=95=A1=ED=8B=B0=EB=B9=84=ED=8B=B0=20->?= =?UTF-8?q?=20common=20dialog=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 3 - .../onboarding/AccessLocationActivity.kt | 56 ------------------- .../onboarding/OnBoardingActivity.kt | 38 ++++++++++++- 3 files changed, 36 insertions(+), 61 deletions(-) delete mode 100644 app/src/main/java/com/teumteum/teumteum/presentation/onboarding/AccessLocationActivity.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a334df10..e8708cd0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -99,9 +99,6 @@ - diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/onboarding/AccessLocationActivity.kt b/app/src/main/java/com/teumteum/teumteum/presentation/onboarding/AccessLocationActivity.kt deleted file mode 100644 index 55fb5cf2..00000000 --- a/app/src/main/java/com/teumteum/teumteum/presentation/onboarding/AccessLocationActivity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.teumteum.teumteum.presentation.onboarding - -import android.content.Intent -import android.os.Bundle -import androidx.activity.result.contract.ActivityResultContracts -import com.teumteum.base.BindingActivity -import com.teumteum.base.util.extension.setOnSingleClickListener -import com.teumteum.teumteum.R -import com.teumteum.teumteum.databinding.ActivityAccessLocationBinding -import com.teumteum.teumteum.presentation.signin.SignInActivity -import com.teumteum.teumteum.util.PermissionUtils - -class AccessLocationActivity - : BindingActivity(R.layout.activity_access_location) { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - initView() - } - - private val locationPermissionRequest = registerForActivityResult( - ActivityResultContracts.RequestMultiplePermissions() - ) { - startActivity(Intent(this@AccessLocationActivity, SignInActivity::class.java)) - openActivitySlideAnimation() - finish() - } - - private fun checkLocationPermission() { - locationPermissionRequest.launch( - arrayOf( - PermissionUtils.ACCESS_FINE_LOCATION, PermissionUtils.ACCESS_COARSE_LOCATION - ) - ) - } - - private fun initView() { - with(binding) { - btnDecline.setOnSingleClickListener { - startActivity(Intent(this@AccessLocationActivity, SignInActivity::class.java)) - } - btnAllow.setOnSingleClickListener { - checkLocationPermission() - } - } - } - - override fun finish() { - super.finish() - closeActivitySlideAnimation() - } - - companion object { - } -} \ No newline at end of file diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/onboarding/OnBoardingActivity.kt b/app/src/main/java/com/teumteum/teumteum/presentation/onboarding/OnBoardingActivity.kt index 52dc6a36..0de16db1 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/onboarding/OnBoardingActivity.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/onboarding/OnBoardingActivity.kt @@ -2,6 +2,7 @@ package com.teumteum.teumteum.presentation.onboarding import android.content.Intent import android.os.Bundle +import androidx.activity.result.contract.ActivityResultContracts import androidx.recyclerview.widget.RecyclerView import com.google.android.material.tabs.TabLayoutMediator import com.teumteum.base.BindingActivity @@ -12,6 +13,10 @@ import com.teumteum.domain.entity.CommonViewPagerEntity import com.teumteum.teumteum.R import com.teumteum.teumteum.databinding.ActivityOnboardingBinding import com.teumteum.teumteum.presentation.onboarding.adapter.OnBoardingViewPagerAdapter +import com.teumteum.teumteum.presentation.signin.SignInActivity +import com.teumteum.teumteum.util.PermissionUtils +import com.teumteum.teumteum.util.custom.dialog.CommonDialogConfig +import com.teumteum.teumteum.util.custom.dialog.CommonDialogFragment import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint @@ -38,13 +43,42 @@ class OnBoardingActivity setAppBarHeight(48) } + private val locationPermissionRequest = registerForActivityResult( + ActivityResultContracts.RequestMultiplePermissions() + ) { + startActivity(Intent(this@OnBoardingActivity, SignInActivity::class.java)) + openActivitySlideAnimation() + finish() + } + + private fun checkLocationPermission() { + locationPermissionRequest.launch( + arrayOf( + PermissionUtils.ACCESS_FINE_LOCATION, PermissionUtils.ACCESS_COARSE_LOCATION + ) + ) + } + private fun setUpListener() { binding.btnStart.setOnSingleClickListener { - startActivity(Intent(this, AccessLocationActivity::class.java)) - openActivitySlideAnimation() + initDialog() } } + private fun initDialog() { + CommonDialogFragment.newInstance( + commonDialogConfig = CommonDialogConfig( + title = getString(R.string.onboarding_tv_access_location_title), + description = getString(R.string.onboarding_tv_access_location_subtitle), + positiveButtonText = getString(R.string.onboarding_tv_access_location_allow), + negativeButtonText = getString(R.string.onboarding_tv_access_location_decline) + ), + onPositiveButtonClicked = { checkLocationPermission() }, + onNegativeButtonClicked = { startActivity(Intent(this@OnBoardingActivity, SignInActivity::class.java)) + } + ).show(supportFragmentManager, "CommonDialogFragmentTag") + } + private fun initViewPagerItem() { with(viewpagerList) { add( From c2c3c4237c942ecae4edda7cd4adee74cc38d9ae Mon Sep 17 00:00:00 2001 From: blueme0 Date: Tue, 13 Feb 2024 02:24:20 +0900 Subject: [PATCH 09/11] =?UTF-8?q?[fix/#132]=20=EC=9E=90=EA=B8=B0=EC=86=8C?= =?UTF-8?q?=EA=B0=9C=EC=84=9C=20=EC=B9=B4=EB=93=9C=20interest=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EB=B0=98=EC=98=81=EB=90=98=EB=8F=84=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../teumteum/presentation/signup/SignUpViewModel.kt | 9 +++++++++ .../teumteum/presentation/signup/fix/CardFixFragment.kt | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/signup/SignUpViewModel.kt b/app/src/main/java/com/teumteum/teumteum/presentation/signup/SignUpViewModel.kt index 4c7d352b..43625b0c 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/signup/SignUpViewModel.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/signup/SignUpViewModel.kt @@ -204,6 +204,15 @@ class SignUpViewModel @Inject constructor( _interestSelf.value = ArrayList(interests) } + fun setAllInterests(interests: List, selfResource: Array, fieldResource: Array) { + interestSelf.value.clear() + interestField.value.clear() + for (i in interests) { + if (i in selfResource) addInterestSelf(i) + else if (i in fieldResource) addInterestField(i) + } + } + private var _goalText = MutableStateFlow("") val goalText: StateFlow = _goalText.asStateFlow() diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/signup/fix/CardFixFragment.kt b/app/src/main/java/com/teumteum/teumteum/presentation/signup/fix/CardFixFragment.kt index d2cdbd71..aded80ff 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/signup/fix/CardFixFragment.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/signup/fix/CardFixFragment.kt @@ -189,6 +189,11 @@ class CardFixFragment navigateTo() } } + currentList.observe(viewLifecycleOwner) { interests -> + val selfArray = resources.getStringArray(R.array.interest_1) + val fieldArray = resources.getStringArray(R.array.interest_2) + viewModel.setAllInterests(interests.map { it.toString() }, selfArray, fieldArray) + } } } From ddbf3567be401a2cedb824808776d4da16d44233 Mon Sep 17 00:00:00 2001 From: blueme0 Date: Tue, 13 Feb 2024 02:24:49 +0900 Subject: [PATCH 10/11] =?UTF-8?q?[fix/#132]=20=EC=86=8C=EC=85=9C=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EC=8B=A4=ED=8C=A8=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=20=ED=86=A0=EC=8A=A4=ED=8A=B8=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../teumteum/presentation/signin/SignInViewModel.kt | 13 +++++++++---- .../presentation/signin/SocialWebViewActivity.kt | 5 +++-- .../com/teumteum/domain/entity/SocialLoginResult.kt | 2 +- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/signin/SignInViewModel.kt b/app/src/main/java/com/teumteum/teumteum/presentation/signin/SignInViewModel.kt index 3abd9c3d..ca029067 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/signin/SignInViewModel.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/signin/SignInViewModel.kt @@ -6,6 +6,7 @@ import com.teumteum.domain.repository.AuthRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import timber.log.Timber import javax.inject.Inject @HiltViewModel @@ -19,23 +20,27 @@ class SignInViewModel @Inject constructor( var oauthId = "" fun updateMemberState(socialLoginResult: SocialLoginResult) { - if (socialLoginResult.messages == null) { - if (socialLoginResult.oauthId.isNullOrEmpty()) { + Timber.tag("teum-login").d("${socialLoginResult}") + if (socialLoginResult.message == null) { + if (!socialLoginResult.accessToken.isNullOrEmpty() && !socialLoginResult.refreshToken.isNullOrEmpty()) { // 기존 회원일 때 repository.setAutoLogin( socialLoginResult.accessToken!!, socialLoginResult.refreshToken!!) _memberState.value = SignInUiState.Success } - else { + else if (!socialLoginResult.oauthId.isNullOrEmpty()){ // 새로 가입해야 할 때 oauthId = socialLoginResult.oauthId!! _memberState.value = SignInUiState.UserNotRegistered } + else { + _memberState.value = SignInUiState.Failure("소셜로그인 실패") + } } else { // 통신 실패 - _memberState.value = SignInUiState.Failure(socialLoginResult.messages!!) + _memberState.value = SignInUiState.Failure(socialLoginResult.message!!) } } diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/signin/SocialWebViewActivity.kt b/app/src/main/java/com/teumteum/teumteum/presentation/signin/SocialWebViewActivity.kt index fd8e0176..b30578f5 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/signin/SocialWebViewActivity.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/signin/SocialWebViewActivity.kt @@ -18,6 +18,7 @@ import com.teumteum.base.component.appbar.AppBarLayout import com.teumteum.base.component.appbar.AppBarMenu import com.teumteum.base.databinding.LayoutCommonAppbarBinding import com.teumteum.base.util.extension.defaultSnackBar +import com.teumteum.base.util.extension.defaultToast import com.teumteum.data.BuildConfig import com.teumteum.domain.entity.SocialLoginResult import com.teumteum.teumteum.R @@ -175,7 +176,7 @@ class SocialWebViewActivity goToTermsActivity() } is SignInUiState.Failure -> { - defaultSnackBar(binding.root, it.msg) + defaultToast(it.msg) finish() } @@ -192,7 +193,7 @@ class SocialWebViewActivity goToHomeScreen() } is MyInfoUiState.Failure -> { - defaultSnackBar(binding.root, state.msg) + defaultToast(state.msg) goToTermsActivity() } else -> {} diff --git a/core/domain/src/main/java/com/teumteum/domain/entity/SocialLoginResult.kt b/core/domain/src/main/java/com/teumteum/domain/entity/SocialLoginResult.kt index f2eaa1a5..72278c14 100644 --- a/core/domain/src/main/java/com/teumteum/domain/entity/SocialLoginResult.kt +++ b/core/domain/src/main/java/com/teumteum/domain/entity/SocialLoginResult.kt @@ -7,5 +7,5 @@ data class SocialLoginResult ( val accessToken: String?, val refreshToken: String?, val oauthId: String?, - val messages: String? + val message: String? ) \ No newline at end of file From 0405953a765ff5b8d2ba1afc8de0972458123356 Mon Sep 17 00:00:00 2001 From: blueme0 Date: Tue, 13 Feb 2024 02:48:55 +0900 Subject: [PATCH 11/11] =?UTF-8?q?[fix/#133]=20=EC=B6=A9=EB=8F=8C=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../teumteum/presentation/splash/SplashActivity.kt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/splash/SplashActivity.kt b/app/src/main/java/com/teumteum/teumteum/presentation/splash/SplashActivity.kt index cd3b1fdc..7685b0c2 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/splash/SplashActivity.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/splash/SplashActivity.kt @@ -33,7 +33,6 @@ class SplashActivity isFromAlarm = intent.getBooleanExtra(IS_FROM_ALARM, false) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) getMessage() checkNetwork() - setUpObserver() } private fun getMessage() { @@ -42,13 +41,6 @@ class SplashActivity } } - private fun setUpObserver() { - viewModel.myInfo.observe(this) { - AuthUtils.setMyInfo(context = this, myInfo = it) - Timber.tag("setMyInfo").d("$it") - } - } - private fun checkNetwork() { if (NetworkManager.checkNetworkState(this)) checkAutoLogin() else {