very basic screen for the wifi-p2p

This commit is contained in:
Faraphel 2024-04-30 16:58:03 +02:00
parent 23e39c026a
commit 7d0f3e88e0
5 changed files with 105 additions and 25 deletions

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.widgets.WifiP2pWidgetDevice
import com.faraphel.tasks_valider.ui.screen.RoomScreen
class MainActivity : ComponentActivity() {
@ -54,28 +54,10 @@ class MainActivity : ComponentActivity() {
// create a helper for handling the WiFi-Direct
this.p2pHelper = WifiP2pHelper(p2pManager, p2pChannel)
// try to display the different devices when available.
this.p2pHelper!!.registerListener(
WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION,
{
peers: WifiP2pDeviceList? ->
Log.d("wifi-p2p", "peers: $peers")
if (peers != null) this.setContent {
for (device in peers.deviceList) {
Log.d("wifi-p2p", "device: ${device.deviceAddress}")
WifiP2pWidgetDevice(device)
}
}
},
once = true
)
// discovers the peers to trigger the peer changed event
this.p2pHelper!!.discoverPeers(object : WifiP2pManager.ActionListener {
override fun onSuccess() { Log.i("wifi-p2p", "discovering successful !") }
override fun onFailure(reason: Int) { Log.e("wifi-p2p", "discovering failed. Reason: $reason") }
})
// open the room selection screen
this.setContent {
RoomScreen(this.p2pHelper!!)
}
}
@RequiresApi(Build.VERSION_CODES.O)

View file

@ -0,0 +1,31 @@
package com.faraphel.tasks_valider.ui.screen
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
@Composable
fun RoomClientScreen(wifiP2pHelper: WifiP2pHelper) {
val peers = remember { mutableStateOf<WifiP2pDeviceList?>(null) }
Column {
Text(text = "Find a Server")
WifiP2pDeviceListWidget(peers.value)
}
// TODO(Faraphel): might be doubtful. Test with more phones, should it only run once ? refresh button ?
wifiP2pHelper.registerListener(
WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION,
{ new_peers: WifiP2pDeviceList? -> peers.value = new_peers },
once = true
)
wifiP2pHelper.discoverPeers()
}

View file

@ -0,0 +1,44 @@
package com.faraphel.tasks_valider.ui.screen
import androidx.compose.foundation.layout.Column
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import com.faraphel.tasks_valider.connectivity.wifi_p2p.WifiP2pHelper
enum class RoomScreenType {
UNDEFINED,
HOST,
CLIENT
}
/**
* This screen will allow the user to choose which room is he connecting to, or let him create one.
*/
@Composable
fun RoomScreen(wifiP2pHelper: WifiP2pHelper) {
val roomMode = remember { mutableStateOf(RoomScreenType.UNDEFINED) }
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")
}
}
}

View file

@ -0,0 +1,23 @@
package com.faraphel.tasks_valider.ui.widgets.connectivity
import android.net.wifi.p2p.WifiP2pDeviceList
import androidx.compose.foundation.layout.Column
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
/**
* Represent a list of WiFi-Direct devices.
*/
@Composable
fun WifiP2pDeviceListWidget(peers: WifiP2pDeviceList?) {
Text(text = "Devices (${peers?.deviceList?.size ?: 0})")
Column {
if (peers != null) {
for (device in peers.deviceList) {
WifiP2pDeviceWidget(device)
}
}
}
}

View file

@ -1,4 +1,4 @@
package com.faraphel.tasks_valider.ui.widgets
package com.faraphel.tasks_valider.ui.widgets.connectivity
import android.net.wifi.p2p.WifiP2pDevice
import androidx.compose.foundation.layout.Column
@ -8,7 +8,7 @@ import androidx.compose.runtime.Composable
@Composable
fun WifiP2pWidgetDevice(device: WifiP2pDevice) {
fun WifiP2pDeviceWidget(device: WifiP2pDevice) {
Column {
Row {
Text(text = "Name: ")