Skip to content

Commit

Permalink
Merge pull request #273 from 6QuizOnTheBlock/and/feat-#244-create_group
Browse files Browse the repository at this point in the history
And/feat #244 create group
  • Loading branch information
TRASALBY authored May 11, 2024
2 parents 88113a1 + f31eb6e commit 1956651
Show file tree
Hide file tree
Showing 26 changed files with 609 additions and 30 deletions.
1 change: 1 addition & 0 deletions android/core/bluetooth/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
plugins {
alias(libs.plugins.sixkids.android.library)
alias(libs.plugins.sixkids.android.hilt)
}

android {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,8 @@ class BluetoothScanner(context: Context) {
isScanning.value = false
}

fun removeDevice(deviceName: String) {
foundDevices.update { it - deviceName }
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ import androidx.annotation.RequiresPermission
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine

class BluetoothServer(context: Context, private val memberId: Long) {
class BluetoothServer(context: Context) {
private val bluetooth = context.getSystemService(Context.BLUETOOTH_SERVICE)
as? BluetoothManager ?: throw Exception("This device doesn't support Bluetooth")

private var advertiseCallback: AdvertiseCallback? = null


@RequiresPermission(allOf = [Manifest.permission.BLUETOOTH_ADVERTISE, Manifest.permission.BLUETOOTH_CONNECT])
suspend fun startAdvertising() {
suspend fun startAdvertising(memberId: Long) {
val advertiser: BluetoothLeAdvertiser = bluetooth.adapter.bluetoothLeAdvertiser
?: throw Exception("This device doesn't support Bluetooth advertising")

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.sixkids.core.bluetooth.di

import android.content.Context
import com.sixkids.core.bluetooth.BluetoothScanner
import com.sixkids.core.bluetooth.BluetoothServer
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object BluetoothModule {

@Provides
@Singleton
fun provideBluetoothScanner(
@ApplicationContext context: Context
): BluetoothScanner {
return BluetoothScanner(context)
}

@Provides
@Singleton
fun provideBluetoothServer(
@ApplicationContext context: Context
): BluetoothServer {
return BluetoothServer(context)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960">
<path
android:pathData="m336,680 l144,-144 144,144 56,-56 -144,-144 144,-144 -56,-56 -144,144 -144,-144 -56,56 144,144 -144,144 56,56ZM480,880q-83,0 -156,-31.5T197,763q-54,-54 -85.5,-127T80,480q0,-83 31.5,-156T197,197q54,-54 127,-85.5T480,80q83,0 156,31.5T763,197q54,54 85.5,127T880,480q0,83 -31.5,156T763,763q-54,54 -127,85.5T480,880Z"
android:fillColor="#8B1A10"/>
</vector>
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.sixkids.model

enum class GroupType {
FREE,
DESIGN
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.sixkids.model

data class MemberSimple(
val id: Long,
val name: String,
val photo: String
val id: Long = 0L,
val name: String = "",
val photo: String = "",
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.sixkids.data.api
import com.sixkids.data.model.request.FcmRequest
import com.sixkids.data.model.response.ApiResponse
import com.sixkids.data.model.response.MemberInfoResponse
import com.sixkids.data.model.response.MemberSimpleInfoResponse
import com.sixkids.data.model.response.SignInResponse
import com.sixkids.data.model.response.UpdateProfilePhotoResponse
import com.sixkids.data.network.ApiResult
Expand All @@ -15,11 +16,17 @@ import retrofit2.http.PATCH
import retrofit2.http.POST
import retrofit2.http.Part
import retrofit2.http.PartMap
import retrofit2.http.Path

interface MemberService {
@GET("members/")
suspend fun getMemberInfo(): ApiResult<ApiResponse<MemberInfoResponse>>

@GET("members/{id}")
suspend fun getMemberInfoById(
@Path("id") id: Long
): ApiResult<ApiResponse<MemberSimpleInfoResponse>>

@Multipart
@PATCH("members/photo")
suspend fun updateMemberProfilePhoto(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.sixkids.data.repository.user.remote.UserRemoteDataSource
import com.sixkids.domain.repository.TokenRepository
import com.sixkids.domain.repository.UserRepository
import com.sixkids.model.JwtToken
import com.sixkids.model.MemberSimple
import com.sixkids.model.UserInfo
import java.io.File
import javax.inject.Inject
Expand Down Expand Up @@ -56,6 +57,10 @@ class UserRepositoryImpl @Inject constructor(
return userRemoteDataSource.getMemberInfo()
}

override suspend fun getMemberSimpleInfo(id: Long): MemberSimple {
return userRemoteDataSource.getMemberSimple(id)
}

override suspend fun updateMemberProfilePhoto(file: File?, defaultImage: Int): String {
return userRemoteDataSource.updateMemberProfilePhoto(file, defaultImage)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.sixkids.data.repository.user.remote

import com.sixkids.model.JwtToken
import com.sixkids.model.MemberSimple
import com.sixkids.model.UserInfo
import java.io.File

Expand All @@ -11,6 +12,8 @@ interface UserRemoteDataSource {

suspend fun getMemberInfo(): UserInfo

suspend fun getMemberSimple(id: Long): MemberSimple

suspend fun updateMemberProfilePhoto(file: File?, defaultImage: Int): String

suspend fun autoSignIn(): JwtToken
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.sixkids.data.model.request.SignInRequest
import com.sixkids.data.model.response.toModel
import com.sixkids.data.repository.user.local.UserLocalDataSource
import com.sixkids.model.JwtToken
import com.sixkids.model.MemberSimple
import com.sixkids.model.UserInfo
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.MultipartBody
Expand Down Expand Up @@ -75,6 +76,9 @@ class UserRemoteDataSourceImpl @Inject constructor(
return response.getOrThrow().data.toModel()
}

override suspend fun getMemberSimple(id: Long): MemberSimple =
memberService.getMemberInfoById(id).getOrThrow().data.toModel()

override suspend fun updateMemberProfilePhoto(file: File?, defaultImage: Int): String {
val data = HashMap<String, RequestBody>()

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.sixkids.domain.repository

import com.sixkids.model.JwtToken
import com.sixkids.model.MemberSimple
import com.sixkids.model.UserInfo
import java.io.File

Expand All @@ -13,6 +14,8 @@ interface UserRepository {

suspend fun getMemberInfo(): UserInfo

suspend fun getMemberSimpleInfo(id: Long): MemberSimple

suspend fun updateMemberProfilePhoto(file: File?, defaultImage: Int): String

suspend fun signOut() : Boolean
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.sixkids.domain.usecase.user

import com.sixkids.domain.repository.UserRepository
import javax.inject.Inject

class GetMemberSimpleUseCase @Inject constructor(
private val userRepository: UserRepository
){
suspend operator fun invoke(id: Long) = runCatching {
userRepository.getMemberSimpleInfo(id)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import com.sixkids.student.board.navigation.navigateStudentHome
import com.sixkids.student.main.navigation.navigateJoinOrganization
import com.sixkids.student.main.navigation.navigateStudentOrganizationList
import com.sixkids.student.main.navigation.navigateStudentProfile
import com.sixkids.student.navigation.navigateStudentChallengeHistory
import com.sixkids.student.navigation.navigateStudentGroupCreate
import com.sixkids.student.navigation.navigateStudentGroupJoin
import com.sixkids.student.relay.navigation.navigateStudentRelayCreate
Expand Down Expand Up @@ -91,7 +92,7 @@ class MainNavigator(
MainNavigationTab.STUDENT_HOME -> navController.navigateStudentHome(studentNavOptions)
MainNavigationTab.STUDENT_BOARD -> {}
MainNavigationTab.STUDENT_RELAY -> navController.navigateStudentRelayHistory(studentNavOptions)
MainNavigationTab.STUDENT_CHALLENGE -> {}
MainNavigationTab.STUDENT_CHALLENGE -> navController.navigateStudentChallengeHistory(studentNavOptions)
}
}

Expand Down Expand Up @@ -321,4 +322,4 @@ internal fun studentTab(): State<List<MainNavigationTab>>{
MainNavigationTab.STUDENT_CHALLENGE
)
)
}
}
1 change: 1 addition & 0 deletions android/feature/student/challenge/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ android {

dependencies {
implementation(libs.bundles.paging)
implementation(projects.core.bluetooth)
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

</manifest>
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
package com.sixkids.student.group.component

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.sixkids.designsystem.component.button.UlbanFilledButton
import com.sixkids.designsystem.theme.Cream
import com.sixkids.designsystem.theme.UlbanTypography
import com.sixkids.model.MemberSimple
import com.sixkids.student.challenge.R

@Composable
fun GroupWaiting(
leader: MemberSimple = MemberSimple(),
memberList: List<MemberIconItem> = emptyList(),
onDoneClick: () -> Unit = {},
onRemoveClick: (Long) -> Unit = {},
groupSize: Int = 0
) {
Card(
modifier = Modifier
.padding(top = 16.dp)
.fillMaxWidth(),
shape = RoundedCornerShape(
topStart = 12.dp,
topEnd = 12.dp,
bottomStart = 0.dp,
bottomEnd = 0.dp
),
elevation = CardDefaults.cardElevation(16.dp),
colors = CardDefaults.cardColors(
containerColor = Cream
)
) {
val remainingMember = groupSize - memberList.size - 1
Column(
modifier = Modifier.padding(16.dp),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
Text(
modifier = Modifier.padding(top = 16.dp),
text = if(remainingMember != 0) {
stringResource(R.string.friend_waiting_message, remainingMember)
} else {
stringResource(R.string.can_create_group)
},
style = UlbanTypography.bodyMedium
)
LazyRow(
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
if(leader.id != 0L) {
item {
MemberIcon(
member = leader,
showX = false,
isActive = true,
onRemoveClick = {}
)
}
}
items(memberList) { item ->
MemberIcon(
member = MemberSimple(
id = item.memberId,
name = item.name,
photo = item.photo
),
showX = item.showX,
isActive = item.isActive,
onRemoveClick = onRemoveClick
)
}
}
UlbanFilledButton(
modifier = Modifier.fillMaxWidth(),
text = stringResource(R.string.done),
onClick = onDoneClick,
enabled = remainingMember == 0
)
}
}
}

data class MemberIconItem(
val memberId: Long,
val name: String,
val photo: String,
val showX: Boolean = false,
val isActive: Boolean = false
)


@Preview(showBackground = true)
@Composable
fun GroupWaitingPreview() {
GroupWaiting(
leader = MemberSimple(
id = 1,
name = "leader",
photo = ""
),
memberList = List(4) {
MemberIconItem(
memberId = it.toLong(),
name = "name$it",
photo = "",
showX = false,
isActive = it % 2 == 0
)
},
groupSize = 5
)
}
Loading

0 comments on commit 1956651

Please sign in to comment.