diff --git a/.idea/misc.xml b/.idea/misc.xml index 67135cd..9c6b75e 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,13 +3,10 @@ diff --git a/app/build.gradle b/app/build.gradle index 996e927..e6264f9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -44,7 +44,6 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" implementation "androidx.cardview:cardview:1.0.0" - implementation 'com.journeyapps:zxing-android-embedded:4.3.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cc80baf..7e0fdf2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,7 +11,6 @@ - - \ No newline at end of file diff --git a/app/src/main/java/im/angry/openeuicc/OpenEUICCApplication.kt b/app/src/main/java/im/angry/openeuicc/OpenEUICCApplication.kt deleted file mode 100644 index bdd6520..0000000 --- a/app/src/main/java/im/angry/openeuicc/OpenEUICCApplication.kt +++ /dev/null @@ -1,8 +0,0 @@ -package im.angry.openeuicc - -import android.app.Application -import im.angry.openeuicc.core.EuiccChannelRepositoryProxy - -class OpenEUICCApplication : Application() { - val euiccChannelRepo = EuiccChannelRepositoryProxy(this) -} \ No newline at end of file diff --git a/app/src/main/java/im/angry/openeuicc/ui/EuiccChannelFragmentUtils.kt b/app/src/main/java/im/angry/openeuicc/ui/EuiccChannelFragmentUtils.kt deleted file mode 100644 index 4aaa49a..0000000 --- a/app/src/main/java/im/angry/openeuicc/ui/EuiccChannelFragmentUtils.kt +++ /dev/null @@ -1,23 +0,0 @@ -package im.angry.openeuicc.ui - -import android.os.Bundle -import androidx.fragment.app.Fragment -import im.angry.openeuicc.OpenEUICCApplication -import im.angry.openeuicc.core.EuiccChannel - -interface EuiccFragmentMarker - -fun newInstanceEuicc(clazz: Class, slotId: Int): T where T: Fragment, T: EuiccFragmentMarker { - val instance = clazz.newInstance() - instance.arguments = Bundle().apply { - putInt("slotId", slotId) - } - return instance -} - -val T.slotId: Int where T: Fragment, T: EuiccFragmentMarker - get() = requireArguments().getInt("slotId") - -val T.channel: EuiccChannel where T: Fragment, T: EuiccFragmentMarker - get() = - (requireActivity().application as OpenEUICCApplication).euiccChannelRepo.availableChannels[slotId] \ No newline at end of file diff --git a/app/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt b/app/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt index 7b0a6b9..4b17565 100644 --- a/app/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt +++ b/app/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt @@ -11,18 +11,14 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import im.angry.openeuicc.R +import im.angry.openeuicc.core.EuiccChannel import im.angry.openeuicc.databinding.EuiccProfileBinding import im.angry.openeuicc.databinding.FragmentEuiccBinding import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class EuiccManagementFragment : Fragment(), EuiccFragmentMarker { - companion object { - fun newInstance(slotId: Int): EuiccManagementFragment = - newInstanceEuicc(EuiccManagementFragment::class.java, slotId) - } - +class EuiccManagementFragment(private val channel: EuiccChannel) : Fragment() { private var _binding: FragmentEuiccBinding? = null private val binding get() = _binding!! @@ -43,11 +39,6 @@ class EuiccManagementFragment : Fragment(), EuiccFragmentMarker { binding.profileList.adapter = adapter binding.profileList.layoutManager = LinearLayoutManager(view.context, LinearLayoutManager.VERTICAL, false) - - binding.fab.setOnClickListener { - ProfileDownloadFragment.newInstance(slotId) - .show(childFragmentManager, ProfileDownloadFragment.TAG) - } } override fun onStart() { diff --git a/app/src/main/java/im/angry/openeuicc/ui/MainActivity.kt b/app/src/main/java/im/angry/openeuicc/ui/MainActivity.kt index 5551219..8c9a305 100644 --- a/app/src/main/java/im/angry/openeuicc/ui/MainActivity.kt +++ b/app/src/main/java/im/angry/openeuicc/ui/MainActivity.kt @@ -9,9 +9,8 @@ import android.widget.ArrayAdapter import android.widget.Spinner import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope -import im.angry.openeuicc.OpenEUICCApplication import im.angry.openeuicc.R -import im.angry.openeuicc.core.EuiccChannelRepository +import im.angry.openeuicc.core.EuiccChannelRepositoryProxy import im.angry.openeuicc.databinding.ActivityMainBinding import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -22,7 +21,7 @@ class MainActivity : AppCompatActivity() { const val TAG = "MainActivity" } - private lateinit var repo: EuiccChannelRepository + private val repo = EuiccChannelRepositoryProxy(this) private lateinit var spinnerAdapter: ArrayAdapter private lateinit var spinner: Spinner @@ -36,8 +35,6 @@ class MainActivity : AppCompatActivity() { binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - repo = (application as OpenEUICCApplication).euiccChannelRepo - spinnerAdapter = ArrayAdapter(this, android.R.layout.simple_spinner_item) lifecycleScope.launch { @@ -78,9 +75,9 @@ class MainActivity : AppCompatActivity() { } withContext(Dispatchers.Main) { - repo.availableChannels.forEachIndexed { idx, channel -> - spinnerAdapter.add(channel.name) - fragments.add(EuiccManagementFragment.newInstance(idx)) + repo.availableChannels.forEach { + spinnerAdapter.add(it.name) + fragments.add(EuiccManagementFragment(it)) } if (fragments.isNotEmpty()) { diff --git a/app/src/main/java/im/angry/openeuicc/ui/ProfileDownloadFragment.kt b/app/src/main/java/im/angry/openeuicc/ui/ProfileDownloadFragment.kt deleted file mode 100644 index bdd5fd2..0000000 --- a/app/src/main/java/im/angry/openeuicc/ui/ProfileDownloadFragment.kt +++ /dev/null @@ -1,78 +0,0 @@ -package im.angry.openeuicc.ui - -import android.app.Dialog -import android.os.Bundle -import android.view.* -import androidx.appcompat.widget.Toolbar -import androidx.fragment.app.DialogFragment -import com.journeyapps.barcodescanner.ScanContract -import com.journeyapps.barcodescanner.ScanOptions -import im.angry.openeuicc.R -import im.angry.openeuicc.databinding.FragmentProfileDownloadBinding -import im.angry.openeuicc.util.setWidthPercent - -class ProfileDownloadFragment : DialogFragment(), EuiccFragmentMarker, Toolbar.OnMenuItemClickListener { - companion object { - const val TAG = "ProfileDownloadFragment" - - fun newInstance(slotId: Int): ProfileDownloadFragment = - newInstanceEuicc(ProfileDownloadFragment::class.java, slotId) - } - - private var _binding: FragmentProfileDownloadBinding? = null - private val binding get() = _binding!! - - private val barcodeScannerLauncher = registerForActivityResult(ScanContract()) { result -> - result.contents?.let { content -> - val components = content.split("$") - if (components.size != 3 || components[0] != "LPA:1") return@registerForActivityResult - binding.profileDownloadServer.editText?.setText(components[1]) - binding.profileDownloadCode.editText?.setText(components[2]) - } - } - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - _binding = FragmentProfileDownloadBinding.inflate(inflater, container, false) - binding.toolbar.inflateMenu(R.menu.fragment_profile_download) - return binding.root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - binding.toolbar.apply { - setTitle(R.string.profile_download) - setNavigationOnClickListener { - dismiss() - } - setOnMenuItemClickListener(this@ProfileDownloadFragment) - } - } - - override fun onMenuItemClick(item: MenuItem): Boolean = - when (item.itemId) { - R.id.scan -> { - barcodeScannerLauncher.launch(ScanOptions().apply { - setDesiredBarcodeFormats(ScanOptions.QR_CODE) - setOrientationLocked(false) - }) - true - } - else -> false - } - - 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) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/im/angry/openeuicc/util/UiUtils.kt b/app/src/main/java/im/angry/openeuicc/util/UiUtils.kt deleted file mode 100644 index 24c1ad8..0000000 --- a/app/src/main/java/im/angry/openeuicc/util/UiUtils.kt +++ /dev/null @@ -1,28 +0,0 @@ -package im.angry.openeuicc.util - -import android.content.res.Resources -import android.graphics.Rect -import android.view.ViewGroup -import androidx.fragment.app.DialogFragment - -// Source: -/** - * 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) -} diff --git a/app/src/main/res/drawable/ic_scan_black.xml b/app/src/main/res/drawable/ic_scan_black.xml deleted file mode 100644 index 597e8d7..0000000 --- a/app/src/main/res/drawable/ic_scan_black.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/layout/fragment_profile_download.xml b/app/src/main/res/layout/fragment_profile_download.xml deleted file mode 100644 index dab6655..0000000 --- a/app/src/main/res/layout/fragment_profile_download.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/fragment_profile_download.xml b/app/src/main/res/menu/fragment_profile_download.xml deleted file mode 100644 index 6f52963..0000000 --- a/app/src/main/res/menu/fragment_profile_download.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0c6c866..dcc7169 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,9 +7,4 @@ Disabled Provider: ICCID: - - New eSIM - Server (RSP / SM-DP+) - Activation Code - Scan QR Code \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 747a861..7e1d6b0 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -9,21 +9,8 @@ @color/pink_600 @color/pink_800 @color/white - ?attr/colorSecondary ?attr/colorPrimaryVariant - - - - - - \ No newline at end of file