diff --git a/app/src/main/java/com/dongyang/android/youdongknowme/service/FCMService.kt b/app/src/main/java/com/dongyang/android/youdongknowme/service/FCMService.kt index d87e19bc..f5868b29 100644 --- a/app/src/main/java/com/dongyang/android/youdongknowme/service/FCMService.kt +++ b/app/src/main/java/com/dongyang/android/youdongknowme/service/FCMService.kt @@ -3,24 +3,29 @@ package com.dongyang.android.youdongknowme.service import android.app.NotificationChannel import android.app.NotificationManager import android.app.PendingIntent +import android.app.TaskStackBuilder import android.content.Context import android.content.Intent import android.media.RingtoneManager import android.os.Build import androidx.core.app.NotificationCompat import com.dongyang.android.youdongknowme.data.local.SharedPreference +import com.dongyang.android.youdongknowme.ui.view.detail.DetailActivity import com.dongyang.android.youdongknowme.ui.view.main.MainActivity import com.google.firebase.messaging.FirebaseMessagingService import com.google.firebase.messaging.RemoteMessage class FCMService : FirebaseMessagingService() { - override fun onMessageReceived(remoteMessage: RemoteMessage) { - val title = remoteMessage.notification?.title ?: "기본 제목" - val message = remoteMessage.notification?.body ?: "기본 메시지" + override fun onMessageReceived(message: RemoteMessage) { + super.onMessageReceived(message) + + val title = message.notification?.title ?: "기본 제목" + val messageBody = message.notification?.body ?: "기본 메시지" + val url = message.data["url"] ?: "" // 알림 채널 ID - val channelId = "your_channel_id" + val channelId = "DMforU" // NotificationManager 인스턴스 생성 val notificationManager = @@ -36,22 +41,39 @@ class FCMService : FirebaseMessagingService() { notificationManager.createNotificationChannel(channel) } - // Intent 및 PendingIntent 생성 - val intent = Intent(this, MainActivity::class.java).apply { + // MainActivity를 시작하는 Intent 생성 + val mainIntent = Intent(this, MainActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP } - val pendingIntent = PendingIntent.getActivity( - this, - 0, - intent, - PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT - ) + + // DetailActivity를 열기 위한 Intent 생성 + val detailIntent = if (!url.isNullOrEmpty()) { + DetailActivity.newIntent(this, url) + } else { + null // URL이 없는 경우에는 null 할당 + } + + // PendingIntent 생성 + val pendingIntent = if (detailIntent != null) { + TaskStackBuilder.create(this).run { + addNextIntent(mainIntent) + addNextIntentWithParentStack(detailIntent) // DetailActivity를 부모 스택으로 추가 + getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT) + } + } else { + PendingIntent.getActivity( + this, + 0, + mainIntent, + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT + ) + } // 알림 생성 val builder = NotificationCompat.Builder(this, channelId) .setSmallIcon(com.dongyang.android.youdongknowme.R.mipmap.ic_logo) // 알림 아이콘 설정 .setContentTitle(title) // 알림 제목 - .setContentText(message) // 알림 내용 + .setContentText(messageBody) // 알림 내용 .setAutoCancel(true) // 터치 시 자동으로 삭제되도록 설정 .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) // 알림 소리 설정 .setVibrate(longArrayOf(0, 1000, 500, 1000)) // 진동 패턴 설정 diff --git a/app/src/main/java/com/dongyang/android/youdongknowme/standard/util/Mapping.kt b/app/src/main/java/com/dongyang/android/youdongknowme/standard/util/Mapping.kt index 5a047c3d..dab80262 100644 --- a/app/src/main/java/com/dongyang/android/youdongknowme/standard/util/Mapping.kt +++ b/app/src/main/java/com/dongyang/android/youdongknowme/standard/util/Mapping.kt @@ -3,53 +3,25 @@ package com.dongyang.android.youdongknowme.standard.util fun mapKeywordEnglishToKorean(english: String): String { return when (english) { "exam" -> "시험" - "course" -> "수강" - "lecture" -> "특강" - "season" -> "계절학기" + "signup" -> "수강" + "speciallecture" -> "특강" + "seasonalsemester" -> "계절학기" + "leaveofabsence" -> "휴학" + "returntoschool" -> "복학" + "graduate" -> "졸업" + "switchmajors" -> "전과" + "givingupthesemester" -> "학기포기" "scholarship" -> "장학" - "tuition" -> "등록" - "leave" -> "휴학" - "return" -> "복학" - "graduation" -> "졸업" - "transfer" -> "전과" - "drop" -> "학기포기" - "recruitment" -> "채용" + "nationalscholarship" -> "국가장학" + "registration" -> "등록" + "employment" -> "채용" "contest" -> "공모전" - "field" -> "현장실습" "competition" -> "대회" - "service" -> "봉사" + "fieldtraining" -> "현장실습" + "volunteer" -> "봉사" "dormitory" -> "기숙사" - "corona" -> "코로나19" - "club" -> "동아리" - else -> throw IllegalArgumentException("올바른 타입이 아닙니다.") - } -} - -fun mapDepartmentCodeToKorean(code: Int): String { - return when (code) { - CODE.SCHOOL_CODE -> "학교" - CODE.MECHANICAL_ENGINE_CODE -> "기계공학과" - CODE.MECHANICAL_DESIGN_CODE -> "기계설계공학과" - CODE.AUTOMATION_ENGINE_CODE -> "자동화공학과" - CODE.ROBOT_ENGINE_CODE -> "로봇공학과" - CODE.COMPUTER_SOFTWARE_ENGINE_CODE -> "컴퓨터소프트웨어공학과" - CODE.COMPUTER_INFO_ENGINE_CODE -> "컴퓨터정보공학과" - CODE.ARTIFICIAL_ENGINE_CODE -> "인공지능소프트웨어공학과" - CODE.ELECTRICAL_ENGINE_CODE -> "전기공학과" - CODE.INFO_ELECTRONIC_ENGINE_CODE -> "정보전자공학과" - CODE.SEMICONDUCTOR_ENGINE_CODE -> "반도체전자공학과" - CODE.INFO_COMMUNICATION_ENGINE_CODE -> "정보통신공학과" - CODE.BIOCHEMICAL_ENGINE_CODE -> "생명화학공학과" - CODE.BIO_CONVERGENCE_ENGINE_CODE -> "바이오융합공학과" - CODE.ARCHITECTURE_CODE -> "건축과" - CODE.INTERIOR_DESIGN_CODE -> "실내건축디자인과" - CODE.VISUAL_DESIGN_CODE -> "시각디자인과" - CODE.BUSINESS_ADMINISTRATION_CODE -> "경영학과" - CODE.TAX_ACCOUNTING_CODE -> "세무회계학과" - CODE.DISTRIBUTION_MARKETING_CODE -> "유통마케팅학과" - CODE.HOTEL_TOURISM_CODE -> "호텔관광학과" - CODE.MANAGEMENT_INFORMATION_CODE -> "경영정보학과" - CODE.BIG_DATA_MANAGEMENT_CODE -> "빅데이터경영과" + "group" -> "동아리" + "studentcouncil" -> "학생회" else -> throw IllegalArgumentException("올바른 타입이 아닙니다.") } } diff --git a/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/depart/DepartActivity.kt b/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/depart/DepartActivity.kt index 62c03183..ea557982 100644 --- a/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/depart/DepartActivity.kt +++ b/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/depart/DepartActivity.kt @@ -11,6 +11,7 @@ import com.dongyang.android.youdongknowme.standard.base.BaseActivity import com.dongyang.android.youdongknowme.ui.adapter.DepartAdapter import com.dongyang.android.youdongknowme.ui.view.main.MainActivity import org.koin.androidx.viewmodel.ext.android.viewModel +import timber.log.Timber class DepartActivity : BaseActivity(), DepartClickListener { @@ -64,6 +65,7 @@ class DepartActivity : BaseActivity(), D private fun getDepart(items: ArrayList) { return binding.btnDepartComplete.setOnClickListener { viewModel.setDepartment(items[viewModel.selectDepartPosition.value ?: 0]) + setResult(RESULT_OK) finish() } } diff --git a/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/keyword/KeywordActivity.kt b/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/keyword/KeywordActivity.kt index 0a7750d8..01187d2b 100644 --- a/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/keyword/KeywordActivity.kt +++ b/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/keyword/KeywordActivity.kt @@ -38,6 +38,7 @@ class KeywordActivity : BaseActivity() viewModel.getLocalKeywordList() binding.btnKeywordComplete.setOnClickListener { + viewModel.subscribeCheckedKeyword() setResult(RESULT_OK) finish() } diff --git a/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/main/MainActivity.kt b/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/main/MainActivity.kt index 3a09c085..a25da2a4 100644 --- a/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/main/MainActivity.kt +++ b/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/main/MainActivity.kt @@ -10,9 +10,9 @@ import com.dongyang.android.youdongknowme.data.local.SharedPreference import com.dongyang.android.youdongknowme.databinding.ActivityMainBinding import com.dongyang.android.youdongknowme.standard.base.BaseActivity import com.dongyang.android.youdongknowme.ui.view.util.KeepStateNavigator -import com.google.android.gms.tasks.OnCompleteListener import com.google.firebase.messaging.FirebaseMessaging import org.koin.androidx.viewmodel.ext.android.viewModel +import timber.log.Timber /* 메인 액티비티 */ class MainActivity : BaseActivity() { @@ -36,23 +36,28 @@ class MainActivity : BaseActivity() { binding.mainNvBottom.setupWithNavController(navController) viewModel.checkFirstLaunch() + } - if (viewModel.isFirstLaunch.value == true) { - getFcmToken() + override fun initDataBinding() { + viewModel.isFirstLaunch.observe(this) { boolean -> + if (boolean) getFcmToken() } } - override fun initDataBinding() = Unit override fun initAfterBinding() = Unit private fun getFcmToken() { FirebaseMessaging.getInstance().token.addOnCompleteListener { task -> if (task.isSuccessful) { - viewModel.setFCMToken(task.result) - viewModel.setInitToken() + viewModel.setFCMToken(task.result).run { viewModel.setInitToken() } + Timber.d("first ${task.result}") } else { return@addOnCompleteListener } + val token = task.result + SharedPreference.setFcmToken(token) + + Timber.d("token : ${token}") } } diff --git a/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/main/MainViewModel.kt b/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/main/MainViewModel.kt index c9cc52b3..119f2bd7 100644 --- a/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/main/MainViewModel.kt +++ b/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/main/MainViewModel.kt @@ -9,6 +9,7 @@ import com.dongyang.android.youdongknowme.standard.base.BaseViewModel import com.dongyang.android.youdongknowme.standard.network.NetworkResult import com.dongyang.android.youdongknowme.ui.view.util.Event import kotlinx.coroutines.launch +import timber.log.Timber class MainViewModel(private val mainRepository: MainRepository) : BaseViewModel() { private val _errorState: MutableLiveData> = MutableLiveData() @@ -45,7 +46,7 @@ class MainViewModel(private val mainRepository: MainRepository) : BaseViewModel( fun setFCMToken(token: String){ mainRepository.setFCMToken(token) - _FCMToken.postValue(token) + _FCMToken.value = token } private fun getUserDepart(){ @@ -69,6 +70,7 @@ class MainViewModel(private val mainRepository: MainRepository) : BaseViewModel( ) )) { is NetworkResult.Success -> { + Timber.d("first ${FCMToken.value.toString()}") mainRepository.setIsFirstLaunch(false) _isFirstLaunch.postValue(false) _isLoading.postValue(false) diff --git a/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/setting/SettingFragment.kt b/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/setting/SettingFragment.kt index 8bec3cef..f0bc15e0 100644 --- a/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/setting/SettingFragment.kt +++ b/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/setting/SettingFragment.kt @@ -19,22 +19,29 @@ class SettingFragment : BaseFragment() override val layoutResourceId: Int = R.layout.fragment_setting override val viewModel: SettingViewModel by viewModel() - private lateinit var resultLauncher: ActivityResultLauncher + private lateinit var resultLauncherKeyword: ActivityResultLauncher + private lateinit var resultResultDepartment: ActivityResultLauncher + private var topics: List = emptyList() + private var department: String = "" override fun initStartView() { binding.tvSettingAppVersion.text = getAppVersion() setResultKeyword() + setResultDepartment() } override fun initDataBinding() { viewModel.myDepartment.observe(viewLifecycleOwner) { myDepartment -> binding.tvSettingDepartment.text = myDepartment + department = myDepartment + viewModel.updateUserDepartment(department) } viewModel.myTopics.observe(viewLifecycleOwner) { myTopics -> - topics = topics + topics = myTopics + viewModel.updateUserTopic(topics) } viewModel.isAccessUniversityAlarm.observe(viewLifecycleOwner) { isChecked -> @@ -54,7 +61,9 @@ class SettingFragment : BaseFragment() binding.switchSettingUniversityAlarm.setOnCheckedChangeListener { compoundButton, _ -> if (compoundButton.isChecked) { - viewModel.updateUserTopic(topics) + if (topics.isNotEmpty()) { + viewModel.updateUserTopic(topics) + } } else { viewModel.removeUserTopic() } @@ -62,7 +71,9 @@ class SettingFragment : BaseFragment() binding.switchSettingDepartmentAlarm.setOnCheckedChangeListener { compoundButton, _ -> if (compoundButton.isChecked) { - viewModel.updateUserDepartment() + if (department.isNotEmpty()) { + viewModel.updateUserDepartment(department) + } } else { viewModel.removeUserDepartment() } @@ -70,20 +81,19 @@ class SettingFragment : BaseFragment() binding.btnSettingEditKeyword.setOnClickListener { val intent = Intent(requireActivity(), KeywordActivity::class.java) - resultLauncher.launch(intent) + resultLauncherKeyword.launch(intent) } binding.btnSettingEditDepartment.setOnClickListener { val intent = Intent(requireActivity(), DepartActivity::class.java) - startActivity(intent) + resultResultDepartment.launch(intent) } binding.btnSettingAppHelp.setOnClickListener { - val intent = - Intent( - Intent.ACTION_VIEW, - Uri.parse("https://docs.google.com/forms/d/e/1FAIpQLSeRTKalenelmffTbCZeK4mqmQg0palobghkXSoie1FlmV22ZQ/viewform") - ) + val intent = Intent( + Intent.ACTION_VIEW, + Uri.parse("https://docs.google.com/forms/d/e/1FAIpQLSeRTKalenelmffTbCZeK4mqmQg0palobghkXSoie1FlmV22ZQ/viewform") + ) startActivity(intent) } @@ -108,11 +118,21 @@ class SettingFragment : BaseFragment() } private fun setResultKeyword() { - resultLauncher = + resultLauncherKeyword = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { - viewModel.getUserTopic() - viewModel.updateUserTopic(topics) + viewModel.getUserTopic().run { viewModel.updateUserTopic(topics) } + binding.switchSettingUniversityAlarm.isChecked = true + } + } + } + + private fun setResultDepartment() { + resultResultDepartment = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == Activity.RESULT_OK) { + viewModel.getUserDepartment() + binding.switchSettingDepartmentAlarm.isChecked = true } } } diff --git a/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/setting/SettingViewModel.kt b/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/setting/SettingViewModel.kt index 29d51831..85779b9e 100644 --- a/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/setting/SettingViewModel.kt +++ b/app/src/main/java/com/dongyang/android/youdongknowme/ui/view/setting/SettingViewModel.kt @@ -41,6 +41,7 @@ class SettingViewModel(private val settingRepository: SettingRepository) : BaseV init { getUserFCMToken() + getUserDepartment() } fun checkAccessAlarm() { @@ -60,8 +61,7 @@ class SettingViewModel(private val settingRepository: SettingRepository) : BaseV } fun getUserDepartment() { - val myDepartment = settingRepository.getUserDepartment() - _myDepartment.postValue(myDepartment) + _myDepartment.value = settingRepository.getUserDepartment() } fun getUserTopic() { @@ -72,22 +72,21 @@ class SettingViewModel(private val settingRepository: SettingRepository) : BaseV } private fun getUserFCMToken() { - val token = settingRepository.getUserFCMToken() - _FCMToken.postValue(token) + _FCMToken.value = settingRepository.getUserFCMToken() } - fun updateUserDepartment() { + fun updateUserDepartment(department: String) { _isLoading.postValue(true) viewModelScope.launch { when (val result = settingRepository.updateUserDepartment( UpdateDepartment( token = FCMToken.value.toString(), - department = myDepartment.value.toString() + department = department ) )) { is NetworkResult.Success -> { - settingRepository.setIsAccessDepartAlarm(true) + setIsAccessDepartAlarm(true) _isLoading.postValue(false) _isError.postValue(false) } @@ -111,7 +110,7 @@ class SettingViewModel(private val settingRepository: SettingRepository) : BaseV ) ) { is NetworkResult.Success -> { - settingRepository.setIsAccessDepartAlarm(false) + setIsAccessDepartAlarm(false) _isLoading.postValue(false) _isError.postValue(false) } @@ -136,7 +135,7 @@ class SettingViewModel(private val settingRepository: SettingRepository) : BaseV ) )) { is NetworkResult.Success -> { - settingRepository.setIsAccessSchoolAlarm(true) + setIsAccessUniversityAlarm(true) _isLoading.postValue(false) _isError.postValue(false) } @@ -152,14 +151,14 @@ class SettingViewModel(private val settingRepository: SettingRepository) : BaseV fun removeUserTopic() { _isLoading.postValue(true) - + viewModelScope.launch { when (val result = settingRepository.removeUserTopic( RemoveToken(token = FCMToken.value.toString()) )) { is NetworkResult.Success -> { - settingRepository.setIsAccessSchoolAlarm(false) + setIsAccessUniversityAlarm(false) _isLoading.postValue(false) _isError.postValue(false) }