Browse Source

ui: Add skeleton of an experimental new download flow

This doesn't work yet at all, and is hidden behind an experimental
settings switch.
Peter Cai 1 year ago
parent
commit
47d5c3881c

+ 4 - 0
app-common/src/main/AndroidManifest.xml

@@ -32,6 +32,10 @@
             android:name="im.angry.openeuicc.ui.LogsActivity"
             android:label="@string/pref_advanced_logs" />
 
+        <activity
+            android:name="im.angry.openeuicc.ui.wizard.DownloadWizardActivity"
+            android:label="@string/download_wizard" />
+
         <activity
             android:name="com.journeyapps.barcodescanner.CaptureActivity"
             android:screenOrientation="fullSensor"

+ 10 - 2
app-common/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt

@@ -31,10 +31,12 @@ import net.typeblog.lpac_jni.LocalProfileInfo
 import im.angry.openeuicc.common.R
 import im.angry.openeuicc.service.EuiccChannelManagerService
 import im.angry.openeuicc.service.EuiccChannelManagerService.Companion.waitDone
+import im.angry.openeuicc.ui.wizard.DownloadWizardActivity
 import im.angry.openeuicc.util.*
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.TimeoutCancellationException
 import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.flow.stateIn
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
@@ -105,8 +107,14 @@ open class EuiccManagementFragment : Fragment(), EuiccProfilesChangedListener,
             LinearLayoutManager(view.context, LinearLayoutManager.VERTICAL, false)
 
         fab.setOnClickListener {
-            ProfileDownloadFragment.newInstance(slotId, portId)
-                .show(childFragmentManager, ProfileDownloadFragment.TAG)
+            lifecycleScope.launch {
+                if (preferenceRepository.experimentalDownloadWizardFlow.first()) {
+                    startActivity(Intent(requireContext(), DownloadWizardActivity::class.java))
+                } else {
+                    ProfileDownloadFragment.newInstance(slotId, portId)
+                        .show(childFragmentManager, ProfileDownloadFragment.TAG)
+                }
+            }
         }
     }
 

+ 3 - 3
app-common/src/main/java/im/angry/openeuicc/ui/SettingsFragment.kt

@@ -3,9 +3,6 @@ package im.angry.openeuicc.ui
 import android.content.Intent
 import android.net.Uri
 import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
 import androidx.datastore.preferences.core.Preferences
 import androidx.lifecycle.lifecycleScope
 import androidx.preference.CheckBoxPreference
@@ -50,6 +47,9 @@ class SettingsFragment: PreferenceFragmentCompat() {
 
         findPreference<CheckBoxPreference>("pref_advanced_verbose_logging")
             ?.bindBooleanFlow(preferenceRepository.verboseLoggingFlow, PreferenceKeys.VERBOSE_LOGGING)
+
+        findPreference<CheckBoxPreference>("pref_advanced_experimental_download_wizard")
+            ?.bindBooleanFlow(preferenceRepository.experimentalDownloadWizardFlow, PreferenceKeys.EXPERIMENTAL_DOWNLOAD_WIZARD)
     }
 
     override fun onStart() {

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

@@ -0,0 +1,43 @@
+package im.angry.openeuicc.ui.wizard
+
+import android.os.Bundle
+import android.view.View
+import androidx.activity.OnBackPressedCallback
+import androidx.activity.enableEdgeToEdge
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.updatePadding
+import im.angry.openeuicc.common.R
+import im.angry.openeuicc.ui.BaseEuiccAccessActivity
+
+class DownloadWizardActivity: BaseEuiccAccessActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        enableEdgeToEdge()
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_download_wizard)
+        onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
+            override fun handleOnBackPressed() {
+                // TODO: Actually implement this
+            }
+        })
+
+        val navigation = requireViewById<View>(R.id.download_wizard_navigation)
+        val origHeight = navigation.layoutParams.height
+
+        ViewCompat.setOnApplyWindowInsetsListener(navigation) { v, insets ->
+            val bars = insets.getInsets(
+                WindowInsetsCompat.Type.systemBars()
+                        or WindowInsetsCompat.Type.displayCutout()
+            )
+            v.updatePadding(bars.left, 0, bars.right, bars.bottom)
+            val newParams = navigation.layoutParams
+            newParams.height = origHeight + bars.bottom
+            navigation.layoutParams = newParams
+            WindowInsetsCompat.CONSUMED
+        }
+    }
+
+    override fun onInit() {
+
+    }
+}

+ 4 - 0
app-common/src/main/java/im/angry/openeuicc/util/PreferenceUtils.kt

