Browse Source

ui: wizard: Add error diagnostics

We finally have it!!!
Peter Cai 1 year ago
parent
commit
07072667db

+ 4 - 0
app-common/src/main/java/im/angry/openeuicc/core/LocalProfileAssistantWrapper.kt

@@ -1,6 +1,7 @@
 package im.angry.openeuicc.core
 package im.angry.openeuicc.core
 
 
 import net.typeblog.lpac_jni.EuiccInfo2
 import net.typeblog.lpac_jni.EuiccInfo2
+import net.typeblog.lpac_jni.HttpInterface
 import net.typeblog.lpac_jni.LocalProfileAssistant
 import net.typeblog.lpac_jni.LocalProfileAssistant
 import net.typeblog.lpac_jni.LocalProfileInfo
 import net.typeblog.lpac_jni.LocalProfileInfo
 import net.typeblog.lpac_jni.LocalProfileNotification
 import net.typeblog.lpac_jni.LocalProfileNotification
@@ -19,6 +20,9 @@ class LocalProfileAssistantWrapper(orig: LocalProfileAssistant) :
             return _inner!!
             return _inner!!
         }
         }
 
 
+    override val lastHttpResponse: HttpInterface.HttpResponse?
+        get() = lpa.lastHttpResponse
+
     override val valid: Boolean
     override val valid: Boolean
         get() = lpa.valid
         get() = lpa.valid
     override val profiles: List<LocalProfileInfo>
     override val profiles: List<LocalProfileInfo>

+ 4 - 1
app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardActivity.kt

@@ -11,6 +11,7 @@ import androidx.core.view.WindowInsetsCompat
 import androidx.core.view.updatePadding
 import androidx.core.view.updatePadding
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.Fragment
 import im.angry.openeuicc.common.R
 import im.angry.openeuicc.common.R
+import im.angry.openeuicc.service.EuiccChannelManagerService
 import im.angry.openeuicc.ui.BaseEuiccAccessActivity
 import im.angry.openeuicc.ui.BaseEuiccAccessActivity
 import im.angry.openeuicc.util.*
 import im.angry.openeuicc.util.*
 
 
@@ -24,6 +25,7 @@ class DownloadWizardActivity: BaseEuiccAccessActivity() {
         var imei: String?,
         var imei: String?,
         var downloadStarted: Boolean,
         var downloadStarted: Boolean,
         var downloadTaskID: Long,
         var downloadTaskID: Long,
+        var downloadError: EuiccChannelManagerService.ProfileDownloadException?,
     )
     )
 
 
     private lateinit var state: DownloadWizardState
     private lateinit var state: DownloadWizardState
@@ -59,7 +61,8 @@ class DownloadWizardActivity: BaseEuiccAccessActivity() {
             null,
             null,
             null,
             null,
             false,
             false,
-            -1
+            -1,
+            null
         )
         )
 
 
         progressBar = requireViewById(R.id.progress)
         progressBar = requireViewById(R.id.progress)

+ 67 - 0
app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDiagnosticsFragment.kt

@@ -0,0 +1,67 @@
+package im.angry.openeuicc.ui.wizard
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import im.angry.openeuicc.common.R
+
+class DownloadWizardDiagnosticsFragment : DownloadWizardActivity.DownloadWizardStepFragment() {
+    override val hasNext: Boolean
+        get() = true
+    override val hasPrev: Boolean
+        get() = false
+
+    private lateinit var diagnosticTextView: TextView
+
+    override fun createNextFragment(): DownloadWizardActivity.DownloadWizardStepFragment? = null
+
+    override fun createPrevFragment(): DownloadWizardActivity.DownloadWizardStepFragment? = null
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        val view = inflater.inflate(R.layout.fragment_download_diagnostics, container, false)
+        diagnosticTextView = view.requireViewById<TextView>(R.id.download_wizard_diagnostics_text)
+        return view
+    }
+
+    override fun onStart() {
+        super.onStart()
+        val str = buildDiagnosticsText()
+        if (str == null) {
+            requireActivity().finish()
+            return
+        }
+
+        diagnosticTextView.text = str
+    }
+
+    private fun buildDiagnosticsText(): String? = state.downloadError?.let { err ->
+        val ret = StringBuilder()
+
+        err.lastHttpResponse?.let { resp ->
+            if (resp.rcode != 200) {
+                // Only show the status if it's not 200
+                // Because we can have errors even if the rcode is 200 due to SM-DP+ servers being dumb
+                // and showing 200 might mislead users
+                ret.appendLine(
+                    getString(
+                        R.string.download_wizard_diagnostics_last_http_status,
+                        resp.rcode
+                    )
+                )
+                ret.appendLine()
+            }
+
+            ret.appendLine(getString(R.string.download_wizard_diagnostics_last_http_response))
+            ret.appendLine()
+            ret.appendLine(resp.data.decodeToString(throwOnInvalidSequence = false))
+        }
+
+        ret.toString()
+    }
+}

