- カラム一覧のカラム名とアイコンとその背景に色をつける

- サーバ情報の取得時にFriendicaが/api/metaに401を返す問題
This commit is contained in:
tateisu 2023-02-18 00:03:59 +09:00
parent 269e20e12f
commit c6b92c4c11
5 changed files with 76 additions and 36 deletions

View File

@ -3,6 +3,7 @@ package jp.juggler.subwaytooter
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.res.ColorStateList
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
@ -29,6 +30,8 @@ import jp.juggler.util.log.LogCategory
import jp.juggler.util.ui.attrColor
import jp.juggler.util.ui.setNavigationBack
import jp.juggler.util.ui.vg
import org.jetbrains.anko.backgroundColor
import org.jetbrains.anko.textColor
class ActColumnList : AppCompatActivity() {
@ -55,10 +58,12 @@ class ActColumnList : AppCompatActivity() {
private val listAdapter by lazy { MyListAdapter() }
private val defaultNameColor by lazy {
attrColor(R.attr.colorColumnListItemText)
private val defaultAcctColorFg by lazy {
attrColor(R.attr.colorColumnHeaderAcct)
}
private val defaultColumnColorFg by lazy {
attrColor(R.attr.colorColumnHeaderName)
}
private var oldSelection: Int = 0
override fun onCreate(savedInstanceState: Bundle?) {
@ -145,7 +150,10 @@ class ActColumnList : AppCompatActivity() {
?.objectList()
?.forEachIndexed { index, src ->
try {
val item = MyItem(src, index.toLong(), defaultNameColor)
val item = MyItem(
src,
index.toLong(),
)
add(item)
if (oldSelection == item.oldIndex) {
item.setOldSelection(true)
@ -196,16 +204,19 @@ class ActColumnList : AppCompatActivity() {
}
// リスト要素のデータ
internal class MyItem(val json: JsonObject, val id: Long, defaultNameColor: Int) {
val name: String = json.optString(ColumnEncoder.KEY_COLUMN_NAME)
val acct: Acct = Acct.parse(json.optString(ColumnEncoder.KEY_COLUMN_ACCESS_ACCT))
val acctName: String = json.optString(ColumnEncoder.KEY_COLUMN_ACCESS_STR)
val oldIndex = json.optInt(ColumnEncoder.KEY_OLD_INDEX)
val type = ColumnType.parse(json.optInt(ColumnEncoder.KEY_TYPE))
val acctColorBg = json.optInt(ColumnEncoder.KEY_COLUMN_ACCESS_COLOR_BG, 0)
val acctColorFg = json.optInt(ColumnEncoder.KEY_COLUMN_ACCESS_COLOR, 0)
.notZero() ?: defaultNameColor
internal inner class MyItem(
val json: JsonObject,
val id: Long,
val name: String = json.optString(ColumnEncoder.KEY_COLUMN_NAME),
val acct: Acct = Acct.parse(json.optString(ColumnEncoder.KEY_COLUMN_ACCESS_ACCT)),
val acctName: String = json.optString(ColumnEncoder.KEY_COLUMN_ACCESS_STR),
val oldIndex: Int = json.optInt(ColumnEncoder.KEY_OLD_INDEX),
val type: ColumnType = ColumnType.parse(json.optInt(ColumnEncoder.KEY_TYPE)),
val acctColorBg: Int = json.optInt(ColumnEncoder.KEY_COLUMN_ACCESS_COLOR_BG, 0),
val acctColorFg: Int = json.optInt(ColumnEncoder.KEY_COLUMN_ACCESS_COLOR, 0),
val columnColorFg: Int = json.optInt(ColumnEncoder.KEY_HEADER_TEXT_COLOR, 0),
val columnColorBg: Int = json.optInt(ColumnEncoder.KEY_HEADER_BACKGROUND_COLOR, 0),
) {
var bOldSelection: Boolean = false
fun setOldSelection(b: Boolean) {
@ -237,11 +248,16 @@ class ActColumnList : AppCompatActivity() {
lastItem = item
views.ivSelected.vg(item.bOldSelection)
views.tvAccess.text = item.acctName
views.tvAccess.setTextColor(item.acctColorFg)
views.tvAccess.setTextColor(item.acctColorFg.notZero() ?: defaultAcctColorFg)
views.tvAccess.setBackgroundColor(item.acctColorBg)
views.tvAccess.setPaddingRelative(acctPadLr, 0, acctPadLr, 0)
views.tvName.text = item.name
val columnColorFg = item.columnColorFg.notZero() ?: defaultColumnColorFg
views.llColumn.backgroundColor = item.columnColorBg
views.tvColumnName.text = item.name
views.tvColumnName.textColor = columnColorFg
views.ivColumnIcon.setImageResource(item.type.iconId(item.acct))
views.ivColumnIcon.imageTintList = ColorStateList.valueOf(columnColorFg)
// 背景色がテーマ次第なので、カラム設定の色を反映するとアイコンが見えなくなる可能性がある
// よってアイコンやテキストにカラム設定の色を反映しない
}
@ -261,11 +277,16 @@ class ActColumnList : AppCompatActivity() {
dragViews.tvAccess.run {
text = item.acctName
setTextColor(item.acctColorFg)
setBackgroundColor(item.acctColorBg)
textColor = item.acctColorFg.notZero() ?: defaultAcctColorFg
backgroundColor = item.acctColorBg
}
dragViews.tvName.text = item.name
val columnColorFg = item.columnColorFg.notZero() ?: defaultColumnColorFg
dragViews.tvColumnName.run {
text = item.name
textColor = columnColorFg
}
dragViews.ivColumnIcon.imageTintList = ColorStateList.valueOf(columnColorFg)
dragViews.llColumn.backgroundColor = item.columnColorBg
dragViews.ivColumnIcon.setImageResource(item.type.iconId(item.acct))
dragViews.ivSelected.visibility = clickViews.ivSelected.visibility
dragViews.itemLayout.setBackgroundColor(attrColor(R.attr.list_item_bg_pressed_dragged))

View File

@ -397,19 +397,33 @@ class TootInstance(parser: TootParser, src: JsonObject) {
private suspend fun TootApiClient.getInstanceInformation(
forceAccessToken: String? = null,
): TootApiResult? {
// misskeyのインスタンス情報を読めたら、それはmisskeyのインスタンス
val r2 = getInstanceInformationMisskey(forceAccessToken) ?: return null
val r2 = getInstanceInformationMisskey(forceAccessToken)
?: return null
if (r2.jsonObject != null) return r2
when (r2.response?.code) {
null, 404 -> Unit // fall
else -> return r2
}
// https://github.com/tateisu/SubwayTooter/issues/234
// friendica は /api/meta に401を返す
// このためMisskeyのサーバ情報取得に失敗したらそれが何であれMastodonのサーバ情報取得を行う
// マストドンのインスタンス情報を読めたら、それはマストドンのインスタンス
// インスタンス情報を読めない場合もホワイトリストモードの問題があるので
// マストドン側のエラーを返す
return getInstanceInformationMastodon(forceAccessToken)
val r1 = getInstanceInformationMastodon(forceAccessToken)
?: return null
if (r1.jsonObject != null) return r1
// 両方読めなかった場合
return when (r1.response?.code) {
// Mastodon側が404を返したらMisskeyのエラー応答を返す
404 -> r2
// Mastodonはホワイトリストモードの際に401を返す。
// Mastoronのエラー結果を返す。
401 -> r1
// その他の場合
// Mastoronのエラー結果を返す。
else -> r1
}
}
/**

View File

@ -44,8 +44,8 @@ object ColumnEncoder {
private const val KEY_REGEX_TEXT = "regex_text"
private const val KEY_LANGUAGE_FILTER = "language_filter"
private const val KEY_HEADER_BACKGROUND_COLOR = "header_background_color"
private const val KEY_HEADER_TEXT_COLOR = "header_text_color"
const val KEY_HEADER_BACKGROUND_COLOR = "header_background_color"
const val KEY_HEADER_TEXT_COLOR = "header_text_color"
private const val KEY_COLUMN_BACKGROUND_COLOR = "column_background_color"
private const val KEY_COLUMN_ACCT_TEXT_COLOR = "column_acct_text_color"
private const val KEY_COLUMN_CONTENT_TEXT_COLOR = "column_content_text_color"

View File

@ -28,10 +28,10 @@ class MyDrawerLayout : DrawerLayout {
private val exclusionRects = listOf(Rect(), Rect(), Rect(), Rect())
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
val timeStart = SystemClock.elapsedRealtime()
// val timeStart = SystemClock.elapsedRealtime()
super.onLayout(changed, l, t, r, b)
val timeEnd = SystemClock.elapsedRealtime()
log.i("onLayout ${timeEnd - timeStart}ms changed=$changed")
// val timeEnd = SystemClock.elapsedRealtime()
// log.i("onLayout ${timeEnd - timeStart}ms changed=$changed")
// 画面下部の左右にはボタンがあるので、システムジェスチャーナビゲーションの対象外にする
val w = r - l

View File

@ -71,14 +71,17 @@
android:id="@+id/tvAccess"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start"
android:gravity="start|center_vertical"
android:includeFontPadding="false"
android:textColor="?attr/colorColumnListItemText"
android:textSize="14sp"
tools:text="user@acct" />
<LinearLayout
android:id="@+id/llColumn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:baselineAligned="false"
android:gravity="center_vertical"
android:orientation="horizontal">
@ -92,10 +95,12 @@
tools:src="@drawable/ic_face" />
<TextView
android:id="@+id/tvName"
android:id="@+id/tvColumnName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="start|center_vertical"
android:includeFontPadding="false"
android:textSize="18sp"
tools:text="name 名前 " />