summaryrefslogtreecommitdiff
path: root/src/android
diff options
context:
space:
mode:
authorZephyron <zephyron@citron-emu.org>2025-01-13 17:48:02 +1000
committerZephyron <zephyron@citron-emu.org>2025-01-13 17:48:02 +1000
commitcce4abbb0b0c5902939a05d79016b2de672b9457 (patch)
tree91a1e9470f41d5637b47a1830e0e0fa48c8b9faf /src/android
parent6d5475a9cf51feb36bb1a45d88b51182ede4a1f8 (diff)
Android: Update dependencies and improve UI feedback
- Update Kotlin and various AndroidX dependencies to stable versions - Add temperature monitoring with color-coded display in emulation - Add FPS color indication (red to green based on performance) - Add legal disclaimer page to initial setup - Remove x86_64 ABI filter to focus on arm64-v8a - Adjust thermal and FPS update intervals for consistency - Clean up redundant dependency declarations The temperature display now shows both Celsius and Fahrenheit with color coding based on safe operating ranges [WIP]. FPS counter provides visual feedback through colors, making performance issues more immediately apparent to users.
Diffstat (limited to 'src/android')
-rw-r--r--src/android/app/build.gradle.kts31
-rw-r--r--src/android/app/src/main/java/org/citron/citron_emu/fragments/EmulationFragment.kt44
-rw-r--r--src/android/app/src/main/java/org/citron/citron_emu/fragments/SetupFragment.kt13
-rw-r--r--src/android/app/src/main/res/values/strings.xml3
-rw-r--r--src/android/build.gradle.kts4
5 files changed, 73 insertions, 22 deletions
diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts
index 793a8621c..35b2948ad 100644
--- a/src/android/app/build.gradle.kts
+++ b/src/android/app/build.gradle.kts
@@ -10,10 +10,10 @@ plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("kotlin-parcelize")
- kotlin("plugin.serialization") version "2.1.20-Beta1"
+ kotlin("plugin.serialization") version "1.9.20"
id("androidx.navigation.safeargs.kotlin")
- id("org.jlleitschuh.gradle.ktlint") version "12.1.2"
- id("com.github.triplet.play") version "3.12.1"
+ id("org.jlleitschuh.gradle.ktlint") version "11.4.0"
+ id("com.github.triplet.play") version "3.8.6"
}
/**
@@ -180,7 +180,7 @@ android {
"-DCMAKE_EXPORT_COMPILE_COMMANDS=ON"
)
- abiFilters("arm64-v8a", "x86_64")
+ abiFilters("arm64-v8a")
}
}
}
@@ -226,24 +226,23 @@ play {
}
dependencies {
- implementation("androidx.core:core-ktx:1.15.0")
- implementation("androidx.appcompat:appcompat:1.7.0")
- implementation("androidx.recyclerview:recyclerview:1.3.2")
- implementation("androidx.constraintlayout:constraintlayout:2.2.0")
- implementation("androidx.fragment:fragment-ktx:1.8.5")
+ implementation("androidx.core:core-ktx:1.12.0")
+ implementation("androidx.appcompat:appcompat:1.6.1")
+ implementation("androidx.recyclerview:recyclerview:1.3.1")
+ implementation("androidx.constraintlayout:constraintlayout:2.1.4")
+ implementation("androidx.fragment:fragment-ktx:1.6.1")
implementation("androidx.documentfile:documentfile:1.0.1")
- implementation("com.google.android.material:material:1.12.0")
+ implementation("com.google.android.material:material:1.9.0")
implementation("androidx.preference:preference-ktx:1.2.1")
- implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7")
+ implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2")
implementation("io.coil-kt:coil:2.2.2")
implementation("androidx.core:core-splashscreen:1.0.1")
- implementation("androidx.window:window:1.3.0")
- implementation("androidx.constraintlayout:constraintlayout:2.2.0")
+ implementation("androidx.window:window:1.2.0-beta03")
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
- implementation("androidx.navigation:navigation-fragment-ktx:2.8.5")
- implementation("androidx.navigation:navigation-ui-ktx:2.8.5")
+ implementation("androidx.navigation:navigation-fragment-ktx:2.7.4")
+ implementation("androidx.navigation:navigation-ui-ktx:2.7.4")
implementation("info.debatty:java-string-similarity:2.0.0")
- implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3")
+ implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0")
}
fun runGitCommand(command: List<String>): String {
diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/EmulationFragment.kt
index aa255a942..58d176e92 100644
--- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/EmulationFragment.kt
+++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/EmulationFragment.kt
@@ -499,10 +499,20 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
val cpuBackend = NativeLibrary.getCpuBackend()
val gpuDriver = NativeLibrary.getGpuDriver()
if (_binding != null) {
+ // Calculate color based on FPS (red at 0, green at 60)
+ val fps = perfStats[FPS].toFloat()
+ val normalizedFps = (fps / 60f).coerceIn(0f, 1f)
+
+ // Interpolate between red (0xFFFF0000) and green (0xFF00FF00)
+ val red = ((1f - normalizedFps) * 255).toInt()
+ val green = (normalizedFps * 255).toInt()
+ val color = android.graphics.Color.rgb(red, green, 0)
+
+ binding.showFpsText.setTextColor(color)
binding.showFpsText.text =
- String.format("FPS: %.1f\n%s/%s", perfStats[FPS], cpuBackend, gpuDriver)
+ String.format("FPS: %.1f\n%s/%s", fps, cpuBackend, gpuDriver)
}
- perfStatsUpdateHandler.postDelayed(perfStatsUpdater!!, 800)
+ perfStatsUpdateHandler.postDelayed(perfStatsUpdater!!, 1000)
}
}
perfStatsUpdateHandler.post(perfStatsUpdater!!)
@@ -528,11 +538,37 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
PowerManager.THERMAL_STATUS_CRITICAL,
PowerManager.THERMAL_STATUS_EMERGENCY,
PowerManager.THERMAL_STATUS_SHUTDOWN -> "☢️"
-
else -> "🙂"
}
+
+ // Get temperature in Celsius from thermal sensor
+ val temperature = try {
+ val process = Runtime.getRuntime().exec("cat /sys/class/thermal/thermal_zone0/temp")
+ val reader = process.inputStream.bufferedReader()
+ val temp = reader.readLine().toFloat() / 1000f // Convert from millicelsius to celsius
+ reader.close()
+ temp
+ } catch (e: Exception) {
+ 0f
+ }
+
+ // Convert to Fahrenheit
+ val fahrenheit = (temperature * 9f / 5f) + 32f
+
if (_binding != null) {
- binding.showThermalsText.text = thermalStatus
+ // Color interpolation based on temperature (green at 45°C, red at 85°C)
+ val normalizedTemp = ((temperature - 45f) / 40f).coerceIn(0f, 1f)
+ val red = (normalizedTemp * 255).toInt()
+ val green = ((1f - normalizedTemp) * 255).toInt()
+ val color = android.graphics.Color.rgb(red, green, 0)
+
+ binding.showThermalsText.setTextColor(color)
+ binding.showThermalsText.text = String.format(
+ "%s %.1f°C\n%.1f°F",
+ thermalStatus,
+ temperature,
+ fahrenheit
+ )
}
thermalStatsUpdateHandler.postDelayed(thermalStatsUpdater!!, 1000)
}
diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/SetupFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/SetupFragment.kt
index 817210d48..7731b7608 100644
--- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/SetupFragment.kt
+++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/SetupFragment.kt
@@ -100,6 +100,19 @@ class SetupFragment : Fragment() {
pages.apply {
add(
SetupPage(
+ R.drawable.ic_check,
+ R.string.disclaimer_title,
+ R.string.disclaimer_description,
+ 0,
+ true,
+ R.string.accept_and_continue,
+ { pageForward() },
+ false
+ )
+ )
+
+ add(
+ SetupPage(
R.drawable.ic_citron_title,
R.string.welcome,
R.string.welcome_description,
diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml
index bc8f42292..5b8fc30c4 100644
--- a/src/android/app/src/main/res/values/strings.xml
+++ b/src/android/app/src/main/res/values/strings.xml
@@ -13,6 +13,9 @@
<string name="welcome">Welcome!</string>
<string name="welcome_description">Learn how to setup &lt;b>citron&lt;/b> and jump into emulation.</string>
<string name="get_started">Get started</string>
+ <string name="disclaimer_title">Legal Disclaimer</string>
+ <string name="disclaimer_description">Welcome to Citron! This application is intended for homebrew development and legitimate backup purposes only. We do not support or advocate piracy. By continuing, you acknowledge that you will only use this application in compliance with all applicable laws and regulations.</string>
+ <string name="accept_and_continue">Accept &amp; Continue</string>
<string name="keys">Keys</string>
<string name="keys_description">Select your &lt;b>prod.keys&lt;/b> file with the button below.</string>
<string name="select_keys">Select Keys</string>
diff --git a/src/android/build.gradle.kts b/src/android/build.gradle.kts
index 2f993b197..19391b0e3 100644
--- a/src/android/build.gradle.kts
+++ b/src/android/build.gradle.kts
@@ -5,7 +5,7 @@
plugins {
id("com.android.application") version "8.8.0" apply false
id("com.android.library") version "8.8.0" apply false
- id("org.jetbrains.kotlin.android") version "2.1.20-Beta1" apply false
+ id("org.jetbrains.kotlin.android") version "1.9.20" apply false
}
tasks.register("clean").configure {
@@ -17,6 +17,6 @@ buildscript {
google()
}
dependencies {
- classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.8.5")
+ classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.6.0")
}
}