diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
new file mode 100644
index 0000000..4bec4ea
--- /dev/null
+++ b/.idea/codeStyles/Project.xml
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ xmlns:android
+
+ ^$
+
+
+
+
+
+
+
+
+ xmlns:.*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:id
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:name
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ name
+
+ ^$
+
+
+
+
+
+
+
+
+ style
+
+ ^$
+
+
+
+
+
+
+
+
+ .*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*
+
+ http://schemas.android.com/apk/res/android
+
+
+ ANDROID_ATTRIBUTE_ORDER
+
+
+
+
+
+
+ .*
+
+ .*
+
+
+ BY_NAME
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 0000000..a55e7a1
--- /dev/null
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/DirectProfileDownloadActivity.kt b/app-common/src/main/java/im/angry/openeuicc/ui/DirectProfileDownloadActivity.kt
index 9c4011a..73e90d2 100644
--- a/app-common/src/main/java/im/angry/openeuicc/ui/DirectProfileDownloadActivity.kt
+++ b/app-common/src/main/java/im/angry/openeuicc/ui/DirectProfileDownloadActivity.kt
@@ -8,27 +8,27 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
-class DirectProfileDownloadActivity : AppCompatActivity(), SlotSelectFragment.SlotSelectedListener {
+class DirectProfileDownloadActivity : AppCompatActivity(), SlotSelectFragment.SlotSelectedListener, OpenEuiccUIContextMarker {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleScope.launch {
withContext(Dispatchers.IO) {
- openEuiccApplication.euiccChannelManager.enumerateEuiccChannels()
+ euiccChannelManager.enumerateEuiccChannels()
}
- val knownChannels = openEuiccApplication.euiccChannelManager.knownChannels
when {
- knownChannels.isEmpty() -> {
+ euiccChannelManager.knownChannels.isEmpty() -> {
finish()
}
- knownChannels.hasMultipleChips -> {
+ euiccChannelManager.knownChannels.hasMultipleChips -> {
SlotSelectFragment.newInstance()
.show(supportFragmentManager, SlotSelectFragment.TAG)
}
else -> {
// If the device has only one eSIM "chip" (but may be mapped to multiple slots),
// we can skip the slot selection dialog since there is only one chip to save to.
- onSlotSelected(knownChannels[0].slotId, knownChannels[0].portId)
+ onSlotSelected(euiccChannelManager.knownChannels[0].slotId,
+ euiccChannelManager.knownChannels[0].portId)
}
}
}
diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/EuiccChannelFragmentUtils.kt b/app-common/src/main/java/im/angry/openeuicc/ui/EuiccChannelFragmentUtils.kt
index f187bf4..7b8d7ca 100644
--- a/app-common/src/main/java/im/angry/openeuicc/ui/EuiccChannelFragmentUtils.kt
+++ b/app-common/src/main/java/im/angry/openeuicc/ui/EuiccChannelFragmentUtils.kt
@@ -2,11 +2,10 @@ package im.angry.openeuicc.ui
import android.os.Bundle
import androidx.fragment.app.Fragment
-import im.angry.openeuicc.core.EuiccChannelManager
import im.angry.openeuicc.core.EuiccChannel
-import im.angry.openeuicc.util.openEuiccApplication
+import im.angry.openeuicc.util.*
-interface EuiccFragmentMarker
+interface EuiccFragmentMarker: OpenEuiccUIContextMarker
fun newInstanceEuicc(clazz: Class, slotId: Int, portId: Int, addArguments: Bundle.() -> Unit = {}): T where T: Fragment, T: EuiccFragmentMarker {
val instance = clazz.newInstance()
@@ -23,9 +22,6 @@ val T.slotId: Int where T: Fragment, T: EuiccFragmentMarker
val T.portId: Int where T: Fragment, T: EuiccFragmentMarker
get() = requireArguments().getInt("portId")
-val T.euiccChannelManager: EuiccChannelManager where T: Fragment, T: EuiccFragmentMarker
- get() = openEuiccApplication.euiccChannelManager
-
val T.channel: EuiccChannel where T: Fragment, T: EuiccFragmentMarker
get() =
euiccChannelManager.findEuiccChannelByPortBlocking(slotId, portId)!!
diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt
index 2d0b67d..c5a6336 100644
--- a/app-common/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt
+++ b/app-common/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt
@@ -31,7 +31,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.lang.Exception
-open class EuiccManagementFragment : Fragment(), EuiccFragmentMarker, EuiccProfilesChangedListener {
+open class EuiccManagementFragment : Fragment(), EuiccProfilesChangedListener, EuiccFragmentMarker {
companion object {
const val TAG = "EuiccManagementFragment"
diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt b/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt
index e7943c5..d3bace2 100644
--- a/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt
+++ b/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt
@@ -20,7 +20,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
-open class MainActivity : AppCompatActivity() {
+open class MainActivity : AppCompatActivity(), OpenEuiccUIContextMarker {
companion object {
const val TAG = "MainActivity"
}
@@ -43,9 +43,9 @@ open class MainActivity : AppCompatActivity() {
noEuiccPlaceholder = findViewById(R.id.no_euicc_placeholder)
- tm = openEuiccApplication.telephonyManager
+ tm = telephonyManager
- manager = openEuiccApplication.euiccChannelManager
+ manager = euiccChannelManager
spinnerAdapter = ArrayAdapter(this, R.layout.spinner_item)
diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/NotificationsActivity.kt b/app-common/src/main/java/im/angry/openeuicc/ui/NotificationsActivity.kt
index 68d666a..7cae863 100644
--- a/app-common/src/main/java/im/angry/openeuicc/ui/NotificationsActivity.kt
+++ b/app-common/src/main/java/im/angry/openeuicc/ui/NotificationsActivity.kt
@@ -19,16 +19,15 @@ import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
-import im.angry.openeuicc.OpenEuiccApplication
import im.angry.openeuicc.common.R
import im.angry.openeuicc.core.EuiccChannel
-import im.angry.openeuicc.util.displayName
+import im.angry.openeuicc.util.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import net.typeblog.lpac_jni.LocalProfileNotification
-class NotificationsActivity: AppCompatActivity() {
+class NotificationsActivity: AppCompatActivity(), OpenEuiccUIContextMarker {
private lateinit var swipeRefresh: SwipeRefreshLayout
private lateinit var notificationList: RecyclerView
private val notificationAdapter = NotificationAdapter()
@@ -41,7 +40,7 @@ class NotificationsActivity: AppCompatActivity() {
setSupportActionBar(findViewById(R.id.toolbar))
supportActionBar!!.setDisplayHomeAsUpEnabled(true)
- euiccChannel = (application as OpenEuiccApplication).euiccChannelManager
+ euiccChannel = euiccChannelManager
.findEuiccChannelBySlotBlocking(intent.getIntExtra("logicalSlotId", 0))!!
swipeRefresh = findViewById(R.id.swipe_refresh)
diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt
index ddc89df..dfa367a 100644
--- a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt
+++ b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt
@@ -7,12 +7,9 @@ import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope
import im.angry.openeuicc.common.R
-import im.angry.openeuicc.util.preferenceRepository
-import kotlinx.coroutines.Dispatchers
+import im.angry.openeuicc.util.*
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
-import net.typeblog.lpac_jni.LocalProfileNotification
import java.lang.Exception
class ProfileDeleteFragment : DialogFragment(), EuiccFragmentMarker {
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 81caa11..92acfbf 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
@@ -17,9 +17,7 @@ import com.google.android.material.textfield.TextInputLayout
import com.journeyapps.barcodescanner.ScanContract
import com.journeyapps.barcodescanner.ScanOptions
import im.angry.openeuicc.common.R
-import im.angry.openeuicc.util.openEuiccApplication
-import im.angry.openeuicc.util.preferenceRepository
-import im.angry.openeuicc.util.setWidthPercent
+import im.angry.openeuicc.util.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
@@ -27,7 +25,8 @@ import kotlinx.coroutines.withContext
import net.typeblog.lpac_jni.ProfileDownloadCallback
import kotlin.Exception
-class ProfileDownloadFragment : BaseMaterialDialogFragment(), EuiccFragmentMarker, Toolbar.OnMenuItemClickListener {
+class ProfileDownloadFragment : BaseMaterialDialogFragment(),
+ Toolbar.OnMenuItemClickListener, EuiccFragmentMarker {
companion object {
const val TAG = "ProfileDownloadFragment"
diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt
index 8c4b78b..ca922f5 100644
--- a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt
+++ b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt
@@ -13,7 +13,7 @@ import androidx.appcompat.widget.Toolbar
import androidx.lifecycle.lifecycleScope
import com.google.android.material.textfield.TextInputLayout
import im.angry.openeuicc.common.R
-import im.angry.openeuicc.util.setWidthPercent
+import im.angry.openeuicc.util.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
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
index 7ad27e2..c8f9a08 100644
--- a/app-common/src/main/java/im/angry/openeuicc/ui/SlotSelectFragment.kt
+++ b/app-common/src/main/java/im/angry/openeuicc/ui/SlotSelectFragment.kt
@@ -10,10 +10,9 @@ 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
+import im.angry.openeuicc.util.*
-class SlotSelectFragment : BaseMaterialDialogFragment() {
+class SlotSelectFragment : BaseMaterialDialogFragment(), OpenEuiccUIContextMarker {
companion object {
const val TAG = "SlotSelectFragment"
@@ -30,7 +29,7 @@ class SlotSelectFragment : BaseMaterialDialogFragment() {
private lateinit var toolbar: Toolbar
private lateinit var spinner: Spinner
private val channels: List by lazy {
- openEuiccApplication.euiccChannelManager.knownChannels.sortedBy { it.logicalSlotId }
+ euiccChannelManager.knownChannels.sortedBy { it.logicalSlotId }
}
override fun onCreateView(
diff --git a/app-common/src/main/java/im/angry/openeuicc/util/UiUtils.kt b/app-common/src/main/java/im/angry/openeuicc/util/UiUtils.kt
index 477837f..17b3f8f 100644
--- a/app-common/src/main/java/im/angry/openeuicc/util/UiUtils.kt
+++ b/app-common/src/main/java/im/angry/openeuicc/util/UiUtils.kt
@@ -1,18 +1,32 @@
package im.angry.openeuicc.util
-import android.app.Activity
+import android.content.Context
import android.content.res.Resources
import android.graphics.Rect
+import android.telephony.TelephonyManager
import android.view.ViewGroup
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import im.angry.openeuicc.OpenEuiccApplication
+import im.angry.openeuicc.core.EuiccChannelManager
-val Activity.openEuiccApplication: OpenEuiccApplication
- get() = application as OpenEuiccApplication
+interface OpenEuiccUIContextMarker
-val Fragment.openEuiccApplication: OpenEuiccApplication
- get() = requireActivity().openEuiccApplication
+val OpenEuiccUIContextMarker.context: Context
+ get() = when (this) {
+ is Context -> this
+ is Fragment -> requireContext()
+ else -> throw RuntimeException("OpenEuiccUIContextMarker shall only be used on Fragments or UI types that derive from Context")
+ }
+
+val OpenEuiccUIContextMarker.openEuiccApplication: OpenEuiccApplication
+ get() = context.applicationContext as OpenEuiccApplication
+
+val OpenEuiccUIContextMarker.euiccChannelManager: EuiccChannelManager
+ get() = openEuiccApplication.euiccChannelManager
+
+val OpenEuiccUIContextMarker.telephonyManager: TelephonyManager
+ get() = openEuiccApplication.telephonyManager
// Source:
/**
diff --git a/app/src/main/java/im/angry/openeuicc/ui/SlotMappingFragment.kt b/app/src/main/java/im/angry/openeuicc/ui/SlotMappingFragment.kt
index d2e59ff..fd6cc22 100644
--- a/app/src/main/java/im/angry/openeuicc/ui/SlotMappingFragment.kt
+++ b/app/src/main/java/im/angry/openeuicc/ui/SlotMappingFragment.kt
@@ -26,7 +26,8 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
-class SlotMappingFragment: BaseMaterialDialogFragment(), OnMenuItemClickListener {
+class SlotMappingFragment: BaseMaterialDialogFragment(),
+ OnMenuItemClickListener, OpenEuiccUIContextMarker {
companion object {
const val TAG = "SlotMappingFragment"
}