From dbd4fdf2f37a1850596fa8418d543ecadeaf2ae2 Mon Sep 17 00:00:00 2001 From: septs Date: Sun, 8 Dec 2024 16:11:42 +0800 Subject: [PATCH] feat: copy ara-m sha-1 in settings --- .../openeuicc/di/DefaultUiComponentFactory.kt | 4 ++ .../angry/openeuicc/di/UiComponentFactory.kt | 2 + .../im/angry/openeuicc/ui/SettingsActivity.kt | 7 ++- .../im/angry/openeuicc/ui/SettingsFragment.kt | 9 ++-- .../di/UnprivilegedUiComponentFactory.kt | 5 ++ .../ui/UnprivilegedSettingsFragment.kt | 50 +++++++++++++++++++ app-unpriv/src/main/res/values/strings.xml | 6 +++ .../res/xml/pref_unprivileged_settings.xml | 9 ++++ 8 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedSettingsFragment.kt create mode 100644 app-unpriv/src/main/res/xml/pref_unprivileged_settings.xml 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 a080017..52a501a 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,12 +1,16 @@ package im.angry.openeuicc.di import androidx.fragment.app.Fragment +import androidx.preference.PreferenceFragmentCompat import im.angry.openeuicc.ui.EuiccManagementFragment import im.angry.openeuicc.ui.NoEuiccPlaceholderFragment +import im.angry.openeuicc.ui.SettingsFragment open class DefaultUiComponentFactory : UiComponentFactory { override fun createEuiccManagementFragment(slotId: Int, portId: Int): EuiccManagementFragment = EuiccManagementFragment.newInstance(slotId, portId) override fun createNoEuiccPlaceholderFragment(): Fragment = NoEuiccPlaceholderFragment() + + override fun createSettingsFragment(): Fragment = SettingsFragment() } \ 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 eef662c..2c3c72b 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,9 +1,11 @@ package im.angry.openeuicc.di import androidx.fragment.app.Fragment +import androidx.preference.PreferenceFragmentCompat import im.angry.openeuicc.ui.EuiccManagementFragment interface UiComponentFactory { fun createEuiccManagementFragment(slotId: Int, portId: Int): EuiccManagementFragment fun createNoEuiccPlaceholderFragment(): Fragment + fun createSettingsFragment(): Fragment } \ No newline at end of file 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 52e3272..bb299a3 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 @@ -4,10 +4,14 @@ import android.os.Bundle import android.view.MenuItem import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity +import im.angry.openeuicc.OpenEuiccApplication import im.angry.openeuicc.common.R import im.angry.openeuicc.util.* class SettingsActivity: AppCompatActivity() { + private val appContainer + get() = (application as OpenEuiccApplication).appContainer + override fun onCreate(savedInstanceState: Bundle?) { enableEdgeToEdge() super.onCreate(savedInstanceState) @@ -15,8 +19,9 @@ class SettingsActivity: AppCompatActivity() { setSupportActionBar(requireViewById(R.id.toolbar)) setupToolbarInsets() supportActionBar!!.setDisplayHomeAsUpEnabled(true) + val settingsFragment = appContainer.uiComponentFactory.createSettingsFragment() supportFragmentManager.beginTransaction() - .replace(R.id.settings_container, SettingsFragment()) + .replace(R.id.settings_container, settingsFragment) .commit() } 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 f10f134..99a4f45 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 @@ -1,5 +1,6 @@ package im.angry.openeuicc.ui +import android.content.Context import android.content.Intent import android.net.Uri import android.os.Build @@ -20,7 +21,7 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking -class SettingsFragment: PreferenceFragmentCompat() { +open class SettingsFragment: PreferenceFragmentCompat() { private lateinit var developerPref: PreferenceCategory // Hidden developer options switch @@ -35,9 +36,9 @@ class SettingsFragment: PreferenceFragmentCompat() { // Show / hide developer preference based on whether it is enabled lifecycleScope.launch { - preferenceRepository.developerOptionsEnabledFlow.onEach { - developerPref.isVisible = it - }.collect() + preferenceRepository.developerOptionsEnabledFlow + .onEach { developerPref.isVisible = it } + .collect() } findPreference("pref_info_app_version")?.apply { 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 index 50e5581..06c489c 100644 --- a/app-unpriv/src/main/java/im/angry/openeuicc/di/UnprivilegedUiComponentFactory.kt +++ b/app-unpriv/src/main/java/im/angry/openeuicc/di/UnprivilegedUiComponentFactory.kt @@ -2,8 +2,10 @@ package im.angry.openeuicc.di import androidx.fragment.app.Fragment import im.angry.openeuicc.ui.EuiccManagementFragment +import im.angry.openeuicc.ui.SettingsFragment import im.angry.openeuicc.ui.UnprivilegedEuiccManagementFragment import im.angry.openeuicc.ui.UnprivilegedNoEuiccPlaceholderFragment +import im.angry.openeuicc.ui.UnprivilegedSettingsFragment class UnprivilegedUiComponentFactory : DefaultUiComponentFactory() { override fun createEuiccManagementFragment(slotId: Int, portId: Int): EuiccManagementFragment = @@ -11,4 +13,7 @@ class UnprivilegedUiComponentFactory : DefaultUiComponentFactory() { override fun createNoEuiccPlaceholderFragment(): Fragment = UnprivilegedNoEuiccPlaceholderFragment() + + override fun createSettingsFragment(): Fragment = + UnprivilegedSettingsFragment() } \ No newline at end of file diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedSettingsFragment.kt b/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedSettingsFragment.kt new file mode 100644 index 0000000..1319ece --- /dev/null +++ b/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedSettingsFragment.kt @@ -0,0 +1,50 @@ +package im.angry.openeuicc.ui + +import android.content.ClipData +import android.content.ClipboardManager +import android.content.pm.PackageManager +import android.os.Bundle +import android.widget.Toast +import androidx.preference.Preference +import androidx.preference.PreferenceCategory +import im.angry.easyeuicc.R +import im.angry.openeuicc.util.encodeHex +import java.security.MessageDigest + +class UnprivilegedSettingsFragment : SettingsFragment() { + private val firstSigner by lazy { + val packageInfo = requireContext().let { + it.packageManager.getPackageInfo( + it.packageName, + PackageManager.GET_SIGNING_CERTIFICATES, + ) + } + packageInfo.signingInfo!!.apkContentsSigners.first().let { + MessageDigest.getInstance("SHA-1") + .apply { update(it.toByteArray()) } + .digest() + } + } + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + super.onCreatePreferences(savedInstanceState, rootKey) + addPreferencesFromResource(R.xml.pref_unprivileged_settings) + findPreference("pref_developer_ara_m")?.apply { + bindCategory(this, "pref_developer") + isVisible = true + summary = firstSigner.encodeHex() + setOnPreferenceClickListener { + requireContext().getSystemService(ClipboardManager::class.java)!! + .setPrimaryClip(ClipData.newPlainText("ara-m", summary)) + Toast.makeText(requireContext(), R.string.toast_ara_m_copied, Toast.LENGTH_SHORT) + .show() + true + } + } + } + + private fun bindCategory(preference: Preference, key: String) { + preference.parent!!.removePreference(preference) + findPreference(key)!!.addPreference(preference) + } +} \ No newline at end of file diff --git a/app-unpriv/src/main/res/values/strings.xml b/app-unpriv/src/main/res/values/strings.xml index a754848..a147b58 100644 --- a/app-unpriv/src/main/res/values/strings.xml +++ b/app-unpriv/src/main/res/values/strings.xml @@ -4,6 +4,12 @@ Compatibility Check Open SIM Toolkit + + ARA-M SHA-1 + + + ARA-M SHA-1 copied to clipboard + System Features Whether your device has all the required features for managing removable eUICC cards. For example, basic telephony and OMAPI support. diff --git a/app-unpriv/src/main/res/xml/pref_unprivileged_settings.xml b/app-unpriv/src/main/res/xml/pref_unprivileged_settings.xml new file mode 100644 index 0000000..0c9876c --- /dev/null +++ b/app-unpriv/src/main/res/xml/pref_unprivileged_settings.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file -- 2.45.3