Skip to content

Commit ae7ade5

Browse files
authored
Merge pull request #34 from SEONGGYU96/feature/request_matching
Feature/request matching
2 parents 8012f08 + 8318653 commit ae7ade5

File tree

12 files changed

+275
-26
lines changed

12 files changed

+275
-26
lines changed

app/src/main/java/org/sopt/santamanitto/room/manittoroom/ManittoRoomViewModel.kt

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ import androidx.lifecycle.LiveData
55
import androidx.lifecycle.MutableLiveData
66
import org.sopt.santamanitto.NetworkViewModel
77
import org.sopt.santamanitto.room.manittoroom.network.ManittoRoomData
8+
import org.sopt.santamanitto.room.manittoroom.network.ManittoRoomMatchedMissions
89
import org.sopt.santamanitto.room.manittoroom.network.ManittoRoomMember
910
import org.sopt.santamanitto.room.network.RoomRequest
11+
import org.sopt.santamanitto.user.data.User
1012
import org.sopt.santamanitto.user.data.source.UserDataSource
1113
import javax.inject.Named
1214

@@ -15,6 +17,10 @@ class ManittoRoomViewModel @ViewModelInject constructor(
1517
private val roomRequest: RoomRequest
1618
): NetworkViewModel() {
1719

20+
companion object {
21+
private const val TAG = "ManittoRoomViewModel"
22+
}
23+
1824
private var _roomId = -1
1925
var roomId: Int
2026
get() = _roomId
@@ -49,6 +55,14 @@ class ManittoRoomViewModel @ViewModelInject constructor(
4955
val isAdmin: LiveData<Boolean>
5056
get() = _isAdmin
5157

58+
private val _myManittoName = MutableLiveData("")
59+
val myManittoName : LiveData<String>
60+
get() = _myManittoName
61+
62+
private val _myMission = MutableLiveData("")
63+
val myMission: LiveData<String>
64+
get() = _myMission
65+
5266
fun refreshManittoRoomInfo() {
5367
roomRequest.getManittoRoomData(roomId, object: RoomRequest.GetManittoRoomCallback {
5468
override fun onLoadManittoRoomData(manittoRoomData: ManittoRoomData) {
@@ -57,6 +71,20 @@ class ManittoRoomViewModel @ViewModelInject constructor(
5771
_members.value = manittoRoomData.members
5872
_invitationCode = manittoRoomData.invitationCode
5973
_isAdmin.value = userDataSource.getUserId() == manittoRoomData.creator.userId
74+
_isMatched = manittoRoomData.isMatched
75+
}
76+
77+
override fun onFailed() {
78+
_networkErrorOccur.value = true
79+
}
80+
})
81+
}
82+
83+
fun match() {
84+
roomRequest.matchManitto(roomId, object : RoomRequest.MatchManittoCallback {
85+
override fun onSuccessMatching(missions: List<ManittoRoomMatchedMissions>) {
86+
isMatched = true
87+
findMyMission(missions)
6088
}
6189

6290
override fun onFailed() {
@@ -65,4 +93,26 @@ class ManittoRoomViewModel @ViewModelInject constructor(
6593
})
6694
}
6795

96+
private fun findMyMission(missions: List<ManittoRoomMatchedMissions>) {
97+
for (mission in missions) {
98+
if (mission.userId == userDataSource.getUserId()) {
99+
setMyMissionInfo(mission)
100+
return
101+
}
102+
}
103+
_networkErrorOccur.value = true
104+
}
105+
106+
private fun setMyMissionInfo(mission: ManittoRoomMatchedMissions) {
107+
_myMission.value = mission.myMission.content
108+
userDataSource.getUserInfo(mission.manittoUserId, object: UserDataSource.GetUserInfoCallback {
109+
override fun onUserInfoLoaded(user: User) {
110+
_myManittoName.value = user.userName
111+
}
112+
113+
override fun onDataNotAvailable() {
114+
_networkErrorOccur.value = true
115+
}
116+
})
117+
}
68118
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package org.sopt.santamanitto.room.manittoroom.fragment
2+
3+
import android.os.Bundle
4+
import android.os.Handler
5+
import android.os.Looper
6+
import android.util.Log
7+
import android.view.LayoutInflater
8+
import android.view.View
9+
import android.view.ViewGroup
10+
import androidx.fragment.app.Fragment
11+
import androidx.fragment.app.activityViewModels
12+
import androidx.lifecycle.viewModelScope
13+
import dagger.hilt.android.AndroidEntryPoint
14+
import kotlinx.coroutines.Dispatchers
15+
import kotlinx.coroutines.launch
16+
import org.sopt.santamanitto.databinding.FragmentMatchingBinding
17+
import org.sopt.santamanitto.room.manittoroom.ManittoRoomViewModel
18+
19+
@AndroidEntryPoint
20+
class MatchingFragment: Fragment() {
21+
22+
companion object {
23+
private const val TAG = "MatchingFragment"
24+
private const val DELAY_MILLIS = 2000L
25+
}
26+
27+
private lateinit var binding: FragmentMatchingBinding
28+
29+
private val manittoRoomViewModel: ManittoRoomViewModel by activityViewModels()
30+
31+
private var isDelayDone = false
32+
33+
private var isInBackground = false
34+
35+
override fun onCreateView(
36+
inflater: LayoutInflater,
37+
container: ViewGroup?,
38+
savedInstanceState: Bundle?
39+
): View {
40+
binding = FragmentMatchingBinding.inflate(inflater, container, false)
41+
42+
Handler(Looper.getMainLooper()).postDelayed({
43+
isDelayDone = true
44+
}, DELAY_MILLIS)
45+
46+
return binding.root
47+
}
48+
49+
override fun onResume() {
50+
super.onResume()
51+
isInBackground = false
52+
navigateMissionFragment()
53+
}
54+
55+
override fun onPause() {
56+
super.onPause()
57+
isInBackground = true
58+
}
59+
60+
private fun navigateMissionFragment() {
61+
Log.d(TAG, "coroutine(): start")
62+
manittoRoomViewModel.viewModelScope.launch(Dispatchers.Default) {
63+
while ((!manittoRoomViewModel.isMatched || !isDelayDone) && !isInBackground) { }
64+
if (isInBackground) {
65+
return@launch
66+
}
67+
68+
//Todo: 미션 프래그먼트로 이동
69+
}
70+
}
71+
}

app/src/main/java/org/sopt/santamanitto/room/manittoroom/fragment/WaitingRoomFragment.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import android.view.View
66
import android.view.ViewGroup
77
import androidx.fragment.app.Fragment
88
import androidx.fragment.app.activityViewModels
9+
import androidx.navigation.fragment.findNavController
910
import com.google.android.material.snackbar.Snackbar
1011
import dagger.hilt.android.AndroidEntryPoint
1112
import org.sopt.santamanitto.databinding.FragmentWaitingRoomBinding
@@ -60,11 +61,20 @@ class WaitingRoomFragment: Fragment() {
6061
Snackbar.LENGTH_SHORT
6162
).show()
6263
}
64+
santabottombuttonWaitingroom.setOnClickListener {
65+
manittoRoomViewModel.match()
66+
navigateMatchingFragment()
67+
}
6368
}
6469
}
6570

6671
override fun onResume() {
6772
super.onResume()
6873
manittoRoomViewModel.refreshManittoRoomInfo()
6974
}
75+
76+
private fun navigateMatchingFragment() {
77+
findNavController()
78+
.navigate(WaitingRoomFragmentDirections.actionWaitingRoomFragmentToMatchingFragment())
79+
}
7080
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.sopt.santamanitto.room.manittoroom.network
2+
3+
data class ManittoMatchingData(
4+
val roomId: Int
5+
)

app/src/main/java/org/sopt/santamanitto/room/manittoroom/network/ManittoRoomData.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@ data class ManittoRoomData(
66
@SerializedName("id") val roomId: Int,
77
val roomName: String,
88
val invitationCode: String,
9-
@SerializedName("isMatchingDone") val isMatched: String,
9+
@SerializedName("isMatchingDone") val _isMatched: String,
1010
val expiration: String,
1111
val createdAt: String,
1212
@SerializedName("Creator") val creator: ManittoRoomCreator,
1313
@SerializedName("Missions") val missions: List<ManittoRoomMission>,
1414
@SerializedName("Members") val members: List<ManittoRoomMember>
15-
)
15+
) {
16+
val isMatched: Boolean
17+
get() = _isMatched == "true"
18+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.sopt.santamanitto.room.manittoroom.network
2+
3+
import com.google.gson.annotations.SerializedName
4+
import org.sopt.santamanitto.room.data.MissionContent
5+
6+
data class ManittoRoomMatchedMissions(
7+
@SerializedName("UserId") val userId: Int,
8+
@SerializedName("SantaUserId") val santaUserId: Int,
9+
@SerializedName("ManittoUserId") val manittoUserId: Int,
10+
@SerializedName("MyMission") val myMission: MissionContent
11+
)

app/src/main/java/org/sopt/santamanitto/room/network/RoomRequest.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import org.sopt.santamanitto.room.create.network.CreateRoomResponse
55
import org.sopt.santamanitto.room.join.network.JoinRoomData
66
import org.sopt.santamanitto.room.join.network.JoinRoomResponse
77
import org.sopt.santamanitto.room.manittoroom.network.ManittoRoomData
8+
import org.sopt.santamanitto.room.manittoroom.network.ManittoRoomMatchedMissions
89

910
interface RoomRequest {
1011

@@ -26,6 +27,12 @@ interface RoomRequest {
2627
fun onFailed()
2728
}
2829

30+
interface MatchManittoCallback {
31+
fun onSuccessMatching(missions: List<ManittoRoomMatchedMissions>)
32+
33+
fun onFailed()
34+
}
35+
2936
enum class JoinRoomError {
3037
WrongInvitationCode, DuplicatedMember, AlreadyMatched, Els
3138
}
@@ -35,4 +42,6 @@ interface RoomRequest {
3542
fun joinRoom(joinRoomData: JoinRoomData, callback: JoinRoomCallback)
3643

3744
fun getManittoRoomData(roomId: Int, callback: GetManittoRoomCallback)
45+
46+
fun matchManitto(roomId: Int, callback: MatchManittoCallback)
3847
}

app/src/main/java/org/sopt/santamanitto/room/network/RoomService.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import org.sopt.santamanitto.room.create.network.CreateRoomResponse
66
import org.sopt.santamanitto.room.data.PersonalRoomInfo
77
import org.sopt.santamanitto.room.join.network.JoinRoomData
88
import org.sopt.santamanitto.room.join.network.JoinRoomResponse
9+
import org.sopt.santamanitto.room.manittoroom.network.ManittoMatchingData
910
import org.sopt.santamanitto.room.manittoroom.network.ManittoRoomData
11+
import org.sopt.santamanitto.room.manittoroom.network.ManittoRoomMatchedMissions
1012
import retrofit2.Call
1113
import retrofit2.http.Body
1214
import retrofit2.http.GET
@@ -26,4 +28,7 @@ interface RoomService {
2628

2729
@GET("rooms/{roomId}")
2830
fun getManittoRoomData(@Path("roomId") roomId: Int): Call<Response<ManittoRoomData>>
31+
32+
@POST("rooms/match")
33+
fun matchManitto(@Body manittoMatchingData: ManittoMatchingData): Call<Response<List<ManittoRoomMatchedMissions>>>
2934
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
3+
<layout>
4+
5+
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
6+
android:layout_width="match_parent"
7+
android:layout_height="match_parent">
8+
9+
<!-- Todo: 레이아웃 작성하기 -->
10+
11+
</androidx.constraintlayout.widget.ConstraintLayout>
12+
13+
</layout>

app/src/main/res/navigation/navigation_manittoroom.xml

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,19 @@
99
android:id="@+id/waitingRoomFragment"
1010
android:name="org.sopt.santamanitto.room.manittoroom.fragment.WaitingRoomFragment"
1111
android:label="WaitingRoomFragment"
12-
tool:layout="@layout/fragment_waiting_room"/>
12+
tool:layout="@layout/fragment_waiting_room">
13+
14+
<action
15+
android:id="@+id/action_waitingRoomFragment_to_matchingFragment"
16+
app:destination="@id/matchingFragment"
17+
app:popUpTo="@id/matchingFragment" />
18+
19+
</fragment>
20+
21+
<fragment
22+
android:id="@+id/matchingFragment"
23+
android:name="org.sopt.santamanitto.room.manittoroom.fragment.MatchingFragment"
24+
android:label="MatchingFragment"
25+
tool:layout="@layout/fragment_matching" />
26+
1327
</navigation>

0 commit comments

Comments
 (0)