mirror of
https://github.com/TeamVanced/VancedMicroG
synced 2025-01-08 10:35:48 +01:00
Remove getDefaultSharedPreferences calls
This commit is contained in:
parent
e32c3332e1
commit
c86b9ab7c5
@ -75,6 +75,9 @@ import static android.view.View.INVISIBLE;
|
|||||||
import static android.view.View.VISIBLE;
|
import static android.view.View.VISIBLE;
|
||||||
import static android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT;
|
import static android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT;
|
||||||
import static org.microg.gms.auth.AuthPrefs.isAuthVisible;
|
import static org.microg.gms.auth.AuthPrefs.isAuthVisible;
|
||||||
|
import static org.microg.gms.checkin.CheckinPrefs.hideLauncherIcon;
|
||||||
|
import static org.microg.gms.checkin.CheckinPrefs.isSpoofingEnabled;
|
||||||
|
import static org.microg.gms.checkin.CheckinPrefs.setSpoofingEnabled;
|
||||||
import static org.microg.gms.common.Constants.GMS_PACKAGE_NAME;
|
import static org.microg.gms.common.Constants.GMS_PACKAGE_NAME;
|
||||||
import static org.microg.gms.common.Constants.GMS_VERSION_CODE;
|
import static org.microg.gms.common.Constants.GMS_VERSION_CODE;
|
||||||
|
|
||||||
@ -163,16 +166,17 @@ public class LoginActivity extends AssistantActivity {
|
|||||||
state++;
|
state++;
|
||||||
if (state == 1) {
|
if (state == 1) {
|
||||||
if (SDK_INT >= Build.VERSION_CODES.M) {
|
if (SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("pref_hide_launcher_icon", false).apply();
|
hideLauncherIcon(this, false);
|
||||||
UtilsKt.hideIcon(this, false);
|
UtilsKt.hideIcon(this, false);
|
||||||
}
|
}
|
||||||
PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean(HuaweiButtonPreference, true).apply();
|
if (!isSpoofingEnabled(this)) {
|
||||||
if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(LoginButtonPreference, true)) {
|
|
||||||
LastCheckinInfo.clear(this);
|
LastCheckinInfo.clear(this);
|
||||||
CheckinClient.brandSpoof = true;
|
setSpoofingEnabled(this, true);
|
||||||
PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean(LoginButtonPreference, true).apply();
|
|
||||||
}
|
}
|
||||||
init();
|
init();
|
||||||
|
} else if (state == -1) {
|
||||||
|
setResult(RESULT_CANCELED);
|
||||||
|
finish();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,11 +185,9 @@ public class LoginActivity extends AssistantActivity {
|
|||||||
super.onNextButtonClicked();
|
super.onNextButtonClicked();
|
||||||
state++;
|
state++;
|
||||||
if (state == 1) {
|
if (state == 1) {
|
||||||
PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean(LoginButtonPreference, true).apply();
|
if (isSpoofingEnabled(this)) {
|
||||||
if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(HuaweiButtonPreference, true)) {
|
|
||||||
LastCheckinInfo.clear(this);
|
LastCheckinInfo.clear(this);
|
||||||
CheckinClient.brandSpoof = false;
|
setSpoofingEnabled(this, false);
|
||||||
PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean(HuaweiButtonPreference, true).apply();
|
|
||||||
}
|
}
|
||||||
init();
|
init();
|
||||||
} else if (state == -1) {
|
} else if (state == -1) {
|
||||||
|
@ -45,7 +45,6 @@ public class CheckinClient {
|
|||||||
private static final List<String> TODO_LIST_STRING = new ArrayList<>(); // TODO
|
private static final List<String> TODO_LIST_STRING = new ArrayList<>(); // TODO
|
||||||
private static final List<CheckinRequest.Checkin.Statistic> TODO_LIST_CHECKIN = new ArrayList<CheckinRequest.Checkin.Statistic>(); // TODO
|
private static final List<CheckinRequest.Checkin.Statistic> TODO_LIST_CHECKIN = new ArrayList<CheckinRequest.Checkin.Statistic>(); // TODO
|
||||||
private static final String SERVICE_URL = "https://android.clients.google.com/checkin";
|
private static final String SERVICE_URL = "https://android.clients.google.com/checkin";
|
||||||
public static boolean brandSpoof = false;
|
|
||||||
|
|
||||||
public static CheckinResponse request(CheckinRequest request) throws IOException {
|
public static CheckinResponse request(CheckinRequest request) throws IOException {
|
||||||
HttpURLConnection connection = (HttpURLConnection) new URL(SERVICE_URL).openConnection();
|
HttpURLConnection connection = (HttpURLConnection) new URL(SERVICE_URL).openConnection();
|
||||||
@ -79,7 +78,7 @@ public class CheckinClient {
|
|||||||
public static CheckinRequest makeRequest(Build build, DeviceConfiguration deviceConfiguration,
|
public static CheckinRequest makeRequest(Build build, DeviceConfiguration deviceConfiguration,
|
||||||
DeviceIdentifier deviceIdent, PhoneInfo phoneInfo,
|
DeviceIdentifier deviceIdent, PhoneInfo phoneInfo,
|
||||||
LastCheckinInfo checkinInfo, Locale locale,
|
LastCheckinInfo checkinInfo, Locale locale,
|
||||||
List<Account> accounts) {
|
List<Account> accounts, Boolean brandSpoof) {
|
||||||
CheckinRequest.Builder builder = new CheckinRequest.Builder()
|
CheckinRequest.Builder builder = new CheckinRequest.Builder()
|
||||||
.accountCookie(new ArrayList<>())
|
.accountCookie(new ArrayList<>())
|
||||||
.androidId(checkinInfo.getAndroidId())
|
.androidId(checkinInfo.getAndroidId())
|
||||||
|
@ -32,6 +32,8 @@ import java.io.IOException;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.microg.gms.checkin.CheckinPrefs.isSpoofingEnabled;
|
||||||
|
|
||||||
public class CheckinManager {
|
public class CheckinManager {
|
||||||
private static final String TAG = "GmsCheckinManager";
|
private static final String TAG = "GmsCheckinManager";
|
||||||
private static final long MIN_CHECKIN_INTERVAL = 3 * 60 * 60 * 1000; // 3 hours
|
private static final long MIN_CHECKIN_INTERVAL = 3 * 60 * 60 * 1000; // 3 hours
|
||||||
@ -58,7 +60,8 @@ public class CheckinManager {
|
|||||||
}
|
}
|
||||||
CheckinRequest request = CheckinClient.makeRequest(Utils.getBuild(context),
|
CheckinRequest request = CheckinClient.makeRequest(Utils.getBuild(context),
|
||||||
new DeviceConfiguration(context), Utils.getDeviceIdentifier(context),
|
new DeviceConfiguration(context), Utils.getDeviceIdentifier(context),
|
||||||
Utils.getPhoneInfo(context), info, Utils.getLocale(context), accounts);
|
Utils.getPhoneInfo(context), info, Utils.getLocale(context), accounts,
|
||||||
|
isSpoofingEnabled(context));
|
||||||
return handleResponse(context, CheckinClient.request(request));
|
return handleResponse(context, CheckinClient.request(request));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ package org.microg.gms.checkin
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import org.microg.mgms.settings.SettingsContract
|
import org.microg.mgms.settings.SettingsContract
|
||||||
import org.microg.mgms.settings.SettingsContract.CheckIn
|
import org.microg.mgms.settings.SettingsContract.CheckIn
|
||||||
|
import org.microg.mgms.settings.SettingsContract.setSettings
|
||||||
|
|
||||||
object CheckinPrefs {
|
object CheckinPrefs {
|
||||||
|
|
||||||
@ -18,4 +19,26 @@ object CheckinPrefs {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun isSpoofingEnabled(context: Context): Boolean {
|
||||||
|
val projection = arrayOf(CheckIn.BRAND_SPOOF)
|
||||||
|
return SettingsContract.getSettings(context, CheckIn.CONTENT_URI, projection) { c ->
|
||||||
|
c.getInt(0) != 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun setSpoofingEnabled(context: Context, enabled: Boolean) {
|
||||||
|
setSettings(context, CheckIn.CONTENT_URI) {
|
||||||
|
put(CheckIn.BRAND_SPOOF, enabled)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun hideLauncherIcon(context: Context, enabled: Boolean) {
|
||||||
|
setSettings(context, CheckIn.CONTENT_URI) {
|
||||||
|
put(CheckIn.HIDE_LAUNCHER_ICON, enabled)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,6 @@ import android.content.ComponentName
|
|||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import androidx.preference.Preference
|
import androidx.preference.Preference
|
||||||
@ -23,6 +22,7 @@ import org.microg.gms.gcm.McsConstants.ACTION_RECONNECT
|
|||||||
import org.microg.gms.gcm.McsService
|
import org.microg.gms.gcm.McsService
|
||||||
import org.microg.gms.gcm.TriggerReceiver
|
import org.microg.gms.gcm.TriggerReceiver
|
||||||
import org.microg.gms.gcm.getGcmServiceInfo
|
import org.microg.gms.gcm.getGcmServiceInfo
|
||||||
|
import org.microg.mgms.settings.SettingsContract
|
||||||
import org.microg.tools.ui.ResourceSettingsFragment
|
import org.microg.tools.ui.ResourceSettingsFragment
|
||||||
|
|
||||||
class SettingsFragment : ResourceSettingsFragment() {
|
class SettingsFragment : ResourceSettingsFragment() {
|
||||||
@ -57,7 +57,7 @@ class SettingsFragment : ResourceSettingsFragment() {
|
|||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
findPreference<SwitchPreferenceCompat>(PREF_CAST_HIDE_LAUNCHER_ICON)?.apply {
|
findPreference<SwitchPreferenceCompat>(SettingsContract.CheckIn.HIDE_LAUNCHER_ICON)?.apply {
|
||||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
|
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
|
||||||
setOnPreferenceChangeListener { _, newValue ->
|
setOnPreferenceChangeListener { _, newValue ->
|
||||||
requireActivity().hideIcon(newValue as Boolean)
|
requireActivity().hideIcon(newValue as Boolean)
|
||||||
@ -101,8 +101,6 @@ class SettingsFragment : ResourceSettingsFragment() {
|
|||||||
const val PREF_GCM = "pref_gcm"
|
const val PREF_GCM = "pref_gcm"
|
||||||
const val PREF_CHECKIN = "pref_checkin"
|
const val PREF_CHECKIN = "pref_checkin"
|
||||||
const val PREF_CAST_DOUBLE_FIX_ENABLED = "pref_cast_double_fix_enabled"
|
const val PREF_CAST_DOUBLE_FIX_ENABLED = "pref_cast_double_fix_enabled"
|
||||||
const val PREF_CAST_HIDE_LAUNCHER_ICON = "pref_hide_launcher_icon"
|
|
||||||
const val BRAND_SPOOF_FIX_ENABLED = "brand_spoof_fix_enabled"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
@ -23,6 +23,10 @@ object SettingsContract {
|
|||||||
const val VERSION_INFO = "versionInfo"
|
const val VERSION_INFO = "versionInfo"
|
||||||
const val DEVICE_DATA_VERSION_INFO = "deviceDataVersionInfo"
|
const val DEVICE_DATA_VERSION_INFO = "deviceDataVersionInfo"
|
||||||
|
|
||||||
|
const val BRAND_SPOOF = "brandSpoof"
|
||||||
|
|
||||||
|
const val HIDE_LAUNCHER_ICON = "hideLauncherIcon"
|
||||||
|
|
||||||
val PROJECTION = arrayOf(
|
val PROJECTION = arrayOf(
|
||||||
ENABLED,
|
ENABLED,
|
||||||
ANDROID_ID,
|
ANDROID_ID,
|
||||||
@ -31,6 +35,8 @@ object SettingsContract {
|
|||||||
SECURITY_TOKEN,
|
SECURITY_TOKEN,
|
||||||
VERSION_INFO,
|
VERSION_INFO,
|
||||||
DEVICE_DATA_VERSION_INFO,
|
DEVICE_DATA_VERSION_INFO,
|
||||||
|
BRAND_SPOOF,
|
||||||
|
HIDE_LAUNCHER_ICON,
|
||||||
)
|
)
|
||||||
const val PREFERENCES_NAME = "checkin"
|
const val PREFERENCES_NAME = "checkin"
|
||||||
const val INITIAL_DIGEST = "1-929a0dca0eee55513280171a8585da7dcd3700f8"
|
const val INITIAL_DIGEST = "1-929a0dca0eee55513280171a8585da7dcd3700f8"
|
||||||
|
@ -85,6 +85,8 @@ class SettingsProvider : ContentProvider() {
|
|||||||
CheckIn.SECURITY_TOKEN -> checkInPrefs.getLong(key, 0)
|
CheckIn.SECURITY_TOKEN -> checkInPrefs.getLong(key, 0)
|
||||||
CheckIn.VERSION_INFO -> checkInPrefs.getString(key, "") ?: ""
|
CheckIn.VERSION_INFO -> checkInPrefs.getString(key, "") ?: ""
|
||||||
CheckIn.DEVICE_DATA_VERSION_INFO -> checkInPrefs.getString(key, "") ?: ""
|
CheckIn.DEVICE_DATA_VERSION_INFO -> checkInPrefs.getString(key, "") ?: ""
|
||||||
|
CheckIn.BRAND_SPOOF -> getSettingsBoolean(key, false)
|
||||||
|
CheckIn.HIDE_LAUNCHER_ICON -> getSettingsBoolean(key, false)
|
||||||
else -> throw IllegalArgumentException()
|
else -> throw IllegalArgumentException()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -104,6 +106,14 @@ class SettingsProvider : ContentProvider() {
|
|||||||
// special case: not saved in checkInPrefs
|
// special case: not saved in checkInPrefs
|
||||||
updateCheckInEnabled(value as Boolean)
|
updateCheckInEnabled(value as Boolean)
|
||||||
}
|
}
|
||||||
|
if (key == CheckIn.BRAND_SPOOF) {
|
||||||
|
// special case: not saved in checkInPrefs
|
||||||
|
updateSpoofingEnabled(value as Boolean)
|
||||||
|
}
|
||||||
|
if (key == CheckIn.HIDE_LAUNCHER_ICON) {
|
||||||
|
// special case: not saved in checkInPrefs
|
||||||
|
updateHideLauncherIcon(value as Boolean)
|
||||||
|
}
|
||||||
when (key) {
|
when (key) {
|
||||||
CheckIn.ANDROID_ID -> editor.putLong(key, value as Long)
|
CheckIn.ANDROID_ID -> editor.putLong(key, value as Long)
|
||||||
CheckIn.DIGEST -> editor.putString(key, value as String?)
|
CheckIn.DIGEST -> editor.putString(key, value as String?)
|
||||||
@ -122,6 +132,18 @@ class SettingsProvider : ContentProvider() {
|
|||||||
.apply()
|
.apply()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun updateSpoofingEnabled(enabled: Boolean) {
|
||||||
|
preferences.edit()
|
||||||
|
.putBoolean(CheckIn.BRAND_SPOOF, enabled)
|
||||||
|
.apply()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateHideLauncherIcon(enabled: Boolean) {
|
||||||
|
preferences.edit()
|
||||||
|
.putBoolean(CheckIn.HIDE_LAUNCHER_ICON, enabled)
|
||||||
|
.apply()
|
||||||
|
}
|
||||||
|
|
||||||
private fun queryGcm(p: Array<out String>): Cursor = MatrixCursor(p).addRow(p) { key ->
|
private fun queryGcm(p: Array<out String>): Cursor = MatrixCursor(p).addRow(p) { key ->
|
||||||
when (key) {
|
when (key) {
|
||||||
Gcm.ENABLE_GCM -> getSettingsBoolean(key, true)
|
Gcm.ENABLE_GCM -> getSettingsBoolean(key, true)
|
||||||
|
@ -102,7 +102,7 @@ Tato akce může trvat několik minut."</string>
|
|||||||
|
|
||||||
<string name="pref_about_title">O aplikaci Vanced microG</string>
|
<string name="pref_about_title">O aplikaci Vanced microG</string>
|
||||||
<string name="pref_cast_double_fix">Opravit duplicity ve Vysílání</string>
|
<string name="pref_cast_double_fix">Opravit duplicity ve Vysílání</string>
|
||||||
<string name="pref_hide_launcher_icon">Skrýt ikonu ze spouštěče</string>
|
<string name="hideLauncherIcon">Skrýt ikonu ze spouštěče</string>
|
||||||
|
|
||||||
<string name="brand_spoof_button">Huawei</string>
|
<string name="brand_spoof_button">Huawei</string>
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ Esto puede tardar unos minutos."</string>
|
|||||||
|
|
||||||
<string name="pref_about_title">Acerca de Vanced microG</string>
|
<string name="pref_about_title">Acerca de Vanced microG</string>
|
||||||
<string name="pref_cast_double_fix">Solucion para Cast duplicado</string>
|
<string name="pref_cast_double_fix">Solucion para Cast duplicado</string>
|
||||||
<string name="pref_hide_launcher_icon">Ocultar microG del lanzador</string>
|
<string name="hideLauncherIcon">Ocultar microG del lanzador</string>
|
||||||
|
|
||||||
<string name="brand_spoof_button">Huawei</string>
|
<string name="brand_spoof_button">Huawei</string>
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ Ini bisa berlangsung beberapa menit."</string>
|
|||||||
|
|
||||||
<string name="pref_about_title">Tentang Vanced microG</string>
|
<string name="pref_about_title">Tentang Vanced microG</string>
|
||||||
<string name="pref_cast_double_fix">Perbaikan Cast terduplikasi</string>
|
<string name="pref_cast_double_fix">Perbaikan Cast terduplikasi</string>
|
||||||
<string name="pref_hide_launcher_icon">Sembunyikan microG dari peluncur</string>
|
<string name="hideLauncherIcon">Sembunyikan microG dari peluncur</string>
|
||||||
|
|
||||||
<string name="pref_switcher_title">Registrasi perangkat</string>
|
<string name="pref_switcher_title">Registrasi perangkat</string>
|
||||||
<string name="pref_checkin_enable_summary">Registrasi perangkat anda ke layanan Google dan buat pengenal perangkat unik. Vanced microG strips mengenal bits selain dari akun Google anda dari data registrasi.</string>
|
<string name="pref_checkin_enable_summary">Registrasi perangkat anda ke layanan Google dan buat pengenal perangkat unik. Vanced microG strips mengenal bits selain dari akun Google anda dari data registrasi.</string>
|
||||||
|
@ -102,7 +102,7 @@ Questo potrà richiedere un paio di minuti"</string>
|
|||||||
|
|
||||||
<string name="pref_about_title">Informazioni su Vanced microG</string>
|
<string name="pref_about_title">Informazioni su Vanced microG</string>
|
||||||
<string name="pref_cast_double_fix">Correzione cast duplicato</string>
|
<string name="pref_cast_double_fix">Correzione cast duplicato</string>
|
||||||
<string name="pref_hide_launcher_icon">Nascondi microG dal launcher</string>
|
<string name="hideLauncherIcon">Nascondi microG dal launcher</string>
|
||||||
|
|
||||||
<string name="pref_switcher_title">Registra dispositivo</string>
|
<string name="pref_switcher_title">Registra dispositivo</string>
|
||||||
<string name="pref_checkin_enable_summary">Registra il tuo dispositivo sui servizi Google e crea un identificatore univoco del dispositivo. Verranno rimossi dai Servizi Vanced microG alcuni bit utili per identificare i dati di registrazione, oltre al nome dell\'account Google.</string>
|
<string name="pref_checkin_enable_summary">Registra il tuo dispositivo sui servizi Google e crea un identificatore univoco del dispositivo. Verranno rimossi dai Servizi Vanced microG alcuni bit utili per identificare i dati di registrazione, oltre al nome dell\'account Google.</string>
|
||||||
|
@ -102,7 +102,7 @@
|
|||||||
|
|
||||||
<string name="pref_about_title">О Vanced microG</string>
|
<string name="pref_about_title">О Vanced microG</string>
|
||||||
<string name="pref_cast_double_fix">Исправление двух кнопок трансляции</string>
|
<string name="pref_cast_double_fix">Исправление двух кнопок трансляции</string>
|
||||||
<string name="pref_hide_launcher_icon">скрыть микрог из лаунчера</string>
|
<string name="hideLauncherIcon">скрыть микрог из лаунчера</string>
|
||||||
|
|
||||||
<string name="brand_spoof_button">Huawei</string>
|
<string name="brand_spoof_button">Huawei</string>
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ This can take a couple of minutes."</string>
|
|||||||
|
|
||||||
<string name="pref_about_title">About Vanced microG</string>
|
<string name="pref_about_title">About Vanced microG</string>
|
||||||
<string name="pref_cast_double_fix">Cast duplication fix</string>
|
<string name="pref_cast_double_fix">Cast duplication fix</string>
|
||||||
<string name="pref_hide_launcher_icon">Hide icon from launcher</string>
|
<string name="hideLauncherIcon">Hide icon from launcher</string>
|
||||||
|
|
||||||
<string name="brand_spoof_button">Huawei</string>
|
<string name="brand_spoof_button">Huawei</string>
|
||||||
|
|
||||||
|
@ -49,8 +49,8 @@
|
|||||||
android:summary="@string/pref_cast_double_fix_summary"
|
android:summary="@string/pref_cast_double_fix_summary"
|
||||||
android:defaultValue="false"/>
|
android:defaultValue="false"/>
|
||||||
<SwitchPreferenceCompat
|
<SwitchPreferenceCompat
|
||||||
android:key="pref_hide_launcher_icon"
|
android:key="hideLauncherIcon"
|
||||||
android:title="@string/pref_hide_launcher_icon"
|
android:title="@string/hideLauncherIcon"
|
||||||
android:icon="@drawable/ic_baseline_hide_source_24"
|
android:icon="@drawable/ic_baseline_hide_source_24"
|
||||||
android:defaultValue="true"/>
|
android:defaultValue="true"/>
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
Loading…
Reference in New Issue
Block a user