diff --git a/app/src/main/java/ink/trmnl/android/ui/aboutapp/AppInfoScreen.kt b/app/src/main/java/ink/trmnl/android/ui/aboutapp/AppInfoScreen.kt index 46df0a1..a7be720 100644 --- a/app/src/main/java/ink/trmnl/android/ui/aboutapp/AppInfoScreen.kt +++ b/app/src/main/java/ink/trmnl/android/ui/aboutapp/AppInfoScreen.kt @@ -1,9 +1,8 @@ package ink.trmnl.android.ui.aboutapp -import androidx.compose.foundation.Image -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxWidth @@ -14,11 +13,12 @@ import androidx.compose.foundation.layout.safeDrawing import androidx.compose.foundation.layout.statusBars import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar @@ -29,6 +29,7 @@ import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import com.slack.circuit.codegen.annotations.CircuitInject @@ -135,66 +136,135 @@ fun AppInfoContent( modifier = Modifier .padding(innerPadding) - .padding(horizontal = 32.dp) + .padding(horizontal = 24.dp) .verticalScroll(rememberScrollState()) .fillMaxWidth() .navigationBarsPadding(), horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center, ) { - Spacer(modifier = Modifier.height(24.dp)) + Spacer(modifier = Modifier.height(32.dp)) + // App Logo Icon( painter = painterResource(R.drawable.trmnl_logo_plain), contentDescription = null, tint = TrmnlOrange, - modifier = Modifier.height(64.dp), + modifier = Modifier.height(72.dp), ) - Spacer(modifier = Modifier.height(16.dp)) + Spacer(modifier = Modifier.height(24.dp)) + // App Name Text( text = stringResource(R.string.app_name), - style = MaterialTheme.typography.headlineSmall, + style = MaterialTheme.typography.headlineMedium, fontWeight = FontWeight.Bold, ) Spacer(modifier = Modifier.height(8.dp)) + // App Description Text( - text = "Version: ${state.appVersion}", - style = MaterialTheme.typography.bodyLarge, - ) - - Spacer(modifier = Modifier.height(4.dp)) - - Text( - text = "Build Type: ${state.buildType}", + text = "Display your TRMNL device content on your Android device", style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + textAlign = androidx.compose.ui.text.style.TextAlign.Center, ) - Image( - painter = painterResource(R.drawable.trmnl_device_white_transparent), - contentDescription = "TRMNL Device", + Spacer(modifier = Modifier.height(28.dp)) + + // App Details Section + Column( modifier = Modifier - .padding(vertical = 16.dp) - .clickable { state.eventSink(Event.OpenTrmnlSite) }, - ) + .fillMaxWidth() + .padding(16.dp) + .padding( + top = 16.dp, + bottom = 16.dp, + ), + horizontalAlignment = Alignment.Start, + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + ) { + Text( + text = "Version", + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + Text( + text = state.appVersion, + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.SemiBold, + ) + } + + Spacer(modifier = Modifier.height(12.dp)) + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + ) { + Text( + text = "Build Type", + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + Text( + text = state.buildType, + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.SemiBold, + ) + } + } Spacer(modifier = Modifier.height(8.dp)) - Button( + HorizontalDivider(modifier = Modifier.fillMaxWidth()) + + Spacer(modifier = Modifier.height(24.dp)) + + // Actions Section + Text( + text = "Connect & Learn", + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold, + modifier = Modifier.fillMaxWidth(), + ) + + Spacer(modifier = Modifier.height(16.dp)) + + // GitHub Button + OutlinedButton( onClick = { state.eventSink(Event.OpenGithub) }, - modifier = Modifier.fillMaxWidth(0.7f), + modifier = Modifier.fillMaxWidth(), ) { Icon( - painter = painterResource(R.drawable.code_24dp), + painter = painterResource(R.drawable.github_filled), contentDescription = null, - modifier = Modifier.padding(end = 8.dp), + modifier = Modifier.padding(end = 12.dp), ) - Text("View Project on GitHub") + Text("View on GitHub / Report Issues", modifier = Modifier.weight(1f)) } + + Spacer(modifier = Modifier.height(12.dp)) + + // TRMNL Website Button + OutlinedButton( + onClick = { state.eventSink(Event.OpenTrmnlSite) }, + modifier = Modifier.fillMaxWidth(), + ) { + Icon( + painter = painterResource(R.drawable.outline_link_2_24), + contentDescription = null, + modifier = Modifier.padding(end = 12.dp), + ) + Text("Visit TRMNL", modifier = Modifier.weight(1f)) + } + + Spacer(modifier = Modifier.height(32.dp)) } } } diff --git a/app/src/main/java/ink/trmnl/android/work/TrmnlImageRefreshWorker.kt b/app/src/main/java/ink/trmnl/android/work/TrmnlImageRefreshWorker.kt index 09460a4..bc92059 100644 --- a/app/src/main/java/ink/trmnl/android/work/TrmnlImageRefreshWorker.kt +++ b/app/src/main/java/ink/trmnl/android/work/TrmnlImageRefreshWorker.kt @@ -170,10 +170,6 @@ class TrmnlImageRefreshWorker( httpResponseMetadata = trmnlDisplayInfo.httpResponseMetadata, ) - // DEPRECATED: Battery reporting now happens via Percent-Charged header in /api/display call - // Battery percentage is automatically sent when fetching the next image for BYOD devices - // displayRepository.reportDeviceBatteryStatus(deviceConfig) - // NOTE: Image metadata caching is handled automatically by `TrmnlDisplayRepository` // when the API call succeeds, so we don't need to save it again here. // See https://github.com/usetrmnl/trmnl-android/issues/195 diff --git a/app/src/main/res/drawable/github_filled.xml b/app/src/main/res/drawable/github_filled.xml new file mode 100644 index 0000000..6b22e76 --- /dev/null +++ b/app/src/main/res/drawable/github_filled.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/github_outline.xml b/app/src/main/res/drawable/github_outline.xml new file mode 100644 index 0000000..015d8c5 --- /dev/null +++ b/app/src/main/res/drawable/github_outline.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/outline_link_2_24.xml b/app/src/main/res/drawable/outline_link_2_24.xml new file mode 100644 index 0000000..a8113d5 --- /dev/null +++ b/app/src/main/res/drawable/outline_link_2_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/trmnl_device_white_transparent.xml b/app/src/main/res/drawable/trmnl_device_white_transparent.xml deleted file mode 100644 index dfd2380..0000000 --- a/app/src/main/res/drawable/trmnl_device_white_transparent.xml +++ /dev/null @@ -1,2082 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fastlane/metadata/android/en-US/google_play_description.txt b/fastlane/metadata/android/en-US/google_play_description.txt index f4cb535..bacc9ee 100644 --- a/fastlane/metadata/android/en-US/google_play_description.txt +++ b/fastlane/metadata/android/en-US/google_play_description.txt @@ -14,7 +14,7 @@ Utility app to display TRMNL screens on any Android device FULL DESCRIPTION (Max 4000 characters) -------------------------------------------------------------------------------- -TRMNL serves as a digital display for TRMNL e-ink devices and BYOS installations. The app connects to the TRMNL or BYOS API, fetches display data, and shows it on Android devices. It can function both as a mirror for existing TRMNL devices or as a standalone TRMNL display connected directly to a Bring-Your-Own-Server (BYOS). +TRMNL serves as a digital display for TRMNL e-ink devices and BYOS installations. It can function both as a mirror for existing TRMNL devices or as a standalone TRMNL display connected directly to a Bring-Your-Own-Server (BYOS). > ⚠️ Note: TRMNL app currently requires device API key for non-BYOS based devices. TRMNL device must have a developer edition or BYOD license to enable device API key.