WIP: feat: copy ara-m sha-1 in developer options #94
8 changed files with 87 additions and 5 deletions
|
@ -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()
|
||||||
}
|
}
|
|
@ -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
|
||||||
}
|
}
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
preferenceRepository.developerOptionsEnabledFlow
|
||||||
developerPref.isVisible = it
|
.onEach { developerPref.isVisible = it }
|
||||||
}.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
findPreference<Preference>("pref_info_app_version")?.apply {
|
findPreference<Preference>("pref_info_app_version")?.apply {
|
||||||
|
|
|
@ -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()
|
||||||
}
|
}
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
Loading…
Add table
Reference in a new issue