From 7ed38b2624a1ad73147f4bf29635af7b1353bc41 Mon Sep 17 00:00:00 2001 From: Faraphel Date: Tue, 30 Apr 2024 20:21:25 +0200 Subject: [PATCH] very basic screen for the room creation --- .../faraphel/tasks_valider/MainActivity.kt | 2 +- .../connectivity/wifi_p2p/WifiP2pHelper.kt | 56 +++++++++++++++-- .../ui/screen/{ => room}/RoomClientScreen.kt | 6 +- .../ui/screen/room/RoomHostScreen.kt | 61 +++++++++++++++++++ .../ui/screen/{ => room}/RoomScreen.kt | 29 +++++---- .../ui/screen/tasks/TaskGroupScreen.kt | 13 ++++ 6 files changed, 147 insertions(+), 20 deletions(-) rename app/src/main/java/com/faraphel/tasks_valider/ui/screen/{ => room}/RoomClientScreen.kt (90%) create mode 100644 app/src/main/java/com/faraphel/tasks_valider/ui/screen/room/RoomHostScreen.kt rename app/src/main/java/com/faraphel/tasks_valider/ui/screen/{ => room}/RoomScreen.kt (58%) create mode 100644 app/src/main/java/com/faraphel/tasks_valider/ui/screen/tasks/TaskGroupScreen.kt diff --git a/app/src/main/java/com/faraphel/tasks_valider/MainActivity.kt b/app/src/main/java/com/faraphel/tasks_valider/MainActivity.kt index 9a773a0..3689afc 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/MainActivity.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/MainActivity.kt @@ -13,7 +13,7 @@ import androidx.activity.compose.setContent import androidx.annotation.RequiresApi import com.faraphel.tasks_valider.connectivity.wifi_p2p.WifiP2pHelper import com.faraphel.tasks_valider.database.Database -import com.faraphel.tasks_valider.ui.screen.RoomScreen +import com.faraphel.tasks_valider.ui.screen.room.RoomScreen class MainActivity : ComponentActivity() { diff --git a/app/src/main/java/com/faraphel/tasks_valider/connectivity/wifi_p2p/WifiP2pHelper.kt b/app/src/main/java/com/faraphel/tasks_valider/connectivity/wifi_p2p/WifiP2pHelper.kt index 381f3a7..6d2b309 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/connectivity/wifi_p2p/WifiP2pHelper.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/connectivity/wifi_p2p/WifiP2pHelper.kt @@ -119,10 +119,7 @@ class WifiP2pHelper( * * Connect to another device, allowing for a communication using Sockets */ - fun connect(deviceAddress: String, listener: WifiP2pManager.ActionListener? = null) { - val config = WifiP2pConfig().apply { - this.deviceAddress = deviceAddress - } + fun connect(config: WifiP2pConfig, listener: WifiP2pManager.ActionListener? = null) { this.manager.connect(this.channel, config, listener) } @@ -162,4 +159,55 @@ class WifiP2pHelper( fun requestGroupInfo(listener: WifiP2pManager.GroupInfoListener? = null) { this.manager.requestGroupInfo(this.channel, listener) } + + /** + * Wrapper around WifiP2pManager::createGroup + * + * Create a new WiFi-Direct group. + */ + fun createGroup(listener: WifiP2pManager.ActionListener? = null) { + this.manager.createGroup(this.channel, listener) + } + + /** + * Wrapper around WifiP2pManager::removeGroup + * + * Disconnect from the current WiFi-Direct group. + */ + fun removeGroup(listener: WifiP2pManager.ActionListener? = null) { + this.manager.removeGroup(this.channel, listener) + } + + /** + * Create a new WiFi-Direct group. + * If already connected to a group, quit it first. + * + * @param listener: the createGroup listener + * @param onFailure: error handler for the removeGroup event + */ + fun recreateGroup( + listener: WifiP2pManager.ActionListener? = null, + onFailure: ((Int) -> Unit)? = null + ) { + // get the current group information + this.requestGroupInfo { group -> + // if a group exist, quit it + if (group != null) + this.removeGroup(object : WifiP2pManager.ActionListener { + override fun onSuccess() { + // once left, create the group + this@WifiP2pHelper.createGroup(listener) + } + + override fun onFailure(reason: Int) { + // call the handler + onFailure?.invoke(reason) + } + + }) + else + // create the group + this.createGroup(listener) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/RoomClientScreen.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/room/RoomClientScreen.kt similarity index 90% rename from app/src/main/java/com/faraphel/tasks_valider/ui/screen/RoomClientScreen.kt rename to app/src/main/java/com/faraphel/tasks_valider/ui/screen/room/RoomClientScreen.kt index f0ee7dd..6bc878c 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/RoomClientScreen.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/room/RoomClientScreen.kt @@ -1,17 +1,19 @@ -package com.faraphel.tasks_valider.ui.screen +package com.faraphel.tasks_valider.ui.screen.room import android.net.wifi.p2p.WifiP2pDeviceList import android.net.wifi.p2p.WifiP2pManager import androidx.compose.foundation.layout.Column import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import com.faraphel.tasks_valider.connectivity.wifi_p2p.WifiP2pHelper import com.faraphel.tasks_valider.ui.widgets.connectivity.WifiP2pDeviceListWidget +/** + * This screen allow the user to join a room + */ @Composable fun RoomClientScreen(wifiP2pHelper: WifiP2pHelper) { val peers = remember { mutableStateOf(null) } diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/room/RoomHostScreen.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/room/RoomHostScreen.kt new file mode 100644 index 0000000..eb2dcf0 --- /dev/null +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/room/RoomHostScreen.kt @@ -0,0 +1,61 @@ +package com.faraphel.tasks_valider.ui.screen.room + +import android.net.wifi.p2p.WifiP2pManager +import android.util.Log +import androidx.compose.foundation.layout.Column +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import com.faraphel.tasks_valider.connectivity.wifi_p2p.WifiP2pHelper +import com.faraphel.tasks_valider.ui.screen.tasks.TaskGroupScreen + + +/** + * This screen allow the user to create a room + */ +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun RoomHostScreen(wifiP2pHelper: WifiP2pHelper) { + val expanded = remember { mutableStateOf(false) } + val isCreated = remember { mutableStateOf(false) } + + // if the group have been created, display the group screen + if (isCreated.value) { + TaskGroupScreen() + return + } + + Column { + ExposedDropdownMenuBox( + expanded = expanded.value, + onExpandedChange = { value -> expanded.value = !value } + ) { + DropdownMenuItem( + text = { Text("ISRI") }, + onClick = {} + ) + DropdownMenuItem( + text = { Text("MIAGE") }, + onClick = {} + ) + } + + Button(onClick = { + // create a new WiFi-Direct group + wifiP2pHelper.recreateGroup(object : WifiP2pManager.ActionListener { + override fun onSuccess() { + Log.i("room", "group created !") + // mark the group as created + isCreated.value = true + } + override fun onFailure(reason: Int) { + Log.e("room", "error while creating group. Reason: $reason") + } + }) + }) { + Text("Create") + } + } + +} diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/RoomScreen.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/room/RoomScreen.kt similarity index 58% rename from app/src/main/java/com/faraphel/tasks_valider/ui/screen/RoomScreen.kt rename to app/src/main/java/com/faraphel/tasks_valider/ui/screen/room/RoomScreen.kt index cef5f5e..3e7b38a 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/RoomScreen.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/room/RoomScreen.kt @@ -1,4 +1,4 @@ -package com.faraphel.tasks_valider.ui.screen +package com.faraphel.tasks_valider.ui.screen.room import androidx.compose.foundation.layout.Column import androidx.compose.material3.Button @@ -10,7 +10,6 @@ import com.faraphel.tasks_valider.connectivity.wifi_p2p.WifiP2pHelper enum class RoomScreenType { - UNDEFINED, HOST, CLIENT } @@ -21,24 +20,28 @@ enum class RoomScreenType { */ @Composable fun RoomScreen(wifiP2pHelper: WifiP2pHelper) { - val roomMode = remember { mutableStateOf(RoomScreenType.UNDEFINED) } + val roomMode = remember { mutableStateOf(null) } when (roomMode.value) { - RoomScreenType.UNDEFINED -> Column { - Button(onClick = { roomMode.value = RoomScreenType.CLIENT }) { - Text(text = "Join a room") - } - Button(onClick = { roomMode.value = RoomScreenType.HOST }) { - Text(text = "Create a room") - } - } RoomScreenType.CLIENT -> { // Client mode RoomClientScreen(wifiP2pHelper) } RoomScreenType.HOST -> { // Host mode - TODO("Faraphel: host mode not implemented") + RoomHostScreen(wifiP2pHelper) + } + + null -> { + // let the user decide which room mode he which to use + Column { + Button(onClick = { roomMode.value = RoomScreenType.CLIENT }) { + Text(text = "Join a room") + } + Button(onClick = { roomMode.value = RoomScreenType.HOST }) { + Text(text = "Create a room") + } + } } } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/tasks/TaskGroupScreen.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/tasks/TaskGroupScreen.kt new file mode 100644 index 0000000..60c4fca --- /dev/null +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/tasks/TaskGroupScreen.kt @@ -0,0 +1,13 @@ +package com.faraphel.tasks_valider.ui.screen.tasks + +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable + + +/** + * This screen let the user decide which student team he wants to interact with + */ +@Composable +fun TaskGroupScreen() { + Text(text = "Task Group") +}