diff --git a/app-common/src/main/AndroidManifest.xml b/app-common/src/main/AndroidManifest.xml index a33838f..11f16a6 100644 --- a/app-common/src/main/AndroidManifest.xml +++ b/app-common/src/main/AndroidManifest.xml @@ -32,10 +32,6 @@ android:name="im.angry.openeuicc.ui.LogsActivity" android:label="@string/pref_advanced_logs" /> - - , - ignoreTLSCertificate: Flow + verboseLoggingFlow: Flow ) : EuiccChannel { override val slotId = port.card.physicalSlotIndex override val logicalSlotId = port.logicalSlotIndex override val portId = port.portIndex override val lpa: LocalProfileAssistant = - LocalProfileAssistantImpl(apduInterface, HttpInterfaceImpl(verboseLoggingFlow, ignoreTLSCertificate)) + LocalProfileAssistantImpl(apduInterface, HttpInterfaceImpl(verboseLoggingFlow)) override val valid: Boolean get() = lpa.valid 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 c3ecbf3..bf46043 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,12 +31,10 @@ import net.typeblog.lpac_jni.LocalProfileInfo import im.angry.openeuicc.common.R import im.angry.openeuicc.service.EuiccChannelManagerService import im.angry.openeuicc.service.EuiccChannelManagerService.Companion.waitDone -import im.angry.openeuicc.ui.wizard.DownloadWizardActivity import im.angry.openeuicc.util.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -107,14 +105,8 @@ open class EuiccManagementFragment : Fragment(), EuiccProfilesChangedListener, LinearLayoutManager(view.context, LinearLayoutManager.VERTICAL, false) fab.setOnClickListener { - lifecycleScope.launch { - if (preferenceRepository.experimentalDownloadWizardFlow.first()) { - startActivity(Intent(requireContext(), DownloadWizardActivity::class.java)) - } else { - ProfileDownloadFragment.newInstance(slotId, portId) - .show(childFragmentManager, ProfileDownloadFragment.TAG) - } - } + ProfileDownloadFragment.newInstance(slotId, portId) + .show(childFragmentManager, ProfileDownloadFragment.TAG) } } diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/SettingsFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/SettingsFragment.kt index 83be1ea..5ed4348 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/SettingsFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/SettingsFragment.kt @@ -3,48 +3,26 @@ package im.angry.openeuicc.ui import android.content.Intent import android.net.Uri import android.os.Bundle -import android.widget.Toast +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup import androidx.datastore.preferences.core.Preferences import androidx.lifecycle.lifecycleScope import androidx.preference.CheckBoxPreference import androidx.preference.Preference -import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat import im.angry.openeuicc.common.R import im.angry.openeuicc.util.* import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.collect -import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking class SettingsFragment: PreferenceFragmentCompat() { - private lateinit var developerPref: PreferenceCategory - - // Hidden developer options switch - private var numClicks = 0 - private var lastClickTimestamp = -1L - private var lastToast: Toast? = null - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.pref_settings, rootKey) - developerPref = findPreference("pref_developer")!! - - // Show / hide developer preference based on whether it is enabled - lifecycleScope.launch { - preferenceRepository.developerOptionsEnabledFlow.onEach { - developerPref.isVisible = it - }.collect() - } - findPreference("pref_info_app_version") - ?.apply { - summary = requireContext().selfAppVersion - - // Enable developer options when this is clicked for 7 times - setOnPreferenceClickListener(this@SettingsFragment::onAppVersionClicked) - } + ?.summary = requireContext().selfAppVersion findPreference("pref_info_source_code") ?.setOnPreferenceClickListener { @@ -72,12 +50,6 @@ class SettingsFragment: PreferenceFragmentCompat() { findPreference("pref_advanced_verbose_logging") ?.bindBooleanFlow(preferenceRepository.verboseLoggingFlow, PreferenceKeys.VERBOSE_LOGGING) - - findPreference("pref_developer_experimental_download_wizard") - ?.bindBooleanFlow(preferenceRepository.experimentalDownloadWizardFlow, PreferenceKeys.EXPERIMENTAL_DOWNLOAD_WIZARD) - - findPreference("pref_ignore_tls_certificate") - ?.bindBooleanFlow(preferenceRepository.ignoreTLSCertificate, PreferenceKeys.IGNORE_TLS_CERTIFICATE) } override fun onStart() { @@ -85,44 +57,6 @@ class SettingsFragment: PreferenceFragmentCompat() { setupRootViewInsets(requireView().requireViewById(androidx.preference.R.id.recycler_view)) } - @Suppress("UNUSED_PARAMETER") - private fun onAppVersionClicked(pref: Preference): Boolean { - if (developerPref.isVisible) return false - val now = System.currentTimeMillis() - if (now - lastClickTimestamp >= 1000) { - numClicks = 1 - } else { - numClicks++ - } - lastClickTimestamp = now - - if (numClicks == 7) { - lifecycleScope.launch { - preferenceRepository.updatePreference( - PreferenceKeys.DEVELOPER_OPTIONS_ENABLED, - true - ) - - lastToast?.cancel() - Toast.makeText( - requireContext(), - R.string.developer_options_enabled, - Toast.LENGTH_SHORT - ).show() - } - } else if (numClicks > 1) { - lastToast?.cancel() - lastToast = Toast.makeText( - requireContext(), - getString(R.string.developer_options_steps, 7 - numClicks), - Toast.LENGTH_SHORT - ) - lastToast!!.show() - } - - return true - } - private fun CheckBoxPreference.bindBooleanFlow(flow: Flow, key: Preferences.Key) { lifecycleScope.launch { flow.collect { isChecked = it } diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardActivity.kt b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardActivity.kt deleted file mode 100644 index edd9f2e..0000000 --- a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardActivity.kt +++ /dev/null @@ -1,48 +0,0 @@ -package im.angry.openeuicc.ui.wizard - -import android.os.Bundle -import android.view.View -import android.widget.ProgressBar -import androidx.activity.OnBackPressedCallback -import androidx.activity.enableEdgeToEdge -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat -import androidx.core.view.updatePadding -import im.angry.openeuicc.common.R -import im.angry.openeuicc.ui.BaseEuiccAccessActivity - -class DownloadWizardActivity: BaseEuiccAccessActivity() { - private lateinit var progressBar: ProgressBar - - override fun onCreate(savedInstanceState: Bundle?) { - enableEdgeToEdge() - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_download_wizard) - onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - // TODO: Actually implement this - } - }) - - progressBar = requireViewById(R.id.progress) - - val navigation = requireViewById(R.id.download_wizard_navigation) - val origHeight = navigation.layoutParams.height - - ViewCompat.setOnApplyWindowInsetsListener(navigation) { v, insets -> - val bars = insets.getInsets( - WindowInsetsCompat.Type.systemBars() - or WindowInsetsCompat.Type.displayCutout() - ) - v.updatePadding(bars.left, 0, bars.right, bars.bottom) - val newParams = navigation.layoutParams - newParams.height = origHeight + bars.bottom - navigation.layoutParams = newParams - WindowInsetsCompat.CONSUMED - } - } - - override fun onInit() { - progressBar.visibility = View.GONE - } -} \ No newline at end of file diff --git a/app-common/src/main/java/im/angry/openeuicc/util/PreferenceUtils.kt b/app-common/src/main/java/im/angry/openeuicc/util/PreferenceUtils.kt index 133204c..262482a 100644 --- a/app-common/src/main/java/im/angry/openeuicc/util/PreferenceUtils.kt +++ b/app-common/src/main/java/im/angry/openeuicc/util/PreferenceUtils.kt @@ -20,19 +20,11 @@ val Fragment.preferenceRepository: PreferenceRepository get() = requireContext().preferenceRepository object PreferenceKeys { - // ---- Profile Notifications ---- val NOTIFICATION_DOWNLOAD = booleanPreferencesKey("notification_download") val NOTIFICATION_DELETE = booleanPreferencesKey("notification_delete") val NOTIFICATION_SWITCH = booleanPreferencesKey("notification_switch") - - // ---- Advanced ---- val DISABLE_SAFEGUARD_REMOVABLE_ESIM = booleanPreferencesKey("disable_safeguard_removable_esim") val VERBOSE_LOGGING = booleanPreferencesKey("verbose_logging") - - // ---- Developer Options ---- - val DEVELOPER_OPTIONS_ENABLED = booleanPreferencesKey("developer_options_enabled") - val EXPERIMENTAL_DOWNLOAD_WIZARD = booleanPreferencesKey("experimental_download_wizard") - val IGNORE_TLS_CERTIFICATE = booleanPreferencesKey("ignore_tls_certificate") } class PreferenceRepository(context: Context) { @@ -56,16 +48,6 @@ class PreferenceRepository(context: Context) { val verboseLoggingFlow: Flow = dataStore.data.map { it[PreferenceKeys.VERBOSE_LOGGING] ?: false } - // ---- Developer Options ---- - val developerOptionsEnabledFlow: Flow = - dataStore.data.map { it[PreferenceKeys.DEVELOPER_OPTIONS_ENABLED] ?: false } - - val experimentalDownloadWizardFlow: Flow = - dataStore.data.map { it[PreferenceKeys.EXPERIMENTAL_DOWNLOAD_WIZARD] ?: false } - - val ignoreTLSCertificate: Flow = - dataStore.data.map { it[PreferenceKeys.IGNORE_TLS_CERTIFICATE] ?: false } - suspend fun updatePreference(key: Preferences.Key, value: T) { dataStore.edit { it[key] = value diff --git a/app-common/src/main/res/drawable/ic_chevron_left.xml b/app-common/src/main/res/drawable/ic_chevron_left.xml deleted file mode 100644 index 1152da9..0000000 --- a/app-common/src/main/res/drawable/ic_chevron_left.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/app-common/src/main/res/drawable/ic_chevron_right.xml b/app-common/src/main/res/drawable/ic_chevron_right.xml deleted file mode 100644 index 1db5e68..0000000 --- a/app-common/src/main/res/drawable/ic_chevron_right.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/app-common/src/main/res/layout/activity_download_wizard.xml b/app-common/src/main/res/layout/activity_download_wizard.xml deleted file mode 100644 index 605eca2..0000000 --- a/app-common/src/main/res/layout/activity_download_wizard.xml +++ /dev/null @@ -1,65 +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 a2373a3..05ea4c5 100644 --- a/app-common/src/main/res/values/strings.xml +++ b/app-common/src/main/res/values/strings.xml @@ -58,10 +58,6 @@ This download may fail This download may fail due to low remaining capacity. - Download Wizard - Back - Next - New nickname Are you sure you want to delete the profile %s? This operation is irreversible. @@ -101,9 +97,6 @@ Save Logs at %s - You are %d steps away from being a developer. - You are now a developer! - Settings Notifications eSIM profile operations send notifications to the carrier. Fine-tune this behavior as needed here. @@ -120,11 +113,6 @@ Enable verbose logs, which may contain sensitive information. Only share your logs with someone you trust after turning this on. Logs View recent debug logs of the application - Developer Options - Experimental Download Wizard - Enable the experimental new download wizard. Note that it is not fully working yet. - Do not check SM-DP+ TLS certificate - Do not check SM-DP+ TLS certificate, allow any RSP Info App Version Source Code diff --git a/app-common/src/main/res/xml/pref_settings.xml b/app-common/src/main/res/xml/pref_settings.xml index d43c84b..53395ed 100644 --- a/app-common/src/main/res/xml/pref_settings.xml +++ b/app-common/src/main/res/xml/pref_settings.xml @@ -41,26 +41,6 @@ app:iconSpaceReserved="false" app:title="@string/pref_advanced_logs" app:summary="@string/pref_advanced_logs_desc" /> - - - - - - - - - , - private val ignoreTLSCertificate: Flow -) : HttpInterface { +class HttpInterfaceImpl(private val verboseLoggingFlow: Flow) : HttpInterface { companion object { private const val TAG = "HttpInterfaceImpl" } @@ -40,6 +36,9 @@ class HttpInterfaceImpl( } try { + val sslContext = SSLContext.getInstance("TLS") + sslContext.init(null, trustManagers, SecureRandom()) + val conn = parsedUrl.openConnection() as HttpsURLConnection conn.connectTimeout = 2000 @@ -48,7 +47,7 @@ class HttpInterfaceImpl( conn.readTimeout = 1000 } - conn.sslSocketFactory = getSocketFactory() + conn.sslSocketFactory = sslContext.socketFactory conn.requestMethod = "POST" conn.doInput = true conn.doOutput = true @@ -80,18 +79,6 @@ class HttpInterfaceImpl( } } - private fun getSocketFactory(): SSLSocketFactory { - val trustManagers = - if (runBlocking { ignoreTLSCertificate.first() }) { - arrayOf(IgnoreTLSCertificate()) - } else { - this.trustManagers - } - val sslContext = SSLContext.getInstance("TLS") - sslContext.init(null, trustManagers, SecureRandom()) - return sslContext.socketFactory - } - override fun usePublicKeyIds(pkids: Array) { val trustManagerFactory = TrustManagerFactory.getInstance("PKIX").apply { init(keyIdToKeystore(pkids)) diff --git a/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/IgnoreTLSCertificate.kt b/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/IgnoreTLSCertificate.kt deleted file mode 100644 index 7b13282..0000000 --- a/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/IgnoreTLSCertificate.kt +++ /dev/null @@ -1,22 +0,0 @@ -package net.typeblog.lpac_jni.impl - -import android.annotation.SuppressLint -import java.security.cert.X509Certificate -import javax.net.ssl.X509TrustManager - -@SuppressLint("CustomX509TrustManager") -class IgnoreTLSCertificate : X509TrustManager { - @SuppressLint("TrustAllX509TrustManager") - override fun checkClientTrusted(p0: Array?, p1: String?) { - return - } - - @SuppressLint("TrustAllX509TrustManager") - override fun checkServerTrusted(p0: Array?, p1: String?) { - return - } - - override fun getAcceptedIssuers(): Array { - return emptyArray() - } -} \ No newline at end of file