@@ -25,6 +25,7 @@ object PreferenceKeys {
     val NOTIFICATION_SWITCH = booleanPreferencesKey("notification_switch")
     val DISABLE_SAFEGUARD_REMOVABLE_ESIM = booleanPreferencesKey("disable_safeguard_removable_esim")
     val VERBOSE_LOGGING = booleanPreferencesKey("verbose_logging")
+    val EXPERIMENTAL_DOWNLOAD_WIZARD = booleanPreferencesKey("experimental_download_wizard")
 }
 
 class PreferenceRepository(context: Context) {
@@ -48,6 +49,9 @@ class PreferenceRepository(context: Context) {
     val verboseLoggingFlow: Flow<Boolean> =
         dataStore.data.map { it[PreferenceKeys.VERBOSE_LOGGING] ?: false }
 
+    val experimentalDownloadWizardFlow: Flow<Boolean> =
+        dataStore.data.map { it[PreferenceKeys.EXPERIMENTAL_DOWNLOAD_WIZARD] ?: false }
+
     suspend fun <T> updatePreference(key: Preferences.Key<T>, value: T) {
         dataStore.edit {
             it[key] = value

+ 5 - 0
app-common/src/main/res/drawable/ic_chevron_left.xml

@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
+      
+    <path android:fillColor="@android:color/white" android:pathData="M15.41,7.41L14,6l-6,6 6,6 1.41,-1.41L10.83,12z"/>
+    
+</vector>

+ 5 - 0
app-common/src/main/res/drawable/ic_chevron_right.xml

@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
+      
+    <path android:fillColor="@android:color/white" android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z"/>
+    
+</vector>

+ 44 - 0
app-common/src/main/res/layout/activity_download_wizard.xml

@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/download_wizard_navigation"
+        android:layout_width="match_parent"
+        android:layout_height="48dp"
+        android:background="?attr/colorSurfaceContainer"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent">
+
+        <com.google.android.material.button.MaterialButton
+            android:id="@+id/download_wizard_back"
+            android:text="@string/download_wizard_back"
+            android:background="?attr/selectableItemBackground"
+            android:textColor="?attr/colorPrimary"
+            android:layout_width="wrap_content"
+            android:layout_height="48dp"
+            app:icon="@drawable/ic_chevron_left"
+            app:iconGravity="start"
+            app:iconTint="?attr/colorPrimary"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <com.google.android.material.button.MaterialButton
+            android:id="@+id/download_wizard_next"
+            android:text="@string/download_wizard_next"
+            android:background="?attr/selectableItemBackground"
+            android:textColor="?attr/colorPrimary"
+            android:layout_width="wrap_content"
+            android:layout_height="48dp"
+            app:icon="@drawable/ic_chevron_right"
+            app:iconGravity="end"
+            app:iconTint="?attr/colorPrimary"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

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

@@ -58,6 +58,10 @@
     <string name="profile_download_low_nvram_title">This download may fail</string>
     <string name="profile_download_low_nvram_message">This download may fail due to low remaining capacity.</string>
 
+    <string name="download_wizard">Download Wizard</string>
+    <string name="download_wizard_back">Back</string>
+    <string name="download_wizard_next">Next</string>
+
     <string name="profile_rename_new_name">New nickname</string>
 
     <string name="profile_delete_confirm">Are you sure you want to delete the profile %s? This operation is irreversible.</string>
@@ -113,6 +117,8 @@
     <string name="pref_advanced_verbose_logging_desc">Enable verbose logs, which may contain sensitive information. Only share your logs with someone you trust after turning this on.</string>
     <string name="pref_advanced_logs">Logs</string>
     <string name="pref_advanced_logs_desc">View recent debug logs of the application</string>
+    <string name="pref_advanced_experimental_download_wizard">Experimental Download Wizard</string>
+    <string name="pref_advanced_experimental_download_wizard_desc">Enable the experimental new download wizard. Note that it is not fully working yet.</string>
     <string name="pref_info">Info</string>
     <string name="pref_info_app_version">App Version</string>
     <string name="pref_info_source_code">Source Code</string>

+ 6 - 0
app-common/src/main/res/xml/pref_settings.xml

@@ -41,6 +41,12 @@
             app:iconSpaceReserved="false"
             app:title="@string/pref_advanced_logs"
             app:summary="@string/pref_advanced_logs_desc" />
+
+        <CheckBoxPreference
+            app:key="pref_advanced_experimental_download_wizard"
+            app:iconSpaceReserved="false"
+            app:title="@string/pref_advanced_experimental_download_wizard"
+            app:summary="@string/pref_advanced_experimental_download_wizard_desc" />
     </PreferenceCategory>
 
     <PreferenceCategory