Twidere-App-Android-Twitter.../twidere/src/main/kotlin/org/mariotaku/twidere/preference/RandomizeAccountNamePrefere...

102 lines
3.9 KiB
Kotlin

package org.mariotaku.twidere.preference
import android.accounts.AccountManager
import android.content.Context
import android.content.res.TypedArray
import androidx.collection.ArraySet
import androidx.preference.DialogPreference
import androidx.preference.PreferenceDialogFragmentCompat
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceViewHolder
import androidx.appcompat.widget.SwitchCompat
import android.util.AttributeSet
import org.mariotaku.ktextension.Bundle
import org.mariotaku.ktextension.set
import org.mariotaku.twidere.R
import org.mariotaku.twidere.extension.model.getAccountKey
import org.mariotaku.twidere.extension.model.getAccountUser
import org.mariotaku.twidere.extension.model.renameTwidereAccount
import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.preference.iface.IDialogPreference
import org.mariotaku.twidere.util.generateAccountName
import java.util.*
/**
* Created by mariotaku on 2016/12/16.
*/
class RandomizeAccountNamePreference @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = R.attr.switchPreferenceCompatStyle,
defStyleRes: Int = 0
) : DialogPreference(context, attrs, defStyleAttr, defStyleRes), IDialogPreference {
init {
dialogTitle = title
dialogMessage = context.getString(R.string.preference_randomize_account_rename_accounts_confirm)
positiveButtonText = context.getString(android.R.string.ok)
negativeButtonText = context.getString(android.R.string.cancel)
}
override fun onBindViewHolder(holder: PreferenceViewHolder) {
super.onBindViewHolder(holder)
val switchView = holder.findViewById(androidx.preference.R.id.switchWidget) as SwitchCompat
switchView.isChecked = getPersistedBoolean(false)
}
override fun onGetDefaultValue(a: TypedArray, index: Int): Any {
return a.getBoolean(index, false)
}
override fun onClick() {
persistBoolean(!getPersistedBoolean(false))
notifyChanged()
super.onClick()
}
override fun displayDialog(fragment: PreferenceFragmentCompat) {
val df = RenameAccountsConfirmDialogFragment.newInstance(key, getPersistedBoolean(false))
df.setTargetFragment(fragment, 0)
fragment.parentFragmentManager.let { df.show(it, key) }
}
class RenameAccountsConfirmDialogFragment : PreferenceDialogFragmentCompat() {
override fun onDialogClosed(positiveResult: Boolean) {
val am = AccountManager.get(context)
val enabled = arguments?.getBoolean(ARG_VALUE) ?: false
if (enabled) {
val usedNames = ArraySet<String>()
AccountUtils.getAccounts(am).forEach { oldAccount ->
var newName: String
do {
newName = UUID.randomUUID().toString()
} while (usedNames.contains(newName))
am.renameTwidereAccount(oldAccount, newName)
usedNames.add(newName)
}
} else {
AccountUtils.getAccounts(am).forEach { oldAccount ->
val accountKey = oldAccount.getAccountKey(am)
val accountUser = oldAccount.getAccountUser(am)
val newName = generateAccountName(accountUser.screen_name, accountKey.host)
am.renameTwidereAccount(oldAccount, newName)
}
}
}
companion object {
const val ARG_VALUE = "value"
fun newInstance(key: String, value: Boolean): RenameAccountsConfirmDialogFragment {
val df = RenameAccountsConfirmDialogFragment()
df.arguments = Bundle {
this[ARG_KEY] = key
this[ARG_VALUE] = value
}
return df
}
}
}
}