2022-05-15 18:38:32 +00:00
|
|
|
package com.lagradost.cloudstream3.ui.settings
|
|
|
|
|
|
|
|
import android.os.Bundle
|
2022-06-04 00:11:32 +00:00
|
|
|
import android.view.View
|
2022-07-21 01:43:23 +00:00
|
|
|
import android.view.View.*
|
|
|
|
import android.view.inputmethod.EditorInfo
|
2022-05-15 18:38:32 +00:00
|
|
|
import android.widget.TextView
|
2022-06-07 16:38:24 +00:00
|
|
|
import androidx.annotation.UiThread
|
2022-05-15 18:38:32 +00:00
|
|
|
import androidx.appcompat.app.AlertDialog
|
2022-06-07 16:38:24 +00:00
|
|
|
import androidx.core.view.isGone
|
|
|
|
import androidx.core.view.isVisible
|
2022-09-17 11:03:41 +00:00
|
|
|
import androidx.fragment.app.FragmentActivity
|
2022-05-15 18:38:32 +00:00
|
|
|
import androidx.preference.PreferenceFragmentCompat
|
2024-03-10 22:15:23 +00:00
|
|
|
import androidx.preference.PreferenceManager
|
2024-03-25 00:03:04 +00:00
|
|
|
import androidx.preference.SwitchPreferenceCompat
|
2022-05-15 18:38:32 +00:00
|
|
|
import androidx.recyclerview.widget.RecyclerView
|
2022-09-17 11:03:41 +00:00
|
|
|
import com.lagradost.cloudstream3.AcraApplication.Companion.openBrowser
|
2024-03-08 00:45:20 +00:00
|
|
|
import com.lagradost.cloudstream3.CommonActivity.onDialogDismissedEvent
|
2022-06-07 16:38:24 +00:00
|
|
|
import com.lagradost.cloudstream3.CommonActivity.showToast
|
2022-05-15 18:38:32 +00:00
|
|
|
import com.lagradost.cloudstream3.R
|
2023-07-14 00:28:49 +00:00
|
|
|
import com.lagradost.cloudstream3.databinding.AccountManagmentBinding
|
|
|
|
import com.lagradost.cloudstream3.databinding.AccountSwitchBinding
|
|
|
|
import com.lagradost.cloudstream3.databinding.AddAccountInputBinding
|
2022-05-15 18:38:32 +00:00
|
|
|
import com.lagradost.cloudstream3.mvvm.logError
|
|
|
|
import com.lagradost.cloudstream3.syncproviders.AccountManager
|
2022-06-07 16:38:24 +00:00
|
|
|
import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.aniListApi
|
|
|
|
import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.malApi
|
|
|
|
import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.openSubtitlesApi
|
2023-08-12 20:25:30 +00:00
|
|
|
import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.simklApi
|
2022-06-07 16:38:24 +00:00
|
|
|
import com.lagradost.cloudstream3.syncproviders.AuthAPI
|
|
|
|
import com.lagradost.cloudstream3.syncproviders.InAppAuthAPI
|
2022-05-15 18:38:32 +00:00
|
|
|
import com.lagradost.cloudstream3.syncproviders.OAuth2API
|
2024-03-17 02:37:09 +00:00
|
|
|
import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
|
2024-03-25 00:03:04 +00:00
|
|
|
import com.lagradost.cloudstream3.ui.settings.Globals.PHONE
|
2024-03-17 02:37:09 +00:00
|
|
|
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
|
|
|
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
2022-05-15 18:38:32 +00:00
|
|
|
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref
|
2022-08-21 20:13:53 +00:00
|
|
|
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom
|
2023-11-02 19:50:49 +00:00
|
|
|
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags
|
2022-06-04 00:11:32 +00:00
|
|
|
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
|
2024-03-08 00:45:20 +00:00
|
|
|
import com.lagradost.cloudstream3.utils.AppUtils.html
|
|
|
|
import com.lagradost.cloudstream3.utils.BackupUtils
|
2024-03-25 00:03:04 +00:00
|
|
|
import com.lagradost.cloudstream3.utils.BiometricAuthenticator
|
|
|
|
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.authCallback
|
|
|
|
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.biometricPrompt
|
|
|
|
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.deviceHasPasswordPinLock
|
|
|
|
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.isAuthEnabled
|
|
|
|
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.promptInfo
|
|
|
|
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.startBiometricAuthentication
|
2022-06-07 16:38:24 +00:00
|
|
|
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
2024-03-08 00:45:20 +00:00
|
|
|
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialogText
|
2022-05-15 18:38:32 +00:00
|
|
|
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
|
|
|
|
import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard
|
|
|
|
import com.lagradost.cloudstream3.utils.UIHelper.setImage
|
|
|
|
|
2024-03-25 00:03:04 +00:00
|
|
|
class SettingsAccount : PreferenceFragmentCompat(), BiometricAuthenticator.BiometricAuthCallback {
|
2022-08-17 16:14:36 +00:00
|
|
|
companion object {
|
|
|
|
/** Used by nginx plugin too */
|
2022-09-17 11:03:41 +00:00
|
|
|
fun showLoginInfo(
|
|
|
|
activity: FragmentActivity?,
|
|
|
|
api: AccountManager,
|
|
|
|
info: AuthAPI.LoginInfo
|
|
|
|
) {
|
2023-07-14 00:28:49 +00:00
|
|
|
if (activity == null) return
|
|
|
|
val binding: AccountManagmentBinding =
|
|
|
|
AccountManagmentBinding.inflate(activity.layoutInflater, null, false)
|
2022-08-17 16:14:36 +00:00
|
|
|
val builder =
|
2023-07-14 00:28:49 +00:00
|
|
|
AlertDialog.Builder(activity, R.style.AlertDialogCustom)
|
|
|
|
.setView(binding.root)
|
2022-08-17 16:14:36 +00:00
|
|
|
val dialog = builder.show()
|
|
|
|
|
2023-07-14 00:28:49 +00:00
|
|
|
binding.accountMainProfilePictureHolder.isVisible =
|
|
|
|
binding.accountMainProfilePicture.setImage(info.profilePicture)
|
2022-08-17 16:14:36 +00:00
|
|
|
|
2023-07-14 00:28:49 +00:00
|
|
|
binding.accountLogout.setOnClickListener {
|
2022-08-17 16:14:36 +00:00
|
|
|
api.logOut()
|
|
|
|
dialog.dismissSafe(activity)
|
|
|
|
}
|
2022-05-15 18:38:32 +00:00
|
|
|
|
2022-08-17 16:14:36 +00:00
|
|
|
(info.name ?: activity.getString(R.string.no_data)).let {
|
|
|
|
dialog.findViewById<TextView>(R.id.account_name)?.text = it
|
|
|
|
}
|
2022-06-07 16:38:24 +00:00
|
|
|
|
2023-07-14 00:28:49 +00:00
|
|
|
binding.accountSite.text = api.name
|
|
|
|
binding.accountSwitchAccount.setOnClickListener {
|
2022-08-17 16:14:36 +00:00
|
|
|
dialog.dismissSafe(activity)
|
|
|
|
showAccountSwitch(activity, api)
|
|
|
|
}
|
2022-09-17 11:03:41 +00:00
|
|
|
|
2024-03-17 02:37:09 +00:00
|
|
|
if (isLayout(TV or EMULATOR)) {
|
2023-07-14 00:28:49 +00:00
|
|
|
binding.accountSwitchAccount.requestFocus()
|
2022-09-17 11:03:41 +00:00
|
|
|
}
|
2022-05-15 18:38:32 +00:00
|
|
|
}
|
|
|
|
|
2023-07-14 00:28:49 +00:00
|
|
|
private fun showAccountSwitch(activity: FragmentActivity, api: AccountManager) {
|
2022-08-17 16:14:36 +00:00
|
|
|
val accounts = api.getAccounts() ?: return
|
2023-07-14 00:28:49 +00:00
|
|
|
val binding: AccountSwitchBinding =
|
|
|
|
AccountSwitchBinding.inflate(activity.layoutInflater, null, false)
|
2022-06-07 16:38:24 +00:00
|
|
|
|
2022-08-17 16:14:36 +00:00
|
|
|
val builder =
|
|
|
|
AlertDialog.Builder(activity, R.style.AlertDialogCustom)
|
2023-07-14 00:28:49 +00:00
|
|
|
.setView(binding.root)
|
2022-08-17 16:14:36 +00:00
|
|
|
val dialog = builder.show()
|
|
|
|
|
2023-07-14 00:28:49 +00:00
|
|
|
binding.accountAdd.setOnClickListener {
|
2022-08-17 16:14:36 +00:00
|
|
|
addAccount(activity, api)
|
|
|
|
dialog?.dismissSafe(activity)
|
|
|
|
}
|
|
|
|
|
|
|
|
val ogIndex = api.accountIndex
|
2022-05-15 18:38:32 +00:00
|
|
|
|
2022-08-17 16:14:36 +00:00
|
|
|
val items = ArrayList<AuthAPI.LoginInfo>()
|
|
|
|
|
|
|
|
for (index in accounts) {
|
|
|
|
api.accountIndex = index
|
|
|
|
val accountInfo = api.loginInfo()
|
|
|
|
if (accountInfo != null) {
|
|
|
|
items.add(accountInfo)
|
2022-06-07 16:38:24 +00:00
|
|
|
}
|
2022-08-17 16:14:36 +00:00
|
|
|
}
|
|
|
|
api.accountIndex = ogIndex
|
2023-07-13 21:18:37 +00:00
|
|
|
val adapter = AccountAdapter(items) {
|
2022-08-17 16:14:36 +00:00
|
|
|
dialog?.dismissSafe(activity)
|
|
|
|
api.changeAccount(it.card.accountIndex)
|
|
|
|
}
|
|
|
|
val list = dialog.findViewById<RecyclerView>(R.id.account_list)
|
|
|
|
list?.adapter = adapter
|
|
|
|
}
|
2022-07-21 01:43:23 +00:00
|
|
|
|
2022-08-17 16:14:36 +00:00
|
|
|
@UiThread
|
2022-09-17 11:03:41 +00:00
|
|
|
fun addAccount(activity: FragmentActivity?, api: AccountManager) {
|
2022-08-17 16:14:36 +00:00
|
|
|
try {
|
|
|
|
when (api) {
|
|
|
|
is OAuth2API -> {
|
2022-09-17 11:03:41 +00:00
|
|
|
api.authenticate(activity)
|
2022-06-07 16:38:24 +00:00
|
|
|
}
|
2023-07-14 00:28:49 +00:00
|
|
|
|
2022-08-17 16:14:36 +00:00
|
|
|
is InAppAuthAPI -> {
|
2023-07-14 00:28:49 +00:00
|
|
|
if (activity == null) return
|
|
|
|
val binding: AddAccountInputBinding =
|
|
|
|
AddAccountInputBinding.inflate(activity.layoutInflater, null, false)
|
2022-08-17 16:14:36 +00:00
|
|
|
val builder =
|
2023-07-14 00:28:49 +00:00
|
|
|
AlertDialog.Builder(activity, R.style.AlertDialogCustom)
|
|
|
|
.setView(binding.root)
|
2022-08-17 16:14:36 +00:00
|
|
|
val dialog = builder.show()
|
|
|
|
|
2023-07-14 00:28:49 +00:00
|
|
|
val visibilityMap = listOf(
|
|
|
|
binding.loginEmailInput to api.requiresEmail,
|
|
|
|
binding.loginPasswordInput to api.requiresPassword,
|
|
|
|
binding.loginServerInput to api.requiresServer,
|
|
|
|
binding.loginUsernameInput to api.requiresUsername
|
2022-08-17 16:14:36 +00:00
|
|
|
)
|
|
|
|
|
2024-03-17 02:37:09 +00:00
|
|
|
if (isLayout(TV or EMULATOR)) {
|
2022-08-17 16:14:36 +00:00
|
|
|
visibilityMap.forEach { (input, isVisible) ->
|
|
|
|
input.isVisible = isVisible
|
|
|
|
|
|
|
|
// Band-aid for weird FireTV behavior causing crashes because keyboard covers the screen
|
|
|
|
input.setOnEditorActionListener { textView, actionId, _ ->
|
|
|
|
if (actionId == EditorInfo.IME_ACTION_NEXT) {
|
|
|
|
val view = textView.focusSearch(FOCUS_DOWN)
|
|
|
|
return@setOnEditorActionListener view?.requestFocus(
|
|
|
|
FOCUS_DOWN
|
|
|
|
) == true
|
|
|
|
}
|
|
|
|
return@setOnEditorActionListener true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
visibilityMap.forEach { (input, isVisible) ->
|
|
|
|
input.isVisible = isVisible
|
|
|
|
}
|
2022-06-07 16:38:24 +00:00
|
|
|
}
|
|
|
|
|
2023-07-14 00:28:49 +00:00
|
|
|
binding.loginEmailInput.isVisible = api.requiresEmail
|
|
|
|
binding.loginPasswordInput.isVisible = api.requiresPassword
|
|
|
|
binding.loginServerInput.isVisible = api.requiresServer
|
|
|
|
binding.loginUsernameInput.isVisible = api.requiresUsername
|
|
|
|
binding.createAccount.isGone = api.createAccountUrl.isNullOrBlank()
|
|
|
|
binding.createAccount.setOnClickListener {
|
2022-09-17 11:03:41 +00:00
|
|
|
openBrowser(
|
|
|
|
api.createAccountUrl ?: return@setOnClickListener,
|
|
|
|
activity
|
|
|
|
)
|
|
|
|
dialog.dismissSafe()
|
2022-08-17 16:14:36 +00:00
|
|
|
}
|
2023-03-18 22:55:58 +00:00
|
|
|
|
|
|
|
val displayedItems = listOf(
|
2023-07-14 00:28:49 +00:00
|
|
|
binding.loginUsernameInput,
|
|
|
|
binding.loginEmailInput,
|
|
|
|
binding.loginServerInput,
|
|
|
|
binding.loginPasswordInput
|
2023-03-18 22:55:58 +00:00
|
|
|
).filter { it.isVisible }
|
|
|
|
|
|
|
|
displayedItems.foldRight(displayedItems.firstOrNull()) { item, previous ->
|
2023-07-14 00:28:49 +00:00
|
|
|
item.id.let { previous?.nextFocusDownId = it }
|
|
|
|
previous?.id?.let { item.nextFocusUpId = it }
|
2023-03-18 22:55:58 +00:00
|
|
|
item
|
|
|
|
}
|
|
|
|
|
|
|
|
displayedItems.firstOrNull()?.let {
|
2023-07-14 00:28:49 +00:00
|
|
|
binding.createAccount.nextFocusDownId = it.id
|
|
|
|
it.nextFocusUpId = binding.createAccount.id
|
2023-03-18 22:55:58 +00:00
|
|
|
}
|
2023-07-14 00:28:49 +00:00
|
|
|
binding.applyBtt.id.let {
|
2023-03-18 22:55:58 +00:00
|
|
|
displayedItems.lastOrNull()?.nextFocusDownId = it
|
|
|
|
}
|
|
|
|
|
2023-07-14 00:28:49 +00:00
|
|
|
binding.text1.text = api.name
|
2022-08-17 16:14:36 +00:00
|
|
|
|
|
|
|
if (api.storesPasswordInPlainText) {
|
|
|
|
api.getLatestLoginData()?.let { data ->
|
2023-07-14 00:28:49 +00:00
|
|
|
binding.loginEmailInput.setText(data.email ?: "")
|
|
|
|
binding.loginServerInput.setText(data.server ?: "")
|
|
|
|
binding.loginUsernameInput.setText(data.username ?: "")
|
|
|
|
binding.loginPasswordInput.setText(data.password ?: "")
|
2022-08-17 16:14:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-07-14 00:28:49 +00:00
|
|
|
binding.applyBtt.setOnClickListener {
|
2022-08-17 16:14:36 +00:00
|
|
|
val loginData = InAppAuthAPI.LoginData(
|
2023-07-14 00:28:49 +00:00
|
|
|
username = if (api.requiresUsername) binding.loginUsernameInput.text?.toString() else null,
|
|
|
|
password = if (api.requiresPassword) binding.loginPasswordInput.text?.toString() else null,
|
|
|
|
email = if (api.requiresEmail) binding.loginEmailInput.text?.toString() else null,
|
|
|
|
server = if (api.requiresServer) binding.loginServerInput.text?.toString() else null,
|
2022-08-17 16:14:36 +00:00
|
|
|
)
|
|
|
|
ioSafe {
|
|
|
|
val isSuccessful = try {
|
|
|
|
api.login(loginData)
|
2022-06-07 16:38:24 +00:00
|
|
|
} catch (e: Exception) {
|
2022-08-17 16:14:36 +00:00
|
|
|
logError(e)
|
|
|
|
false
|
|
|
|
}
|
|
|
|
activity.runOnUiThread {
|
|
|
|
try {
|
|
|
|
showToast(
|
2022-09-17 11:03:41 +00:00
|
|
|
activity.getString(if (isSuccessful) R.string.authenticated_user else R.string.authenticated_user_fail)
|
|
|
|
.format(
|
|
|
|
api.name
|
|
|
|
)
|
2022-08-17 16:14:36 +00:00
|
|
|
)
|
|
|
|
} catch (e: Exception) {
|
|
|
|
logError(e) // format might fail
|
|
|
|
}
|
2022-06-07 16:38:24 +00:00
|
|
|
}
|
|
|
|
}
|
2022-08-17 16:14:36 +00:00
|
|
|
dialog.dismissSafe(activity)
|
|
|
|
}
|
2023-07-14 00:28:49 +00:00
|
|
|
binding.cancelBtt.setOnClickListener {
|
2022-08-17 16:14:36 +00:00
|
|
|
dialog.dismissSafe(activity)
|
2022-06-07 16:38:24 +00:00
|
|
|
}
|
|
|
|
}
|
2023-07-14 00:28:49 +00:00
|
|
|
|
2022-08-17 16:14:36 +00:00
|
|
|
else -> {
|
|
|
|
throw NotImplementedError("You are trying to add an account that has an unknown login method")
|
2022-06-07 16:38:24 +00:00
|
|
|
}
|
|
|
|
}
|
2022-08-17 16:14:36 +00:00
|
|
|
} catch (e: Exception) {
|
|
|
|
logError(e)
|
2022-06-07 16:38:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-25 00:03:04 +00:00
|
|
|
private fun updateAuthPreference(enabled: Boolean) {
|
|
|
|
val biometricKey = getString(R.string.biometric_key)
|
|
|
|
|
|
|
|
PreferenceManager.getDefaultSharedPreferences(context ?: return).edit()
|
|
|
|
.putBoolean(biometricKey, enabled).apply()
|
|
|
|
findPreference<SwitchPreferenceCompat>(biometricKey)?.isChecked = enabled
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onAuthenticationError() {
|
|
|
|
updateAuthPreference(!isAuthEnabled(context ?: return))
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onAuthenticationSuccess() {
|
|
|
|
if (isAuthEnabled(context?: return)) {
|
|
|
|
updateAuthPreference(true)
|
|
|
|
BackupUtils.backup(activity)
|
|
|
|
activity?.showBottomDialogText(
|
|
|
|
getString(R.string.biometric_setting),
|
|
|
|
getString(R.string.biometric_warning).html()
|
|
|
|
) { onDialogDismissedEvent }
|
|
|
|
} else {
|
|
|
|
updateAuthPreference(false)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-08-17 16:14:36 +00:00
|
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
|
|
super.onViewCreated(view, savedInstanceState)
|
|
|
|
setUpToolbar(R.string.category_account)
|
2022-08-21 20:13:53 +00:00
|
|
|
setPaddingBottom()
|
2023-11-02 19:50:49 +00:00
|
|
|
setToolBarScrollFlags()
|
2022-05-15 18:38:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
|
|
|
hideKeyboard()
|
2022-06-09 13:50:55 +00:00
|
|
|
setPreferencesFromResource(R.xml.settings_account, rootKey)
|
2022-05-15 18:38:32 +00:00
|
|
|
|
2024-03-25 00:03:04 +00:00
|
|
|
// hide preference on tvs and emulators
|
|
|
|
getPref(R.string.biometric_key)?.isEnabled = isLayout(PHONE)
|
|
|
|
|
2024-03-08 00:45:20 +00:00
|
|
|
getPref(R.string.biometric_key)?.setOnPreferenceClickListener {
|
2024-03-25 00:03:04 +00:00
|
|
|
val ctx = context ?: return@setOnPreferenceClickListener false
|
|
|
|
|
|
|
|
if (deviceHasPasswordPinLock(ctx)) {
|
|
|
|
startBiometricAuthentication(
|
|
|
|
activity?: return@setOnPreferenceClickListener false,
|
|
|
|
R.string.biometric_authentication_title,
|
|
|
|
false
|
|
|
|
)
|
|
|
|
promptInfo?.let {
|
|
|
|
authCallback = this
|
|
|
|
biometricPrompt?.authenticate(it)
|
|
|
|
}
|
2024-03-10 22:15:23 +00:00
|
|
|
}
|
2024-03-25 00:03:04 +00:00
|
|
|
|
|
|
|
false
|
2024-03-08 00:45:20 +00:00
|
|
|
}
|
|
|
|
|
2022-05-15 18:38:32 +00:00
|
|
|
val syncApis =
|
|
|
|
listOf(
|
2022-06-07 16:38:24 +00:00
|
|
|
R.string.mal_key to malApi,
|
|
|
|
R.string.anilist_key to aniListApi,
|
2023-08-12 20:25:30 +00:00
|
|
|
R.string.simkl_key to simklApi,
|
2022-06-07 16:38:24 +00:00
|
|
|
R.string.opensubtitles_key to openSubtitlesApi,
|
2022-05-15 18:38:32 +00:00
|
|
|
)
|
2022-06-07 16:38:24 +00:00
|
|
|
|
2022-05-15 18:38:32 +00:00
|
|
|
for ((key, api) in syncApis) {
|
|
|
|
getPref(key)?.apply {
|
|
|
|
title =
|
|
|
|
getString(R.string.login_format).format(api.name, getString(R.string.account))
|
2022-06-07 16:38:24 +00:00
|
|
|
setOnPreferenceClickListener {
|
2022-05-15 18:38:32 +00:00
|
|
|
val info = api.loginInfo()
|
|
|
|
if (info != null) {
|
2022-08-17 16:14:36 +00:00
|
|
|
showLoginInfo(activity, api, info)
|
2022-05-15 18:38:32 +00:00
|
|
|
} else {
|
2022-08-17 16:14:36 +00:00
|
|
|
addAccount(activity, api)
|
2022-05-15 18:38:32 +00:00
|
|
|
}
|
|
|
|
return@setOnPreferenceClickListener true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-07-27 17:56:59 +00:00
|
|
|
}
|