@@ -8,16 +8,26 @@ package org.microg.gms.ui
88import android.annotation.SuppressLint
99import android.os.Bundle
1010import android.text.format.DateUtils
11+ import androidx.core.content.ContextCompat
1112import androidx.lifecycle.lifecycleScope
12- import androidx.preference.*
13+ import androidx.preference.Preference
14+ import androidx.preference.PreferenceCategory
15+ import androidx.preference.PreferenceFragmentCompat
16+ import androidx.preference.SwitchPreferenceCompat
17+ import androidx.preference.isEmpty
1318import com.google.android.gms.R
1419import org.microg.gms.safetynet.SafetyNetDatabase
15- import org.microg.gms.safetynet.SafetyNetRequestType.*
20+ import org.microg.gms.safetynet.SafetyNetRequestType.ATTESTATION
21+ import org.microg.gms.safetynet.SafetyNetRequestType.RECAPTCHA
22+ import org.microg.gms.safetynet.SafetyNetRequestType.RECAPTCHA_ENTERPRISE
23+ import org.microg.gms.vending.PlayIntegrityData
24+ import org.microg.gms.vending.VendingPreferences
1625
1726class SafetyNetAppFragment : PreferenceFragmentCompat () {
1827 private lateinit var appHeadingPreference: AppHeadingPreference
1928 private lateinit var recents: PreferenceCategory
2029 private lateinit var recentsNone: Preference
30+ private lateinit var allowRequests: SwitchPreferenceCompat
2131 private val packageName: String?
2232 get() = arguments?.getString(" package" )
2333
@@ -30,13 +40,28 @@ class SafetyNetAppFragment : PreferenceFragmentCompat() {
3040 appHeadingPreference = preferenceScreen.findPreference(" pref_safetynet_app_heading" ) ? : appHeadingPreference
3141 recents = preferenceScreen.findPreference(" prefcat_safetynet_recent_list" ) ? : recents
3242 recentsNone = preferenceScreen.findPreference(" pref_safetynet_recent_none" ) ? : recentsNone
43+ allowRequests = preferenceScreen.findPreference(" pref_device_attestation_app_allow_requests" ) ? : allowRequests
44+ allowRequests.setOnPreferenceChangeListener { _, newValue ->
45+ val playIntegrityDataSet = loadPlayIntegrityData()
46+ val integrityData = packageName?.let { packageName -> playIntegrityDataSet.find { packageName == it.packageName } }
47+ if (newValue is Boolean && integrityData != null ) {
48+ val content = PlayIntegrityData .updateDataSetString(playIntegrityDataSet, integrityData.apply { this .allowed = newValue })
49+ VendingPreferences .setPlayIntegrityAppList(requireContext(), content)
50+ }
51+ true
52+ }
3353 }
3454
3555 override fun onResume () {
3656 super .onResume()
3757 updateContent()
3858 }
3959
60+ private fun loadPlayIntegrityData (): Set <PlayIntegrityData > {
61+ val playIntegrityData = VendingPreferences .getPlayIntegrityAppList(requireContext())
62+ return PlayIntegrityData .loadDataSet(playIntegrityData)
63+ }
64+
4065 fun updateContent () {
4166 lifecycleScope.launchWhenResumed {
4267 appHeadingPreference.packageName = packageName
@@ -52,7 +77,6 @@ class SafetyNetAppFragment : PreferenceFragmentCompat() {
5277 }.orEmpty()
5378 recents.removeAll()
5479 recents.addPreference(recentsNone)
55- recentsNone.isVisible = summaries.isEmpty()
5680 for (summary in summaries) {
5781 val preference = Preference (requireContext())
5882 preference.onPreferenceClickListener = Preference .OnPreferenceClickListener {
@@ -84,6 +108,23 @@ class SafetyNetAppFragment : PreferenceFragmentCompat() {
84108 }
85109 recents.addPreference(preference)
86110 }
111+ val piContent = packageName?.let { packageName -> loadPlayIntegrityData().find { packageName == it.packageName } }
112+ if (piContent != null ) {
113+ val preference = Preference (requireContext())
114+ val date = DateUtils .getRelativeDateTimeString(
115+ context,
116+ piContent.lastTime,
117+ DateUtils .MINUTE_IN_MILLIS ,
118+ DateUtils .WEEK_IN_MILLIS ,
119+ DateUtils .FORMAT_SHOW_TIME
120+ )
121+ preference.title = date
122+ preference.summary = piContent.lastResult
123+ preference.icon = if (piContent.lastStatus) ContextCompat .getDrawable(context, R .drawable.ic_circle_check) else ContextCompat .getDrawable(context, R .drawable.ic_circle_warn)
124+ recents.addPreference(preference)
125+ }
126+ recentsNone.isVisible = summaries.isEmpty() && piContent == null
127+ allowRequests.isChecked = piContent?.allowed == true
87128 }
88129
89130 }
0 commit comments