Http Server / Client communication #7

Merged
faraphel merged 24 commits from test-http into main 2024-05-17 17:22:56 +02:00
6 changed files with 147 additions and 20 deletions
Showing only changes of commit 7ed38b2624 - Show all commits

View file

@ -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() {

View file

@ -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)
}
}
}

View file

@ -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<WifiP2pDeviceList?>(null) }

View file

@ -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")
}
}
}

View file

@ -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<RoomScreenType?>(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")
}
}
}
}
}
}

View file

@ -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")
}