diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDownloadFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDownloadFragment.kt
index 69ad1d0..f590d36 100644
--- a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDownloadFragment.kt
+++ b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDownloadFragment.kt
@@ -12,6 +12,7 @@ import android.widget.ProgressBar
import android.widget.TextView
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
+import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.Toolbar
import androidx.lifecycle.lifecycleScope
import com.google.android.material.textfield.TextInputLayout
@@ -25,13 +26,14 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
-import kotlin.Exception
class ProfileDownloadFragment : BaseMaterialDialogFragment(),
Toolbar.OnMenuItemClickListener, EuiccChannelFragmentMarker {
companion object {
const val TAG = "ProfileDownloadFragment"
+ const val LOW_NVRAM_THRESHOLD = 30 * 1024 // < 30 KiB, the alert may fail
+
fun newInstance(slotId: Int, portId: Int, finishWhenDone: Boolean = false): ProfileDownloadFragment =
newInstanceEuicc(ProfileDownloadFragment::class.java, slotId, portId) {
putBoolean("finishWhenDone", finishWhenDone)
@@ -135,7 +137,21 @@ class ProfileDownloadFragment : BaseMaterialDialogFragment(),
true
}
R.id.ok -> {
- startDownloadProfile()
+ if (freeNvram > LOW_NVRAM_THRESHOLD) {
+ startDownloadProfile()
+ } else {
+ AlertDialog.Builder(requireContext()).apply {
+ setTitle(R.string.profile_download_low_nvram_title)
+ setMessage(R.string.profile_download_low_nvram_message)
+ setIcon(android.R.drawable.ic_dialog_alert)
+ setCancelable(true)
+ setPositiveButton(android.R.string.ok) { _, _ ->
+ startDownloadProfile()
+ }
+ setNegativeButton(android.R.string.cancel, null)
+ show()
+ }
+ }
true
}
else -> false
diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml
index cc8f220..05ea4c5 100644
--- a/app-common/src/main/res/values/strings.xml
+++ b/app-common/src/main/res/values/strings.xml
@@ -55,6 +55,9 @@
Download
Failed to download eSIM. Check your activation / QR code.
+ This download may fail
+ This download may fail due to low remaining capacity.
+
New nickname
Are you sure you want to delete the profile %s? This operation is irreversible.
diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt b/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt
index 06b46df..433f9c3 100644
--- a/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt
+++ b/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt
@@ -1,7 +1,6 @@
package im.angry.openeuicc.ui
import android.os.Bundle
-import android.util.Log
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
@@ -68,20 +67,13 @@ class CompatibilityCheckActivity: AppCompatActivity() {
it.visibility = View.GONE
}
- when (item.state) {
- CompatibilityCheck.State.SUCCESS -> {
- root.requireViewById(R.id.compatibility_check_checkmark).visibility = View.VISIBLE
- }
- CompatibilityCheck.State.FAILURE -> {
- root.requireViewById(R.id.compatibility_check_error).visibility = View.VISIBLE
- }
- CompatibilityCheck.State.FAILURE_UNKNOWN -> {
- root.requireViewById(R.id.compatibility_check_unknown).visibility = View.VISIBLE
- }
- else -> {
- root.requireViewById(R.id.compatibility_check_progress_bar).visibility = View.VISIBLE
- }
+ val viewId = when (item.state) {
+ CompatibilityCheck.State.SUCCESS -> R.id.compatibility_check_checkmark
+ CompatibilityCheck.State.FAILURE -> R.id.compatibility_check_error
+ CompatibilityCheck.State.FAILURE_UNKNOWN -> R.id.compatibility_check_unknown
+ else -> R.id.compatibility_check_progress_bar
}
+ root.requireViewById(viewId).visibility = View.VISIBLE
}
}