Browse Source

wizard: Accept deep-links with the LPA: schema

Co-authored-by: septs <github@septs.pw>
Peter Cai 11 months ago
parent
commit
c528962f29

+ 14 - 1
app-common/src/main/AndroidManifest.xml

@@ -30,7 +30,20 @@
         <activity
         <activity
             android:exported="true"
             android:exported="true"
             android:name="im.angry.openeuicc.ui.wizard.DownloadWizardActivity"
             android:name="im.angry.openeuicc.ui.wizard.DownloadWizardActivity"
-            android:label="@string/download_wizard" />
+            android:label="@string/download_wizard">
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW" />
+
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.BROWSABLE" />
+
+                <!-- Accepts URIs that begin with "lpa:" -->
+                <!-- for example: "LPA:1$..." -->
+                <!-- refs: https://www.iana.org/assignments/uri-schemes/prov/lpa -->
+                <data android:scheme="lpa"/>
+                <data android:sspPrefix="1$"/>
+            </intent-filter>
+        </activity>
 
 
         <activity-alias
         <activity-alias
             android:exported="true"
             android:exported="true"

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

@@ -35,6 +35,7 @@ class DownloadWizardActivity: BaseEuiccAccessActivity() {
         var downloadStarted: Boolean,
         var downloadStarted: Boolean,
         var downloadTaskID: Long,
         var downloadTaskID: Long,
         var downloadError: LocalProfileAssistant.ProfileDownloadException?,
         var downloadError: LocalProfileAssistant.ProfileDownloadException?,
+        var skipMethodSelect: Boolean,
     )
     )
 
 
     private lateinit var state: DownloadWizardState
     private lateinit var state: DownloadWizardState
@@ -63,17 +64,20 @@ class DownloadWizardActivity: BaseEuiccAccessActivity() {
         })
         })
 
 
         state = DownloadWizardState(
         state = DownloadWizardState(
-            null,
-            intent.getIntExtra("selectedLogicalSlot", 0),
-            "",
-            null,
-            null,
-            null,
-            false,
-            -1,
-            null
+            currentStepFragmentClassName = null,
+            selectedLogicalSlot = intent.getIntExtra("selectedLogicalSlot", 0),
+            smdp = "",
+            matchingId = null,
+            confirmationCode = null,
+            imei = null,
+            downloadStarted = false,
+            downloadTaskID = -1,
+            downloadError = null,
+            skipMethodSelect = false
         )
         )
 
 
+        handleDeepLink()
+
         progressBar = requireViewById(R.id.progress)
         progressBar = requireViewById(R.id.progress)
         nextButton = requireViewById(R.id.download_wizard_next)
         nextButton = requireViewById(R.id.download_wizard_next)
         prevButton = requireViewById(R.id.download_wizard_back)
         prevButton = requireViewById(R.id.download_wizard_back)
@@ -113,6 +117,19 @@ class DownloadWizardActivity: BaseEuiccAccessActivity() {
         }
         }
     }
     }
 
 
+    private fun handleDeepLink() {
+        // If we get an LPA string from deep-link intents, extract from there.
+        // Note that `onRestoreInstanceState` could override this with user input,
+        // but that _is_ the desired behavior.
+        val uri = intent.data
+        if (uri?.scheme == "lpa") {
+            val parsed = ActivationCode.fromString(uri.schemeSpecificPart)
+            state.smdp = parsed.address
+            state.matchingId = parsed.matchingId
+            state.skipMethodSelect = true
+        }
+    }
+
     override fun onProvideAssistContent(outContent: AssistContent?) {
     override fun onProvideAssistContent(outContent: AssistContent?) {
         super.onProvideAssistContent(outContent)
         super.onProvideAssistContent(outContent)
         outContent?.webUri = try {
         outContent?.webUri = try {

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

@@ -36,7 +36,11 @@ class DownloadWizardDetailsFragment : DownloadWizardActivity.DownloadWizardStepF
         DownloadWizardProgressFragment()
         DownloadWizardProgressFragment()
 
 
     override fun createPrevFragment(): DownloadWizardActivity.DownloadWizardStepFragment =
     override fun createPrevFragment(): DownloadWizardActivity.DownloadWizardStepFragment =
-        DownloadWizardMethodSelectFragment()
+        if (state.skipMethodSelect) {
+            DownloadWizardSlotSelectFragment()
+        } else {
+            DownloadWizardMethodSelectFragment()
+        }
 
 
     override fun onCreateView(
     override fun onCreateView(
         inflater: LayoutInflater,
         inflater: LayoutInflater,

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

@@ -49,7 +49,11 @@ class DownloadWizardSlotSelectFragment : DownloadWizardActivity.DownloadWizardSt
         get() = true
         get() = true
 
 
     override fun createNextFragment(): DownloadWizardActivity.DownloadWizardStepFragment =
     override fun createNextFragment(): DownloadWizardActivity.DownloadWizardStepFragment =
-        DownloadWizardMethodSelectFragment()
+        if (state.skipMethodSelect) {
+            DownloadWizardDetailsFragment()
+        } else {
+            DownloadWizardMethodSelectFragment()
+        }
 
 
     override fun createPrevFragment(): DownloadWizardActivity.DownloadWizardStepFragment? = null
     override fun createPrevFragment(): DownloadWizardActivity.DownloadWizardStepFragment? = null