diff --git a/.github/workflows/debug_builder.yml b/.github/workflows/debug_builder.yml
new file mode 100644
index 00000000..9ad95f36
--- /dev/null
+++ b/.github/workflows/debug_builder.yml
@@ -0,0 +1,84 @@
+#name: TeumTeum Push Builder
+#
+#on:
+# push:
+# branches: [ main ]
+#
+#defaults:
+# run:
+# shell: bash
+# working-directory: .
+#
+#jobs:
+# build:
+# name: APK Builder When Push
+# runs-on: ubuntu-latest
+# steps:
+# - name: Checkout
+# uses: actions/checkout@v2
+#
+# - name: Gradle cache
+# uses: actions/cache@v2
+# with:
+# path: |
+# ~/.gradle/caches
+# ~/.gradle/wrapper
+# key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
+# restore-keys: |
+# ${{ runner.os }}-gradle-
+# - name: set up JDK 17
+# uses: actions/setup-java@v1
+# with:
+# java-version: 17
+#
+# - name: Change gradlew permissions
+# run: chmod +x ./gradlew
+#
+# - name: Create Local Properties
+# run: touch local.properties
+#
+# - name: Access Local Properties
+# env:
+# base_url: ${{ secrets.BASE_URL }}
+# image_url: ${{ secrets.IMAGE_URL }}
+# kakao_redirect_url: ${{ secrets.KAKAO_REDIRECT_URL }}
+# naver_redirect_url: ${{ secrets.KAKAO_REDIRECT_URL }}
+# kakao_api_key: ${{ secrets.KAKAO_API_KEY }}
+# naver_api_key: ${{ secrets.NAVER_API_KEY }}
+# run: |
+# echo base.url=\"$base_url\" >> local.properties
+# echo image.url=\"$image_url\" >> local.properties
+# echo kakao.redirect=\"$kakao_redirect_url\" >> local.properties
+# echo naver.redirect=\"$naver_redirect_url\" >> local.properties
+# echo kakao.key=\"$kakao_api_key\" >> local.properties
+# echo naver.key=\"$naver_api_key\" >> local.properties
+#
+# - name: Access Firebase Service
+# run: echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > ./app/google-services.json
+#
+# - name: Build debug APK
+# run: ./gradlew assembleDebug --stacktrace
+#
+# - name: On Success
+# if: ${{ success() }}
+# uses: MeilCli/slack-upload-file@v1
+# with:
+# slack_token: ${{ secrets.SLACK_BOT_TOKEN}}
+# channels: ${{ secrets.SLACK_CHANNEL_ID}}
+# file_path: 'app/build/outputs/apk/debug/app-debug.apk'
+# file_name: 'TeumTeum.apk'
+# file_type: 'apk'
+# initial_comment: '๐ TeumTeum์ด ์ฌ๋์ผ๋ก ๋ค์ด์์ต๋๋ค.'
+#
+# - name: On Failed, Notify in Slack
+# if: ${{ failure() }}
+# uses: rtCamp/action-slack-notify@v2
+# env:
+# SLACK_COLOR: '#ff0000'
+# SLACK_ICON: https://play-lh.googleusercontent.com/jUeDnP2wd29y48wolu5a8j08PX3Zt-wsftTVuSR8gYgHI00sq7Zsq2jWx1icTdsISw=w240-h480-rw
+# SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
+# SLACK_TITLE: 'TEUMTEUM/Android debug build Failโ'
+# MSG_MINIMAL: true
+# SLACK_USERNAME: TEUMTEUM_ANDROID
+# SLACK_MESSAGE: 'APK ์์ฑ ์ค ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์๋ฌ๋ฅผ ํ์ธํด์ฃผ์ธ์'
+#
\ No newline at end of file
diff --git a/README.md b/README.md
index 186a3570..3f0fbcf5 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,31 @@
- # TeumTeum-Android Repository
+
-![2046](https://github.com/depromeet/TeumTeum-Android/assets/89737271/6a51c5f5-f809-4a2d-a8d3-684b82e80afc)
+# Teum-Teum
+
+> ์ฌ๋ ์ฌ์ด์ **ํ**์ ์ด์ด์ฃผ๋ IT ์ปค๋ฆฌ์ด ๋คํธ์ํน ์๋น์ค `repo:server`
+
+![Build](https://img.shields.io/github/actions/workflow/status/depromeet/teum-teum-server/integration-tester.yml?branch=develop&style=for-the-badge&logo=github&logoColor=white&color=36B2FF) ![](https://img.shields.io/sonar/test_success_density/depromeet_teum-teum-server?server=https%3A%2F%2Fsonarcloud.io&style=for-the-badge&logo=sonar&logoColor=white&color=36B2FF) ![](https://img.shields.io/sonar/quality_gate/depromeet_teum-teum-server/develop?server=https%3A%2F%2Fsonarcloud.io&style=for-the-badge&logo=sonar&logoColor=white&color=36B2FF) ![](https://img.shields.io/github/v/release/depromeet/teum-teum-server?include_prereleases&style=for-the-badge&color=36B2FF)
+
+[![download](https://img.shields.io/badge/playstore-download-brightgreen?style=social&logo=googleplay&color=36B2FF)](https://play.google.com/store/apps/details?id=com.teumteum.teumteum&pcampaignid=web_share) [![instagram](https://img.shields.io/badge/instagram-click-brightgreen?style=social&logo=instagram&color=36B2FF)](https://www.instagram.com/teumteum_official/) [![behance](https://img.shields.io/badge/behance-click-brightgreen?style=social&logo=behance&color=36B2FF)](https://www.behance.net/gallery/191510163/%08TEUMTEUM-IT-Career-Growth-Networking-Service)
+
+---
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -10,3 +35,117 @@
|||||
|**๋ชจ์ ์ฐธ์ฌ & ์ ์ ๋ฆฌ๋ทฐ**|**๊ณตํต ๊ด์ฌ์ฌ ์ฐพ๊ธฐ**|**๋ชจ์ ์์ฑ & ๋ง์ดํ์ด์ง**|**๋ก๊ทธ์ธ & ์๊ธฐ์๊ฐ ์นด๋**|
+
+
+## Tech Stack โ๏ธ
+- Clean Architecture
+- Multi-Module
+
+- MVVM
+- Repository Pattern
+
+- Compose + XML
+- Hilt
+
+- Coroutine
+- Version Catalog
+
+- Kotlin - Flow
+- GitHub Action CI / CD
+
+
+
+## System Architecture ๐ป
+
+### Architecture (with Data flow)
+![image](https://github.com/depromeet/TeumTeum-Android/assets/100370200/b914bf6d-d052-46be-ba05-a841673f38c0)
+
+
+### MODULE
+```
+๐๏ธapp
+ โฃ ๐di
+ โฃ ๐presentation
+ โฃ ๐util
+๐๏ธbuild-logic
+ โฃ ๐convention
+๐๏ธcore
+ โฃ ๐base
+๐๏ธdata
+ โฃ ๐datasource
+ โฃ ๐local
+ โฃ ๐model
+ โ โฃ ๐response
+ โ โฃ ๐request
+ โฃ ๐repository
+ โฃ ๐remote
+ โ โฃ ๐interceptor
+ โ โฃ ๐service
+ โฃ ๐util
+๐๏ธdomain
+ โฃ ๐entity
+ โฃ ๐repository
+```
+
+
+
+## ํํ์ ์๊ฐํฉ๋๋ค ๐
+
+ํํ์ IT ์
๊ณ์์ ์ปค๋ฆฌ์ด ์ฑ์ฅ์ ์ํด ๋
ธ๋ ฅํ๋ '๊ฐ์๋ฌ'๋ค์ ๋ง๋ ์ ์๋ ๋คํธ์ํน ํ๋ซํผ์ด์์.
+ํจ๊ป ์คํฐ๋๋ฅผ ํ๊ฑฐ๋ ๋ชจ์ฌ์ ๊ฐ์ ์์
์ ํ๋ฉฐ ๋ค์ํ ๋คํธ์ํน ํ๋์ ํ ์ ์์ด์.
+
+์ฒ์ ๋ง๋๋ ์ฌ์ด๋ผ ์ด์ํจ์ด ๋๊ปด์ง ๋๋ '์นํด์ง๊ธฐ' ๊ธฐ๋ฅ์ ํ์ฉํด ๊ด์ฌ์ฌ๋ฅผ ํ์
ํ๊ณ ,
+ํจ๊ป ์ฆ๊ฒ๊ฒ ๋ํ๋ฅผ ๋๋๋ฉฐ ์๋ก์ ํ์ ์ฑ์ ๊ฐ๊น์์ง ์ ์์ด์!
+
+IT ์ง๊ตฐ์ ๋ค์ํ ๊ฐ์ฑ์ ์ง๋ ์ฌ๋๋ค๊ณผ ๋คํธ์ํนํ๋ฉฐ ์ปค๋ฆฌ์ด๋ฅผ ์ฑ์ฅ์์ผ ๋ณด๋ ๊ฒ์ ์ด๋จ๊น์?
+
+
+
+## ํํ์ ์ฒ์ ์ฌ์ฉํ์๋์? ๐
+![Untitled](https://github.com/depromeet/TeumTeum-Android/assets/100370200/7ce79833-06aa-40a3-afd1-18f0dc37601b)
+
+### โ๏ธย Step 01 ์๊ฐ์๋ฅผ ๋ง๋ค๊ณ ๊ฐํธํ๊ฒ ์๊ฐํด ๋ณด์ธ์
+- ๊ด์ฌ์ฌ์ ๋ชฉํ๊ฐ ๋ด๊ฒจ ์๋ ์๊ฐ์๋ฅผ ๋ง๋ค์ด์.
+- ๋ชจ์์ ์ฐธ์ฌํ ๋ ์๊ฐ์๋ก ๊ฐํธํ๊ฒ ์์ ์ ์๊ฐ ํ ์ ์์ด์.
+
+
+
+![Untitled2](https://github.com/depromeet/TeumTeum-Android/assets/100370200/4d716950-d3c8-47b0-bef5-890396188598)
+
+### โ๏ธย Step 02 ์ํ๋ ๋ชจ์์ ์ฐธ์ฌํด ๋ณด์ธ์
+- ํํ์์๋ ์คํฐ๋๋ถํฐ ๋ชจ๊ฐ์๊น์ง ๋ค์ํ ์นดํ
๊ณ ๋ฆฌ์ ๋ชจ์์ ์ฐธ์ฌํ ์ ์์ด์.
+- ์ฐธ์ฌ์๋ค์ ์๊ฐ์๋ฅผ ๋ฏธ๋ฆฌ ํ์ธํ๊ณ , ๋ฏฟ์ ์ ์๋ ๋ชจ์์ ์์ํด ๋ณด์ธ์.
+
+
+
+![Untitled3](https://github.com/depromeet/TeumTeum-Android/assets/100370200/a455a546-b573-4470-ba27-80fb49184cc9)
+
+### ๐คย Step 03 ํจ๊ป ์ฑ์ฅํ ๊ทผ์ฒ์ ์น๊ตฌ๋ฅผ ์ฐพ์๋ด์
+- ๋ด๊ฐ ์ฌ๋ ๊ณณ ๊ทผ์ฒ, ํน์ ํ์ฌ ๊ทผ์ฒ์์ ์น๊ตฌ๋ฅผ ๋ง๋ ์ ์์ด์.
+- ๋ด ์ฃผ๋ณ์ ์น๊ตฌ์ ํจ๊ป ์ปค๋ฆฌ์ด ์ฑ์ฅ์ ์ํ ๋ชจ์์ ์์ํด ๋ณด์ธ์.
+
+
+
+![Untitled4](https://github.com/depromeet/TeumTeum-Android/assets/100370200/97252e07-9822-4c40-abd0-dcb153524c0c)
+
+### ๐ค Step 04 ์๋ก์ ๊ด์ฌ์ฌ๋ฅผ ๋ฐ๊ฒฌํด์
+- ์๊ฐ์์ ์์ฑํ ๊ด์ฌ์ฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ์ ์ฐธ์ฌ์๋ค์ ๊ด์ฌ์ฌ๋ฅผ ํ์ธํด ๋ณด์ธ์.
+- ๊ธฐ๊ธฐ๋ฅผ ํ๋ค๋ฉด ๋ชจ์ ์ฐธ์ฌ์๋ค์ ๋ค์ํ ๊ด์ฌ์ฌ ์ฌ์ด์ ํ์ ์ฑ์ธ ์ ์์ด์.
+- chat GPT๊ฐ ๋ง์ ์ฌ๋๋ค์ด ๊ณตํต์ ์ผ๋ก ๊ด์ฌ์ ๊ฐ์ง๊ณ ์๋ ์ฃผ์ ๋ฅผ ์๋ ค์ค๊ฑฐ์์.
+
+
+
+
+![Untitled5](https://github.com/depromeet/TeumTeum-Android/assets/100370200/432f3ec9-32d1-4749-badb-7a49cec6ec12)
+
+### ๐ Step 05 ๋ฐธ๋ฐ์ค ๊ฒ์์ผ๋ก ์นํด์ ธ์
+- ๊ณตํต ๊ด์ฌ์ฌ์ ๊ด๋ จ๋ ๋ค์ํ ๋ํ ์ฃผ์ ๋ฅผ ํ์ธํ๊ณ , ๋ํ๋ฅผ ์์ํด๋ด์.
+- ์ด์ํ ์๊ฐ๋ ์ ์, ๋ฐธ๋ฐ์ค ๊ฒ์์ ํตํด ๋น ๋ฅด๊ฒ ์นํด์ง ์ ์์ด์.
+
+
+
+![Untitled6](https://github.com/depromeet/TeumTeum-Android/assets/100370200/1a5d824f-5231-419f-a9ed-813128b247a0)
+
+### ๐ Step 06 ๋ชจ์ ํ ๋ฆฌ๋ทฐ๋ฅผ ํตํด ๋ ๋์ ๋คํธ์ํน ํ๊ฒฝ์ ๋ง๋ค์ด๊ฐ์
+- ๋ชจ์์ด ๋๋ ํ ๋ค์๋ ์ ์ ์ ๋ฆฌ๋ทฐ๋ฅผ ์์ฑํ ์ ์์ด์.
+- ์ ์ ๋ฆฌ๋ทฐ๋ฅผ ์์ฑํ๊ณ ๋ ๋์ ๋คํธ์ํน ํ๊ฒฝ์ ๋ง๋ค์ด๋ด์.
diff --git a/app/src/main/java/com/teumteum/teumteum/MyApp.kt b/app/src/main/java/com/teumteum/teumteum/MyApp.kt
index d752b143..9f2f9e16 100644
--- a/app/src/main/java/com/teumteum/teumteum/MyApp.kt
+++ b/app/src/main/java/com/teumteum/teumteum/MyApp.kt
@@ -2,12 +2,15 @@ package com.teumteum.teumteum
import android.app.Application
import android.content.Context
-import androidx.appcompat.app.AppCompatDelegate
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleObserver
+import androidx.lifecycle.OnLifecycleEvent
+import androidx.lifecycle.ProcessLifecycleOwner
import dagger.hilt.android.HiltAndroidApp
import timber.log.Timber
@HiltAndroidApp
-class MyApp : Application() {
+class MyApp : Application(), LifecycleObserver {
override fun onCreate() {
super.onCreate()
@@ -18,9 +21,17 @@ class MyApp : Application() {
}
setUpFlipper()
appContext = applicationContext
+ ProcessLifecycleOwner.get().lifecycle.addObserver(this)
}
+ @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
+ fun onAppBackgrounded() { isForeground = false }
+
+ @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
+ fun onAppForegrounded() { isForeground = true}
+
companion object {
lateinit var appContext: Context
+ var isForeground = false
}
}
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 ce2f30a4..abf00aee 100644
--- a/app/src/main/java/com/teumteum/teumteum/config/TeumMessagingService.kt
+++ b/app/src/main/java/com/teumteum/teumteum/config/TeumMessagingService.kt
@@ -13,6 +13,7 @@ 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.domain.repository.UserRepository
import com.teumteum.teumteum.R
import com.teumteum.teumteum.presentation.splash.SplashActivity
import dagger.hilt.android.AndroidEntryPoint
@@ -30,6 +31,9 @@ class TeumMessagingService : FirebaseMessagingService() {
@Inject
lateinit var userService: UserService
+ @Inject
+ lateinit var userRepository: UserRepository
+
override fun onNewToken(token: String) {
super.onNewToken(token)
@@ -51,22 +55,25 @@ class TeumMessagingService : FirebaseMessagingService() {
}
}
- override fun onMessageReceived(message: RemoteMessage) {
- super.onMessageReceived(message)
+ override fun handleIntent(intent: Intent?) {
+ super.handleIntent(intent)
if (dataStore.onNotification) {
if (dataStore.isLogin) {
- 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()
- }
- if (alertMessage.type == END_MEETING) {
- alertMessage.meetingId = message.data["meetingId"]?.toLong()
- alertMessage.participants = message.data["participants"]?.toList()?.map { it.digitToInt() }
+ intent?.let {
+ val alertMessage = Message("", "", "")
+ alertMessage.title = intent.getStringExtra("title").toString()
+ alertMessage.body = intent.getStringExtra("body").toString()
+ alertMessage.type = intent.getStringExtra("type").toString()
+ if (alertMessage.type == END_MEETING) {
+ alertMessage.meetingId = intent.getStringExtra("meetingId")?.toLong()
+ alertMessage.participants =
+ intent.getStringExtra("participants")?.split(",")?.map { it.toInt() }
+ val userId = userRepository.getUserInfo()?.id?.toInt()
+ if (alertMessage.participants?.contains(userId) == true && alertMessage.participants?.size!! > 2)
+ sendNotificationAlarm(alertMessage)
+ } else if (alertMessage.title.isNotEmpty()) sendNotificationAlarm(alertMessage)
}
- if (alertMessage.title.isNotEmpty()) sendNotificationAlarm(alertMessage)
}
}
}
diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendDetailFragment.kt b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendDetailFragment.kt
index 5168e37a..1154e1c8 100644
--- a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendDetailFragment.kt
+++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendDetailFragment.kt
@@ -48,8 +48,8 @@ class ReviewFriendDetailFragment :
private fun initClick() {
val friendDetail = ReviewFriend(id, characterId, name, job)
binding.btnReview.setOnSingleClickListener {
+ viewModel.addSelectDetailFriendList(friendDetail)
if (viewModel.currentFriendIndex < viewModel.selectFriendList.size) {
- viewModel.addSelectDetailFriendList(friendDetail)
(requireActivity() as? ReviewActivity)?.nextFriendDetailFragment()
} else {
viewModel.postRegisterReview()
diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewViewModel.kt b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewViewModel.kt
index edd1ca6d..0009dd5e 100644
--- a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewViewModel.kt
+++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewViewModel.kt
@@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.teumteum.domain.entity.ReviewFriend
import com.teumteum.domain.repository.GroupRepository
+import com.teumteum.domain.repository.UserRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
import kotlinx.coroutines.flow.MutableStateFlow
@@ -12,13 +13,14 @@ import kotlinx.coroutines.launch
@HiltViewModel
class ReviewViewModel @Inject constructor(
- private val repository: GroupRepository
+ private val repository: GroupRepository,
+ private val userRepository: UserRepository
) : ViewModel() {
private var _selectFriendList = listOf()
val selectFriendList get() = _selectFriendList
private var _selectDetailFriendList = mutableListOf()
- val selectDetailFriendList get() = _selectFriendList
+ val selectDetailFriendList get() = _selectDetailFriendList
var meetingId: Long? = null
@@ -34,15 +36,23 @@ class ReviewViewModel @Inject constructor(
}
fun addSelectDetailFriendList(selectFriendDetail: ReviewFriend) {
+ _selectDetailFriendList.removeAll { it.id == selectFriendDetail.id }
_selectDetailFriendList.add(selectFriendDetail)
}
+ private fun filterReviewFriendList(list: List): List {
+ val friendList = list.toMutableList()
+ val myUserId = userRepository.getUserInfo()?.id
+ friendList.removeAll { it.id == myUserId }
+ return friendList
+ }
+
fun getReviewFriendList() {
meetingId?.let { id ->
viewModelScope.launch {
repository.getReviewFriendList(id)
- .onSuccess {
- _moimFriendList.value = it
+ .onSuccess { list ->
+ _moimFriendList.value = filterReviewFriendList(list)
}
}
}
diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/mypage/recommend/RecommendScreen.kt b/app/src/main/java/com/teumteum/teumteum/presentation/mypage/recommend/RecommendScreen.kt
index 8d76e7f5..7aea4e9d 100644
--- a/app/src/main/java/com/teumteum/teumteum/presentation/mypage/recommend/RecommendScreen.kt
+++ b/app/src/main/java/com/teumteum/teumteum/presentation/mypage/recommend/RecommendScreen.kt
@@ -20,7 +20,6 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
-import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
@@ -40,7 +39,6 @@ import com.teumteum.teumteum.presentation.mypage.setting.viewModel.MyPageViewMod
import com.teumteum.teumteum.presentation.mypage.setting.viewModel.Recommend
import com.teumteum.teumteum.presentation.mypage.setting.viewModel.RecommendDetailViewModel
import com.teumteum.teumteum.presentation.mypage.setting.viewModel.UserInfoUiState
-import com.teumteum.teumteum.presentation.mypage.setting.viewModel.SettingViewModel
import com.teumteum.teumteum.presentation.mypage.setting.viewModel.toRecommend
import com.teumteum.teumteum.util.SignupUtils.CHARACTER_CARD_FRIEND
@@ -127,6 +125,7 @@ fun RecommendItem(recommend: Recommend, myPageViewModel: MyPageViewModel, navCon
verticalAlignment = Alignment.CenterVertically
) {
RecommendRow(recommend = recommend, list= CHARACTER_CARD_FRIEND)
+ RecommendRow(recommend = recommend, list= SignupUtils.CHARACTER_FRIEND_LIST)
recommend.jobName?.let {
Text(
text = it,
diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/mypage/setting/viewModel/MyPageViewModel.kt b/app/src/main/java/com/teumteum/teumteum/presentation/mypage/setting/viewModel/MyPageViewModel.kt
index f0deee29..dfd31b98 100644
--- a/app/src/main/java/com/teumteum/teumteum/presentation/mypage/setting/viewModel/MyPageViewModel.kt
+++ b/app/src/main/java/com/teumteum/teumteum/presentation/mypage/setting/viewModel/MyPageViewModel.kt
@@ -125,6 +125,7 @@ class MyPageViewModel @Inject constructor(
}
}
}
+
fun userInfoToFrontCard(userInfo: UserInfo, characterList: HashMap): FrontCard {
return FrontCard(
name = userInfo.name,
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 9d853b57..3e1d0451 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
@@ -16,6 +16,7 @@ import com.teumteum.teumteum.util.SignupUtils.CHARACTER_CARD_LIST_BACK
import com.teumteum.teumteum.util.SignupUtils.STATUS_STUDENT
import com.teumteum.teumteum.util.SignupUtils.STATUS_TRAINEE
import com.teumteum.teumteum.util.SignupUtils.STATUS_WORKER
+import com.teumteum.teumteum.util.custom.view.model.BackCard
import com.teumteum.teumteum.util.custom.view.model.FrontCard
import com.teumteum.teumteum.util.custom.view.model.Interest
import dagger.hilt.android.AndroidEntryPoint
@@ -60,9 +61,10 @@ class CardCompleteFragment
for (i in interestSelf.value) {
interests.add(Interest(i))
}
+
+ val bc = BackCard(goalContent = goalText.value, characterResId = CHARACTER_CARD_LIST_BACK[characterId.value])
+ binding.cardviewBack.getInstance(bc)
binding.cardviewBack.apply {
- tvGoalContent.text = goalText.value
- CHARACTER_CARD_LIST_BACK[characterId.value]?.let { ivCharacter.setImageResource(it) }
submitInterestList(interests)
isModify = false
setIsModifyDetail(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 404b615a..4a63108b 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
@@ -73,11 +73,13 @@ class CardFixFragment
for (i in interestSelf.value) {
interests.add(Interest(i))
}
+
+ val bc = BackCard(goalContent = goalText.value, characterResId = SignupUtils.CHARACTER_CARD_LIST_BACK[characterId.value])
+ binding.cardviewBack.getInstance(bc)
binding.cardviewBack.apply {
- setIsModifyDetail(true)
- tvGoalContent.text = goalText.value
- SignupUtils.CHARACTER_CARD_LIST_BACK[characterId.value]?.let { ivCharacter.setImageResource(it) }
submitInterestList(interests)
+ isModify = false
+ setIsModifyDetail(true)
}
}
}
diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/signup/name/GetNameFragment.kt b/app/src/main/java/com/teumteum/teumteum/presentation/signup/name/GetNameFragment.kt
index 8dec9030..c69f08be 100644
--- a/app/src/main/java/com/teumteum/teumteum/presentation/signup/name/GetNameFragment.kt
+++ b/app/src/main/java/com/teumteum/teumteum/presentation/signup/name/GetNameFragment.kt
@@ -2,6 +2,7 @@ package com.teumteum.teumteum.presentation.signup.name
import android.os.Bundle
import android.text.Editable
+import android.text.InputFilter
import android.text.TextWatcher
import android.view.View
import androidx.fragment.app.activityViewModels
@@ -26,6 +27,7 @@ class GetNameFragment
binding.vm = viewModel
binding.lifecycleOwner = this
+ binding.etName.filters = arrayOf(filterAlphaNumSpace)
setTextChangedListener()
checkValidinput()
}
@@ -44,18 +46,31 @@ class GetNameFragment
})
}
+ private var filterAlphaNumSpace = InputFilter { source, _, _, _, _, _ ->
+ val ps = Pattern.compile(REGEX_NAME_PATTERN_WRITING)
+ if (!ps.matcher(source).matches()) {
+ ""
+ } else source
+ }
+
private fun checkValidinput() {
lifecycleScope.launch {
viewModel.userName.collect { userName ->
- if (Pattern.matches(REGEX_NAME_PATTERN, userName) && userName.trim().length >= 2)
+ if (Pattern.matches(REGEX_NAME_PATTERN_SUBMIT, userName) && userName.trim().length >= 2) {
(activity as SignUpActivity).activateNextButton()
- else
+ binding.tvCaption.visibility = View.INVISIBLE
+ }
+ else {
(activity as SignUpActivity).disableNextButton()
+ if (userName.isNotBlank()) binding.tvCaption.visibility = View.VISIBLE
+ else binding.tvCaption.visibility = View.INVISIBLE
+ }
}
}
}
companion object {
- private const val REGEX_NAME_PATTERN = "^([๊ฐ-ํฃ]*)\$"
+ private const val REGEX_NAME_PATTERN_SUBMIT = "^([๊ฐ-ํฃ]*)\$"
+ private const val REGEX_NAME_PATTERN_WRITING = "^[ใฑ-ใ
ฃ๊ฐ-ํฃ]+$"
}
}
\ No newline at end of file
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 a21263b4..79b234e7 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
@@ -11,6 +11,7 @@ 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.MyApp.Companion.isForeground
import com.teumteum.teumteum.R
import com.teumteum.teumteum.databinding.ActivitySplashBinding
import com.teumteum.teumteum.presentation.MainActivity
@@ -32,6 +33,7 @@ class SplashActivity
isFromAlarm = intent.getBooleanExtra(IS_FROM_ALARM, false)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) getMessage()
+ if (isForeground) startHomeScreen()
checkNetwork()
}
diff --git a/app/src/main/java/com/teumteum/teumteum/util/ResMapper.kt b/app/src/main/java/com/teumteum/teumteum/util/ResMapper.kt
index 2f6269dc..0e2f2f38 100644
--- a/app/src/main/java/com/teumteum/teumteum/util/ResMapper.kt
+++ b/app/src/main/java/com/teumteum/teumteum/util/ResMapper.kt
@@ -60,6 +60,23 @@ object ResMapper {
}
}
+ fun getColorByBackCardCharacterDrawble(context: Context, characterResId: Int): Int {
+ return when (characterResId) {
+ R.drawable.ic_card_back_ghost -> getColorByCharacterId(context, 0)
+ R.drawable.ic_card_back_star -> getColorByCharacterId(context, 1)
+ R.drawable.ic_card_back_bear -> getColorByCharacterId(context, 2)
+ R.drawable.ic_card_back_raccon -> getColorByCharacterId(context, 3)
+ R.drawable.ic_card_back_cat -> getColorByCharacterId(context, 4)
+ R.drawable.ic_card_back_rabbit -> getColorByCharacterId(context, 5)
+ R.drawable.ic_card_back_fox -> getColorByCharacterId(context, 6)
+ R.drawable.ic_card_back_water -> getColorByCharacterId(context, 7)
+ R.drawable.ic_card_back_penguin -> getColorByCharacterId(context, 8)
+ R.drawable.ic_card_back_dog -> getColorByCharacterId(context, 9)
+ R.drawable.ic_card_back_mouse -> getColorByCharacterId(context, 10)
+ R.drawable.ic_card_back_panda -> getColorByCharacterId(context, 11)
+ else -> getColorByCharacterId(context, 0)
+ }
+ }
fun getColorByCharacterId(context: Context, characterId: Int): Int {
return when (characterId) {
diff --git a/app/src/main/java/com/teumteum/teumteum/util/SignupUtils.kt b/app/src/main/java/com/teumteum/teumteum/util/SignupUtils.kt
index 0812c302..dc570eb5 100644
--- a/app/src/main/java/com/teumteum/teumteum/util/SignupUtils.kt
+++ b/app/src/main/java/com/teumteum/teumteum/util/SignupUtils.kt
@@ -52,6 +52,21 @@ object SignupUtils {
11 to R.drawable.ic_panda
)
+ val CHARACTER_FRIEND_LIST: HashMap = hashMapOf(
+ 0 to R.drawable.ic_ghost,
+ 1 to R.drawable.ic_star_character,
+ 2 to R.drawable.ic_bear,
+ 3 to R.drawable.ic_raccoon,
+ 4 to R.drawable.ic_cat,
+ 5 to R.drawable.ic_rabbit,
+ 6 to R.drawable.ic_fox,
+ 7 to R.drawable.ic_water,
+ 8 to R.drawable.ic_penguin,
+ 9 to R.drawable.ic_dog,
+ 10 to R.drawable.ic_mouse,
+ 11 to R.drawable.ic_panda
+ )
+
const val JOB_DESIGN = "๋์์ธ"
const val JOB_DEVELOPMENT = "๊ฐ๋ฐ"
const val JOB_PLANNING = "๊ธฐํ"
diff --git a/app/src/main/java/com/teumteum/teumteum/util/custom/view/BackCardView.kt b/app/src/main/java/com/teumteum/teumteum/util/custom/view/BackCardView.kt
index 904d2dd9..fe772838 100644
--- a/app/src/main/java/com/teumteum/teumteum/util/custom/view/BackCardView.kt
+++ b/app/src/main/java/com/teumteum/teumteum/util/custom/view/BackCardView.kt
@@ -19,6 +19,7 @@ import com.google.android.flexbox.FlexWrap
import com.google.android.flexbox.FlexboxLayoutManager
import com.google.android.flexbox.JustifyContent
import com.teumteum.teumteum.R
+import com.teumteum.teumteum.util.ResMapper
import com.teumteum.teumteum.util.callback.OnCurrentListChangedListener
import com.teumteum.teumteum.util.custom.itemdecoration.FlexboxItemDecoration
import com.teumteum.teumteum.util.custom.view.adapter.InterestAdapter
@@ -163,7 +164,10 @@ class BackCardView : CardView, OnCurrentListChangedListener {
private fun setUpViews() {
tvGoalTitle.text = backCard.goalTitle
tvGoalContent.text = backCard.goalContent
- backCard.characterResId?.let { ivCharacter.setImageResource(it) }
+ backCard.characterResId?.let {
+ ivCharacter.setImageResource(it)
+ tvGoalTitle.setTextColor(ResMapper.getColorByBackCardCharacterDrawble(context, it))
+ }
ivFloat.setImageResource(backCard.floatResId)
}
diff --git a/app/src/main/res/layout/fragment_get_name.xml b/app/src/main/res/layout/fragment_get_name.xml
index 314620b8..0eb0b8f3 100644
--- a/app/src/main/res/layout/fragment_get_name.xml
+++ b/app/src/main/res/layout/fragment_get_name.xml
@@ -79,5 +79,17 @@
app:layout_constraintTop_toBottomOf="@id/tv_name"
/>
+
+
\ 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 3947a0ae..ac95967c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -57,6 +57,7 @@
ํํ์ ์ ๋ขฐ ๊ธฐ๋ฐ ์ปค๋ฎค๋ํฐ๋ก ์ค๋ช
์ผ๋ก\n๋ํํ๊ณ ์์ด์
์ด๋ฆ
์ค๋ช
์ ์
๋ ฅํด์ฃผ์ธ์
+ ํ์์ด ์ฌ๋ฐ๋ฅด์ง ์์์.
์์ผ์ด ์ธ์ ์ธ๊ฐ์?
๋๋์ ํจ๊ปํ๋ ๋ง์ถคํ ๋ชจ์์ ์ถ์ฒํด ๋๋ ค์
2000๋
diff --git a/core/data/src/main/java/com/teumteum/data/datasource/remote/RemoteGroupDataSource.kt b/core/data/src/main/java/com/teumteum/data/datasource/remote/RemoteGroupDataSource.kt
index 62055bb5..fbd9a954 100644
--- a/core/data/src/main/java/com/teumteum/data/datasource/remote/RemoteGroupDataSource.kt
+++ b/core/data/src/main/java/com/teumteum/data/datasource/remote/RemoteGroupDataSource.kt
@@ -1,9 +1,9 @@
package com.teumteum.data.datasource.remote
-import com.teumteum.data.model.request.RequestReviewFriend
+import com.teumteum.data.model.request.RequestReviewFriends
import com.teumteum.data.model.response.ResponseGroup
import com.teumteum.data.model.response.ResponseMeeting
-import com.teumteum.data.model.response.ResponseReviewFriends
+import com.teumteum.data.model.response.ResponseReviewFriend
import com.teumteum.data.service.GroupService
import okhttp3.MultipartBody
import okhttp3.RequestBody
@@ -85,13 +85,13 @@ class RemoteGroupDataSource @Inject constructor(
suspend fun getReviewFriendList(
meetingId: Long
- ): ResponseReviewFriends {
+ ): List {
return service.getReviewFriendList(meetingId)
}
suspend fun postRegisterReview(
meetingId: Long,
- requestReviewFriends: List
+ requestReviewFriends: RequestReviewFriends
): Boolean {
return service.postRegisterReview(meetingId, requestReviewFriends).isSuccessful
}
diff --git a/core/data/src/main/java/com/teumteum/data/interceptor/AuthInterceptor.kt b/core/data/src/main/java/com/teumteum/data/interceptor/AuthInterceptor.kt
index 7fc7e5e1..0e3d816b 100644
--- a/core/data/src/main/java/com/teumteum/data/interceptor/AuthInterceptor.kt
+++ b/core/data/src/main/java/com/teumteum/data/interceptor/AuthInterceptor.kt
@@ -29,7 +29,7 @@ class AuthInterceptor @Inject constructor(
try {
Timber.tag("๋ง๋ฃ๋ ํ ํฐ").d("accessToken: ${dataStore.userToken}, refreshToken: ${dataStore.refreshToken}")
val refreshTokenRequest = originalRequest.newBuilder().post("".toRequestBody())
- .url("$BASE_URL/auth/reissues")
+ .url("${BASE_URL}auth/reissues")
.addHeader(HEADER_AUTHORIZATION, dataStore.userToken)
.addHeader(HEADER_REFRESH_TOKEN, dataStore.refreshToken)
.build()
diff --git a/core/data/src/main/java/com/teumteum/data/model/request/RequestReviewFriend.kt b/core/data/src/main/java/com/teumteum/data/model/request/RequestReviewFriend.kt
index 3461be89..1f591509 100644
--- a/core/data/src/main/java/com/teumteum/data/model/request/RequestReviewFriend.kt
+++ b/core/data/src/main/java/com/teumteum/data/model/request/RequestReviewFriend.kt
@@ -3,6 +3,11 @@ package com.teumteum.data.model.request
import com.teumteum.domain.entity.ReviewFriend
import kotlinx.serialization.Serializable
+@Serializable
+data class RequestReviewFriends(
+ val reviews: List
+)
+
@Serializable
data class RequestReviewFriend(
val id: Long,
diff --git a/core/data/src/main/java/com/teumteum/data/repository/GroupRepositoryImpl.kt b/core/data/src/main/java/com/teumteum/data/repository/GroupRepositoryImpl.kt
index bdf6d783..cfac34f9 100644
--- a/core/data/src/main/java/com/teumteum/data/repository/GroupRepositoryImpl.kt
+++ b/core/data/src/main/java/com/teumteum/data/repository/GroupRepositoryImpl.kt
@@ -3,9 +3,9 @@ package com.teumteum.data.repository
import android.util.Log
import com.google.gson.Gson
import com.teumteum.data.datasource.remote.RemoteGroupDataSource
+import com.teumteum.data.model.request.RequestReviewFriends
import com.teumteum.data.model.request.toBody
import com.teumteum.data.model.request.toRequestReviewFriend
-import com.teumteum.domain.TeumTeumDataStore
import com.teumteum.domain.entity.Meeting
import com.teumteum.domain.entity.MoimEntity
import com.teumteum.domain.entity.ReviewFriend
@@ -98,7 +98,7 @@ class GroupRepositoryImpl @Inject constructor(
override suspend fun getReviewFriendList(meetingId: Long): Result> {
return runCatching {
- dataSource.getReviewFriendList(meetingId).participants.map { it.toReviewFriend() }
+ dataSource.getReviewFriendList(meetingId).map { it.toReviewFriend() }
}
}
@@ -107,7 +107,7 @@ class GroupRepositoryImpl @Inject constructor(
request: List
): Result {
return runCatching {
- dataSource.postRegisterReview(meetingId, request.map { it.toRequestReviewFriend() })
+ dataSource.postRegisterReview(meetingId, RequestReviewFriends(request.map { it.toRequestReviewFriend() }))
}
}
override suspend fun saveBookmark(meetingId: Long): Result {
diff --git a/core/data/src/main/java/com/teumteum/data/service/GroupService.kt b/core/data/src/main/java/com/teumteum/data/service/GroupService.kt
index a5f91bc5..90d2bccd 100644
--- a/core/data/src/main/java/com/teumteum/data/service/GroupService.kt
+++ b/core/data/src/main/java/com/teumteum/data/service/GroupService.kt
@@ -1,10 +1,9 @@
package com.teumteum.data.service
-import com.teumteum.data.model.request.RequestReviewFriend
+import com.teumteum.data.model.request.RequestReviewFriends
import com.teumteum.data.model.response.ResponseGroup
import com.teumteum.data.model.response.ResponseMeeting
-import com.teumteum.data.model.response.ResponseReviewFriends
-import com.teumteum.domain.entity.Meeting
+import com.teumteum.data.model.response.ResponseReviewFriend
import okhttp3.MultipartBody
import okhttp3.RequestBody
import retrofit2.Response
@@ -85,11 +84,11 @@ interface GroupService {
@GET("meetings/{meetingId}/participants")
suspend fun getReviewFriendList(
@Path("meetingId") meetingId: Long
- ): ResponseReviewFriends
+ ): List
@POST("users/reviews")
suspend fun postRegisterReview(
@Query("meetingId") meetingsId: Long,
- @Body request: List
+ @Body request: RequestReviewFriends
):Response
}
\ No newline at end of file