ソースを参照

feat: copy ara-m sha-1 in settings

septs 1 年間 前
コミット
23022b14be

+ 4 - 0
app-common/src/main/java/im/angry/openeuicc/di/DefaultUiComponentFactory.kt

@@ -1,12 +1,16 @@
 package im.angry.openeuicc.di
 package im.angry.openeuicc.di
 
 
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.Fragment
+import androidx.preference.PreferenceFragmentCompat
 import im.angry.openeuicc.ui.EuiccManagementFragment
 import im.angry.openeuicc.ui.EuiccManagementFragment
 import im.angry.openeuicc.ui.NoEuiccPlaceholderFragment
 import im.angry.openeuicc.ui.NoEuiccPlaceholderFragment
+import im.angry.openeuicc.ui.SettingsFragment
 
 
 open class DefaultUiComponentFactory : UiComponentFactory {
 open class DefaultUiComponentFactory : UiComponentFactory {
     override fun createEuiccManagementFragment(slotId: Int, portId: Int): EuiccManagementFragment =
     override fun createEuiccManagementFragment(slotId: Int, portId: Int): EuiccManagementFragment =
         EuiccManagementFragment.newInstance(slotId, portId)
         EuiccManagementFragment.newInstance(slotId, portId)
 
 
     override fun createNoEuiccPlaceholderFragment(): Fragment = NoEuiccPlaceholderFragment()
     override fun createNoEuiccPlaceholderFragment(): Fragment = NoEuiccPlaceholderFragment()
+
+    override fun createSettingsFragment(): Fragment = SettingsFragment()
 }
 }

+ 2 - 0
app-common/src/main/java/im/angry/openeuicc/di/UiComponentFactory.kt

@@ -1,9 +1,11 @@
 package im.angry.openeuicc.di
 package im.angry.openeuicc.di
 
 
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.Fragment
+import androidx.preference.PreferenceFragmentCompat
 import im.angry.openeuicc.ui.EuiccManagementFragment
 import im.angry.openeuicc.ui.EuiccManagementFragment
 
 
 interface UiComponentFactory {
 interface UiComponentFactory {
     fun createEuiccManagementFragment(slotId: Int, portId: Int): EuiccManagementFragment
     fun createEuiccManagementFragment(slotId: Int, portId: Int): EuiccManagementFragment
     fun createNoEuiccPlaceholderFragment(): Fragment
     fun createNoEuiccPlaceholderFragment(): Fragment
+    fun createSettingsFragment(): Fragment
 }
 }

+ 6 - 1
app-common/src/main/java/im/angry/openeuicc/ui/SettingsActivity.kt

@@ -4,10 +4,14 @@ import android.os.Bundle
 import android.view.MenuItem
 import android.view.MenuItem
 import androidx.activity.enableEdgeToEdge
 import androidx.activity.enableEdgeToEdge
 import androidx.appcompat.app.AppCompatActivity
 import androidx.appcompat.app.AppCompatActivity
