diff --git a/app-common/src/main/AndroidManifest.xml b/app-common/src/main/AndroidManifest.xml
index debf765..bf80c5e 100644
--- a/app-common/src/main/AndroidManifest.xml
+++ b/app-common/src/main/AndroidManifest.xml
@@ -16,6 +16,11 @@
android:name="im.angry.openeuicc.ui.NotificationsActivity"
android:label="@string/profile_notifications" />
+
+
newInstanceEuicc(clazz: Class, slotId: Int, portId: Int): T where T: Fragment, T: EuiccFragmentMarker {
+fun newInstanceEuicc(clazz: Class, slotId: Int, portId: Int, addArguments: Bundle.() -> Unit = {}): T where T: Fragment, T: EuiccFragmentMarker {
val instance = clazz.newInstance()
instance.arguments = Bundle().apply {
putInt("slotId", slotId)
putInt("portId", portId)
+ addArguments()
}
return instance
}
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 737d322..81caa11 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
@@ -2,6 +2,7 @@ package im.angry.openeuicc.ui
import android.annotation.SuppressLint
import android.app.Dialog
+import android.content.DialogInterface
import android.os.Bundle
import android.text.Editable
import android.text.format.Formatter
@@ -30,8 +31,10 @@ class ProfileDownloadFragment : BaseMaterialDialogFragment(), EuiccFragmentMarke
companion object {
const val TAG = "ProfileDownloadFragment"
- fun newInstance(slotId: Int, portId: Int): ProfileDownloadFragment =
- newInstanceEuicc(ProfileDownloadFragment::class.java, slotId, portId)
+ fun newInstance(slotId: Int, portId: Int, finishWhenDone: Boolean = false): ProfileDownloadFragment =
+ newInstanceEuicc(ProfileDownloadFragment::class.java, slotId, portId) {
+ putBoolean("finishWhenDone", finishWhenDone)
+ }
}
private lateinit var toolbar: Toolbar
@@ -46,6 +49,10 @@ class ProfileDownloadFragment : BaseMaterialDialogFragment(), EuiccFragmentMarke
private var downloading = false
+ private val finishWhenDone by lazy {
+ requireArguments().getBoolean("finishWhenDone", false)
+ }
+
private val barcodeScannerLauncher = registerForActivityResult(ScanContract()) { result ->
result.contents?.let { content ->
Log.d(TAG, content)
@@ -81,7 +88,9 @@ class ProfileDownloadFragment : BaseMaterialDialogFragment(), EuiccFragmentMarke
toolbar.apply {
setTitle(R.string.profile_download)
setNavigationOnClickListener {
- if (!downloading) dismiss()
+ if (!downloading) {
+ dismiss()
+ }
}
setOnMenuItemClickListener(this@ProfileDownloadFragment)
}
@@ -195,4 +204,18 @@ class ProfileDownloadFragment : BaseMaterialDialogFragment(), EuiccFragmentMarke
// Only send notifications if the user allowed us to
preferenceRepository.notificationDownloadFlow.first()
}
+
+ override fun onDismiss(dialog: DialogInterface) {
+ super.onDismiss(dialog)
+ if (finishWhenDone) {
+ activity?.finish()
+ }
+ }
+
+ override fun onCancel(dialog: DialogInterface) {
+ super.onCancel(dialog)
+ if (finishWhenDone) {
+ activity?.finish()
+ }
+ }
}
\ No newline at end of file
diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/SlotSelectFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/SlotSelectFragment.kt
new file mode 100644
index 0000000..7ad27e2
--- /dev/null
+++ b/app-common/src/main/java/im/angry/openeuicc/ui/SlotSelectFragment.kt
@@ -0,0 +1,78 @@
+package im.angry.openeuicc.ui
+
+import android.content.DialogInterface
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ArrayAdapter
+import android.widget.Spinner
+import androidx.appcompat.widget.Toolbar
+import im.angry.openeuicc.common.R
+import im.angry.openeuicc.core.EuiccChannel
+import im.angry.openeuicc.util.openEuiccApplication
+import im.angry.openeuicc.util.setWidthPercent
+
+class SlotSelectFragment : BaseMaterialDialogFragment() {
+ companion object {
+ const val TAG = "SlotSelectFragment"
+
+ fun newInstance(): SlotSelectFragment {
+ return SlotSelectFragment()
+ }
+ }
+
+ interface SlotSelectedListener {
+ fun onSlotSelected(slotId: Int, portId: Int)
+ fun onSlotSelectCancelled()
+ }
+
+ private lateinit var toolbar: Toolbar
+ private lateinit var spinner: Spinner
+ private val channels: List by lazy {
+ openEuiccApplication.euiccChannelManager.knownChannels.sortedBy { it.logicalSlotId }
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ val view = inflater.inflate(R.layout.fragment_slot_select, container, false)
+
+ toolbar = view.findViewById(R.id.toolbar)
+ toolbar.setTitle(R.string.slot_select)
+ toolbar.inflateMenu(R.menu.fragment_slot_select)
+
+ val adapter = ArrayAdapter(inflater.context, R.layout.spinner_item)
+
+ spinner = view.findViewById(R.id.spinner)
+ spinner.adapter = adapter
+
+ channels.forEach { channel ->
+ adapter.add(getString(R.string.channel_name_format, channel.logicalSlotId))
+ }
+
+ toolbar.setNavigationOnClickListener {
+ (requireActivity() as SlotSelectedListener).onSlotSelectCancelled()
+ }
+ toolbar.setOnMenuItemClickListener {
+ val channel = channels[spinner.selectedItemPosition]
+ (requireActivity() as SlotSelectedListener).onSlotSelected(channel.slotId, channel.portId)
+ dismiss()
+ true
+ }
+
+ return view
+ }
+
+ override fun onResume() {
+ super.onResume()
+ setWidthPercent(75)
+ }
+
+ override fun onCancel(dialog: DialogInterface) {
+ super.onCancel(dialog)
+ (requireActivity() as SlotSelectedListener).onSlotSelectCancelled()
+ }
+}
\ No newline at end of file
diff --git a/app-common/src/main/res/layout/fragment_profile_download.xml b/app-common/src/main/res/layout/fragment_profile_download.xml
index acd47e4..78274dc 100644
--- a/app-common/src/main/res/layout/fragment_profile_download.xml
+++ b/app-common/src/main/res/layout/fragment_profile_download.xml
@@ -2,7 +2,8 @@
+ android:layout_height="match_parent"
+ android:background="?attr/colorSurface">
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-common/src/main/res/menu/fragment_slot_select.xml b/app-common/src/main/res/menu/fragment_slot_select.xml
new file mode 100644
index 0000000..e129008
--- /dev/null
+++ b/app-common/src/main/res/menu/fragment_slot_select.xml
@@ -0,0 +1,9 @@
+
+
\ No newline at end of file
diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml
index 4916084..71440c0 100644
--- a/app-common/src/main/res/values/strings.xml
+++ b/app-common/src/main/res/values/strings.xml
@@ -19,6 +19,9 @@
Cannot switch to new eSIM profile.
Nickname cannot be longer than 64 characters
+ Select Slot
+ Select
+
New eSIM
Server (RSP / SM-DP+)
Activation Code
diff --git a/app-common/src/main/res/values/themes.xml b/app-common/src/main/res/values/themes.xml
index 3fd5916..cc7104d 100644
--- a/app-common/src/main/res/values/themes.xml
+++ b/app-common/src/main/res/values/themes.xml
@@ -28,4 +28,14 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/im/angry/openeuicc/ui/LuiActivity.kt b/app/src/main/java/im/angry/openeuicc/ui/LuiActivity.kt
index 89baf93..e60dfa7 100644
--- a/app/src/main/java/im/angry/openeuicc/ui/LuiActivity.kt
+++ b/app/src/main/java/im/angry/openeuicc/ui/LuiActivity.kt
@@ -11,11 +11,10 @@ class LuiActivity : AppCompatActivity() {
setContentView(R.layout.activity_lui)
findViewById(R.id.lui_skip).setOnClickListener { finish() }
- // TODO: Allow users to select slots, and then hand over directly to ProfileDownloadFragment
// TODO: Deactivate LuiActivity if there is no eSIM found.
// TODO: Support pre-filled download info (from carrier apps); UX
findViewById(R.id.lui_download).setOnClickListener {
- startActivity(Intent(this, PrivilegedMainActivity::class.java))
+ startActivity(Intent(this, DirectProfileDownloadActivity::class.java))
}
}
}
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_slot_mapping.xml b/app/src/main/res/layout/fragment_slot_mapping.xml
index 0fc9faf..52a341c 100644
--- a/app/src/main/res/layout/fragment_slot_mapping.xml
+++ b/app/src/main/res/layout/fragment_slot_mapping.xml
@@ -8,7 +8,6 @@
android:id="@+id/toolbar"
android:layout_width="0dp"
android:layout_height="wrap_content"
- android:theme="@style/Theme.OpenEUICC"
android:elevation="4dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"