client egl context and viewport in kotlin UI

This commit is contained in:
2025-12-28 21:46:18 +01:00
parent 19400fd2b2
commit 6830c61e31
5 changed files with 175 additions and 15 deletions

View File

@@ -6,7 +6,11 @@ import android.content.ServiceConnection
import android.os.Bundle
import android.os.IBinder
import android.util.Log
import android.view.Surface
import android.view.SurfaceView
import android.view.SurfaceHolder
import androidx.activity.ComponentActivity
import androidx.activity.addCallback
import androidx.activity.enableEdgeToEdge
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Arrangement
@@ -16,7 +20,9 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.viewinterop.AndroidView
class MainActivity : ComponentActivity() {
init {
@@ -25,7 +31,7 @@ class MainActivity : ComponentActivity() {
var remote_service: IMosisService? = null
var statusText = mutableStateOf("Status: idle")
var buttonText = mutableStateOf("Init OS")
private val connection = object : ServiceConnection {
val connection = object : ServiceConnection {
override fun onServiceConnected(className: ComponentName, service: IBinder) {
Log.d("MosisTest", "Service Connected")
statusText.value = "Service Connected"
@@ -39,6 +45,27 @@ class MainActivity : ComponentActivity() {
statusText.value = "Service Disconnected"
}
}
val viewport = object : SurfaceHolder.Callback {
override fun surfaceCreated(holder: SurfaceHolder) {
Log.d("MosisTest", "surfaceCreated")
setSurface(holder.surface)
}
override fun surfaceChanged(
holder: SurfaceHolder,
format: Int,
width: Int,
height: Int
) {
// Optional: Pass resize events to native if needed
// resizeSurface(width, height)
Log.d("MosisTest", "surfaceResized")
}
override fun surfaceDestroyed(holder: SurfaceHolder) {
destroySurface()
Log.d("MosisTest", "surfaceDestroyed")
}
}
fun initOS()
{
remote_service?.let { service ->
@@ -47,7 +74,7 @@ class MainActivity : ComponentActivity() {
buttonText.value = if (result) "OS Initialized" else "OS Not Initialized"
}
}
private fun startRemoteService() {
fun startRemoteService() {
val intent = Intent("com.omixlab.mosis.SERVICE")
intent.setPackage("com.omixlab.mosis")
try {
@@ -73,8 +100,24 @@ class MainActivity : ComponentActivity() {
Text(buttonText.value)
}
Text(statusText.value)
NativeViewport(
modifier = Modifier.fillMaxSize(0.8f)
)
}
}
}
@Composable
fun NativeViewport(modifier: Modifier = Modifier) {
AndroidView(
modifier = modifier,
factory = { context ->
SurfaceView(context).apply {
holder.addCallback(viewport)
}
}
)
}
external fun serviceConnected(binder: IBinder)
external fun setSurface(surface: Surface)
external fun destroySurface()
}