+import im.angry.openeuicc.OpenEuiccApplication
 import im.angry.openeuicc.common.R
 import im.angry.openeuicc.common.R
 import im.angry.openeuicc.util.*
 import im.angry.openeuicc.util.*
 
 
 class SettingsActivity: AppCompatActivity() {
 class SettingsActivity: AppCompatActivity() {
+    private val appContainer
+        get() = (application as OpenEuiccApplication).appContainer
+
     override fun onCreate(savedInstanceState: Bundle?) {
     override fun onCreate(savedInstanceState: Bundle?) {
         enableEdgeToEdge()
         enableEdgeToEdge()
         super.onCreate(savedInstanceState)
         super.onCreate(savedInstanceState)
@@ -15,8 +19,9 @@ class SettingsActivity: AppCompatActivity() {
         setSupportActionBar(requireViewById(R.id.toolbar))
         setSupportActionBar(requireViewById(R.id.toolbar))
         setupToolbarInsets()
         setupToolbarInsets()
         supportActionBar!!.setDisplayHomeAsUpEnabled(true)
         supportActionBar!!.setDisplayHomeAsUpEnabled(true)
+        val settingsFragment = appContainer.uiComponentFactory.createSettingsFragment()
         supportFragmentManager.beginTransaction()
         supportFragmentManager.beginTransaction()
-            .replace(R.id.settings_container, SettingsFragment())
+            .replace(R.id.settings_container, settingsFragment)
             .commit()
             .commit()
     }
     }
 
 

+ 5 - 4
app-common/src/main/java/im/angry/openeuicc/ui/SettingsFragment.kt

@@ -1,5 +1,6 @@
 package im.angry.openeuicc.ui
 package im.angry.openeuicc.ui
 
 
+import android.content.Context
 import android.content.Intent
 import android.content.Intent
 import android.net.Uri
 import android.net.Uri
 import android.os.Build
 import android.os.Build
@@ -20,7 +21,7 @@ import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.runBlocking
 
 
-class SettingsFragment: PreferenceFragmentCompat() {
+open class SettingsFragment: PreferenceFragmentCompat() {
     private lateinit var developerPref: PreferenceCategory
     private lateinit var developerPref: PreferenceCategory
 
 
     // Hidden developer options switch
     // Hidden developer options switch
@@ -35,9 +36,9 @@ class SettingsFragment: PreferenceFragmentCompat() {
 
 
         // Show / hide developer preference based on whether it is enabled
         // Show / hide developer preference based on whether it is enabled
         lifecycleScope.launch {
         lifecycleScope.launch {
-            preferenceRepository.developerOptionsEnabledFlow.onEach {
-                developerPref.isVisible = it
-            }.collect()
+            preferenceRepository.developerOptionsEnabledFlow
+                .onEach { developerPref.isVisible = it }
+                .collect()
         }
         }
 
 
         findPreference<Preference>("pref_info_app_version")?.apply {
         findPreference<Preference>("pref_info_app_version")?.apply {

+ 5 - 0
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 androidx.fragment.app.Fragment
 import im.angry.openeuicc.ui.EuiccManagementFragment
 import im.angry.openeuicc.ui.EuiccManagementFragment
+import im.angry.openeuicc.ui.SettingsFragment
 import im.angry.openeuicc.ui.UnprivilegedEuiccManagementFragment
 import im.angry.openeuicc.ui.UnprivilegedEuiccManagementFragment
 import im.angry.openeuicc.ui.UnprivilegedNoEuiccPlaceholderFragment
 import im.angry.openeuicc.ui.UnprivilegedNoEuiccPlaceholderFragment
+import im.angry.openeuicc.ui.UnprivilegedSettingsFragment
 
 
 class UnprivilegedUiComponentFactory : DefaultUiComponentFactory() {
 class UnprivilegedUiComponentFactory : DefaultUiComponentFactory() {
     override fun createEuiccManagementFragment(slotId: Int, portId: Int): EuiccManagementFragment =
     override fun createEuiccManagementFragment(slotId: Int, portId: Int): EuiccManagementFragment =
@@ -11,4 +13,7 @@ class UnprivilegedUiComponentFactory : DefaultUiComponentFactory() {
 
 
     override fun createNoEuiccPlaceholderFragment(): Fragment =
     override fun createNoEuiccPlaceholderFragment(): Fragment =
         UnprivilegedNoEuiccPlaceholderFragment()
         UnprivilegedNoEuiccPlaceholderFragment()
+
+    override fun createSettingsFragment(): Fragment =
+        UnprivilegedSettingsFragment()
 }
 }

+ 50 - 0
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<Preference>("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<PreferenceCategory>(key)!!.addPreference(preference)
+    }
+}

+ 6 - 0
app-unpriv/src/main/res/values/strings.xml

@@ -4,6 +4,12 @@
     <string name="compatibility_check">Compatibility Check</string>
     <string name="compatibility_check">Compatibility Check</string>
     <string name="open_sim_toolkit">Open SIM Toolkit</string>
     <string name="open_sim_toolkit">Open SIM Toolkit</string>
 
 
+    <!-- Settings -->
+    <string name="pref_developer_ara_m" translatable="false">ARA-M SHA-1</string>
+
+    <!-- Toast -->
+    <string name="toast_ara_m_copied">ARA-M SHA-1 copied to clipboard</string>
+
     <!-- Compatibility Check Descriptions -->
     <!-- Compatibility Check Descriptions -->
     <string name="compatibility_check_system_features">System Features</string>
     <string name="compatibility_check_system_features">System Features</string>
     <string name="compatibility_check_system_features_desc">Whether your device has all the required features for managing removable eUICC cards. For example, basic telephony and OMAPI support.</string>
     <string name="compatibility_check_system_features_desc">Whether your device has all the required features for managing removable eUICC cards. For example, basic telephony and OMAPI support.</string>

+ 9 - 0
app-unpriv/src/main/res/xml/pref_unprivileged_settings.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
+    <Preference
+        app:enableCopying="true"
+        app:iconSpaceReserved="false"
+        app:isPreferenceVisible="false"
+        app:key="pref_developer_ara_m"
+        app:title="@string/pref_developer_ara_m" />
+</PreferenceScreen>