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 @@ + + + + + + \ 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" }