Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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() {

Expand All @@ -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<String?>(userId)
val peersState = mutableStateOf<List<String>>(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<String?>(null) }
val peersState = remember { mutableStateOf<List<String>>(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
)
}
)
}
}
}
}
Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.*

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -214,7 +214,7 @@ class SignalingClient @OptIn(UnstableApi::class) constructor
}

override fun onIceCandidatesRemoved(p0: Array<out IceCandidate?>?) {
TODO("Not yet implemented")
//TODO("Not yet implemented")
}

@OptIn(UnstableApi::class)
Expand All @@ -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)
Expand All @@ -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?) {
Expand Down Expand Up @@ -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")
}

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

}
Expand Down
6 changes: 6 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading