summaryrefslogtreecommitdiff
path: root/Source/Android/app/src/main/java/org
diff options
context:
space:
mode:
authorTilka <tilkax@gmail.com>2025-04-25 01:43:53 +0100
committerGitHub <noreply@github.com>2025-04-25 01:43:53 +0100
commita95779add09bf24002ba9e5d0d5987d2c6945e47 (patch)
tree7ce613c858dd5d1f0a492019b7e99c427c87fe59 /Source/Android/app/src/main/java/org
parent5523b9a01b5e2628b3b22a5b97cb78aac0cd83f6 (diff)
parentb8e70df413ddd4663aa8e65a6f9d8a1e059c64c7 (diff)
Merge pull request #13506 from JosJuice/android-time-played
Android: Show time played in game details
Diffstat (limited to 'Source/Android/app/src/main/java/org')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GameDetailsDialog.kt31
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.kt7
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt8
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFile.kt11
4 files changed, 57 insertions, 0 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GameDetailsDialog.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GameDetailsDialog.kt
index 53b1467bbc..0384da89c0 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GameDetailsDialog.kt
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GameDetailsDialog.kt
@@ -19,6 +19,7 @@ import kotlinx.coroutines.launch
import org.dolphinemu.dolphinemu.NativeLibrary
import org.dolphinemu.dolphinemu.databinding.DialogGameDetailsBinding
import org.dolphinemu.dolphinemu.databinding.DialogGameDetailsTvBinding
+import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting
import org.dolphinemu.dolphinemu.model.GameFile
class GameDetailsDialog : DialogFragment() {
@@ -35,6 +36,21 @@ class GameDetailsDialog : DialogFragment() {
if (requireActivity() is AppCompatActivity) {
binding = DialogGameDetailsBinding.inflate(layoutInflater)
binding.apply {
+ if (BooleanSetting.MAIN_TIME_TRACKING.boolean) {
+ lifecycleScope.launch {
+ val totalMs = gameFile.getTimePlayedMs()
+ val totalMinutes = totalMs / 60000
+ val totalHours = totalMinutes / 60
+ textTimePlayed.text = resources.getString(
+ R.string.game_details_time_played,
+ totalHours,
+ totalMinutes % 60
+ )
+ }
+ } else {
+ textTimePlayed.visibility = View.GONE
+ }
+
textGameTitle.text = gameFile.getTitle()
textDescription.text = gameFile.getDescription()
if (gameFile.getDescription().isEmpty()) {
@@ -87,6 +103,21 @@ class GameDetailsDialog : DialogFragment() {
} else {
tvBinding = DialogGameDetailsTvBinding.inflate(layoutInflater)
tvBinding.apply {
+ if (BooleanSetting.MAIN_TIME_TRACKING.boolean) {
+ lifecycleScope.launch {
+ val totalMs = gameFile.getTimePlayedMs()
+ val totalMinutes = totalMs / 60000
+ val totalHours = totalMinutes / 60
+ textTimePlayed.text = resources.getString(
+ R.string.game_details_time_played,
+ totalHours,
+ totalMinutes % 60
+ )
+ }
+ } else {
+ textTimePlayed.visibility = View.GONE
+ }
+
textGameTitle.text = gameFile.getTitle()
textDescription.text = gameFile.getDescription()
if (gameFile.getDescription().isEmpty()) {
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.kt
index 16ee12e307..afe48b86d7 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.kt
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.kt
@@ -132,6 +132,12 @@ enum class BooleanSetting(
),
MAIN_WII_WIILINK_ENABLE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "EnableWiiLink", false),
MAIN_DSP_JIT(Settings.FILE_DOLPHIN, Settings.SECTION_INI_DSP, "EnableJIT", true),
+ MAIN_TIME_TRACKING(
+ Settings.FILE_DOLPHIN,
+ Settings.SECTION_INI_GENERAL,
+ "EnablePlayTimeTracking",
+ true
+ ),
MAIN_EXPAND_TO_CUTOUT_AREA(
Settings.FILE_DOLPHIN,
Settings.SECTION_INI_INTERFACE,
@@ -916,6 +922,7 @@ enum class BooleanSetting(
MAIN_RAM_OVERRIDE_ENABLE,
MAIN_CUSTOM_RTC_ENABLE,
MAIN_DSP_JIT,
+ MAIN_TIME_TRACKING,
MAIN_EMULATE_SKYLANDER_PORTAL,
MAIN_EMULATE_INFINITY_BASE
)
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt
index ff82f4c63c..e0aa32e15c 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt
@@ -344,6 +344,14 @@ class SettingsFragmentPresenter(
R.string.osd_messages_description
)
)
+ sl.add(
+ SwitchSetting(
+ context,
+ BooleanSetting.MAIN_TIME_TRACKING,
+ R.string.time_tracking,
+ R.string.time_tracking_description
+ )
+ )
val appTheme: AbstractIntSetting = object : AbstractIntSetting {
override val isOverridden: Boolean
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFile.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFile.kt
index 347433f552..26da174285 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFile.kt
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFile.kt
@@ -3,6 +3,8 @@
package org.dolphinemu.dolphinemu.model
import androidx.annotation.Keep
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.withContext
@Keep
class GameFile private constructor(private val pointer: Long) {
@@ -54,6 +56,15 @@ class GameFile private constructor(private val pointer: Long) {
external fun getBannerHeight(): Int
+ suspend fun getTimePlayedMs(): Long {
+ // getTimePlayedMsInternal reads from disk, so let's use coroutines.
+ return withContext(Dispatchers.IO) {
+ getTimePlayedMsInternal()
+ }
+ }
+
+ external private fun getTimePlayedMsInternal(): Long
+
val customCoverPath: String
get() = "${getPath().substring(0, getPath().lastIndexOf("."))}.cover.png"