Browse Source

lay out the profile download dialog

Peter Cai 3 years ago
parent
commit
9c376d0a3c

+ 1 - 0
.idea/misc.xml

@@ -6,6 +6,7 @@
         <entry key="app/src/main/res/layout/activity_main.xml" value="0.19375" />
         <entry key="app/src/main/res/layout/euicc_profile.xml" value="0.19375" />
         <entry key="app/src/main/res/layout/fragment_euicc.xml" value="0.19375" />
+        <entry key="app/src/main/res/layout/fragment_profile_download.xml" value="0.19375" />
         <entry key="app/src/main/res/menu/activity_main_slot_spinner.xml" value="0.19375" />
       </map>
     </option>

+ 4 - 0
app/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt

@@ -39,6 +39,10 @@ class EuiccManagementFragment(private val channel: EuiccChannel) : Fragment() {
         binding.profileList.adapter = adapter
         binding.profileList.layoutManager =
             LinearLayoutManager(view.context, LinearLayoutManager.VERTICAL, false)
+
+        binding.fab.setOnClickListener {
+            ProfileDownloadFragment(channel).show(childFragmentManager, ProfileDownloadFragment.TAG)
+        }
     }
 
     override fun onStart() {

+ 53 - 0
app/src/main/java/im/angry/openeuicc/ui/ProfileDownloadFragment.kt

@@ -0,0 +1,53 @@
+package im.angry.openeuicc.ui
+
+import android.app.Dialog
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.view.Window
+import androidx.fragment.app.DialogFragment
+import im.angry.openeuicc.R
+import im.angry.openeuicc.core.EuiccChannel
+import im.angry.openeuicc.databinding.FragmentProfileDownloadBinding
+import im.angry.openeuicc.util.setWidthPercent
+
+class ProfileDownloadFragment(val channel: EuiccChannel) : DialogFragment() {
+    companion object {
+        const val TAG = "ProfileDownloadFragment"
+    }
+
+    private var _binding: FragmentProfileDownloadBinding? = null
+    private val binding get() = _binding!!
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View {
+        _binding = FragmentProfileDownloadBinding.inflate(inflater, container, false)
+        return binding.root
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+        binding.toolbar.apply {
+            setTitle(R.string.profile_download)
+            setNavigationOnClickListener {
+                dismiss()
+            }
+        }
+    }
+
+    override fun onResume() {
+        super.onResume()
+        setWidthPercent(95)
+    }
+
+    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+        return super.onCreateDialog(savedInstanceState).also {
+            it.window?.requestFeature(Window.FEATURE_NO_TITLE)
+            it.setCanceledOnTouchOutside(false)
+        }
+    }
+}

+ 28 - 0
app/src/main/java/im/angry/openeuicc/util/UiUtils.kt

@@ -0,0 +1,28 @@
+package im.angry.openeuicc.util
+
+import android.content.res.Resources
+import android.graphics.Rect
+import android.view.ViewGroup
+import androidx.fragment.app.DialogFragment
+
+// Source: <https://stackoverflow.com/questions/12478520/how-to-set-dialogfragments-width-and-height>
+/**
+ * Call this method (in onActivityCreated or later) to set
+ * the width of the dialog to a percentage of the current
+ * screen width.
+ */
+fun DialogFragment.setWidthPercent(percentage: Int) {
+    val percent = percentage.toFloat() / 100
+    val dm = Resources.getSystem().displayMetrics
+    val rect = dm.run { Rect(0, 0, widthPixels, heightPixels) }
+    val percentWidth = rect.width() * percent
+    dialog?.window?.setLayout(percentWidth.toInt(), ViewGroup.LayoutParams.WRAP_CONTENT)
+}
+
+/**
+ * Call this method (in onActivityCreated or later)
+ * to make the dialog near-full screen.
+ */
+fun DialogFragment.setFullScreen() {
+    dialog?.window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
+}

+ 58 - 0
app/src/main/res/layout/fragment_profile_download.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout 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">
+
+    <androidx.appcompat.widget.Toolbar
+        android:id="@+id/toolbar"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:theme="@style/Theme.OpenEUICC"
+        android:background="?attr/colorPrimary"
+        android:elevation="4dp"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintWidth_percent="1"
+        app:navigationIcon="?homeAsUpIndicator" />
+
+    <com.google.android.material.textfield.TextInputLayout
+        android:id="@+id/profile_download_server"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="15dp"
+        android:hint="@string/profile_download_server"
+        style="@style/Widget.OpenEUICC.Input"
+        app:layout_constraintTop_toBottomOf="@id/toolbar"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintWidth_percent=".8">
+
+        <com.google.android.material.textfield.TextInputEditText
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:theme="@style/Theme.OpenEUICC.Input.Cursor"/>
+
+    </com.google.android.material.textfield.TextInputLayout>
+
+    <com.google.android.material.textfield.TextInputLayout
+        android:id="@+id/profile_download_code"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginVertical="15dp"
+        android:hint="@string/profile_download_code"
+        style="@style/Widget.OpenEUICC.Input"
+        app:layout_constraintTop_toBottomOf="@id/profile_download_server"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintWidth_percent=".8">
+
+        <com.google.android.material.textfield.TextInputEditText
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:theme="@style/Theme.OpenEUICC.Input.Cursor"/>
+
+    </com.google.android.material.textfield.TextInputLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

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

@@ -7,4 +7,8 @@
     <string name="disabled">Disabled</string>
     <string name="provider">Provider:</string>
     <string name="iccid">ICCID:</string>
+
+    <string name="profile_download">New eSIM</string>
+    <string name="profile_download_server">Server (RSP / SM-DP+)</string>
+    <string name="profile_download_code">Activation Code</string>
 </resources>

+ 13 - 0
app/src/main/res/values/themes.xml

@@ -9,8 +9,21 @@
         <item name="colorSecondary">@color/pink_600</item>
         <item name="colorSecondaryVariant">@color/pink_800</item>
         <item name="colorOnSecondary">@color/white</item>
+        <item name="colorAccent">?attr/colorSecondary</item>
         <!-- Status bar color. -->
         <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
         <!-- Customize your theme here. -->
     </style>
+
+    <style name="Theme.OpenEUICC.Input.Cursor" parent="ThemeOverlay.MaterialComponents.TextInputEditText.OutlinedBox">
+        <item name="colorControlActivated">?attr/colorSecondary</item>
+    </style>
+
+    <style name="Widget.OpenEUICC.Input" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox">
+        <item name="boxBackgroundColor">@android:color/transparent</item>
+        <item name="boxStrokeColor">?attr/colorSecondary</item>
+        <item name="hintTextColor">?attr/colorSecondary</item>
+    </style>
+
+
 </resources>