+ 9 - 1
app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardProgressFragment.kt

@@ -65,7 +65,12 @@ class DownloadWizardProgressFragment : DownloadWizardActivity.DownloadWizardStep
     override val hasPrev: Boolean
     override val hasPrev: Boolean
         get() = false
         get() = false
 
 
-    override fun createNextFragment(): DownloadWizardActivity.DownloadWizardStepFragment? = null
+    override fun createNextFragment(): DownloadWizardActivity.DownloadWizardStepFragment? =
+        if (state.downloadError != null) {
+            DownloadWizardDiagnosticsFragment()
+        } else {
+            null
+        }
 
 
     override fun createPrevFragment(): DownloadWizardActivity.DownloadWizardStepFragment? = null
     override fun createPrevFragment(): DownloadWizardActivity.DownloadWizardStepFragment? = null
 
 
@@ -116,6 +121,9 @@ class DownloadWizardProgressFragment : DownloadWizardActivity.DownloadWizardStep
                             adapter.notifyItemChanged(index)
                             adapter.notifyItemChanged(index)
                         }
                         }
 
 
+                        state.downloadError =
+                            it.error as? EuiccChannelManagerService.ProfileDownloadException
+
                         isDone = true
                         isDone = true
                         refreshButtons()
                         refreshButtons()
                     }
                     }

+ 48 - 0
app-common/src/main/res/layout/fragment_download_diagnostics.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:fillViewport="true">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <TextView
+            android:id="@+id/download_wizard_diagnostics_title"
+            android:text="@string/download_wizard_diagnostics"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:gravity="center_horizontal"
+            android:textSize="20sp"
+            android:layout_marginTop="20sp"
+            android:layout_marginBottom="20sp"
+            android:layout_marginStart="60sp"
+            android:layout_marginEnd="60sp"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constrainedWidth="true"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <TextView
+            android:id="@+id/download_wizard_diagnostics_text"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="10dp"
+            android:textIsSelectable="true"
+            android:focusable="true"
+            android:textSize="10sp"
+            android:fontFamily="monospace"
+            android:lineSpacingMultiplier="1.1"
+            android:longClickable="true"
+            app:layout_constraintTop_toBottomOf="@id/download_wizard_diagnostics_title"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            tools:ignore="SmallSp" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</ScrollView>

+ 3 - 0
app-common/src/main/res/values/strings.xml

@@ -81,6 +81,9 @@
     <string name="download_wizard_progress_step_authenticating">Authenticating your device with server</string>
     <string name="download_wizard_progress_step_authenticating">Authenticating your device with server</string>
     <string name="download_wizard_progress_step_downloading">Downloading eSIM profile</string>
     <string name="download_wizard_progress_step_downloading">Downloading eSIM profile</string>
     <string name="download_wizard_progress_step_finalizing">Loading eSIM profile into storage</string>
     <string name="download_wizard_progress_step_finalizing">Loading eSIM profile into storage</string>
+    <string name="download_wizard_diagnostics">Error diagnostics</string>
+    <string name="download_wizard_diagnostics_last_http_status">Last HTTP status: %d</string>
+    <string name="download_wizard_diagnostics_last_http_response">Last HTTP response:</string>
 
 
     <string name="profile_rename_new_name">New nickname</string>
     <string name="profile_rename_new_name">New nickname</string>