SubwayTooter-Android-App/app/src/main/java/jp/juggler/subwaytooter/dialog/AccountPicker.kt

182 lines
5.2 KiB
Kotlin
Raw Normal View History

package jp.juggler.subwaytooter.dialog
import android.annotation.SuppressLint
import android.app.Dialog
import android.text.Spannable
import android.text.SpannableStringBuilder
import android.text.style.RelativeSizeSpan
import android.view.Gravity
import android.view.View
import android.widget.Button
import android.widget.LinearLayout
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import jp.juggler.subwaytooter.R
import jp.juggler.subwaytooter.table.AcctColor
import jp.juggler.subwaytooter.table.SavedAccount
import jp.juggler.subwaytooter.util.DialogInterfaceCallback
import jp.juggler.subwaytooter.util.SavedAccountCallback
2019-01-19 03:36:40 +01:00
import jp.juggler.util.dismissSafe
import jp.juggler.util.getAdaptiveRippleDrawableRound
2018-12-01 00:02:18 +01:00
import jp.juggler.util.showToast
import org.jetbrains.anko.textColor
2018-12-01 00:02:18 +01:00
import java.util.*
import java.util.concurrent.atomic.AtomicBoolean
object AccountPicker {
2018-01-13 07:15:52 +01:00
@SuppressLint("InflateParams")
fun pick(
2018-01-13 07:15:52 +01:00
activity : AppCompatActivity,
bAllowPseudo : Boolean = false,
bAllowMisskey : Boolean = true,
2020-09-29 19:44:56 +02:00
bAllowMastodon : Boolean = true,
2018-01-13 07:15:52 +01:00
bAuto : Boolean = false,
message : String? = null,
accountListArg : ArrayList<SavedAccount>? = null,
dismiss_callback : DialogInterfaceCallback? = null,
2020-09-29 19:44:56 +02:00
extra_callback : (LinearLayout, Int, Int) -> Unit = { _, _, _ -> },
2018-01-13 07:15:52 +01:00
callback : SavedAccountCallback
) {
2020-09-29 19:44:56 +02:00
var removedMisskey = 0
var removedPseudo = 0
2018-08-23 04:20:10 +02:00
var removeMastodon = 0
val account_list : MutableList<SavedAccount> = accountListArg ?: {
2020-09-29 19:44:56 +02:00
val l = SavedAccount.loadAccountList(activity).filter { a ->
var bOk = true
2018-08-23 04:20:10 +02:00
2020-09-29 19:44:56 +02:00
if(! bAllowMastodon && ! a.isMisskey) {
++ removeMastodon
bOk = false
2018-08-23 04:20:10 +02:00
}
2020-09-29 19:44:56 +02:00
if(! bAllowMisskey && a.isMisskey) {
++ removedMisskey
bOk = false
}
2020-09-29 19:44:56 +02:00
if(! bAllowPseudo && a.isPseudo) {
++ removedPseudo
bOk = false
}
2020-09-29 19:44:56 +02:00
bOk
}.toMutableList()
2018-01-13 07:15:52 +01:00
SavedAccount.sort(l)
l
}()
if(account_list.isEmpty()) {
2020-09-29 19:44:56 +02:00
val sb = StringBuilder()
if(removedPseudo > 0) {
sb.append(activity.getString(R.string.not_available_for_pseudo_account))
}
2020-09-29 19:44:56 +02:00
if(removedMisskey > 0) {
if(sb.isNotEmpty()) sb.append('\n')
sb.append(activity.getString(R.string.not_available_for_misskey_account))
}
2020-09-29 19:44:56 +02:00
if(removeMastodon > 0) {
if(sb.isNotEmpty()) sb.append('\n')
2018-08-23 04:20:10 +02:00
sb.append(activity.getString(R.string.not_available_for_mastodon_account))
}
2020-09-29 19:44:56 +02:00
if(sb.isEmpty()) {
sb.append(activity.getString(R.string.account_empty))
}
2020-09-29 19:44:56 +02:00
activity.showToast(false, sb.toString())
return
}
2020-09-29 19:44:56 +02:00
if(bAuto && account_list.size == 1) {
callback(account_list[0])
return
}
val viewRoot = activity.layoutInflater.inflate(R.layout.dlg_account_picker, null, false)
val dialog = Dialog(activity)
val isDialogClosed = AtomicBoolean(false)
2018-01-13 07:15:52 +01:00
dialog.setOnDismissListener {
if(dismiss_callback != null) dismiss_callback(it)
}
dialog.setContentView(viewRoot)
2018-01-13 07:15:52 +01:00
if(message != null && message.isNotEmpty()) {
val tv = viewRoot.findViewById<TextView>(R.id.tvMessage)
tv.visibility = View.VISIBLE
tv.text = message
}
viewRoot.findViewById<View>(R.id.btnCancel).setOnClickListener {
isDialogClosed.set(true)
dialog.cancel()
}
dialog.setCancelable(true)
dialog.setCanceledOnTouchOutside(true)
dialog.setOnCancelListener { isDialogClosed.set(true) }
val density = activity.resources.displayMetrics.density
2020-09-29 19:44:56 +02:00
val llAccounts : LinearLayout = viewRoot.findViewById(R.id.llAccounts)
val pad_se = (0.5f + 12f * density).toInt()
val pad_tb = (0.5f + 6f * density).toInt()
for(a in account_list) {
2020-09-29 19:44:56 +02:00
val lp = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
)
val ac = AcctColor.load(a)
val b = Button(activity)
if(AcctColor.hasColorBackground(ac)) {
2020-09-29 19:44:56 +02:00
b.background = getAdaptiveRippleDrawableRound(activity, ac.color_bg, ac.color_fg)
} else {
b.setBackgroundResource(R.drawable.btn_bg_transparent_round6dp)
}
if(AcctColor.hasColorForeground(ac)) {
b.textColor = ac.color_fg
}
b.setPaddingRelative(pad_se, pad_tb, pad_se, pad_tb)
b.gravity = Gravity.START or Gravity.CENTER_VERTICAL
2018-12-01 00:02:18 +01:00
b.isAllCaps = false
b.layoutParams = lp
b.minHeight = (0.5f + 32f * density).toInt()
val sb = SpannableStringBuilder(ac.nickname)
2020-09-29 19:44:56 +02:00
if(a.last_notification_error?.isNotEmpty() == true) {
sb.append("\n")
val start = sb.length
sb.append(a.last_notification_error)
val end = sb.length
sb.setSpan(RelativeSizeSpan(0.7f), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
2020-09-29 19:44:56 +02:00
} else if(a.last_subscription_error?.isNotEmpty() == true) {
sb.append("\n")
val start = sb.length
sb.append(a.last_subscription_error)
val end = sb.length
sb.setSpan(RelativeSizeSpan(0.7f), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
}
b.text = sb
b.setOnClickListener {
isDialogClosed.set(true)
callback(a)
2019-01-19 03:36:40 +01:00
dialog.dismissSafe()
}
llAccounts.addView(b)
}
2020-09-29 19:44:56 +02:00
extra_callback(llAccounts, pad_se, pad_tb)
dialog.show()
}
}