bug fixes and improvements

This commit is contained in:
X1nto 2020-08-06 11:46:07 +04:00
parent e9695caf76
commit b5026a7758
12 changed files with 137 additions and 119 deletions

View File

@ -18,6 +18,11 @@ jobs:
with: with:
java-version: 1.8 java-version: 1.8
- name: Write firebase config to file
run: echo $FIREBASE_CONFIG > app/google-services.json
env:
FIREBASE_CONFIG: ${{ secrets.FIREBASE_CONFIG }}
- name: Grant rights - name: Grant rights
run: chmod +x ./gradlew run: chmod +x ./gradlew

View File

@ -45,7 +45,7 @@ class MicrogDownloadService: Service() {
.build() .build()
.setOnProgressListener { progress -> .setOnProgressListener { progress ->
val mProgress = progress.currentBytes * 100 / progress.totalBytes val mProgress = progress.currentBytes * 100 / progress.totalBytes
localBroadcastManager.sendBroadcast(Intent(HomeFragment.MICROG_DOWNLOADING).putExtra("progress", mProgress).putExtra("file", getFileNameFromUrl(url))) localBroadcastManager.sendBroadcast(Intent(HomeFragment.MICROG_DOWNLOADING).putExtra("progress", mProgress.toInt()).putExtra("file", getFileNameFromUrl(url)))
} }
.start(object : OnDownloadListener { .start(object : OnDownloadListener {
override fun onDownloadComplete() { override fun onDownloadComplete() {

View File

@ -71,7 +71,7 @@ class VancedDownloadService: Service() {
.build() .build()
.setOnProgressListener { progress -> .setOnProgressListener { progress ->
val mProgress = progress.currentBytes * 100 / progress.totalBytes val mProgress = progress.currentBytes * 100 / progress.totalBytes
localBroadcastManager.sendBroadcast(Intent(HomeFragment.VANCED_DOWNLOADING).putExtra("progress", mProgress).putExtra("file", getFileNameFromUrl(url))) localBroadcastManager.sendBroadcast(Intent(HomeFragment.VANCED_DOWNLOADING).putExtra("progress", mProgress.toInt()).putExtra("file", getFileNameFromUrl(url)))
} }
.start(object : OnDownloadListener { .start(object : OnDownloadListener {
override fun onDownloadComplete() { override fun onDownloadComplete() {

View File

@ -1,15 +1,11 @@
package com.vanced.manager.ui package com.vanced.manager.ui
import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.MenuItem import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil import androidx.databinding.DataBindingUtil
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.navigation.NavDestination import androidx.navigation.NavDestination
import androidx.navigation.findNavController import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.AppBarConfiguration
@ -17,6 +13,7 @@ import androidx.navigation.ui.setupWithNavController
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.crowdin.platform.Crowdin import com.crowdin.platform.Crowdin
import com.crowdin.platform.LoadingStateListener import com.crowdin.platform.LoadingStateListener
import com.google.firebase.messaging.FirebaseMessaging
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.databinding.ActivityMainBinding import com.vanced.manager.databinding.ActivityMainBinding
import com.vanced.manager.ui.dialogs.DialogContainer import com.vanced.manager.ui.dialogs.DialogContainer
@ -32,14 +29,6 @@ class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding private lateinit var binding: ActivityMainBinding
private val navHost by lazy { findNavController(R.id.bottom_nav_host) } private val navHost by lazy { findNavController(R.id.bottom_nav_host) }
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(this) }
private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
}
}
}
private val loadingObserver = object : LoadingStateListener { private val loadingObserver = object : LoadingStateListener {
val tag = "VMLocalisation" val tag = "VMLocalisation"
@ -69,46 +58,45 @@ class MainActivity : AppCompatActivity() {
setDisplayHomeAsUpEnabled(currFrag.id != R.id.home_fragment) setDisplayHomeAsUpEnabled(currFrag.id != R.id.home_fragment)
} }
Crowdin.registerDataLoadingObserver(loadingObserver)
initDialogs() initDialogs()
} }
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
localBroadcastManager.unregisterReceiver(broadcastReceiver)
Crowdin.unregisterDataLoadingObserver(loadingObserver) Crowdin.unregisterDataLoadingObserver(loadingObserver)
} }
override fun onResume() { override fun onResume() {
setFinalTheme(this) setFinalTheme(this)
super.onResume() super.onResume()
registerReceivers() Crowdin.registerDataLoadingObserver(loadingObserver)
} }
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (!isInstallationRunning(this)) { if (isInstallationRunning(this))
when (item.itemId) { return false
android.R.id.home -> {
onBackPressed() when (item.itemId) {
return true android.R.id.home -> {
} onBackPressed()
R.id.toolbar_about -> { return true
navHost.navigate(R.id.toAboutFragment)
return true
}
R.id.toolbar_settings -> {
navHost.navigate(R.id.action_settingsFragment)
return true
}
R.id.dev_settings -> {
navHost.navigate(R.id.toDevSettingsFragment)
return true
}
else -> super.onOptionsItemSelected(item)
} }
R.id.toolbar_about -> {
navHost.navigate(R.id.toAboutFragment)
return true
}
R.id.toolbar_settings -> {
navHost.navigate(R.id.action_settingsFragment)
return true
}
R.id.dev_settings -> {
navHost.navigate(R.id.toDevSettingsFragment)
return true
}
else -> super.onOptionsItemSelected(item)
} }
return false return false
} }
@ -120,25 +108,19 @@ class MainActivity : AppCompatActivity() {
super.attachBaseContext(Crowdin.wrapContext(newBase)) super.attachBaseContext(Crowdin.wrapContext(newBase))
} }
private fun registerReceivers() {
val intentFilter = IntentFilter()
localBroadcastManager.registerReceiver(broadcastReceiver, intentFilter)
}
fun restartActivity() {
startActivity(Intent(this@MainActivity, MainActivity::class.java))
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
finish()
}
private fun initDialogs() { private fun initDialogs() {
val prefs = PreferenceManager.getDefaultSharedPreferences(this) val prefs = PreferenceManager.getDefaultSharedPreferences(this)
val variant = prefs.getString("vanced_variant", "nonroot") val variant = prefs.getString("vanced_variant", "nonroot")
val showRootDialog = prefs.getBoolean("show_root_dialog", true) val showRootDialog = prefs.getBoolean("show_root_dialog", true)
when { when {
prefs.getBoolean("firstStart", true) -> DialogContainer.showSecurityDialog(this) prefs.getBoolean("firstStart", true) -> {
DialogContainer.showSecurityDialog(this)
with(FirebaseMessaging.getInstance()) {
subscribeToTopic("Vanced-Update")
subscribeToTopic("MicroG-Update")
}
}
!prefs.getBoolean("statement", true) -> DialogContainer.statementFalse(this) !prefs.getBoolean("statement", true) -> DialogContainer.statementFalse(this)
variant == "root" -> { variant == "root" -> {
if (showRootDialog) if (showRootDialog)
@ -170,6 +152,4 @@ class MainActivity : AppCompatActivity() {
} }
} }
companion object {
}
} }

View File

@ -17,13 +17,17 @@ object DialogContainer {
MaterialAlertDialogBuilder(context) MaterialAlertDialogBuilder(context)
.setTitle(context.resources.getString(R.string.welcome)) .setTitle(context.resources.getString(R.string.welcome))
.setMessage(context.resources.getString(R.string.security_context)) .setMessage(context.resources.getString(R.string.security_context))
.setCancelable(false)
.setPositiveButton(context.resources.getString(R.string.close)) { dialog, _ -> .setPositiveButton(context.resources.getString(R.string.close)) { dialog, _ ->
run { dialog.dismiss()
dialog.dismiss() }
if (MiuiHelper.isMiui()) { .setOnDismissListener {
showMiuiDialog(context) if (MiuiHelper.isMiui()) {
} showMiuiDialog(context)
}
}
.setOnCancelListener {
if (MiuiHelper.isMiui()) {
showMiuiDialog(context)
} }
} }
.create() .create()
@ -57,6 +61,7 @@ object DialogContainer {
openUrl("https://lmgtfy.com/?q=andnixsh+apk+verification+disable", R.color.Twitter, activity) openUrl("https://lmgtfy.com/?q=andnixsh+apk+verification+disable", R.color.Twitter, activity)
} }
.setOnDismissListener { PreferenceManager.getDefaultSharedPreferences(activity).edit().putBoolean("show_root_dialog", false).apply() } .setOnDismissListener { PreferenceManager.getDefaultSharedPreferences(activity).edit().putBoolean("show_root_dialog", false).apply() }
.setOnCancelListener { PreferenceManager.getDefaultSharedPreferences(activity).edit().putBoolean("show_root_dialog", false).apply() }
.create() .create()
.show() .show()
} }

View File

@ -3,10 +3,9 @@ package com.vanced.manager.ui.fragments
import android.os.Bundle import android.os.Bundle
import android.view.Menu import android.view.Menu
import android.view.MenuInflater import android.view.MenuInflater
import androidx.preference.ListPreference import android.widget.Toast
import androidx.preference.Preference import androidx.preference.*
import androidx.preference.PreferenceFragmentCompat import com.google.firebase.messaging.FirebaseMessaging
import androidx.preference.PreferenceManager
import com.vanced.manager.R import com.vanced.manager.R
class SettingsFragment : PreferenceFragmentCompat() { class SettingsFragment : PreferenceFragmentCompat() {
@ -17,57 +16,79 @@ class SettingsFragment : PreferenceFragmentCompat() {
activity?.title = getString(R.string.title_settings) activity?.title = getString(R.string.title_settings)
setHasOptionsMenu(true) setHasOptionsMenu(true)
val updateCheck: Preference? = findPreference("update_check") findPreference<Preference>("update_check")?.setOnPreferenceClickListener {
updateCheck?.setOnPreferenceClickListener { UpdateCheckFragment().show(childFragmentManager.beginTransaction(), "Update Center")
val fm = childFragmentManager.beginTransaction()
val updateDialog = UpdateCheckFragment()
updateDialog.show(fm, "Update Center")
true
}
val themeSwitch: ListPreference? = findPreference("theme_mode")
val themePref = preferenceScreen.sharedPreferences.getString("theme_mode", "Follow System")
themeSwitch?.summary =
when (themePref) {
"Light" -> getString(R.string.theme_light)
"Dark" -> getString(R.string.theme_dark)
"Follow System" -> getString(R.string.theme_follow)
else -> ""
}
themeSwitch?.setOnPreferenceChangeListener { _, _ ->
activity?.recreate()
true true
} }
val accentSwitch: ListPreference? = findPreference("accent_color") findPreference<SwitchPreference>("vanced_notifs")?.apply {
val accentPref = preferenceScreen.sharedPreferences.getString("accent_color", "Blue") title = getString(R.string.push_notifications, "Vanced")
accentSwitch?.summary = summary = getString(R.string.push_notifications_summary, "Vanced")
when (accentPref) { setOnPreferenceChangeListener { _, newValue ->
"Blue" -> getString(R.string.accent_blue) when (newValue) {
"Red" -> getString(R.string.accent_red) true -> FirebaseMessaging.getInstance().subscribeToTopic("Vanced-Update")
"Green" -> getString(R.string.accent_green) false -> FirebaseMessaging.getInstance().unsubscribeFromTopic("Vanced-Update")
"Yellow" -> getString(R.string.accent_yellow) }
"Purple" -> getString(R.string.accent_purple) true
else -> "" }
}
findPreference<SwitchPreference>("microg_notifs")?.apply {
title = getString(R.string.push_notifications, "microG")
summary = getString(R.string.push_notifications_summary, "microG")
setOnPreferenceChangeListener { _, newValue ->
when (newValue) {
true -> FirebaseMessaging.getInstance().subscribeToTopic("MicroG-Update")
false -> FirebaseMessaging.getInstance().unsubscribeFromTopic("MicroG-Update")
}
Toast.makeText(requireActivity(), "Set value to $newValue", Toast.LENGTH_SHORT).show()
true
}
}
val themePref = preferenceScreen.sharedPreferences.getString("theme_mode", "Follow System")
findPreference<ListPreference>("theme_mode")?.apply {
summary = when (themePref) {
"Light" -> getString(R.string.theme_light)
"Dark" -> getString(R.string.theme_dark)
else -> getString(R.string.theme_follow)
}
setOnPreferenceChangeListener { _, newValue ->
if (themePref != newValue) {
requireActivity().recreate()
return@setOnPreferenceChangeListener true
}
false
}
}
val accentPref = preferenceScreen.sharedPreferences.getString("accent_color", "Blue")
findPreference<ListPreference>("accent_color")?.apply {
summary = when (accentPref) {
"Blue" -> getString(R.string.accent_blue)
"Red" -> getString(R.string.accent_red)
"Green" -> getString(R.string.accent_green)
"Yellow" -> getString(R.string.accent_yellow)
else -> getString(R.string.accent_purple)
}
setOnPreferenceChangeListener { _, newValue ->
if (accentPref != newValue) {
requireActivity().recreate()
return@setOnPreferenceChangeListener true
}
false
} }
accentSwitch?.setOnPreferenceChangeListener { _, _ ->
activity?.recreate()
true
} }
val chosenPrefs: Preference? = findPreference("vanced_chosen_modes") val chosenPrefs: Preference? = findPreference("vanced_chosen_modes")
chosenPrefs?.setOnPreferenceClickListener { chosenPrefs?.setOnPreferenceClickListener {
val fm = childFragmentManager.beginTransaction() ChosenPreferenceDialogFragment().show(childFragmentManager.beginTransaction(), "Chosen Preferences")
val chosenPrefsDialog = ChosenPreferenceDialogFragment()
chosenPrefsDialog.show(fm, "Chosen Preferences")
true true
} }
val installUrl: Preference? = findPreference("install_url") val installUrl: Preference? = findPreference("install_url")
installUrl?.setOnPreferenceClickListener { installUrl?.setOnPreferenceClickListener {
val fm = childFragmentManager.beginTransaction() URLChangeFragment().show(childFragmentManager.beginTransaction(), "Install URL")
val chosenPrefsDialog = URLChangeFragment()
chosenPrefsDialog.show(fm, "Install URL")
true true
} }

View File

@ -48,7 +48,10 @@ class VancedLanguageSelectionFragment : Fragment() {
chosenLangs.add(lang) chosenLangs.add(lang)
} }
} }
activity?.getSharedPreferences("installPrefs", Context.MODE_PRIVATE)?.edit()?.putString("lang", chosenLangs.joinToString())?.apply() activity?.getSharedPreferences("installPrefs", Context.MODE_PRIVATE)?.edit()?.apply {
putString("lang", chosenLangs.joinToString())?.apply()
putBoolean("valuesModified", true)
}
activity?.startService(Intent(activity, VancedDownloadService::class.java)) activity?.startService(Intent(activity, VancedDownloadService::class.java))
view.findNavController().navigate(R.id.action_installTo_homeFragment) view.findNavController().navigate(R.id.action_installTo_homeFragment)
} }

View File

@ -25,7 +25,7 @@
android:background="?colorSurface" android:background="?colorSurface"
android:layout_alignParentTop="true"> android:layout_alignParentTop="true">
<androidx.appcompat.widget.Toolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/home_toolbar" android:id="@+id/home_toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"

View File

@ -6,7 +6,7 @@
<item name="colorPrimary">#1490D7</item> <item name="colorPrimary">#1490D7</item>
<item name="colorPrimaryVariant">#2C7EB9</item> <item name="colorPrimaryVariant">#2C7EB9</item>
<item name="colorSecondary">#3E78AF</item> <item name="colorSecondary">#3E78AF</item>
<item name="colorSecondaryVariant">#803E78AF</item> <item name="colorSecondaryVariant">?colorPrimary</item>
<item name="colorSurface">#ffffff</item> <item name="colorSurface">#ffffff</item>
<item name="colorSurfaceVariant">#F3F3F3</item> <item name="colorSurfaceVariant">#F3F3F3</item>
<item name="colorSurfaceSurfaceVariant">?colorSurface</item> <item name="colorSurfaceSurfaceVariant">?colorSurface</item>

View File

@ -33,7 +33,7 @@
<string name="latest">Latest:</string> <string name="latest">Latest:</string>
<string name="successfully_installed">Successfully installed %1$s</string> <string name="successfully_installed">Successfully installed %1$s</string>
<string name="network_error">Network connection unavailable</string> <string name="network_error">Network connection unavailable</string>
<string name="no_microg">No MicroG!</string> <string name="no_microg">microG isn\'t installed</string>
<string name="root_not_granted">Root access not granted</string> <string name="root_not_granted">Root access not granted</string>
<string name="unavailable">Unavailable</string> <string name="unavailable">Unavailable</string>
<string name="update">Update</string> <string name="update">Update</string>
@ -63,8 +63,8 @@
<string name="theme_dark">Dark Theme</string> <string name="theme_dark">Dark Theme</string>
<string name="theme_light">Light Theme</string> <string name="theme_light">Light Theme</string>
<string name="update_url">Update Channel URL</string> <string name="update_url">Update Channel URL</string>
<string name="push_notifications">Push Notifications</string> <string name="push_notifications">%1$s Push Notifications</string>
<string name="push_notifications_summary">Receive push notifications when an update is released</string> <string name="push_notifications_summary">Receive push notifications when an update for %1$s is released</string>
<string name="re_check">Re-check</string> <string name="re_check">Re-check</string>
<string name="update_center">Manager Update Center</string> <string name="update_center">Manager Update Center</string>
<string name="update_found">Update found!</string> <string name="update_found">Update found!</string>

View File

@ -8,7 +8,7 @@
<item name="colorPrimary">#1490D7</item> <item name="colorPrimary">#1490D7</item>
<item name="colorPrimaryVariant">#2C7EB9</item> <item name="colorPrimaryVariant">#2C7EB9</item>
<item name="colorSecondary">#3E78AF</item> <item name="colorSecondary">#3E78AF</item>
<item name="colorSecondaryVariant">#803E78AF</item> <item name="colorSecondaryVariant">?colorPrimary</item>
<item name="colorSurface">#ffffff</item> <item name="colorSurface">#ffffff</item>
<item name="colorSurfaceVariant">#F3F3F3</item> <item name="colorSurfaceVariant">#F3F3F3</item>
<item name="colorSurfaceSurfaceVariant">?colorSurface</item> <item name="colorSurfaceSurfaceVariant">?colorSurface</item>
@ -40,7 +40,7 @@
<item name="colorPrimary">#D71414</item> <item name="colorPrimary">#D71414</item>
<item name="colorPrimaryVariant">#B92C2C</item> <item name="colorPrimaryVariant">#B92C2C</item>
<item name="colorSecondary">#AF3E3E</item> <item name="colorSecondary">#AF3E3E</item>
<item name="colorSecondaryVariant">#80AF3E3E</item> <item name="colorSecondaryVariant">?colorPrimary</item>
</style> </style>
@ -49,7 +49,7 @@
<item name="colorPrimary">#3ED714</item> <item name="colorPrimary">#3ED714</item>
<item name="colorPrimaryVariant">#2CB943</item> <item name="colorPrimaryVariant">#2CB943</item>
<item name="colorSecondary">#3EAF51</item> <item name="colorSecondary">#3EAF51</item>
<item name="colorSecondaryVariant">#803EAF44</item> <item name="colorSecondaryVariant">?colorPrimary</item>
</style> </style>
@ -58,7 +58,7 @@
<item name="colorPrimary">#ffd500</item> <item name="colorPrimary">#ffd500</item>
<item name="colorPrimaryVariant">#A6FFD500</item> <item name="colorPrimaryVariant">#A6FFD500</item>
<item name="colorSecondary">#D3B418</item> <item name="colorSecondary">#D3B418</item>
<item name="colorSecondaryVariant">#B7D3B418</item> <item name="colorSecondaryVariant">?colorPrimary</item>
</style> </style>
@ -67,7 +67,7 @@
<item name="colorPrimary">#6D49B7</item> <item name="colorPrimary">#6D49B7</item>
<item name="colorPrimaryVariant">#563C8D</item> <item name="colorPrimaryVariant">#563C8D</item>
<item name="colorSecondary">#734BC7</item> <item name="colorSecondary">#734BC7</item>
<item name="colorSecondaryVariant">#9A734BC7</item> <item name="colorSecondaryVariant">?colorPrimary</item>
</style> </style>
@ -78,7 +78,7 @@
<item name="colorPrimary">#1490D7</item> <item name="colorPrimary">#1490D7</item>
<item name="colorPrimaryVariant">#2C7EB9</item> <item name="colorPrimaryVariant">#2C7EB9</item>
<item name="colorSecondary">#3E78AF</item> <item name="colorSecondary">#3E78AF</item>
<item name="colorSecondaryVariant">#803E78AF</item> <item name="colorSecondaryVariant">?colorPrimary</item>
<item name="colorSurface">#000000</item> <item name="colorSurface">#000000</item>
<item name="colorSurfaceVariant">#111111</item> <item name="colorSurfaceVariant">#111111</item>
<item name="colorSurfaceSurfaceVariant">?colorSurface</item> <item name="colorSurfaceSurfaceVariant">?colorSurface</item>
@ -111,7 +111,7 @@
<item name="colorPrimary">#D71414</item> <item name="colorPrimary">#D71414</item>
<item name="colorPrimaryVariant">#B92C2C</item> <item name="colorPrimaryVariant">#B92C2C</item>
<item name="colorSecondary">#AF3E3E</item> <item name="colorSecondary">#AF3E3E</item>
<item name="colorSecondaryVariant">#80AF3E3E</item> <item name="colorSecondaryVariant">?colorPrimary</item>
</style> </style>
@ -120,7 +120,7 @@
<item name="colorPrimary">#3ED714</item> <item name="colorPrimary">#3ED714</item>
<item name="colorPrimaryVariant">#2CB943</item> <item name="colorPrimaryVariant">#2CB943</item>
<item name="colorSecondary">#3EAF51</item> <item name="colorSecondary">#3EAF51</item>
<item name="colorSecondaryVariant">#803EAF44</item> <item name="colorSecondaryVariant">?colorPrimary</item>
</style> </style>
@ -129,7 +129,7 @@
<item name="colorPrimary">#ffd500</item> <item name="colorPrimary">#ffd500</item>
<item name="colorPrimaryVariant">#A6FFD500</item> <item name="colorPrimaryVariant">#A6FFD500</item>
<item name="colorSecondary">#D3B418</item> <item name="colorSecondary">#D3B418</item>
<item name="colorSecondaryVariant">#B7D3B418</item> <item name="colorSecondaryVariant">?colorPrimary</item>
</style> </style>
@ -138,7 +138,7 @@
<item name="colorPrimary">#6D49B7</item> <item name="colorPrimary">#6D49B7</item>
<item name="colorPrimaryVariant">#563C8D</item> <item name="colorPrimaryVariant">#563C8D</item>
<item name="colorSecondary">#734BC7</item> <item name="colorSecondary">#734BC7</item>
<item name="colorSecondaryVariant">#9A734BC7</item> <item name="colorSecondaryVariant">?colorPrimary</item>
</style> </style>

View File

@ -21,9 +21,13 @@
android:summaryOff="@string/link_external_browser" /> android:summaryOff="@string/link_external_browser" />
<SwitchPreference <SwitchPreference
android:title="@string/push_notifications" android:key="vanced_notifs"
android:key="push_notifications_status" android:defaultValue="true"
android:summary="@string/push_notifications_summary" android:icon="@drawable/ic_notifications_black_24dp"/>
<SwitchPreference
android:key="microg_notifs"
android:defaultValue="true"
android:icon="@drawable/ic_notifications_black_24dp"/> android:icon="@drawable/ic_notifications_black_24dp"/>
</PreferenceCategory> </PreferenceCategory>