client egl context and viewport in kotlin UI
This commit is contained in:
@@ -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()
|
||||
}
|
||||
Reference in New Issue
Block a user