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"