From d7b17a8d8af23eb343bc5dda1cf1d7d29c25d5f7 Mon Sep 17 00:00:00 2001 From: tateisu Date: Tue, 20 Nov 2018 07:46:14 +0900 Subject: [PATCH] =?UTF-8?q?=E3=82=A2=E3=83=97=E3=83=AA=E8=A8=AD=E5=AE=9A?= =?UTF-8?q?=E3=81=AB=E3=80=8C=E3=82=AB=E3=83=A9=E3=83=A0=E8=89=B2=E3=81=AE?= =?UTF-8?q?=E3=83=87=E3=83=95=E3=82=A9=E3=83=AB=E3=83=88=E3=80=8D=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=80=82createColoredDrawable=20=E3=81=AE?= =?UTF-8?q?=E6=9C=80=E9=81=A9=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jp/juggler/subwaytooter/ActAppSetting.kt | 389 ++++++++++++++---- .../subwaytooter/ActColumnCustomize.kt | 18 +- .../java/jp/juggler/subwaytooter/ActMain.kt | 89 ++-- .../java/jp/juggler/subwaytooter/Column.kt | 85 ++-- .../juggler/subwaytooter/ColumnViewHolder.kt | 8 +- .../jp/juggler/subwaytooter/ItemViewHolder.kt | 4 +- .../main/java/jp/juggler/subwaytooter/Pref.kt | 6 + .../jp/juggler/subwaytooter/StatusButtons.kt | 2 +- .../java/jp/juggler/subwaytooter/Styler.kt | 164 +++++++- .../subwaytooter/ViewHolderHeaderProfile.kt | 10 +- .../subwaytooter/ViewHolderHeaderSearch.kt | 2 +- app/src/main/res/layout/act_app_setting.xml | 308 +++++++++++--- .../main/res/layout/act_column_customize.xml | 10 +- app/src/main/res/values-fr/strings.xml | 4 - app/src/main/res/values-ja/strings.xml | 17 +- app/src/main/res/values/strings.xml | 16 +- app/src/main/res/values/styles.xml | 44 +- 17 files changed, 871 insertions(+), 305 deletions(-) diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActAppSetting.kt b/app/src/main/java/jp/juggler/subwaytooter/ActAppSetting.kt index 3a0954de..e32dc198 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActAppSetting.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ActAppSetting.kt @@ -30,6 +30,7 @@ import jp.juggler.subwaytooter.util.handleGetContentResult import jp.juggler.subwaytooter.util.intentOpenDocument import jp.juggler.subwaytooter.util.showToast import org.apache.commons.io.IOUtils +import org.jetbrains.anko.textColor import java.io.File import java.io.FileOutputStream import java.io.OutputStreamWriter @@ -67,8 +68,14 @@ class ActAppSetting : AppCompatActivity() internal const val COLOR_DIALOG_ID_TOOT_BG_UNLISTED = 7 internal const val COLOR_DIALOG_ID_TOOT_BG_FOLLOWER = 8 internal const val COLOR_DIALOG_ID_TOOT_BG_DIRECT_USER = 9 - internal const val COLOR_DIALOG_ID_TOOT_BG_DIRECT_ME = 10 - internal const val COLOR_DIALOG_ID_LINK = 11 + internal const val COLOR_DIALOG_ID_TOOT_BG_DIRECT_ME = 10 + internal const val COLOR_DIALOG_ID_LINK = 11 + + internal const val COLOR_DIALOG_ID_COLUMN_HEADER_BG = 12 + internal const val COLOR_DIALOG_ID_COLUMN_HEADER_FG = 13 + internal const val COLOR_DIALOG_ID_COLUMN_BG = 14 + internal const val COLOR_DIALOG_ID_COLUMN_ACCT = 15 + internal const val COLOR_DIALOG_ID_COLUMN_TEXT = 16 internal const val REQUEST_CODE_TIMELINE_FONT = 1 internal const val REQUEST_CODE_TIMELINE_FONT_BOLD = 2 @@ -117,6 +124,12 @@ class ActAppSetting : AppCompatActivity() private var toot_color_direct_me : Int = 0 private var link_color : Int = 0 + private var color_column_header_bg : Int = 0 + private var color_column_header_fg : Int = 0 + private var color_column_bg : Int = 0 + private var color_column_acct : Int = 0 + private var color_column_text : Int = 0 + private lateinit var ivFooterToot : ImageView private lateinit var ivFooterMenu : ImageView private lateinit var llFooterBG : View @@ -137,7 +150,6 @@ class ActAppSetting : AppCompatActivity() private lateinit var etBoostAlpha : EditText private lateinit var etMediaReadTimeout : EditText - private lateinit var tvTimelineFontUrl : TextView private var timeline_font : String? = null private lateinit var tvTimelineFontBoldUrl : TextView @@ -154,11 +166,18 @@ class ActAppSetting : AppCompatActivity() private lateinit var etNotificationTlFontSize : EditText private lateinit var tvNotificationTlFontSize : TextView private lateinit var etNotificationTlIconSize : EditText - + private lateinit var etBoostButtonSize : EditText private lateinit var tvUserAgentError : TextView + private lateinit var llColumnHeader : View + private lateinit var ivColumnHeader : ImageView + private lateinit var tvColumnName : TextView + private lateinit var flColumnBackground : View + private lateinit var tvSampleAcct : TextView + private lateinit var tvSampleContent : TextView + private var load_busy : Boolean = false override fun onPause() { @@ -171,7 +190,7 @@ class ActAppSetting : AppCompatActivity() try { PollingWorker.scheduleJob(this, PollingWorker.JOB_POLLING) } catch(ex : Throwable) { - log.trace(ex,"PollingWorker.scheduleJob failed.") + log.trace(ex, "PollingWorker.scheduleJob failed.") } } @@ -222,13 +241,13 @@ class ActAppSetting : AppCompatActivity() , getString(R.string.replies_count_none) ) - spVisibilityStyle= initSpinner( + spVisibilityStyle = initSpinner( R.id.spVisibilityStyle , getString(R.string.visibility_style_by_account) , getString(R.string.mastodon) , getString(R.string.misskey) ) - spBoostButtonJustify= initSpinner( + spBoostButtonJustify = initSpinner( R.id.spBoostButtonJustify , getString(R.string.start) , getString(R.string.center) @@ -263,39 +282,51 @@ class ActAppSetting : AppCompatActivity() } - findViewById(R.id.btnFooterBackgroundEdit).setOnClickListener(this) - findViewById(R.id.btnFooterBackgroundReset).setOnClickListener(this) - findViewById(R.id.btnFooterForegroundColorEdit).setOnClickListener(this) - findViewById(R.id.btnFooterForegroundColorReset).setOnClickListener(this) - findViewById(R.id.btnTabBackgroundColorEdit).setOnClickListener(this) - findViewById(R.id.btnTabBackgroundColorReset).setOnClickListener(this) - findViewById(R.id.btnTabDividerColorEdit).setOnClickListener(this) - findViewById(R.id.btnTabDividerColorReset).setOnClickListener(this) - findViewById(R.id.btnTabIndicatorColorEdit).setOnClickListener(this) - findViewById(R.id.btnTabIndicatorColorReset).setOnClickListener(this) - findViewById(R.id.btnListDividerColorEdit).setOnClickListener(this) - findViewById(R.id.btnListDividerColorReset).setOnClickListener(this) + intArrayOf( + R.id.btnFooterBackgroundEdit + , R.id.btnFooterBackgroundReset + , R.id.btnFooterForegroundColorEdit + , R.id.btnFooterForegroundColorReset + , R.id.btnTabBackgroundColorEdit + , R.id.btnTabBackgroundColorReset + , R.id.btnTabDividerColorEdit + , R.id.btnTabDividerColorReset + , R.id.btnTabIndicatorColorEdit + , R.id.btnTabIndicatorColorReset + , R.id.btnListDividerColorEdit + , R.id.btnListDividerColorReset + , R.id.btnBackgroundColorUnlistedEdit + , R.id.btnBackgroundColorUnlistedReset + , R.id.btnBackgroundColorFollowerEdit + , R.id.btnBackgroundColorFollowerReset + , R.id.btnBackgroundColorDirectWithUserEdit + , R.id.btnBackgroundColorDirectWithUserReset + , R.id.btnBackgroundColorDirectNoUserEdit + , R.id.btnBackgroundColorDirectNoUserReset + , R.id.btnLinkColorEdit + , R.id.btnLinkColorReset + , R.id.btnTimelineFontEdit + , R.id.btnTimelineFontReset + , R.id.btnTimelineFontBoldEdit + , R.id.btnTimelineFontBoldReset + , R.id.btnSettingExport + , R.id.btnSettingImport + , R.id.btnCustomStreamListenerEdit + , R.id.btnCustomStreamListenerReset + , R.id.btnCcdHeaderBackgroundEdit + , R.id.btnCcdHeaderBackgroundReset + , R.id.btnCcdHeaderForegroundEdit + , R.id.btnCcdHeaderForegroundReset + , R.id.btnCcdContentBackgroundEdit + , R.id.btnCcdContentBackgroundReset + , R.id.btnCcdContentAcctEdit + , R.id.btnCcdContentAcctReset + , R.id.btnCcdContentTextEdit + , R.id.btnCcdContentTextReset + ).forEach { + findViewById(it).setOnClickListener(this) + } - findViewById(R.id.btnBackgroundColorUnlistedEdit).setOnClickListener(this) - findViewById(R.id.btnBackgroundColorUnlistedReset).setOnClickListener(this) - findViewById(R.id.btnBackgroundColorFollowerEdit).setOnClickListener(this) - findViewById(R.id.btnBackgroundColorFollowerReset).setOnClickListener(this) - findViewById(R.id.btnBackgroundColorDirectWithUserEdit).setOnClickListener(this) - findViewById(R.id.btnBackgroundColorDirectWithUserReset).setOnClickListener(this) - findViewById(R.id.btnBackgroundColorDirectNoUserEdit).setOnClickListener(this) - findViewById(R.id.btnBackgroundColorDirectNoUserReset).setOnClickListener(this) - - findViewById(R.id.btnLinkColorEdit).setOnClickListener(this) - findViewById(R.id.btnLinkColorReset).setOnClickListener(this) - - findViewById(R.id.btnTimelineFontEdit).setOnClickListener(this) - findViewById(R.id.btnTimelineFontReset).setOnClickListener(this) - findViewById(R.id.btnTimelineFontBoldEdit).setOnClickListener(this) - findViewById(R.id.btnTimelineFontBoldReset).setOnClickListener(this) - findViewById(R.id.btnSettingExport).setOnClickListener(this) - findViewById(R.id.btnSettingImport).setOnClickListener(this) - findViewById(R.id.btnCustomStreamListenerEdit).setOnClickListener(this) - findViewById(R.id.btnCustomStreamListenerReset).setOnClickListener(this) ivFooterToot = findViewById(R.id.ivFooterToot) ivFooterMenu = findViewById(R.id.ivFooterMenu) @@ -321,14 +352,14 @@ class ActAppSetting : AppCompatActivity() etAutoCWLines = findViewById(R.id.etAutoCWLines) etAutoCWLines.addTextChangedListener(this) - + etCardDescriptionLength = findViewById(R.id.etCardDescriptionLength) etCardDescriptionLength.addTextChangedListener(this) - + etMediaSizeMax = findViewById(R.id.etMediaSizeMax) etMediaSizeMax.addTextChangedListener(this) - - etMovieSizeMax= findViewById(R.id.etMovieSizeMax) + + etMovieSizeMax = findViewById(R.id.etMovieSizeMax) etMovieSizeMax.addTextChangedListener(this) etRoundRatio = findViewById(R.id.etRoundRatio) @@ -337,7 +368,7 @@ class ActAppSetting : AppCompatActivity() etBoostAlpha = findViewById(R.id.etBoostAlpha) etBoostAlpha.addTextChangedListener(this) - etMediaReadTimeout= findViewById(R.id.etMediaReadTimeout) + etMediaReadTimeout = findViewById(R.id.etMediaReadTimeout) etMediaReadTimeout.addTextChangedListener(this) tvTimelineFontSize = findViewById(R.id.tvTimelineFontSize) @@ -382,6 +413,14 @@ class ActAppSetting : AppCompatActivity() tvUserAgentError = findViewById(R.id.tvUserAgentError) + + llColumnHeader = findViewById(R.id.llColumnHeader) + ivColumnHeader = findViewById(R.id.ivColumnHeader) + tvColumnName = findViewById(R.id.tvColumnName) + flColumnBackground = findViewById(R.id.flColumnBackground) + tvSampleAcct = findViewById(R.id.tvSampleAcct) + tvSampleContent = findViewById(R.id.tvSampleContent) + } private fun initSpinner(@IdRes viewId : Int, vararg captions : String) : Spinner { @@ -430,6 +469,12 @@ class ActAppSetting : AppCompatActivity() toot_color_direct_me = Pref.ipTootColorDirectMe(pref) link_color = Pref.ipLinkColor(pref) + color_column_header_bg = Pref.ipCcdHeaderBg(pref) + color_column_header_fg = Pref.ipCcdHeaderFg(pref) + color_column_bg = Pref.ipCcdContentBg(pref) + color_column_acct = Pref.ipCcdContentAcct(pref) + color_column_text = Pref.ipCcdContentText(pref) + etColumnWidth.setText(Pref.spColumnWidth(pref)) etMediaThumbHeight.setText(Pref.spMediaThumbHeight(pref)) etClientName.setText(Pref.spClientName(pref)) @@ -473,6 +518,8 @@ class ActAppSetting : AppCompatActivity() ) showUserAgentError() + showColumnSample() + showColumnHeaderSample() } private fun saveUIToData() { @@ -512,7 +559,9 @@ class ActAppSetting : AppCompatActivity() etUserAgent.text.toString().replace(reLinefeed, " ").trim { it <= ' ' }) .put(Pref.spQuoteNameFormat, etQuoteNameFormat.text.toString()) // not trimmed .put(Pref.spAutoCWLines, etAutoCWLines.text.toString().trim { it <= ' ' }) - .put(Pref.spCardDescriptionLength, etCardDescriptionLength.text.toString().trim { it <= ' ' }) + .put( + Pref.spCardDescriptionLength, + etCardDescriptionLength.text.toString().trim { it <= ' ' }) .put(Pref.spAvatarIconSize, etAvatarIconSize.text.toString().trim { it <= ' ' }) .put( Pref.spNotificationTlIconSize, @@ -525,12 +574,11 @@ class ActAppSetting : AppCompatActivity() etPullNotificationCheckInterval.text.toString().trim { it <= ' ' }) .put(Pref.spMediaSizeMax, etMediaSizeMax.text.toString().trim { it <= ' ' }) .put(Pref.spMovieSizeMax, etMovieSizeMax.text.toString().trim { it <= ' ' }) - + .put(Pref.spRoundRatio, etRoundRatio.text.toString().trim { it <= ' ' }) .put(Pref.spBoostAlpha, etBoostAlpha.text.toString().trim { it <= ' ' }) - + .put(Pref.spMediaReadTimeout, etMediaReadTimeout.text.toString().trim { it <= ' ' }) - .put(Pref.spTimelineFont, timeline_font ?: "") .put(Pref.spTimelineFontBold, timeline_font_bold ?: "") @@ -548,7 +596,7 @@ class ActAppSetting : AppCompatActivity() .put(Pref.ipFooterTabDividerColor, footer_tab_divider_color) .put(Pref.ipFooterTabIndicatorColor, footer_tab_indicator_color) .put(Pref.ipListDividerColor, list_divider_color) - + .put(Pref.ipTootColorUnlisted, toot_color_unlisted) .put(Pref.ipTootColorFollower, toot_color_follower) .put(Pref.ipTootColorDirectUser, toot_color_direct_user) @@ -556,9 +604,16 @@ class ActAppSetting : AppCompatActivity() .put(Pref.ipLinkColor, link_color) + .put(Pref.ipCcdHeaderBg, color_column_header_bg) + .put(Pref.ipCcdHeaderFg, color_column_header_fg) + .put(Pref.ipCcdContentBg, color_column_bg) + .put(Pref.ipCcdContentAcct, color_column_acct) + .put(Pref.ipCcdContentText, color_column_text) + .apply() showUserAgentError() + } private fun showUserAgentError() { @@ -569,6 +624,53 @@ class ActAppSetting : AppCompatActivity() } } + private fun showColumnHeaderSample() { + val header_bg = when { + color_column_header_bg != 0 -> color_column_header_bg + else -> Styler.getAttributeColor(this, R.attr.color_column_header) + } + + val header_fg = when { + color_column_header_fg != 0 -> color_column_header_fg + else -> Styler.getAttributeColor(this, R.attr.colorColumnHeaderName) + } + + ViewCompat.setBackground( + llColumnHeader, + Styler.getAdaptiveRippleDrawable(header_bg, header_fg) + ) + + tvColumnName.textColor = header_fg + Styler.setIconAttr( + this, + ivColumnHeader, + R.attr.btn_federate_tl, + color = header_fg + ) + } + + private fun showColumnSample() { + + var c = when { + color_column_bg != 0 -> color_column_bg + else -> 0 + } + flColumnBackground.setBackgroundColor(c) + + c = when { + color_column_acct != 0 -> color_column_acct + else -> Styler.getAttributeColor(this, R.attr.colorTimeSmall) + } + tvSampleAcct.setTextColor(c) + + c = when { + color_column_text != 0 -> color_column_text + else -> Styler.getAttributeColor(this, R.attr.colorContentText) + } + tvSampleContent.setTextColor(c) + + } + override fun onCheckedChanged(buttonView : CompoundButton, isChecked : Boolean) { saveUIToData() } @@ -649,46 +751,50 @@ class ActAppSetting : AppCompatActivity() true ) + R.id.btnListDividerColorReset -> { + list_divider_color = 0 + saveUIToData() + } + R.id.btnBackgroundColorUnlistedEdit -> openColorPicker( COLOR_DIALOG_ID_TOOT_BG_UNLISTED, toot_color_unlisted, true ) - + + R.id.btnBackgroundColorUnlistedReset -> { + toot_color_unlisted = 0 + saveUIToData() + } + R.id.btnBackgroundColorFollowerEdit -> openColorPicker( COLOR_DIALOG_ID_TOOT_BG_FOLLOWER, toot_color_follower, true ) - + + R.id.btnBackgroundColorFollowerReset -> { + toot_color_follower = 0 + saveUIToData() + } + R.id.btnBackgroundColorDirectWithUserEdit -> openColorPicker( COLOR_DIALOG_ID_TOOT_BG_DIRECT_USER, toot_color_direct_user, true ) - + + R.id.btnBackgroundColorDirectWithUserReset -> { + toot_color_direct_user = 0 + saveUIToData() + } + R.id.btnBackgroundColorDirectNoUserEdit -> openColorPicker( COLOR_DIALOG_ID_TOOT_BG_DIRECT_ME, toot_color_direct_me, true ) - - R.id.btnListDividerColorReset -> { - list_divider_color = 0 - saveUIToData() - } - R.id.btnBackgroundColorUnlistedReset -> { - toot_color_unlisted = 0 - saveUIToData() - } - R.id.btnBackgroundColorFollowerReset -> { - toot_color_follower = 0 - saveUIToData() - } - R.id.btnBackgroundColorDirectWithUserReset -> { - toot_color_direct_user = 0 - saveUIToData() - } + R.id.btnBackgroundColorDirectNoUserReset -> { toot_color_direct_me = 0 saveUIToData() @@ -699,11 +805,72 @@ class ActAppSetting : AppCompatActivity() link_color, true ) + R.id.btnLinkColorReset -> { link_color = 0 saveUIToData() } + R.id.btnCcdHeaderBackgroundEdit -> openColorPicker( + COLOR_DIALOG_ID_COLUMN_HEADER_BG, + color_column_header_bg, + false + ) + + R.id.btnCcdHeaderBackgroundReset -> { + color_column_header_bg = 0 + saveUIToData() + showColumnHeaderSample() + } + + R.id.btnCcdHeaderForegroundEdit -> openColorPicker( + COLOR_DIALOG_ID_COLUMN_HEADER_FG, + color_column_header_fg, + false + ) + + R.id.btnCcdHeaderForegroundReset -> { + color_column_header_fg = 0 + saveUIToData() + showColumnHeaderSample() + } + + R.id.btnCcdContentBackgroundEdit -> openColorPicker( + COLOR_DIALOG_ID_COLUMN_BG, + color_column_bg, + false + ) + + R.id.btnCcdContentBackgroundReset -> { + color_column_bg = 0 + saveUIToData() + showColumnSample() + } + + R.id.btnCcdContentAcctEdit -> openColorPicker( + COLOR_DIALOG_ID_COLUMN_ACCT, + color_column_acct, + true + ) + + R.id.btnCcdContentAcctReset -> { + color_column_acct = 0 + saveUIToData() + showColumnSample() + } + + R.id.btnCcdContentTextEdit -> openColorPicker( + COLOR_DIALOG_ID_COLUMN_TEXT, + color_column_text, + true + ) + + R.id.btnCcdContentTextReset -> { + color_column_text = 0 + saveUIToData() + showColumnSample() + } + R.id.btnTimelineFontReset -> { timeline_font = "" saveUIToData() @@ -751,7 +918,7 @@ class ActAppSetting : AppCompatActivity() override fun onActivityResult(requestCode : Int, resultCode : Int, data : Intent?) { if(resultCode == RESULT_OK && data != null && requestCode == REQUEST_CODE_TIMELINE_FONT) { - data.handleGetContentResult(contentResolver).firstOrNull()?.first?.let{ uri-> + data.handleGetContentResult(contentResolver).firstOrNull()?.first?.let { uri -> val file = saveTimelineFont(uri, "TimelineFont") if(file != null) { timeline_font = file.absolutePath @@ -760,7 +927,7 @@ class ActAppSetting : AppCompatActivity() } } } else if(resultCode == RESULT_OK && data != null && requestCode == REQUEST_CODE_TIMELINE_FONT_BOLD) { - data.handleGetContentResult(contentResolver).firstOrNull()?.first?.let{ uri-> + data.handleGetContentResult(contentResolver).firstOrNull()?.first?.let { uri -> val file = saveTimelineFont(uri, "TimelineFontBold") if(file != null) { timeline_font_bold = file.absolutePath @@ -769,7 +936,7 @@ class ActAppSetting : AppCompatActivity() } } } else if(resultCode == RESULT_OK && data != null && requestCode == REQUEST_CODE_APP_DATA_IMPORT) { - data.handleGetContentResult(contentResolver).firstOrNull()?.first?.let{ uri-> + data.handleGetContentResult(contentResolver).firstOrNull()?.first?.let { uri -> contentResolver.takePersistableUriPermission( uri, Intent.FLAG_GRANT_READ_URI_PERMISSION @@ -791,63 +958,99 @@ class ActAppSetting : AppCompatActivity() } override fun onColorSelected(dialogId : Int, @ColorInt colorSelected : Int) { + val colorOpaque = colorFF000000 or colorSelected + val colorAlpha = if(colorSelected == 0) 0x01000000 else colorSelected when(dialogId) { COLOR_DIALOG_ID_FOOTER_BUTTON_BG -> { - footer_button_bg_color = colorFF000000 or colorSelected + footer_button_bg_color = colorOpaque saveUIToData() showFooterColor() } COLOR_DIALOG_ID_FOOTER_BUTTON_FG -> { - footer_button_fg_color = colorFF000000 or colorSelected + footer_button_fg_color = colorOpaque saveUIToData() showFooterColor() } COLOR_DIALOG_ID_FOOTER_TAB_BG -> { - footer_tab_bg_color = colorFF000000 or colorSelected + footer_tab_bg_color = colorOpaque saveUIToData() showFooterColor() } COLOR_DIALOG_ID_FOOTER_TAB_DIVIDER -> { - footer_tab_divider_color = colorFF000000 or colorSelected + footer_tab_divider_color = colorOpaque saveUIToData() showFooterColor() } COLOR_DIALOG_ID_FOOTER_TAB_INDICATOR -> { - footer_tab_indicator_color = if(colorSelected == 0) 0x01000000 else colorSelected + footer_tab_indicator_color = colorAlpha saveUIToData() showFooterColor() } COLOR_DIALOG_ID_LIST_DIVIDER -> { - list_divider_color = if(colorSelected == 0) 0x01000000 else colorSelected + list_divider_color = colorAlpha saveUIToData() } COLOR_DIALOG_ID_TOOT_BG_UNLISTED -> { - toot_color_unlisted = if(colorSelected == 0) 0x01000000 else colorSelected + toot_color_unlisted = colorAlpha saveUIToData() } + COLOR_DIALOG_ID_TOOT_BG_FOLLOWER -> { - toot_color_follower = if(colorSelected == 0) 0x01000000 else colorSelected + toot_color_follower = colorAlpha saveUIToData() } + COLOR_DIALOG_ID_TOOT_BG_DIRECT_USER -> { - toot_color_direct_user= if(colorSelected == 0) 0x01000000 else colorSelected + toot_color_direct_user = colorAlpha saveUIToData() } + COLOR_DIALOG_ID_TOOT_BG_DIRECT_ME -> { - toot_color_direct_me = if(colorSelected == 0) 0x01000000 else colorSelected + toot_color_direct_me = colorAlpha saveUIToData() } - COLOR_DIALOG_ID_LINK ->{ - link_color = if(colorSelected == 0) 0x01000000 else colorSelected + + COLOR_DIALOG_ID_LINK -> { + link_color = colorAlpha saveUIToData() } + + COLOR_DIALOG_ID_COLUMN_HEADER_BG -> { + color_column_header_bg = colorOpaque + saveUIToData() + showColumnHeaderSample() + } + + COLOR_DIALOG_ID_COLUMN_HEADER_FG -> { + color_column_header_fg = colorOpaque + saveUIToData() + showColumnHeaderSample() + } + + COLOR_DIALOG_ID_COLUMN_BG -> { + color_column_bg = colorOpaque + saveUIToData() + showColumnSample() + } + + COLOR_DIALOG_ID_COLUMN_ACCT -> { + color_column_acct = colorAlpha + saveUIToData() + showColumnSample() + } + + COLOR_DIALOG_ID_COLUMN_TEXT -> { + color_column_text = colorAlpha + saveUIToData() + showColumnSample() + } } } @@ -873,8 +1076,8 @@ class ActAppSetting : AppCompatActivity() Styler.setIconAttr(this, ivFooterToot, R.attr.ic_edit) Styler.setIconAttr(this, ivFooterMenu, R.attr.ic_hamburger) } else { - Styler.setIconAttr(this, ivFooterToot, R.attr.ic_edit,color=c) - Styler.setIconAttr(this, ivFooterMenu, R.attr.ic_hamburger,color=c) + Styler.setIconAttr(this, ivFooterToot, R.attr.ic_edit, color = c) + Styler.setIconAttr(this, ivFooterMenu, R.attr.ic_hamburger, color = c) } c = footer_tab_bg_color @@ -1072,7 +1275,7 @@ class ActAppSetting : AppCompatActivity() ) // ZipOutputStreamオブジェクトの作成 - ZipOutputStream(FileOutputStream(file)).use{ zipStream-> + ZipOutputStream(FileOutputStream(file)).use { zipStream -> // アプリデータjson zipStream.putNextEntry(ZipEntry("AppData.json")) @@ -1080,17 +1283,21 @@ class ActAppSetting : AppCompatActivity() val jw = JsonWriter(OutputStreamWriter(zipStream, "UTF-8")) AppDataExporter.encodeAppData(this@ActAppSetting, jw) jw.flush() - }finally{ + } finally { zipStream.closeEntry() } - + // カラム背景画像 val appState = App1.getAppState(this@ActAppSetting) for(column in appState.column_list) { - AppDataExporter.saveBackgroundImage(this@ActAppSetting,zipStream,column) + AppDataExporter.saveBackgroundImage( + this@ActAppSetting, + zipStream, + column + ) } } - + return file } catch(ex : Throwable) { log.trace(ex) diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActColumnCustomize.kt b/app/src/main/java/jp/juggler/subwaytooter/ActColumnCustomize.kt index e8737491..2a7caf4a 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActColumnCustomize.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ActColumnCustomize.kt @@ -119,7 +119,7 @@ class ActColumnCustomize : AppCompatActivity(), View.OnClickListener, ColorPicke .setAllowPresets(true) .setShowAlphaSlider(false) .setDialogId(COLOR_DIALOG_ID_HEADER_BACKGROUND) - .setColor(column.getHeaderBackgroundColor(this)) + .setColor(column.getHeaderBackgroundColor()) .show(this) } @@ -134,7 +134,7 @@ class ActColumnCustomize : AppCompatActivity(), View.OnClickListener, ColorPicke .setAllowPresets(true) .setShowAlphaSlider(false) .setDialogId(COLOR_DIALOG_ID_HEADER_FOREGROUND) - .setColor(column.getHeaderNameColor(this)) + .setColor(column.getHeaderNameColor()) .show(this) } @@ -164,7 +164,7 @@ class ActColumnCustomize : AppCompatActivity(), View.OnClickListener, ColorPicke .setAllowPresets(true) .setShowAlphaSlider(true) .setDialogId(COLOR_DIALOG_ID_ACCT_TEXT) - .setColor(column.getAcctColor(this)) + .setColor(column.getAcctColor()) .show(this) } @@ -179,7 +179,7 @@ class ActColumnCustomize : AppCompatActivity(), View.OnClickListener, ColorPicke .setAllowPresets(true) .setShowAlphaSlider(true) .setDialogId(COLOR_DIALOG_ID_CONTENT_TEXT) - .setColor(column.getContentColor(this)) + .setColor(column.getContentColor()) .show(this) } @@ -391,11 +391,9 @@ class ActColumnCustomize : AppCompatActivity(), View.OnClickListener, ColorPicke try { loading_busy = true - column.setHeaderBackground(this,llColumnHeader) + column.setHeaderBackground(llColumnHeader) - - - var c = column.getHeaderNameColor(this) + val c = column.getHeaderNameColor() tvColumnName.textColor = c Styler.setIconAttr( this, @@ -430,8 +428,8 @@ class ActColumnCustomize : AppCompatActivity(), View.OnClickListener, ColorPicke loadImage(ivColumnBackground, column.column_bg_image) - tvSampleAcct.setTextColor( column.getAcctColor(this)) - tvSampleContent.setTextColor(column.getContentColor(this)) + tvSampleAcct.setTextColor( column.getAcctColor()) + tvSampleContent.setTextColor(column.getContentColor()) } finally { loading_busy = false diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActMain.kt b/app/src/main/java/jp/juggler/subwaytooter/ActMain.kt index d5cc6707..31ae5d5e 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActMain.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ActMain.kt @@ -200,7 +200,7 @@ class ActMain : AppCompatActivity() /////////////////////////////////////////////////////////////////////////////////////////////// - internal val link_click_listener : MyClickableSpanClickCallback = { viewClicked, span -> + private val link_click_listener : MyClickableSpanClickCallback = { viewClicked, span -> var view = viewClicked var column : Column? = null @@ -437,6 +437,7 @@ class ActMain : AppCompatActivity() super.onNewIntent(intent) log.w("onNewIntent: isResumed = isResumed") } + override fun onSaveInstanceState(outState : Bundle?) { log.d("onSaveInstanceState") super.onSaveInstanceState(outState) @@ -637,9 +638,9 @@ class ActMain : AppCompatActivity() private fun handleSentIntent(intent : Intent) { sent_intent2 = intent - + // Galaxy S8+ で STのSSを取った後に出るポップアップからそのまま共有でSTを選ぶと何も起きない問題への対策 - handler.post{ + handler.post { AccountPicker.pick( this, bAllowPseudo = false, @@ -775,6 +776,11 @@ class ActMain : AppCompatActivity() override fun onActivityResult(requestCode : Int, resultCode : Int, data : Intent?) { log.d("onActivityResult") + + if(requestCode == REQUEST_CODE_APP_SETTING) { + Column.reloadDefaultColor(this,pref) + } + if(resultCode == Activity.RESULT_OK) { if(requestCode == REQUEST_CODE_COLUMN_LIST) { if(data != null) { @@ -1159,6 +1165,8 @@ class ActMain : AppCompatActivity() MyClickableSpan.defaultLinkColor = Pref.ipLinkColor(pref) + Column.reloadDefaultColor(this,pref) + var sv = Pref.spTimelineFont(pref) if(sv.isNotEmpty()) { try { @@ -1223,13 +1231,13 @@ class ActMain : AppCompatActivity() } run { - var boost_alpha :Float? = 0.8f - try{ - val f = ( Pref.spBoostAlpha.toInt(pref).toFloat() +0.5f )/100f - boost_alpha = when{ + var boost_alpha : Float? = 0.8f + try { + val f = (Pref.spBoostAlpha.toInt(pref).toFloat() + 0.5f) / 100f + boost_alpha = when { f >= 1f -> null f < 0f -> 0.66f - else-> f + else -> f } } catch(ex : Throwable) { log.trace(ex) @@ -1429,11 +1437,14 @@ class ActMain : AppCompatActivity() viewRoot.contentDescription = column.getColumnName(true) // - column.setHeaderBackground(this,viewRoot) + column.setHeaderBackground( viewRoot) - - var c = column.getHeaderNameColor(this) - Styler.setIconAttr(this, ivIcon, column.getIconAttrId(column.column_type), c) + Styler.setIconAttr( + this, + ivIcon, + column.getIconAttrId(column.column_type), + column.getHeaderNameColor() + ) // val ac = AcctColor.load(column.access_info.acct) @@ -2260,16 +2271,17 @@ class ActMain : AppCompatActivity() val footer_tab_bg_color = Pref.ipFooterTabBgColor(pref) val footer_tab_divider_color = Pref.ipFooterTabDividerColor(pref) val footer_tab_indicator_color = Pref.ipFooterTabIndicatorColor(pref) + var c = footer_button_bg_color if(c == 0) { btnMenu.setBackgroundResource(R.drawable.bg_button_cw) btnToot.setBackgroundResource(R.drawable.bg_button_cw) btnQuickToot.setBackgroundResource(R.drawable.bg_button_cw) } else { - val fg = if(footer_button_fg_color != 0) - footer_button_fg_color - else - Styler.getAttributeColor(this, R.attr.colorRippleEffect) + val fg = when { + footer_button_fg_color != 0 -> footer_button_fg_color + else -> Styler.getAttributeColor(this, R.attr.colorRippleEffect) + } ViewCompat.setBackground(btnToot, Styler.getAdaptiveRippleDrawable(c, fg)) ViewCompat.setBackground(btnMenu, Styler.getAdaptiveRippleDrawable(c, fg)) ViewCompat.setBackground(btnQuickToot, Styler.getAdaptiveRippleDrawable(c, fg)) @@ -2287,47 +2299,14 @@ class ActMain : AppCompatActivity() } c = footer_tab_bg_color - if(c == 0) { - svColumnStrip.setBackgroundColor( - Styler.getAttributeColor( - this, - R.attr.colorColumnStripBackground - ) - ) - llQuickTootBar.setBackgroundColor( - Styler.getAttributeColor( - this, - R.attr.colorColumnStripBackground - ) - ) - } else { - svColumnStrip.setBackgroundColor(c) - svColumnStrip.setBackgroundColor( - Styler.getAttributeColor( - this, - R.attr.colorColumnStripBackground - ) - ) - } + if(c == 0) c = Styler.getAttributeColor(this, R.attr.colorColumnStripBackground) + svColumnStrip.setBackgroundColor(c) + llQuickTootBar.setBackgroundColor(c) c = footer_tab_divider_color - if(c == 0) { - vFooterDivider1.setBackgroundColor( - Styler.getAttributeColor( - this, - R.attr.colorImageButton - ) - ) - vFooterDivider2.setBackgroundColor( - Styler.getAttributeColor( - this, - R.attr.colorImageButton - ) - ) - } else { - vFooterDivider1.setBackgroundColor(c) - vFooterDivider2.setBackgroundColor(c) - } + if(c == 0) c = Styler.getAttributeColor(this, R.attr.colorImageButton) + vFooterDivider1.setBackgroundColor(c) + vFooterDivider2.setBackgroundColor(c) llColumnStrip.indicatorColor = footer_tab_indicator_color } diff --git a/app/src/main/java/jp/juggler/subwaytooter/Column.kt b/app/src/main/java/jp/juggler/subwaytooter/Column.kt index 1a87072e..5827ee03 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/Column.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/Column.kt @@ -2,6 +2,7 @@ package jp.juggler.subwaytooter import android.annotation.SuppressLint import android.content.Context +import android.content.SharedPreferences import android.net.Uri import android.os.AsyncTask import android.os.Environment @@ -468,6 +469,42 @@ class Column( log.i("backgroundDir: ${backgroundDir} exists=${backgroundDir.exists()}") return backgroundDir } + + private var defaultColorHeaderBg = 0 + private var defaultColorHeaderName = 0 + private var defaultColorHeaderPageNumber = 0 + private var defaultColorContentBg = 0 + private var defaultColorContentAcct = 0 + private var defaultColorContentText = 0 + + fun reloadDefaultColor(activity : AppCompatActivity, pref : SharedPreferences) { + var c : Int + + // + c = Pref.ipCcdHeaderBg(pref) + if(c == 0) c = Styler.getAttributeColor(activity, R.attr.color_column_header) + defaultColorHeaderBg = c + // + c = Pref.ipCcdHeaderFg(pref) + if(c == 0) c = Styler.getAttributeColor(activity, R.attr.colorColumnHeaderName) + defaultColorHeaderName = c + // + c = Pref.ipCcdHeaderFg(pref) + if(c == 0) c = Styler.getAttributeColor(activity, R.attr.colorColumnHeaderPageNumber) + defaultColorHeaderPageNumber = c + // + c = Pref.ipCcdContentBg(pref) + defaultColorContentBg = c + // + c = Pref.ipCcdContentAcct(pref) + if(c == 0) c = Styler.getAttributeColor(activity, R.attr.colorTimeSmall) + defaultColorContentAcct = c + // + c = Pref.ipCcdContentText(pref) + if(c == 0) c = Styler.getAttributeColor(activity, R.attr.colorContentText) + defaultColorContentText = c + + } } private var callback_ref : WeakReference? = null @@ -6822,53 +6859,41 @@ class Column( } } - fun getContentColor(activity : AppCompatActivity) : Int = if(content_color != 0) { - content_color - } else { - Styler.getAttributeColor(activity, R.attr.colorContentText) + fun getContentColor() : Int = when { + content_color != 0 -> content_color + else -> defaultColorContentText } - fun getAcctColor(activity : AppCompatActivity) : Int = if(acct_color != 0) { - acct_color - } else { - Styler.getAttributeColor(activity, R.attr.colorTimeSmall) + fun getAcctColor() : Int = when { + acct_color != 0 -> acct_color + else -> defaultColorContentAcct } - fun getHeaderPageNumberColor(activity : AppCompatActivity) : Int { - val c = header_fg_color - return when { - c != 0 -> c - else -> Styler.getAttributeColor(activity,R.attr.colorColumnHeaderPageNumber) - } + fun getHeaderPageNumberColor() = when { + header_fg_color != 0 -> header_fg_color + else -> defaultColorHeaderPageNumber } - fun getHeaderNameColor(activity : AppCompatActivity) : Int { - val c = header_fg_color - return when { - c != 0 -> c - else -> Styler.getAttributeColor(activity,R.attr.colorColumnHeaderName) - } + fun getHeaderNameColor() = when { + header_fg_color != 0 -> header_fg_color + else -> defaultColorHeaderName } - fun getHeaderBackgroundColor(activity : AppCompatActivity) : Int { - val c = header_bg_color - return when { - c != 0 -> c - else -> Styler.getAttributeColor(activity,R.attr.color_column_header) - } + fun getHeaderBackgroundColor() = when { + header_bg_color != 0 -> header_bg_color + else -> defaultColorHeaderBg } - fun setHeaderBackground(activity : AppCompatActivity, view : View) { + fun setHeaderBackground( view : View) { ViewCompat.setBackground( view, Styler.getAdaptiveRippleDrawable( - getHeaderBackgroundColor(activity), - getHeaderNameColor(activity) + getHeaderBackgroundColor(), + getHeaderNameColor() ) ) } - // fun findListIndexByTimelineId(orderId : EntityId) : Int? { // list_data.forEachIndexed { i, v -> // if(v.getOrderId() == orderId) return i diff --git a/app/src/main/java/jp/juggler/subwaytooter/ColumnViewHolder.kt b/app/src/main/java/jp/juggler/subwaytooter/ColumnViewHolder.kt index 1f0aa19c..d09dda26 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ColumnViewHolder.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ColumnViewHolder.kt @@ -659,10 +659,10 @@ class ColumnViewHolder( if(column == null || column.is_dispose.get()) return // カラムヘッダ背景 - column.setHeaderBackground(activity,llColumnHeader) + column.setHeaderBackground(llColumnHeader) // カラムヘッダ文字色(A) - var c = column.getHeaderNameColor(activity) + var c = column.getHeaderNameColor() tvColumnName.textColor =c Styler.setIconAttr( activity, @@ -675,7 +675,7 @@ class ColumnViewHolder( Styler.setIconAttr(activity, btnColumnClose, R.attr.btn_close, c) // カラムヘッダ文字色(B) - c = column.getHeaderPageNumberColor(activity) + c = column.getHeaderPageNumberColor() tvColumnIndex.textColor =c tvColumnStatus.textColor =c @@ -692,7 +692,7 @@ class ColumnViewHolder( loadBackgroundImage(ivColumnBackgroundImage, column.column_bg_image) // エラー表示 - tvLoading.textColor = column.getContentColor(activity) + tvLoading.textColor = column.getContentColor() status_adapter?.findHeaderViewHolder(listView)?.showColor() } diff --git a/app/src/main/java/jp/juggler/subwaytooter/ItemViewHolder.kt b/app/src/main/java/jp/juggler/subwaytooter/ItemViewHolder.kt index 47fa3648..c9236747 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ItemViewHolder.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ItemViewHolder.kt @@ -399,7 +399,7 @@ internal class ItemViewHolder( removeExtraView() var c : Int - c = column.getContentColor(activity) + c = column.getContentColor() this.content_color = c tvBoosted.setTextColor(c) @@ -427,7 +427,7 @@ internal class ItemViewHolder( it.color = rgb or (alpha shl 24) } - c = column.getAcctColor(activity) + c = column.getAcctColor() log.d("acct_color %x", c) this.acct_color = c tvBoostedTime.setTextColor(c) diff --git a/app/src/main/java/jp/juggler/subwaytooter/Pref.kt b/app/src/main/java/jp/juggler/subwaytooter/Pref.kt index 97b8088d..09caef6e 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/Pref.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/Pref.kt @@ -387,6 +387,12 @@ object Pref { val ipTootColorDirectUser = IntPref("ipTootColorDirectUser", 0) val ipTootColorDirectMe = IntPref("ipTootColorDirectMe", 0) + val ipCcdHeaderBg = IntPref("ipCcdHeaderBg", 0) + val ipCcdHeaderFg = IntPref("ipCcdHeaderFg", 0) + val ipCcdContentBg = IntPref("ipCcdContentBg", 0) + val ipCcdContentAcct = IntPref("ipCcdContentAcct", 0) + val ipCcdContentText = IntPref("ipCcdContentText", 0) + // val ipTrendTagCountShowing = IntPref("TrendTagCountShowing", 0) // const val TTCS_WEEKLY = 0 // const val TTCS_DAILY = 1 diff --git a/app/src/main/java/jp/juggler/subwaytooter/StatusButtons.kt b/app/src/main/java/jp/juggler/subwaytooter/StatusButtons.kt index d0e20627..8f4313af 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/StatusButtons.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/StatusButtons.kt @@ -57,7 +57,7 @@ internal class StatusButtons( private val ivFollowedBy2 = holder.ivFollowedBy2 private val btnMore = holder.btnMore - private val color_normal = column.getContentColor(activity) + private val color_normal = column.getContentColor() private val color_accent : Int get() = Styler.getAttributeColor(activity, R.attr.colorImageButtonAccent) diff --git a/app/src/main/java/jp/juggler/subwaytooter/Styler.kt b/app/src/main/java/jp/juggler/subwaytooter/Styler.kt index 5dbe3d85..814adf6b 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/Styler.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/Styler.kt @@ -3,13 +3,17 @@ package jp.juggler.subwaytooter import android.content.Context import android.content.res.ColorStateList import android.graphics.Color +import android.graphics.ColorFilter import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter import android.graphics.drawable.* import android.graphics.drawable.shapes.RectShape import android.os.Build +import android.os.SystemClock import android.support.v4.content.ContextCompat import android.text.SpannableStringBuilder import android.text.Spanned +import android.util.SparseArray import android.view.View import android.view.ViewGroup import android.widget.ImageButton @@ -59,40 +63,136 @@ object Styler { ) } + ///////////////////////////////////////////////////////// + + private class ColorFilterCacheValue( + val filter : ColorFilter, + var lastUsed : Long + ) + + private val colorFilterCache = SparseArray() + private var colorFilterCacheLastSweep = 0L + + private fun createColorFilter(rgb : Int) : ColorFilter? { + synchronized(colorFilterCache) { + val now = SystemClock.elapsedRealtime() + val cacheValue = colorFilterCache[rgb] + if(cacheValue != null) { + cacheValue.lastUsed = now + return cacheValue.filter + } + + val size = colorFilterCache.size() + if(now - colorFilterCacheLastSweep >= 10000L && size >= 64) { + colorFilterCacheLastSweep = now + for(i in size - 1 downTo 0) { + val v = colorFilterCache.valueAt(i) + if(now - v.lastUsed >= 10000L) { + colorFilterCache.removeAt(i) + } + } + } + + val f = PorterDuffColorFilter(rgb, PorterDuff.Mode.SRC_ATOP) + colorFilterCache.put(rgb, ColorFilterCacheValue(f, now)) + return f + } + } + + ///////////////////////////////////////////////////////// + + private class ColoredDrawableCacheKey( + val drawableId : Int, + val rgb : Int, + val alpha : Int + ) { + + override fun equals(other : Any?) : Boolean { + return this === other || ( + other is ColoredDrawableCacheKey + && drawableId == other.drawableId + && rgb == other.rgb + && alpha == other.alpha + ) + } + + override fun hashCode() : Int { + return drawableId xor (rgb or (alpha shl 24)) + } + } + + private class ColoredDrawableCacheValue( + val drawable : Drawable, + var lastUsed : Long + ) + + private val coloredDrawableCache = HashMap() + private var coloredDrawableCacheLastSweep = 0L + fun createColoredDrawable( context : Context, drawableId : Int, color : Int, - alphaMultiplier: Float? = null + alphaMultiplier : Float? = null ) : Drawable { val rgb = (color and 0xffffff) or Color.BLACK - val alpha = if( alphaMultiplier ==null ){ + val alpha = if(alphaMultiplier == null) { (color ushr 24) - }else{ - clipRange(0,255,((color ushr 24).toFloat() * alphaMultiplier +0.5f ).toInt()) + } else { + clipRange(0, 255, ((color ushr 24).toFloat() * alphaMultiplier + 0.5f).toInt()) } - // 色指定が他のアイコンに影響しないようにする - // カラーフィルターとアルファ値を設定する - val d = ContextCompat.getDrawable(context, drawableId) !!.mutate() - d.setColorFilter(rgb, PorterDuff.Mode.SRC_ATOP) - d.alpha = alpha - - return d + val cacheKey = ColoredDrawableCacheKey(drawableId, rgb, alpha) + synchronized(coloredDrawableCache) { + val now = SystemClock.elapsedRealtime() + val cacheValue = coloredDrawableCache[cacheKey] + if(cacheValue != null) { + cacheValue.lastUsed = now + return cacheValue.drawable + } + + if(now - coloredDrawableCacheLastSweep >= 10000L && coloredDrawableCache.size >= 64) { + coloredDrawableCacheLastSweep = now + val it = coloredDrawableCache.entries.iterator() + while(it.hasNext()) { + val (_, v) = it.next() + if(now - v.lastUsed >= 10000L) { + it.remove() + } + } + } + + // 色指定が他のアイコンに影響しないようにする + // カラーフィルターとアルファ値を設定する + val d = ContextCompat.getDrawable(context, drawableId) !!.mutate() + d.colorFilter = createColorFilter(rgb) + d.alpha = alpha + coloredDrawableCache[cacheKey] = ColoredDrawableCacheValue(d, now) + return d + } } + ////////////////////////////////////////////////////////////////// + fun setIconDrawableId( context : Context, imageView : ImageView, drawableId : Int, color : Int? = null, - alphaMultiplier: Float? = null + alphaMultiplier : Float? = null ) { if(color == null) { // ImageViewにアイコンを設定する。デフォルトの色 imageView.setImageDrawable(ContextCompat.getDrawable(context, drawableId)) } else { - imageView.setImageDrawable(createColoredDrawable(context, drawableId, color,alphaMultiplier)) + imageView.setImageDrawable( + createColoredDrawable( + context, + drawableId, + color, + alphaMultiplier + ) + ) } } @@ -101,9 +201,15 @@ object Styler { imageView : ImageView, iconAttrId : Int, color : Int? = null, - alphaMultiplier: Float? = null + alphaMultiplier : Float? = null ) { - setIconDrawableId(context, imageView, getAttributeResourceId(context, iconAttrId), color,alphaMultiplier) + setIconDrawableId( + context, + imageView, + getAttributeResourceId(context, iconAttrId), + color, + alphaMultiplier + ) } fun getVisibilityIconAttr(isMisskeyData : Boolean, visibility : TootVisibility) : Int { @@ -222,7 +328,7 @@ object Styler { , relation : UserRelation , who : TootAccount , defaultColor : Int - ,alphaMultiplier : Float? = null + , alphaMultiplier : Float? = null ) { fun colorError() = Styler.getAttributeColor(context, R.attr.colorRegexFilterError) @@ -233,17 +339,35 @@ object Styler { relation.blocked_by -> { ivDot.visibility = View.VISIBLE - setIconDrawableId(context, ivDot, R.drawable.ic_blocked_by, color = colorError(),alphaMultiplier = alphaMultiplier) + setIconDrawableId( + context, + ivDot, + R.drawable.ic_blocked_by, + color = colorError(), + alphaMultiplier = alphaMultiplier + ) } relation.requested_by -> { ivDot.visibility = View.VISIBLE - setIconDrawableId(context, ivDot, R.drawable.ic_requested_by, color = colorError(),alphaMultiplier = alphaMultiplier) + setIconDrawableId( + context, + ivDot, + R.drawable.ic_requested_by, + color = colorError(), + alphaMultiplier = alphaMultiplier + ) } relation.followed_by -> { ivDot.visibility = View.VISIBLE - setIconAttr(context, ivDot, R.attr.ic_followed_by, color = colorAccent(),alphaMultiplier = alphaMultiplier) + setIconAttr( + context, + ivDot, + R.attr.ic_followed_by, + color = colorAccent(), + alphaMultiplier = alphaMultiplier + ) // 被フォローリクエスト状態の時に followed_by が 真と偽の両方がありえるようなので // Relationshipだけを見ても被フォローリクエスト状態は分からないっぽい // 仕方ないので馬鹿正直に「 followed_byが真ならバッジをつける」しかできない @@ -292,7 +416,7 @@ object Styler { } } - setIconAttr(context, ibFollow, icon_attr, color = color,alphaMultiplier = alphaMultiplier) + setIconAttr(context, ibFollow, icon_attr, color = color, alphaMultiplier = alphaMultiplier) ibFollow.contentDescription = contentDescription } diff --git a/app/src/main/java/jp/juggler/subwaytooter/ViewHolderHeaderProfile.kt b/app/src/main/java/jp/juggler/subwaytooter/ViewHolderHeaderProfile.kt index 33ad5dda..8b922db8 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ViewHolderHeaderProfile.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ViewHolderHeaderProfile.kt @@ -144,7 +144,7 @@ internal class ViewHolderHeaderProfile( tvCreated.textSize = f } - val contentColor = column.getContentColor(activity) + val contentColor = column.getContentColor() this.contentColor = contentColor tvMoved.textColor = contentColor @@ -164,7 +164,7 @@ internal class ViewHolderHeaderProfile( alphaMultiplier = Styler.boost_alpha ) - val acctColor = column.getAcctColor(activity) + val acctColor = column.getAcctColor() tvCreated.textColor = acctColor tvMovedAcct.textColor = acctColor @@ -407,11 +407,7 @@ internal class ViewHolderHeaderProfile( else -> acctLong } - val acct_color = when { - column.acct_color != 0 -> column.acct_color - else -> Styler.getAttributeColor(activity, R.attr.colorTimeSmall) - } - tv.setTextColor(if(AcctColor.hasColorForeground(ac)) ac.color_fg else acct_color) + tv.setTextColor(if(AcctColor.hasColorForeground(ac)) ac.color_fg else column.getAcctColor() ) if(AcctColor.hasColorBackground(ac)) { tv.setBackgroundColor(ac.color_bg) diff --git a/app/src/main/java/jp/juggler/subwaytooter/ViewHolderHeaderSearch.kt b/app/src/main/java/jp/juggler/subwaytooter/ViewHolderHeaderSearch.kt index 7b8d45f2..159f72e0 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ViewHolderHeaderSearch.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ViewHolderHeaderSearch.kt @@ -30,7 +30,7 @@ internal class ViewHolderHeaderSearch( val sv = DecodeOptions(activity, access_info,decodeEmoji = true).decodeHTML( html) tvSearchDesc.text = sv - tvSearchDesc.textColor = column.getContentColor(activity) + tvSearchDesc.textColor = column.getContentColor() } override fun onViewRecycled() { diff --git a/app/src/main/res/layout/act_app_setting.xml b/app/src/main/res/layout/act_app_setting.xml index 4ff4869c..9a675660 100644 --- a/app/src/main/res/layout/act_app_setting.xml +++ b/app/src/main/res/layout/act_app_setting.xml @@ -924,7 +924,6 @@ /> - + + + + @@ -1047,11 +1053,9 @@ - - @@ -1074,11 +1078,10 @@ - @@ -1101,11 +1104,9 @@ - - @@ -1128,6 +1129,8 @@ + + + + + + + + + + + + + + + + + + + + + + + + +