package com.parseable.android.ui.screens.about import android.content.Intent import android.net.Uri import androidx.compose.foundation.Image import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.filled.* import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import com.parseable.android.BuildConfig import com.parseable.android.R private const val GITHUB_REPO_URL = "https://github.com/parseablehq/parseable-android" private const val PARSEABLE_WEBSITE_URL = "https://www.parseable.com" @OptIn(ExperimentalMaterial3Api::class) @Composable fun AboutScreen( onBack: () -> Unit, ) { val context = LocalContext.current Scaffold( topBar = { TopAppBar( title = { Text("About") }, navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Back") } }, ) }, ) { padding -> Column( modifier = Modifier .fillMaxSize() .padding(padding) .verticalScroll(rememberScrollState()) .padding(16.dp), verticalArrangement = Arrangement.spacedBy(16.dp), ) { // App header Card( modifier = Modifier.fillMaxWidth(), elevation = CardDefaults.cardElevation(defaultElevation = 1.dp), ) { Column( modifier = Modifier .fillMaxWidth() .padding(24.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { Image( painter = painterResource(id = R.mipmap.ic_launcher), contentDescription = "Parseable logo", modifier = Modifier.size(80.dp), ) Spacer(modifier = Modifier.height(12.dp)) Text( text = "Parseable", style = MaterialTheme.typography.headlineSmall, fontWeight = FontWeight.Bold, ) Text( text = "Android Client", style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) Spacer(modifier = Modifier.height(8.dp)) Text( text = "Version ${BuildConfig.VERSION_NAME}", style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) } } // Description Card( modifier = Modifier.fillMaxWidth(), elevation = CardDefaults.cardElevation(defaultElevation = 1.dp), ) { Column(modifier = Modifier.padding(16.dp)) { Row(verticalAlignment = Alignment.CenterVertically) { Icon( Icons.Filled.Info, contentDescription = null, tint = MaterialTheme.colorScheme.primary, ) Spacer(modifier = Modifier.width(8.dp)) Text( text = "About", style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.Bold, ) } Spacer(modifier = Modifier.height(12.dp)) Text( text = "Parseable is an open-source log analytics platform. " + "This app connects to a Parseable server instance and lets you " + "browse, search, filter, and live-tail log data.", style = MaterialTheme.typography.bodyMedium, ) } } // Links Card( modifier = Modifier.fillMaxWidth(), elevation = CardDefaults.cardElevation(defaultElevation = 1.dp), ) { Column(modifier = Modifier.padding(16.dp)) { Row(verticalAlignment = Alignment.CenterVertically) { Icon( Icons.Filled.Link, contentDescription = null, tint = MaterialTheme.colorScheme.primary, ) Spacer(modifier = Modifier.width(8.dp)) Text( text = "Links", style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.Bold, ) } Spacer(modifier = Modifier.height(12.dp)) OutlinedButton( onClick = { context.startActivity( Intent(Intent.ACTION_VIEW, Uri.parse(GITHUB_REPO_URL)) ) }, modifier = Modifier.fillMaxWidth(), ) { Icon( Icons.Filled.Code, contentDescription = null, modifier = Modifier.size(18.dp), ) Spacer(modifier = Modifier.width(8.dp)) Text("GitHub Repository") } Spacer(modifier = Modifier.height(8.dp)) OutlinedButton( onClick = { context.startActivity( Intent(Intent.ACTION_VIEW, Uri.parse(PARSEABLE_WEBSITE_URL)) ) }, modifier = Modifier.fillMaxWidth(), ) { Icon( Icons.Filled.Language, contentDescription = null, modifier = Modifier.size(18.dp), ) Spacer(modifier = Modifier.width(8.dp)) Text("Parseable Website") } } } } } }