Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5f02ef6e authored by Carlos Martinez Romero's avatar Carlos Martinez Romero
Browse files

Add logging funtionatily to the example app.

Logs can now be sent over from CPP to Kotlin and displayed in the
LogOutput Card.

Bug: 296272152
Test: Built and run on device.
Change-Id: I79641dd9fbd6d04db0615579591a2bef4b24c914
parent c0a0930b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -23,6 +23,9 @@ android_app {
    kotlincflags: [
        "-opt-in=androidx.compose.material3.ExperimentalMaterial3Api",
    ],
    optimize: {
        proguard_flags_files: ["proguard-rules.pro"],
    },

    resource_dirs: ["res"],

+5 −5
Original line number Diff line number Diff line
@@ -10,18 +10,18 @@ class BufferStreamJNI {
     * A native method that is implemented by the 'bufferstreamsdemoapp' native library, which is
     * packaged with this application.
     */
    external fun stringFromJNI()
    external fun testBufferQueueCreation()
    external fun stringFromJNI(): String;
    external fun testBufferQueueCreation();

    companion object {
        fun companion_stringFromJNI() {
        fun companion_stringFromJNI(): String {
            val instance = BufferStreamJNI()
            instance.stringFromJNI()
            return instance.stringFromJNI()
        }

        fun companion_testBufferQueueCreation() {
            val instance = BufferStreamJNI()
            instance.testBufferQueueCreation()
            return instance.testBufferQueueCreation()
        }
    }
}
 No newline at end of file
+12 −10
Original line number Diff line number Diff line
@@ -4,10 +4,8 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.Card
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -17,16 +15,20 @@ import androidx.compose.ui.unit.dp
@Composable
fun DemoScreen1(modifier: Modifier = Modifier) {
    Column(modifier = modifier, verticalArrangement = Arrangement.SpaceBetween) {
        Card(modifier = Modifier.fillMaxWidth().weight(1f, false).padding(16.dp).height(400.dp)) {
            Text("Log output", modifier = Modifier.padding(16.dp))
        }
        LogOutput.getInstance().LogOutputComposable()
        Row(modifier = Modifier.weight(1f, false).padding(16.dp)) {
            Column(verticalArrangement = Arrangement.spacedBy(16.dp)) {
                Button(
                    modifier = Modifier.fillMaxWidth(),
                        onClick = { BufferStreamJNI.companion_testBufferQueueCreation() }
                ) { Text("Run") }
                OutlinedButton(modifier = Modifier.fillMaxWidth(), onClick = {}) { Text("Clear") }
                    onClick = { BufferStreamJNI.companion_testBufferQueueCreation() }) {
                        Text("Run")
                    }

                OutlinedButton(
                    modifier = Modifier.fillMaxWidth(),
                    onClick = { LogOutput.getInstance().clearText() }) {
                        Text("Clear")
                    }
            }
        }
    }
+65 −0
Original line number Diff line number Diff line
package com.android.graphics.bufferstreamsdemoapp

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Card
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import java.util.Collections

/*
LogOutput centralizes logging: storing, displaying, adding, and clearing log messages with
thread safety. It is a singleton that's also accessed from C++. The private constructor will
not allow this class to be initialized, limiting it to getInstance().
 */
class LogOutput private constructor() {
    val logs = Collections.synchronizedList(mutableStateListOf<String>())

    @Composable
    fun LogOutputComposable() {
        val rlogs = remember { logs }

        Card(modifier = Modifier.fillMaxWidth().padding(16.dp).height(400.dp)) {
            Column(
                modifier =
                    Modifier.padding(10.dp).size(380.dp).verticalScroll(rememberScrollState())) {
                    for (log in rlogs) {
                        Text(log, modifier = Modifier.padding(0.dp))
                    }
                }
        }
    }

    fun clearText() {
        logs.clear()
    }

    fun addLog(log: String) {
        logs.add(log)
    }

    companion object {
        @Volatile private var instance: LogOutput? = null

        @JvmStatic
        fun getInstance(): LogOutput {
            if (instance == null) {
                synchronized(this) {
                    if (instance == null) {
                        instance = LogOutput()
                    }
                }
            }
            return instance!!
        }
    }
}
+43 −47
Original line number Diff line number Diff line
@@ -31,17 +31,19 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import com.android.graphics.bufferstreamsdemoapp.ui.theme.JetpackTheme
import java.util.*

class MainActivity : ComponentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContent {
            JetpackTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                        color = MaterialTheme.colorScheme.background
                ) { BufferDemosApp() }
                    color = MaterialTheme.colorScheme.background) {
                        BufferDemosApp()
                    }
            }
        }
    }
@@ -68,28 +70,22 @@ fun BufferDemosApp() {
    // Get the name of the current screen
    val currentScreen =
        BufferDemoScreen.findByRoute(
                    backStackEntry?.destination?.route ?: BufferDemoScreen.Start.route
            )
            backStackEntry?.destination?.route ?: BufferDemoScreen.Start.route)

    Scaffold(
        topBar = {
            BufferDemosAppBar(
                currentScreen = currentScreen,
                canNavigateBack = navController.previousBackStackEntry != null,
                        navigateUp = { navController.navigateUp() }
                )
            }
    ) {
                navigateUp = { navController.navigateUp() })
        }) {
            NavHost(
                navController = navController,
                startDestination = BufferDemoScreen.Start.route,
                modifier = Modifier.padding(10.dp)
        ) {
                modifier = Modifier.padding(10.dp)) {
                    composable(route = BufferDemoScreen.Start.route) {
                        DemoList(
                        onButtonClicked = {
                            navController.navigate(it)
                        },
                            onButtonClicked = { navController.navigate(it) },
                        )
                    }
                    composable(route = BufferDemoScreen.Demo1.route) {
@@ -109,8 +105,7 @@ fun DemoList(onButtonClicked: (String) -> Unit) {
        Column(
            modifier = Modifier.fillMaxWidth(),
            horizontalAlignment = Alignment.CenterHorizontally,
                verticalArrangement = Arrangement.spacedBy(8.dp)
        ) {
            verticalArrangement = Arrangement.spacedBy(8.dp)) {
                Spacer(modifier = Modifier.height(100.dp))
                Text(text = "Buffer Demos", style = MaterialTheme.typography.titleLarge)
                Spacer(modifier = Modifier.height(8.dp))
@@ -119,11 +114,12 @@ fun DemoList(onButtonClicked: (String) -> Unit) {
            Column(
                modifier = Modifier.fillMaxWidth(),
                horizontalAlignment = Alignment.CenterHorizontally,
                    verticalArrangement = Arrangement.spacedBy(16.dp)
            ) {
                verticalArrangement = Arrangement.spacedBy(16.dp)) {
                    for (item in BufferDemoScreen.values()) {
                        if (item.route != BufferDemoScreen.Start.route)
                        SelectDemoButton(name = stringResource(item.title), onClick = { onButtonClicked(item.route) })
                            SelectDemoButton(
                                name = stringResource(item.title),
                                onClick = { onButtonClicked(item.route) })
                    }
                }
        }
Loading