From c6b11effe345b88a5bef61ed9a36221f19c282e5 Mon Sep 17 00:00:00 2001 From: Faraphel Date: Sat, 29 Jun 2024 03:15:47 +0200 Subject: [PATCH] fixed the Wi-Fi Direct client feature --- README.md | 13 +++- app/src/main/AndroidManifest.xml | 3 +- .../connectivity/bwd/BwdManager.kt | 12 ++- .../connection/internet/{ => role}/client.kt | 2 +- .../connection/internet/{ => role}/server.kt | 2 +- .../connection/internet/selection.kt | 4 +- .../connection/wifiP2p/client.kt | 57 -------------- .../connection/wifiP2p/role/client.kt | 76 +++++++++++++++++++ .../connection/wifiP2p/{ => role}/server.kt | 6 +- .../connection/wifiP2p/selection.kt | 5 +- .../ui/screen/communication/selection.kt | 4 +- 11 files changed, 110 insertions(+), 74 deletions(-) rename app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/internet/{ => role}/client.kt (99%) rename app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/internet/{ => role}/server.kt (99%) delete mode 100644 app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/client.kt create mode 100644 app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/role/client.kt rename app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/{ => role}/server.kt (95%) diff --git a/README.md b/README.md index c122a9a..eff70fe 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,12 @@ -# Study-M1-PDS +# Master 1 - Projet de Spécialité -(Université) - Projet De Spécialité +Ce projet consiste en une application Android permettant à des enseignants de créer des session de cours où un ensemble +d'élève est assigné à des tâches de sujet différent qui peuvent être validé collaborativement. + +Il est possible d'utiliser le QR code des cartes étudiantes afin de substituer l'identifiant d'un étudiant et de +pouvoir valider rapidement les tâches d'un élève. + +# Build + +1. Cloner le projet `git clone https://git.faraphel.fr/study-faraphel/M1-PDS` +2. Ouvrer le dans Android Studio ou Intellij IDEA \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 32f3c79..c459751 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,7 +48,8 @@ + android:theme="@style/Theme.Tasksvalider" + android:screenOrientation="portrait"> diff --git a/app/src/main/java/com/faraphel/tasks_valider/connectivity/bwd/BwdManager.kt b/app/src/main/java/com/faraphel/tasks_valider/connectivity/bwd/BwdManager.kt index d200d0f..97924cf 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/connectivity/bwd/BwdManager.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/connectivity/bwd/BwdManager.kt @@ -1,6 +1,7 @@ package com.faraphel.tasks_valider.connectivity.bwd import android.Manifest +import android.annotation.SuppressLint import android.app.Activity import android.content.BroadcastReceiver import android.content.Context @@ -41,6 +42,7 @@ class BwdManager( * Create a new BwfManager from an activity. * @param activity The activity to create the manager from */ + @SuppressLint("UnspecifiedRegisterReceiverFlag") fun fromActivity(activity: Activity): BwdManager { // check if the system support WiFi-Direct if (!this.isSupported(activity)) { @@ -67,9 +69,14 @@ class BwdManager( // get the WiFi-Direct channel val channel = manager.initialize(activity, activity.mainLooper, null) - return BwdManager(manager, channel) + + // create the manager + val bwdManager = BwdManager(manager, channel) - // NOTE(Faraphel): the broadcast receiver should be registered in the activity onResume + // make the manager receive the application intents + activity.registerReceiver(bwdManager, ALL_INTENT_FILTER) + + return bwdManager } } @@ -174,6 +181,7 @@ class BwdManager( val stateConnectionInfo = mutableStateOf(null) val statePeers = mutableStateOf(null) + override fun onReceive(context: Context?, intent: Intent?) { // ignore empty intent if (intent == null) diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/internet/client.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/internet/role/client.kt similarity index 99% rename from app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/internet/client.kt rename to app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/internet/role/client.kt index cd53c0d..05b6565 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/internet/client.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/internet/role/client.kt @@ -1,4 +1,4 @@ -package com.faraphel.tasks_valider.ui.screen.communication.connection.internet +package com.faraphel.tasks_valider.ui.screen.communication.connection.internet.role import android.app.Activity import androidx.compose.foundation.layout.* diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/internet/server.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/internet/role/server.kt similarity index 99% rename from app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/internet/server.kt rename to app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/internet/role/server.kt index 9021139..9fb8127 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/internet/server.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/internet/role/server.kt @@ -1,4 +1,4 @@ -package com.faraphel.tasks_valider.ui.screen.communication.connection.internet +package com.faraphel.tasks_valider.ui.screen.communication.connection.internet.role import android.app.Activity import android.util.Log diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/internet/selection.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/internet/selection.kt index 7f6e353..5d4a0eb 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/internet/selection.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/internet/selection.kt @@ -1,8 +1,6 @@ package com.faraphel.tasks_valider.ui.screen.communication.connection.internet import android.app.Activity -import android.os.Build -import androidx.annotation.RequiresApi import androidx.compose.foundation.layout.* import androidx.compose.material3.Button import androidx.compose.material3.Text @@ -16,6 +14,8 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import com.faraphel.tasks_valider.database.TaskDatabase +import com.faraphel.tasks_valider.ui.screen.communication.connection.internet.role.CommunicationInternetClientScreen +import com.faraphel.tasks_valider.ui.screen.communication.connection.internet.role.CommunicationInternetServerScreen @Composable diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/client.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/client.kt deleted file mode 100644 index 106b866..0000000 --- a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/client.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.faraphel.tasks_valider.ui.screen.communication.connection.wifiP2p - -import android.app.Activity -import android.net.wifi.p2p.WifiP2pConfig -import android.net.wifi.p2p.WifiP2pDevice -import androidx.compose.foundation.layout.Column -import androidx.compose.runtime.Composable -import androidx.compose.runtime.MutableState -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import com.faraphel.tasks_valider.connectivity.bwd.BwdManager -import com.faraphel.tasks_valider.ui.widgets.connectivity.WifiP2pDeviceListWidget - - -@Composable -fun CommunicationWifiP2pClientScreen(activity: Activity, bwdManager: BwdManager) { - val selectedDevice = remember { mutableStateOf(null) } - val isConnected = remember { mutableStateOf(false) } - - // if connected, show the task group screen - if (isConnected.value) { - // TaskGroupScreen(activity, null) - // TODO(Faraphel): finish the connection - return - } - - - // if the device is selected but not connected, try to connect - if (selectedDevice.value != null) { - // TODO(Faraphel): error handling - val config = WifiP2pConfig().apply { - deviceAddress = selectedDevice.value!!.deviceAddress - } - bwdManager.connect(config) { - isConnected.value = true - } - return - } - - // display the list of devices - CommunicationWifiP2pClientContent(bwdManager, selectedDevice) -} - - -@Composable -fun CommunicationWifiP2pClientContent( - bwdManager: BwdManager, - selectedDevice: MutableState -) { - Column { - WifiP2pDeviceListWidget( - peers = bwdManager.statePeers.value, - filter = { device: WifiP2pDevice -> device.isGroupOwner }, - selectedDevice, - ) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/role/client.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/role/client.kt new file mode 100644 index 0000000..90d9c38 --- /dev/null +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/role/client.kt @@ -0,0 +1,76 @@ +package com.faraphel.tasks_valider.ui.screen.communication.connection.wifiP2p.role + +import android.app.Activity +import android.net.wifi.p2p.WifiP2pConfig +import android.net.wifi.p2p.WifiP2pDevice +import androidx.compose.foundation.layout.Column +import androidx.compose.runtime.* +import com.faraphel.tasks_valider.connectivity.bwd.BwdManager +import com.faraphel.tasks_valider.connectivity.task.TaskClient +import com.faraphel.tasks_valider.connectivity.task.session.TaskSession +import com.faraphel.tasks_valider.ui.screen.communication.DEFAULT_SERVER_PORT +import com.faraphel.tasks_valider.ui.screen.communication.authentication.AuthenticationClientScreen +import com.faraphel.tasks_valider.ui.screen.communication.connection.internet.role.CommunicationInternetClientContent +import com.faraphel.tasks_valider.ui.screen.task.TaskSessionController +import com.faraphel.tasks_valider.ui.screen.task.TaskSessionScreen +import com.faraphel.tasks_valider.ui.widgets.connectivity.WifiP2pDeviceListWidget + + +@Composable +fun CommunicationWifiP2pClientScreen(activity: Activity, bwdManager: BwdManager) { + val client = remember { mutableStateOf(null) } + val session = remember { mutableStateOf(null) } + + // if the client is not connected, show the connection screen + if (client.value == null) + return CommunicationWifiP2pClientContent(client, bwdManager) + // if the user is not authenticated, show the authentication screen + if (session.value == null) + return AuthenticationClientScreen(activity, client.value!!, session) + + // show the main screen + TaskSessionController( + activity, + client.value!!, + session.value!!.person, + ) +} + + +@Composable +fun CommunicationWifiP2pClientContent( + client: MutableState, + bwdManager: BwdManager, +) { + val selectedDevice = remember { mutableStateOf(null) } + + if (selectedDevice.value == null) { + Column { + WifiP2pDeviceListWidget( + peers = bwdManager.statePeers.value, + filter = { device: WifiP2pDevice -> device.isGroupOwner }, + selectedDevice, + ) + } + + LaunchedEffect(true) { + // look for new peers + bwdManager.discoverPeers() + } + + return + } + + val config = WifiP2pConfig().apply { + deviceAddress = selectedDevice.value!!.deviceAddress + } + bwdManager.connect(config) { + bwdManager.requestConnectionInfo { connectionInfo -> + // TODO(Faraphel): check if the server is reachable + client.value = TaskClient( + connectionInfo.groupOwnerAddress.toString(), + DEFAULT_SERVER_PORT + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/server.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/role/server.kt similarity index 95% rename from app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/server.kt rename to app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/role/server.kt index 36cdf26..8ba0cd6 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/server.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/role/server.kt @@ -1,14 +1,12 @@ -package com.faraphel.tasks_valider.ui.screen.communication.connection.wifiP2p +package com.faraphel.tasks_valider.ui.screen.communication.connection.wifiP2p.role import android.app.Activity import android.util.Log import androidx.compose.foundation.layout.* -import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.compose.NavHost @@ -23,9 +21,7 @@ import com.faraphel.tasks_valider.database.entities.PersonEntity import com.faraphel.tasks_valider.database.entities.SessionEntity import com.faraphel.tasks_valider.database.populateSubjectSessionPersonTest import com.faraphel.tasks_valider.ui.screen.communication.DEFAULT_SERVER_PORT -import com.faraphel.tasks_valider.ui.screen.communication.RANGE_SERVER_PORT import com.faraphel.tasks_valider.ui.screen.communication.authentication.AuthenticationServerScreen -import com.faraphel.tasks_valider.ui.screen.communication.connection.internet.CommunicationInternetServerContent import com.faraphel.tasks_valider.ui.screen.task.TaskSessionController import java.time.Instant diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/selection.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/selection.kt index 896a262..928f240 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/selection.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/connection/wifiP2p/selection.kt @@ -1,11 +1,11 @@ package com.faraphel.tasks_valider.ui.screen.communication.connection.wifiP2p +import android.annotation.SuppressLint import android.app.Activity import androidx.compose.foundation.layout.* import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -16,7 +16,10 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import com.faraphel.tasks_valider.connectivity.bwd.BwdManager +import com.faraphel.tasks_valider.connectivity.bwd.BwdManager.Companion.ALL_INTENT_FILTER import com.faraphel.tasks_valider.database.TaskDatabase +import com.faraphel.tasks_valider.ui.screen.communication.connection.wifiP2p.role.CommunicationWifiP2pClientScreen +import com.faraphel.tasks_valider.ui.screen.communication.connection.wifiP2p.role.CommunicationWifiP2pServerScreen @Composable diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/selection.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/selection.kt index 86aedf3..1750464 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/selection.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/selection.kt @@ -88,10 +88,10 @@ fun CommunicationSelectContent(controller: NavController, activity: Activity) { // if the WiFi-Direct is supported, navigate to the WiFi-Direct screen if (isWifiP2pSupported) controller.navigate("wifi-p2p") // if the WiFi-Direct is not supported, show a toast message - else Toast.makeText(activity, "WiFi-Direct is not supported on this device", Toast.LENGTH_SHORT).show() + else Toast.makeText(activity, "Wi-Fi Direct is not supported on this device", Toast.LENGTH_SHORT).show() } ) { - Text("WiFi-Direct") + Text("Wi-Fi Direct") } } }