diff --git a/app/src/main/java/com/example/neurology_project_android/FormManager.kt b/app/src/main/java/com/example/neurology_project_android/FormManager.kt index f0fab03..a392576 100644 --- a/app/src/main/java/com/example/neurology_project_android/FormManager.kt +++ b/app/src/main/java/com/example/neurology_project_android/FormManager.kt @@ -16,7 +16,7 @@ object FormManager { fun submitFormToServer(form: NIHForm, client: OkHttpClient, onResult: (Boolean) -> Unit) { val json = JSONObject().apply { put("patientName", form.patientName) - put("DOB", form.dob) + put("patientDob", form.dob) put("formDate", form.date) put("results", form.formData) put("username", form.username) @@ -78,8 +78,8 @@ object FormManager { forms.add( NIHForm( id = item.getInt("id"), - patientName = item.getString("name"), - dob = item.getString("dob"), + patientName = item.getString("patient_name"), + dob = item.getString("patient_dob"), date = item.getString("form_date"), formData = item.getString("results"), username = item.getString("username") @@ -131,7 +131,7 @@ object FormManager { val json = JSONObject().apply { put("id", form.id) put("patientName", form.patientName) - put("dob", form.dob) + put("patientDob", form.dob) put("formDate", form.date) put("results", form.formData) put("username", form.username) diff --git a/app/src/main/java/com/example/neurology_project_android/MainActivity.kt b/app/src/main/java/com/example/neurology_project_android/MainActivity.kt index 037862e..c7eecd7 100644 --- a/app/src/main/java/com/example/neurology_project_android/MainActivity.kt +++ b/app/src/main/java/com/example/neurology_project_android/MainActivity.kt @@ -16,6 +16,7 @@ import androidx.annotation.OptIn import androidx.annotation.RequiresApi import androidx.camera.core.imagecapture.CameraRequest import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -29,6 +30,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Button import androidx.compose.material3.Card +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text @@ -63,6 +65,8 @@ import okio.IOException import org.webrtc.CapturerObserver import org.webrtc.VideoProcessor import org.webrtc.VideoSource +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext class MainActivity : ComponentActivity() { @@ -88,59 +92,72 @@ class MainActivity : ComponentActivity() { PendingIntent.FLAG_IMMUTABLE ) - requestPermissions(arrayOf(Manifest.permission.CAMERA, Manifest.permission.FOREGROUND_SERVICE_MICROPHONE), 1) - - val userId = fetchUserId() - val peerIdState = mutableStateOf(userId) - val peersState = mutableStateOf>(emptyList()) - - signalingClient = SignalingClient( - "" + BASE_WS_API_URL + ":" + PORT + "/peerjs?id=$userId&token=6789&key=peerjs", - this, userId, - onCallRecieved = { - isInCall = true // Update call state when an offer is received - }, - onCallEnded = { - runOnUiThread { isInCall = false } - } + requestPermissions( + arrayOf( + Manifest.permission.CAMERA, + Manifest.permission.FOREGROUND_SERVICE_MICROPHONE + ), 1 ) - Log.d("MainActivitiy", "SignalingClient should be set") - //videoSource = signalingClient.getVideoSource() - - // Fetch peers and update state (excluding own peer ID) - GetPeers { peers -> - runOnUiThread { - peerIdState.value?.let { id -> - peersState.value = peers.filter { it != id } - } ?: run { - peersState.value = peers - } - } - } enableEdgeToEdge() + setContent { NeurologyProjectAndroidTheme { + val userIdState = remember { mutableStateOf(null) } + val peersState = remember { mutableStateOf>(emptyList()) } + + // Fetch user ID once + LaunchedEffect(Unit) { + val fetchedId = fetchUserId() + userIdState.value = fetchedId + + // Now safe to start SignalingClient + signalingClient = SignalingClient( + "$BASE_WS_API_URL:$PORT/peerjs?id=$fetchedId&token=6789&key=peerjs", + this@MainActivity, + fetchedId, + onCallRecieved = { isInCall = true }, + onCallEnded = { runOnUiThread { isInCall = false } } + ) + + // Fetch peers + GetPeers { peers -> + runOnUiThread { + peersState.value = peers.filter { it != fetchedId } + } + } + } + + val userId = userIdState.value - Scaffold( - modifier = Modifier.fillMaxSize(), - containerColor = Color.Transparent, // Make the Scaffold background transparent - content = { innerPadding -> - // Suppose you have the camera & request object set up - HomeScreen( - modifier = Modifier.padding(innerPadding), - peerId = peerIdState.value ?: userId, - peers = peersState.value - ) - Greeting( - name = "Android", - modifier = Modifier.padding(innerPadding), - signalingClient = signalingClient, - cameraInitialized = cameraInitialized, - cameraRequest = { cameraRequest }, - isInCall = isInCall - ) - }) + if (userId == null) { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + CircularProgressIndicator() + } + } else { + Scaffold( + modifier = Modifier.fillMaxSize(), + containerColor = Color.Transparent, + content = { innerPadding -> + HomeScreen( + modifier = Modifier.padding(innerPadding), + peerId = userId, + peers = peersState.value + ) + Greeting( + name = "Android", + modifier = Modifier.padding(innerPadding), + signalingClient = signalingClient, + cameraInitialized = cameraInitialized, + cameraRequest = { cameraRequest }, + isInCall = isInCall + ) + } + ) + } } } } @@ -250,35 +267,22 @@ class MainActivity : ComponentActivity() { } } -fun fetchUserId(): String { - val idUrl = "https://videochat-signaling-app.ue.r.appspot.com/key=peerjs/id" - val client = OkHttpClient() - var id = "123" - var requestReceived = false - - val request = Request.Builder().url(idUrl).build() - client.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - android.util.Log.d("Request", "Request failed: ${e.message}") - } - - override fun onResponse(call: Call, response: Response) { +suspend fun fetchUserId(): String { + return withContext(Dispatchers.IO) { + try { + val idUrl = "https://videochat-signaling-app.ue.r.appspot.com/key=peerjs/id" + val client = OkHttpClient() + val request = Request.Builder().url(idUrl).build() + val response = client.newCall(request).execute() if (response.isSuccessful) { - response.body?.string()?.let { body -> - id = body - requestReceived = true - } + response.body?.string() ?: "unknown" } else { - android.util.Log.d("Response", "Request failed: ${response.code}") + "unknown" } + } catch (e: Exception) { + "unknown" } - }) - while (!requestReceived) { - /* Unsure how to make program wait until id is received - This works for now, but I am sure there are better ways - */ } - return id } @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) diff --git a/app/src/main/java/com/example/neurology_project_android/NewNIHFormActivity.kt b/app/src/main/java/com/example/neurology_project_android/NewNIHFormActivity.kt index ad6545f..5b67cbb 100644 --- a/app/src/main/java/com/example/neurology_project_android/NewNIHFormActivity.kt +++ b/app/src/main/java/com/example/neurology_project_android/NewNIHFormActivity.kt @@ -25,17 +25,6 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import kotlinx.coroutines.launch -import okhttp3.Call -import okhttp3.Callback -import okhttp3.HttpUrl -import okhttp3.HttpUrl.Companion.toHttpUrl -import okhttp3.MediaType.Companion.toMediaTypeOrNull -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.RequestBody -import okhttp3.Response -import org.json.JSONObject -import java.io.IOException import java.text.SimpleDateFormat import java.util.* diff --git a/app/src/main/java/com/example/neurology_project_android/SessionManager.kt b/app/src/main/java/com/example/neurology_project_android/SessionManager.kt index da8df59..f4b68b7 100644 --- a/app/src/main/java/com/example/neurology_project_android/SessionManager.kt +++ b/app/src/main/java/com/example/neurology_project_android/SessionManager.kt @@ -8,20 +8,21 @@ import com.franmontiel.persistentcookiejar.cache.SetCookieCache import com.franmontiel.persistentcookiejar.persistence.SharedPrefsCookiePersistor import okhttp3.OkHttpClient -class SessionManager(context: Context) { +class SessionManager(private val context: Context) { private val prefs: SharedPreferences = context.getSharedPreferences("user_session", Context.MODE_PRIVATE) // Use the PersistentCookieJar to automatically persist cookies - private val cookieJar: ClearableCookieJar = PersistentCookieJar( + private var cookieJar: ClearableCookieJar = PersistentCookieJar( SetCookieCache(), SharedPrefsCookiePersistor(context) ) // Shared OkHttpClient for your whole app - val client: OkHttpClient = OkHttpClient.Builder() + var client: OkHttpClient = OkHttpClient.Builder() .cookieJar(cookieJar) .build() + private set fun saveAuthToken(token: String, username: String) { val editor = prefs.edit() @@ -46,5 +47,16 @@ class SessionManager(context: Context) { fun logout() { prefs.edit().clear().apply() cookieJar.clear() + resetClient() + } + + private fun resetClient() { + cookieJar = PersistentCookieJar( + SetCookieCache(), + SharedPrefsCookiePersistor(context) + ) + client = OkHttpClient.Builder() + .cookieJar(cookieJar) + .build() } } diff --git a/app/src/main/java/com/example/neurology_project_android/SignalingClient.kt b/app/src/main/java/com/example/neurology_project_android/SignalingClient.kt index b10f1f0..6e69caf 100644 --- a/app/src/main/java/com/example/neurology_project_android/SignalingClient.kt +++ b/app/src/main/java/com/example/neurology_project_android/SignalingClient.kt @@ -183,7 +183,7 @@ class SignalingClient @OptIn(UnstableApi::class) constructor } override fun onIceConnectionReceivingChange(p0: Boolean) { - TODO("Not yet implemented") + //TODO("Not yet implemented") } @OptIn(UnstableApi::class) @@ -214,7 +214,7 @@ class SignalingClient @OptIn(UnstableApi::class) constructor } override fun onIceCandidatesRemoved(p0: Array?) { - TODO("Not yet implemented") + //TODO("Not yet implemented") } @OptIn(UnstableApi::class) @@ -241,7 +241,7 @@ class SignalingClient @OptIn(UnstableApi::class) constructor } override fun onRemoveStream(p0: MediaStream?) { - TODO("Not yet implemented") + //TODO("Not yet implemented") } @OptIn(UnstableApi::class) @@ -268,7 +268,7 @@ class SignalingClient @OptIn(UnstableApi::class) constructor } override fun onCameraDisconnected() { - TODO("Not yet implemented") + //TODO("Not yet implemented") } override fun onCameraFreezed(p0: String?) { @@ -507,11 +507,11 @@ class SignalingClient @OptIn(UnstableApi::class) constructor } override fun onCreateFailure(p0: String?) { - TODO("Not yet implemented") + //TODO("Not yet implemented") } override fun onSetFailure(p0: String?) { - TODO("Not yet implemented") + //TODO("Not yet implemented") } } @@ -526,11 +526,11 @@ class SignalingClient @OptIn(UnstableApi::class) constructor } override fun onCreateFailure(p0: String?) { - TODO("Not yet implemented") + //TODO("Not yet implemented") } override fun onSetFailure(p0: String?) { - TODO("Not yet implemented") + //TODO("Not yet implemented") } } diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..51b6f02 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "Neurology-Project-Android", + "lockfileVersion": 3, + "requires": true, + "packages": {} +}