diff --git a/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelFactory.kt b/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelFactory.kt index c741f497..15e01912 100644 --- a/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelFactory.kt +++ b/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelFactory.kt @@ -24,7 +24,7 @@ open class DefaultEuiccChannelFactory(protected val context: Context) : EuiccCha Log.i(DefaultEuiccChannelManager.TAG, "Trying OMAPI for physical slot ${port.card.physicalSlotIndex}") try { - return EuiccChannel(port, OmapiApduInterface(seService!!, port)) + return OmapiChannel(seService!!, port) } catch (e: IllegalArgumentException) { // Failed Log.w( diff --git a/app-common/src/main/java/im/angry/openeuicc/core/EuiccChannel.kt b/app-common/src/main/java/im/angry/openeuicc/core/EuiccChannel.kt index 35cf0ad0..003c0ccf 100644 --- a/app-common/src/main/java/im/angry/openeuicc/core/EuiccChannel.kt +++ b/app-common/src/main/java/im/angry/openeuicc/core/EuiccChannel.kt @@ -1,21 +1,16 @@ package im.angry.openeuicc.core import im.angry.openeuicc.util.* -import net.typeblog.lpac_jni.ApduInterface import net.typeblog.lpac_jni.LocalProfileAssistant -import net.typeblog.lpac_jni.impl.HttpInterfaceImpl -import net.typeblog.lpac_jni.impl.LocalProfileAssistantImpl -class EuiccChannel( - val port: UiccPortInfoCompat, - apduInterface: ApduInterface, +abstract class EuiccChannel( + val port: UiccPortInfoCompat ) { val slotId = port.card.physicalSlotIndex // PHYSICAL slot val logicalSlotId = port.logicalSlotIndex val portId = port.portIndex - val lpa: LocalProfileAssistant = LocalProfileAssistantImpl(apduInterface, HttpInterfaceImpl()) - + abstract val lpa: LocalProfileAssistant val valid: Boolean get() = lpa.valid diff --git a/app-common/src/main/java/im/angry/openeuicc/core/OmapiApduInterface.kt b/app-common/src/main/java/im/angry/openeuicc/core/OmapiApduInterface.kt index 3d3bfe11..1349f3c8 100644 --- a/app-common/src/main/java/im/angry/openeuicc/core/OmapiApduInterface.kt +++ b/app-common/src/main/java/im/angry/openeuicc/core/OmapiApduInterface.kt @@ -5,6 +5,9 @@ import android.se.omapi.SEService import android.se.omapi.Session import im.angry.openeuicc.util.* import net.typeblog.lpac_jni.ApduInterface +import net.typeblog.lpac_jni.LocalProfileAssistant +import net.typeblog.lpac_jni.impl.HttpInterfaceImpl +import net.typeblog.lpac_jni.impl.LocalProfileAssistantImpl class OmapiApduInterface( private val service: SEService, @@ -44,4 +47,13 @@ class OmapiApduInterface( return lastChannel.transmit(tx) } -} \ No newline at end of file +} + +class OmapiChannel( + service: SEService, + port: UiccPortInfoCompat, +) : EuiccChannel(port) { + override val lpa: LocalProfileAssistant = LocalProfileAssistantImpl( + OmapiApduInterface(service, port), + HttpInterfaceImpl()) +} diff --git a/app-common/src/main/java/im/angry/openeuicc/di/DefaultUiComponentFactory.kt b/app-common/src/main/java/im/angry/openeuicc/di/DefaultUiComponentFactory.kt index 32550d63..86af0076 100644 --- a/app-common/src/main/java/im/angry/openeuicc/di/DefaultUiComponentFactory.kt +++ b/app-common/src/main/java/im/angry/openeuicc/di/DefaultUiComponentFactory.kt @@ -1,13 +1,9 @@ package im.angry.openeuicc.di -import androidx.fragment.app.Fragment import im.angry.openeuicc.core.EuiccChannel import im.angry.openeuicc.ui.EuiccManagementFragment -import im.angry.openeuicc.ui.NoEuiccPlaceholderFragment open class DefaultUiComponentFactory : UiComponentFactory { override fun createEuiccManagementFragment(channel: EuiccChannel): EuiccManagementFragment = EuiccManagementFragment.newInstance(channel.slotId, channel.portId) - - override fun createNoEuiccPlaceholderFragment(): Fragment = NoEuiccPlaceholderFragment() } \ No newline at end of file diff --git a/app-common/src/main/java/im/angry/openeuicc/di/UiComponentFactory.kt b/app-common/src/main/java/im/angry/openeuicc/di/UiComponentFactory.kt index 4e09a709..d311876e 100644 --- a/app-common/src/main/java/im/angry/openeuicc/di/UiComponentFactory.kt +++ b/app-common/src/main/java/im/angry/openeuicc/di/UiComponentFactory.kt @@ -1,10 +1,8 @@ package im.angry.openeuicc.di -import androidx.fragment.app.Fragment import im.angry.openeuicc.core.EuiccChannel import im.angry.openeuicc.ui.EuiccManagementFragment interface UiComponentFactory { fun createEuiccManagementFragment(channel: EuiccChannel): EuiccManagementFragment - fun createNoEuiccPlaceholderFragment(): Fragment } \ No newline at end of file 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 7564cc88..d2e7caa2 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 @@ -58,9 +58,9 @@ open class EuiccManagementFragment : Fragment(), EuiccProfilesChangedListener, ): View { val view = inflater.inflate(R.layout.fragment_euicc, container, false) - swipeRefresh = view.requireViewById(R.id.swipe_refresh) - fab = view.requireViewById(R.id.fab) - profileList = view.requireViewById(R.id.profile_list) + swipeRefresh = view.findViewById(R.id.swipe_refresh) + fab = view.findViewById(R.id.fab) + profileList = view.findViewById(R.id.profile_list) return view } @@ -191,11 +191,11 @@ open class EuiccManagementFragment : Fragment(), EuiccProfilesChangedListener, } inner class ProfileViewHolder(private val root: View) : ViewHolder(root) { - private val iccid: TextView = root.requireViewById(R.id.iccid) - private val name: TextView = root.requireViewById(R.id.name) - private val state: TextView = root.requireViewById(R.id.state) - private val provider: TextView = root.requireViewById(R.id.provider) - private val profileMenu: ImageButton = root.requireViewById(R.id.profile_menu) + private val iccid: TextView = root.findViewById(R.id.iccid) + private val name: TextView = root.findViewById(R.id.name) + private val state: TextView = root.findViewById(R.id.state) + private val provider: TextView = root.findViewById(R.id.provider) + private val profileMenu: ImageButton = root.findViewById(R.id.profile_menu) init { iccid.setOnClickListener { diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/LogsActivity.kt b/app-common/src/main/java/im/angry/openeuicc/ui/LogsActivity.kt index 2b364683..70f6992b 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/LogsActivity.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/LogsActivity.kt @@ -39,12 +39,12 @@ class LogsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_logs) - setSupportActionBar(requireViewById(R.id.toolbar)) + setSupportActionBar(findViewById(R.id.toolbar)) supportActionBar!!.setDisplayHomeAsUpEnabled(true) - swipeRefresh = requireViewById(R.id.swipe_refresh) - scrollView = requireViewById(R.id.scroll_view) - logText = requireViewById(R.id.log_text) + swipeRefresh = findViewById(R.id.swipe_refresh) + scrollView = findViewById(R.id.scroll_view) + logText = findViewById(R.id.log_text) swipeRefresh.setOnRefreshListener { lifecycleScope.launch { 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 2d80e331..ca6715d9 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 @@ -25,22 +25,20 @@ open class MainActivity : AppCompatActivity(), OpenEuiccContextMarker { } private lateinit var spinnerAdapter: ArrayAdapter - private lateinit var spinnerItem: MenuItem private lateinit var spinner: Spinner private val fragments = arrayListOf() + private lateinit var noEuiccPlaceholder: View + protected lateinit var tm: TelephonyManager override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - setSupportActionBar(requireViewById(R.id.toolbar)) + setSupportActionBar(findViewById(R.id.toolbar)) - supportFragmentManager.beginTransaction().replace( - R.id.fragment_root, - appContainer.uiComponentFactory.createNoEuiccPlaceholderFragment() - ).commit() + noEuiccPlaceholder = findViewById(R.id.no_euicc_placeholder) tm = telephonyManager @@ -55,11 +53,7 @@ open class MainActivity : AppCompatActivity(), OpenEuiccContextMarker { menuInflater.inflate(R.menu.activity_main, menu) if (!this::spinner.isInitialized) { - spinnerItem = menu.findItem(R.id.spinner) - spinner = spinnerItem.actionView as Spinner - if (spinnerAdapter.isEmpty) { - spinnerItem.isVisible = false - } + spinner = menu.findItem(R.id.spinner).actionView as Spinner spinner.adapter = spinnerAdapter spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected( @@ -114,9 +108,7 @@ open class MainActivity : AppCompatActivity(), OpenEuiccContextMarker { } if (fragments.isNotEmpty()) { - if (this@MainActivity::spinner.isInitialized) { - spinnerItem.isVisible = true - } + noEuiccPlaceholder.visibility = View.GONE supportFragmentManager.beginTransaction().replace(R.id.fragment_root, fragments.first()).commit() } } diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/NoEuiccPlaceholderFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/NoEuiccPlaceholderFragment.kt deleted file mode 100644 index e9e44b11..00000000 --- a/app-common/src/main/java/im/angry/openeuicc/ui/NoEuiccPlaceholderFragment.kt +++ /dev/null @@ -1,18 +0,0 @@ -package im.angry.openeuicc.ui - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.Fragment -import im.angry.openeuicc.common.R - -class NoEuiccPlaceholderFragment : Fragment() { - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - return inflater.inflate(R.layout.fragment_no_euicc_placeholder, container, false) - } -} \ No newline at end of file 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 925ed84b..87c5ba34 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 @@ -37,14 +37,14 @@ class NotificationsActivity: AppCompatActivity(), OpenEuiccContextMarker { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_notifications) - setSupportActionBar(requireViewById(R.id.toolbar)) + setSupportActionBar(findViewById(R.id.toolbar)) supportActionBar!!.setDisplayHomeAsUpEnabled(true) euiccChannel = euiccChannelManager .findEuiccChannelBySlotBlocking(intent.getIntExtra("logicalSlotId", 0))!! - swipeRefresh = requireViewById(R.id.swipe_refresh) - notificationList = requireViewById(R.id.recycler_view) + swipeRefresh = findViewById(R.id.swipe_refresh) + notificationList = findViewById(R.id.recycler_view) notificationList.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) @@ -118,8 +118,8 @@ class NotificationsActivity: AppCompatActivity(), OpenEuiccContextMarker { @SuppressLint("ClickableViewAccessibility") inner class NotificationViewHolder(private val root: View): RecyclerView.ViewHolder(root), View.OnCreateContextMenuListener, OnMenuItemClickListener { - private val address: TextView = root.requireViewById(R.id.notification_address) - private val profileName: TextView = root.requireViewById(R.id.notification_profile_name) + private val address: TextView = root.findViewById(R.id.notification_address) + private val profileName: TextView = root.findViewById(R.id.notification_profile_name) private lateinit var notification: LocalProfileNotificationWrapper 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 8ab09d91..43fc1ee9 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 @@ -69,13 +69,13 @@ class ProfileDownloadFragment : BaseMaterialDialogFragment(), ): View { val view = inflater.inflate(R.layout.fragment_profile_download, container, false) - toolbar = view.requireViewById(R.id.toolbar) - profileDownloadServer = view.requireViewById(R.id.profile_download_server) - profileDownloadCode = view.requireViewById(R.id.profile_download_code) - profileDownloadConfirmationCode = view.requireViewById(R.id.profile_download_confirmation_code) - profileDownloadIMEI = view.requireViewById(R.id.profile_download_imei) - profileDownloadFreeSpace = view.requireViewById(R.id.profile_download_free_space) - progress = view.requireViewById(R.id.progress) + toolbar = view.findViewById(R.id.toolbar) + profileDownloadServer = view.findViewById(R.id.profile_download_server) + profileDownloadCode = view.findViewById(R.id.profile_download_code) + profileDownloadConfirmationCode = view.findViewById(R.id.profile_download_confirmation_code) + profileDownloadIMEI = view.findViewById(R.id.profile_download_imei) + profileDownloadFreeSpace = view.findViewById(R.id.profile_download_free_space) + progress = view.findViewById(R.id.progress) toolbar.inflateMenu(R.menu.fragment_profile_download) 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 79871173..7ebac399 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 @@ -46,9 +46,9 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment ): View { val view = inflater.inflate(R.layout.fragment_profile_rename, container, false) - toolbar = view.requireViewById(R.id.toolbar) - profileRenameNewName = view.requireViewById(R.id.profile_rename_new_name) - progress = view.requireViewById(R.id.progress) + toolbar = view.findViewById(R.id.toolbar) + profileRenameNewName = view.findViewById(R.id.profile_rename_new_name) + progress = view.findViewById(R.id.progress) toolbar.inflateMenu(R.menu.fragment_profile_rename) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/SettingsActivity.kt b/app-common/src/main/java/im/angry/openeuicc/ui/SettingsActivity.kt index 426c5467..f5bb4d48 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/SettingsActivity.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/SettingsActivity.kt @@ -9,7 +9,7 @@ class SettingsActivity: AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_settings) - setSupportActionBar(requireViewById(R.id.toolbar)) + setSupportActionBar(findViewById(R.id.toolbar)) supportActionBar!!.setDisplayHomeAsUpEnabled(true) supportFragmentManager.beginTransaction() .replace(R.id.settings_container, SettingsFragment()) 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 6288b0df..9bdcbc10 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 @@ -39,13 +39,13 @@ class SlotSelectFragment : BaseMaterialDialogFragment(), OpenEuiccContextMarker ): View? { val view = inflater.inflate(R.layout.fragment_slot_select, container, false) - toolbar = view.requireViewById(R.id.toolbar) + 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.requireViewById(R.id.spinner) + spinner = view.findViewById(R.id.spinner) spinner.adapter = adapter channels.forEach { channel -> diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/preference/LongSummaryPreferenceCategory.kt b/app-common/src/main/java/im/angry/openeuicc/ui/preference/LongSummaryPreferenceCategory.kt index dc16e15f..a35e897b 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/preference/LongSummaryPreferenceCategory.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/preference/LongSummaryPreferenceCategory.kt @@ -18,4 +18,4 @@ class LongSummaryPreferenceCategory: PreferenceCategory { summaryText.isSingleLine = false summaryText.maxLines = 10 } -} +} \ No newline at end of file diff --git a/app-common/src/main/java/im/angry/openeuicc/util/Utils.kt b/app-common/src/main/java/im/angry/openeuicc/util/Utils.kt index 175e85fa..33699d7e 100644 --- a/app-common/src/main/java/im/angry/openeuicc/util/Utils.kt +++ b/app-common/src/main/java/im/angry/openeuicc/util/Utils.kt @@ -24,7 +24,7 @@ val Context.selfAppVersion: String get() = try { val pInfo = packageManager.getPackageInfo(packageName, 0) - pInfo.versionName!! + pInfo.versionName } catch (e: PackageManager.NameNotFoundException) { throw RuntimeException(e) } @@ -91,4 +91,4 @@ suspend fun connectSEService(context: Context): SEService = suspendCoroutine { c } } } -} +} \ No newline at end of file diff --git a/app-common/src/main/res/layout/activity_main.xml b/app-common/src/main/res/layout/activity_main.xml index 4f1020d7..74b77993 100644 --- a/app-common/src/main/res/layout/activity_main.xml +++ b/app-common/src/main/res/layout/activity_main.xml @@ -21,6 +21,15 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" - app:layout_constraintTop_toBottomOf="@id/toolbar"/> + app:layout_constraintTop_toBottomOf="@id/toolbar"> + + \ No newline at end of file diff --git a/app-common/src/main/res/layout/fragment_no_euicc_placeholder.xml b/app-common/src/main/res/layout/fragment_no_euicc_placeholder.xml deleted file mode 100644 index b040fda6..00000000 --- a/app-common/src/main/res/layout/fragment_no_euicc_placeholder.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - \ 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 52187850..040c910f 100644 --- a/app-common/src/main/res/values/strings.xml +++ b/app-common/src/main/res/values/strings.xml @@ -1,6 +1,6 @@ - No removable eUICC card accessible by this app is detected on this device. + No eUICC card on this device is accessible by this app.\nInsert a supported eUICC card, or try out the privileged OpenEUICC app instead. Unknown Help diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/UnprivilegedOpenEuiccApplication.kt b/app-unpriv/src/main/java/im/angry/openeuicc/UnprivilegedOpenEuiccApplication.kt index 55415012..23e7be9d 100644 --- a/app-unpriv/src/main/java/im/angry/openeuicc/UnprivilegedOpenEuiccApplication.kt +++ b/app-unpriv/src/main/java/im/angry/openeuicc/UnprivilegedOpenEuiccApplication.kt @@ -1,17 +1,12 @@ package im.angry.openeuicc import android.content.Intent -import im.angry.openeuicc.di.UnprivilegedAppContainer import im.angry.openeuicc.ui.LogsActivity import im.angry.openeuicc.util.* import kotlinx.coroutines.runBlocking import kotlin.system.exitProcess class UnprivilegedOpenEuiccApplication : OpenEuiccApplication() { - override val appContainer by lazy { - UnprivilegedAppContainer(this) - } - override fun onCreate() { super.onCreate() diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/di/UnprivilegedAppContainer.kt b/app-unpriv/src/main/java/im/angry/openeuicc/di/UnprivilegedAppContainer.kt deleted file mode 100644 index 22d5a62d..00000000 --- a/app-unpriv/src/main/java/im/angry/openeuicc/di/UnprivilegedAppContainer.kt +++ /dev/null @@ -1,9 +0,0 @@ -package im.angry.openeuicc.di - -import android.content.Context - -class UnprivilegedAppContainer(context: Context) : DefaultAppContainer(context) { - override val uiComponentFactory by lazy { - UnprivilegedUiComponentFactory() - } -} \ No newline at end of file diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/di/UnprivilegedUiComponentFactory.kt b/app-unpriv/src/main/java/im/angry/openeuicc/di/UnprivilegedUiComponentFactory.kt deleted file mode 100644 index f1170382..00000000 --- a/app-unpriv/src/main/java/im/angry/openeuicc/di/UnprivilegedUiComponentFactory.kt +++ /dev/null @@ -1,9 +0,0 @@ -package im.angry.openeuicc.di - -import androidx.fragment.app.Fragment -import im.angry.openeuicc.ui.UnprivilegedNoEuiccPlaceholderFragment - -class UnprivilegedUiComponentFactory : DefaultUiComponentFactory() { - override fun createNoEuiccPlaceholderFragment(): Fragment = - UnprivilegedNoEuiccPlaceholderFragment() -} \ No newline at end of file diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt b/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt index b747befe..b7c8cf80 100644 --- a/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt +++ b/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt @@ -24,10 +24,10 @@ class CompatibilityCheckActivity: AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_compatibility_check) - setSupportActionBar(requireViewById(R.id.toolbar)) + setSupportActionBar(findViewById(R.id.toolbar)) supportActionBar!!.setDisplayHomeAsUpEnabled(true) - compatibilityCheckList = requireViewById(R.id.recycler_view) + compatibilityCheckList = findViewById(R.id.recycler_view) compatibilityCheckList.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) compatibilityCheckList.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL)) @@ -51,9 +51,9 @@ class CompatibilityCheckActivity: AppCompatActivity() { } inner class ViewHolder(private val root: View): RecyclerView.ViewHolder(root) { - private val titleView: TextView = root.requireViewById(R.id.compatibility_check_title) - private val descView: TextView = root.requireViewById(R.id.compatibility_check_desc) - private val statusContainer: ViewGroup = root.requireViewById(R.id.compatibility_check_status_container) + private val titleView: TextView = root.findViewById(R.id.compatibility_check_title) + private val descView: TextView = root.findViewById(R.id.compatibility_check_desc) + private val statusContainer: ViewGroup = root.findViewById(R.id.compatibility_check_status_container) fun bindItem(item: CompatibilityCheck) { titleView.text = item.title @@ -65,16 +65,16 @@ class CompatibilityCheckActivity: AppCompatActivity() { when (item.state) { CompatibilityCheck.State.SUCCESS -> { - root.requireViewById(R.id.compatibility_check_checkmark).visibility = View.VISIBLE + root.findViewById(R.id.compatibility_check_checkmark).visibility = View.VISIBLE } CompatibilityCheck.State.FAILURE -> { - root.requireViewById(R.id.compatibility_check_error).visibility = View.VISIBLE + root.findViewById(R.id.compatibility_check_error).visibility = View.VISIBLE } CompatibilityCheck.State.FAILURE_UNKNOWN -> { - root.requireViewById(R.id.compatibility_check_unknown).visibility = View.VISIBLE + root.findViewById(R.id.compatibility_check_unknown).visibility = View.VISIBLE } else -> { - root.requireViewById(R.id.compatibility_check_progress_bar).visibility = View.VISIBLE + root.findViewById(R.id.compatibility_check_progress_bar).visibility = View.VISIBLE } } } diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedNoEuiccPlaceholderFragment.kt b/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedNoEuiccPlaceholderFragment.kt deleted file mode 100644 index 92cda23b..00000000 --- a/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedNoEuiccPlaceholderFragment.kt +++ /dev/null @@ -1,29 +0,0 @@ -package im.angry.openeuicc.ui - -import android.content.Intent -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.Fragment -import im.angry.easyeuicc.R - -class UnprivilegedNoEuiccPlaceholderFragment : Fragment() { - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - val view = inflater.inflate( - R.layout.fragment_no_euicc_placeholder_unprivileged, - container, - false - ) - - view.findViewById(R.id.compatibility_check).setOnClickListener { - startActivity(Intent(requireContext(), CompatibilityCheckActivity::class.java)) - } - - return view - } -} \ No newline at end of file diff --git a/app-unpriv/src/main/res/layout/fragment_no_euicc_placeholder_unprivileged.xml b/app-unpriv/src/main/res/layout/fragment_no_euicc_placeholder_unprivileged.xml deleted file mode 100644 index 7f9e65c0..00000000 --- a/app-unpriv/src/main/res/layout/fragment_no_euicc_placeholder_unprivileged.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/im/angry/openeuicc/core/PrivilegedEuiccChannelFactory.kt b/app/src/main/java/im/angry/openeuicc/core/PrivilegedEuiccChannelFactory.kt index 317248b8..78acefe1 100644 --- a/app/src/main/java/im/angry/openeuicc/core/PrivilegedEuiccChannelFactory.kt +++ b/app/src/main/java/im/angry/openeuicc/core/PrivilegedEuiccChannelFactory.kt @@ -26,7 +26,9 @@ class PrivilegedEuiccChannelFactory(context: Context) : DefaultEuiccChannelFacto "Trying TelephonyManager for slot ${port.card.physicalSlotIndex} port ${port.portIndex}" ) try { - return EuiccChannel(port, TelephonyManagerApduInterface(port, tm)) + return TelephonyManagerChannel( + port, tm + ) } catch (e: IllegalArgumentException) { // Failed Log.w( diff --git a/app/src/main/java/im/angry/openeuicc/core/TelephonyManagerApduInterface.kt b/app/src/main/java/im/angry/openeuicc/core/TelephonyManagerApduInterface.kt index d6770c3c..c0936a46 100644 --- a/app/src/main/java/im/angry/openeuicc/core/TelephonyManagerApduInterface.kt +++ b/app/src/main/java/im/angry/openeuicc/core/TelephonyManagerApduInterface.kt @@ -3,7 +3,10 @@ package im.angry.openeuicc.core import android.telephony.IccOpenLogicalChannelResponse import android.telephony.TelephonyManager import im.angry.openeuicc.util.* +import net.typeblog.lpac_jni.LocalProfileAssistant import net.typeblog.lpac_jni.ApduInterface +import net.typeblog.lpac_jni.impl.HttpInterfaceImpl +import net.typeblog.lpac_jni.impl.LocalProfileAssistantImpl class TelephonyManagerApduInterface( private val port: UiccPortInfoCompat, @@ -51,4 +54,14 @@ class TelephonyManagerApduInterface( cla, instruction, p1, p2, p3, p4)?.decodeHex() ?: byteArrayOf() } +} + +class TelephonyManagerChannel( + port: UiccPortInfoCompat, + private val tm: TelephonyManager +) : EuiccChannel(port) { + override val lpa: LocalProfileAssistant = LocalProfileAssistantImpl( + TelephonyManagerApduInterface(port, tm), + HttpInterfaceImpl() + ) } \ No newline at end of file diff --git a/app/src/main/java/im/angry/openeuicc/service/OpenEuiccService.kt b/app/src/main/java/im/angry/openeuicc/service/OpenEuiccService.kt index 3c9eaf26..23f14442 100644 --- a/app/src/main/java/im/angry/openeuicc/service/OpenEuiccService.kt +++ b/app/src/main/java/im/angry/openeuicc/service/OpenEuiccService.kt @@ -104,9 +104,9 @@ class OpenEuiccService : EuiccService(), OpenEuiccContextMarker { return GetDefaultDownloadableSubscriptionListResult(RESULT_OK, arrayOf()) } - override fun onGetEuiccProfileInfoList(slotId: Int): GetEuiccProfileInfoListResult { + override fun onGetEuiccProfileInfoList(slotId: Int): GetEuiccProfileInfoListResult? { Log.i(TAG, "onGetEuiccProfileInfoList slotId=$slotId") - val channel = findChannel(slotId)!! + val channel = findChannel(slotId) ?: return null val profiles = channel.lpa.profiles.operational.map { EuiccProfileInfo.Builder(it.iccid).apply { setProfileName(it.name) @@ -256,4 +256,4 @@ class OpenEuiccService : EuiccService(), OpenEuiccContextMarker { // No-op -- we do not care return RESULT_FIRST_USER } -} +} \ 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 f12c9b4e..e60dfa72 100644 --- a/app/src/main/java/im/angry/openeuicc/ui/LuiActivity.kt +++ b/app/src/main/java/im/angry/openeuicc/ui/LuiActivity.kt @@ -10,10 +10,10 @@ class LuiActivity : AppCompatActivity() { super.onStart() setContentView(R.layout.activity_lui) - requireViewById(R.id.lui_skip).setOnClickListener { finish() } + findViewById(R.id.lui_skip).setOnClickListener { finish() } // TODO: Deactivate LuiActivity if there is no eSIM found. // TODO: Support pre-filled download info (from carrier apps); UX - requireViewById(R.id.lui_download).setOnClickListener { + findViewById(R.id.lui_download).setOnClickListener { startActivity(Intent(this, DirectProfileDownloadActivity::class.java)) } } diff --git a/app/src/main/java/im/angry/openeuicc/ui/PrivilegedEuiccManagementFragment.kt b/app/src/main/java/im/angry/openeuicc/ui/PrivilegedEuiccManagementFragment.kt index 744acb8b..78fcd4f5 100644 --- a/app/src/main/java/im/angry/openeuicc/ui/PrivilegedEuiccManagementFragment.kt +++ b/app/src/main/java/im/angry/openeuicc/ui/PrivilegedEuiccManagementFragment.kt @@ -17,7 +17,7 @@ class PrivilegedEuiccManagementFragment: EuiccManagementFragment() { override suspend fun onCreateFooterViews(parent: ViewGroup): List = if (channel.isMEP) { val view = layoutInflater.inflate(R.layout.footer_mep, parent, false) - view.requireViewById