android: Add a notice when RAM inadequate
This commit is contained in:
		| @@ -27,13 +27,13 @@ import android.view.MotionEvent | ||||
| import android.view.Surface | ||||
| import android.view.View | ||||
| import android.view.inputmethod.InputMethodManager | ||||
| import android.widget.Toast | ||||
| import androidx.activity.viewModels | ||||
| import androidx.appcompat.app.AppCompatActivity | ||||
| import androidx.core.view.WindowCompat | ||||
| import androidx.core.view.WindowInsetsCompat | ||||
| import androidx.core.view.WindowInsetsControllerCompat | ||||
| import androidx.navigation.fragment.NavHostFragment | ||||
| import kotlin.math.roundToInt | ||||
| import org.yuzu.yuzu_emu.NativeLibrary | ||||
| import org.yuzu.yuzu_emu.R | ||||
| import org.yuzu.yuzu_emu.databinding.ActivityEmulationBinding | ||||
| @@ -44,8 +44,10 @@ import org.yuzu.yuzu_emu.model.Game | ||||
| import org.yuzu.yuzu_emu.utils.ControllerMappingHelper | ||||
| import org.yuzu.yuzu_emu.utils.ForegroundService | ||||
| import org.yuzu.yuzu_emu.utils.InputHandler | ||||
| import org.yuzu.yuzu_emu.utils.MemoryUtil | ||||
| import org.yuzu.yuzu_emu.utils.NfcReader | ||||
| import org.yuzu.yuzu_emu.utils.ThemeHelper | ||||
| import kotlin.math.roundToInt | ||||
|  | ||||
| class EmulationActivity : AppCompatActivity(), SensorEventListener { | ||||
|     private lateinit var binding: ActivityEmulationBinding | ||||
| @@ -102,6 +104,19 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { | ||||
|         inputHandler = InputHandler() | ||||
|         inputHandler.initialize() | ||||
|  | ||||
|         val memoryUtil = MemoryUtil(this) | ||||
|         if (memoryUtil.isLessThan(8, MemoryUtil.Gb)) { | ||||
|             Toast.makeText( | ||||
|                 this, | ||||
|                 getString( | ||||
|                     R.string.device_memory_inadequate_description, | ||||
|                     memoryUtil.getDeviceRAM(), | ||||
|                     "8 GB" | ||||
|                 ), | ||||
|                 Toast.LENGTH_LONG | ||||
|             ).show() | ||||
|         } | ||||
|  | ||||
|         // Start a foreground service to prevent the app from getting killed in the background | ||||
|         val startIntent = Intent(this, ForegroundService::class.java) | ||||
|         startForegroundService(startIntent) | ||||
|   | ||||
| @@ -0,0 +1,58 @@ | ||||
| // SPDX-FileCopyrightText: 2023 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-2.0-or-later | ||||
|  | ||||
| package org.yuzu.yuzu_emu.utils | ||||
|  | ||||
| import android.app.ActivityManager | ||||
| import android.content.Context | ||||
| import java.util.Locale | ||||
|  | ||||
| class MemoryUtil(context: Context) { | ||||
|  | ||||
|     private val Long.floatForm: String | ||||
|         get() = String.format(Locale.ROOT, "%.2f", this.toDouble()) | ||||
|  | ||||
|     private fun bytesToSizeUnit(size: Long): String { | ||||
|         return when { | ||||
|             size < Kb -> size.floatForm + " byte" | ||||
|             size < Mb -> (size / Kb).floatForm + " KB" | ||||
|             size < Gb -> (size / Mb).floatForm + " MB" | ||||
|             size < Tb -> (size / Gb).floatForm + " GB" | ||||
|             size < Pb -> (size / Tb).floatForm + " TB" | ||||
|             size < Eb -> (size / Pb).floatForm + " Pb" | ||||
|             else -> (size / Eb).floatForm + " Eb" | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private val totalMemory = | ||||
|         with(context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager) { | ||||
|             val memInfo = ActivityManager.MemoryInfo() | ||||
|             getMemoryInfo(memInfo) | ||||
|             memInfo.totalMem | ||||
|         } | ||||
|  | ||||
|     fun isLessThan(minimum: Int, size: Long): Boolean { | ||||
|         return when (size) { | ||||
|             Kb -> totalMemory < Mb && totalMemory < minimum | ||||
|             Mb -> totalMemory < Gb && (totalMemory / Mb) < minimum | ||||
|             Gb -> totalMemory < Tb && (totalMemory / Gb) < minimum | ||||
|             Tb -> totalMemory < Pb && (totalMemory / Tb) < minimum | ||||
|             Pb -> totalMemory < Eb && (totalMemory / Pb) < minimum | ||||
|             Eb -> totalMemory / Eb < minimum | ||||
|             else -> totalMemory < Kb && totalMemory < minimum | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fun getDeviceRAM(): String { | ||||
|         return bytesToSizeUnit(totalMemory) | ||||
|     } | ||||
|  | ||||
|     companion object { | ||||
|         const val Kb: Long = 1024 | ||||
|         const val Mb = Kb * 1024 | ||||
|         const val Gb = Mb * 1024 | ||||
|         const val Tb = Gb * 1024 | ||||
|         const val Pb = Tb * 1024 | ||||
|         const val Eb = Pb * 1024 | ||||
|     } | ||||
| } | ||||
| @@ -270,6 +270,7 @@ | ||||
|     <string name="fatal_error">Fatal Error</string> | ||||
|     <string name="fatal_error_message">A fatal error occurred. Check the log for details.\nContinuing emulation may result in crashes and bugs.</string> | ||||
|     <string name="performance_warning">Turning off this setting will significantly reduce emulation performance! For the best experience, it is recommended that you leave this setting enabled.</string> | ||||
|     <string name="device_memory_inadequate_description">Device RAM: %1$s\nRecommended: %2$s</string> | ||||
|  | ||||
|     <!-- Region Names --> | ||||
|     <string name="region_japan">Japan</string> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user