diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt b/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt index 784b6129..eb9aa896 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt @@ -86,12 +86,18 @@ class ActAccountSetting private lateinit var tvInstance : TextView private lateinit var tvUser : TextView - private lateinit var btnAccessToken : View - private lateinit var btnInputAccessToken : View - private lateinit var btnAccountRemove : View + private lateinit var btnAccessToken : Button + private lateinit var btnInputAccessToken : Button + private lateinit var btnAccountRemove : Button + private lateinit var btnLoadPreference : Button + private lateinit var btnVisibility : Button + private lateinit var swNSFWOpen : Switch private lateinit var swDontShowTimeout : Switch + private lateinit var swExpandCW : Switch + private lateinit var swMarkSensitive : Switch + private lateinit var btnOpenBrowser : Button private lateinit var btnPushSubscription : Button private lateinit var cbNotificationMention : CheckBox @@ -253,9 +259,12 @@ class ActAccountSetting btnAccessToken = findViewById(R.id.btnAccessToken) btnInputAccessToken = findViewById(R.id.btnInputAccessToken) btnAccountRemove = findViewById(R.id.btnAccountRemove) + btnLoadPreference = findViewById(R.id.btnLoadPreference) btnVisibility = findViewById(R.id.btnVisibility) swNSFWOpen = findViewById(R.id.swNSFWOpen) swDontShowTimeout = findViewById(R.id.swDontShowTimeout) + swExpandCW = findViewById(R.id.swExpandCW) + swMarkSensitive = findViewById(R.id.swMarkSensitive) btnOpenBrowser = findViewById(R.id.btnOpenBrowser) btnPushSubscription = findViewById(R.id.btnPushSubscription) cbNotificationMention = findViewById(R.id.cbNotificationMention) @@ -309,6 +318,7 @@ class ActAccountSetting btnAccessToken.setOnClickListener(this) btnInputAccessToken.setOnClickListener(this) btnAccountRemove.setOnClickListener(this) + btnLoadPreference.setOnClickListener(this) btnVisibility.setOnClickListener(this) btnUserCustom.setOnClickListener(this) btnProfileAvatar.setOnClickListener(this) @@ -319,6 +329,8 @@ class ActAccountSetting swNSFWOpen.setOnCheckedChangeListener(this) swDontShowTimeout.setOnCheckedChangeListener(this) + swExpandCW.setOnCheckedChangeListener(this) + swMarkSensitive.setOnCheckedChangeListener(this) cbNotificationMention.setOnCheckedChangeListener(this) cbNotificationBoost.setOnCheckedChangeListener(this) cbNotificationFavourite.setOnCheckedChangeListener(this) @@ -392,6 +404,8 @@ class ActAccountSetting swNSFWOpen.isChecked = a.dont_hide_nsfw swDontShowTimeout.isChecked = a.dont_show_timeout + swExpandCW.isChecked = a.expand_cw + swMarkSensitive.isChecked = a.default_sensitive cbNotificationMention.isChecked = a.notification_mention cbNotificationBoost.isChecked = a.notification_boost cbNotificationFavourite.isChecked = a.notification_favourite @@ -444,7 +458,7 @@ class ActAccountSetting - updateVisibility() + showVisibility() showAcctColor() } @@ -464,6 +478,8 @@ class ActAccountSetting account.visibility = visibility account.dont_hide_nsfw = swNSFWOpen.isChecked account.dont_show_timeout = swDontShowTimeout.isChecked + account.expand_cw = swExpandCW.isChecked + account.default_sensitive = swMarkSensitive.isChecked account.notification_mention = cbNotificationMention.isChecked account.notification_boost = cbNotificationBoost.isChecked account.notification_favourite = cbNotificationFavourite.isChecked @@ -501,6 +517,7 @@ class ActAccountSetting R.id.btnInputAccessToken -> inputAccessToken() R.id.btnAccountRemove -> performAccountRemove() + R.id.btnLoadPreference -> performLoadPreference() R.id.btnVisibility -> performVisibility() R.id.btnOpenBrowser -> App1.openBrowser( this@ActAccountSetting, @@ -543,7 +560,7 @@ class ActAccountSetting } } - private fun updateVisibility() { + private fun showVisibility() { btnVisibility.text = Styler.getVisibilityString(this, account.isMisskey, visibility) } @@ -580,7 +597,7 @@ class ActAccountSetting .setItems(caption_list) { _, which -> if(which in 0 until list.size) { visibility = list[which] - updateVisibility() + showVisibility() saveUIToData() } } @@ -589,6 +606,60 @@ class ActAccountSetting } + private fun performLoadPreference() { + + TootTaskRunner(this).run(account, object : TootTask { + override fun background(client : TootApiClient) : TootApiResult? { + return client.request("/api/v1/preferences") + } + + override fun handleResult(result : TootApiResult?) { + result ?: return + + val json = result.jsonObject + if(json == null) { + showToast(this@ActAccountSetting, true, result.error) + return + } + + var bChanged = false + try { + loading = true + + val tmpVisibility = + TootVisibility.parseMastodon(json.parseString("posting:default:visibility")) + if(tmpVisibility != null) { + bChanged = true + visibility = tmpVisibility + showVisibility() + } + + val tmpDefaultSensitive = json.parseBoolean("posting:default:sensitive") + if(tmpDefaultSensitive != null) { + bChanged = true + swMarkSensitive.isChecked = tmpDefaultSensitive + } + + val tmpExpandMedia = json.parseString("reading:expand:media") + if(tmpExpandMedia?.isNotEmpty() == true) { + bChanged = true + swNSFWOpen.isChecked = (tmpExpandMedia == "show_all") + } + + val tmpExpandCW = json.parseBoolean("reading:expand:spoilers") + if(tmpExpandCW != null) { + bChanged = true + swExpandCW.isChecked = tmpExpandCW + } + + } finally { + loading = false + if(bChanged) saveUIToData() + } + } + }) + } + /////////////////////////////////////////////////// private fun performAccountRemove() { AlertDialog.Builder(this) diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActMain.kt b/app/src/main/java/jp/juggler/subwaytooter/ActMain.kt index 62ec89de..c02640ca 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActMain.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ActMain.kt @@ -146,6 +146,8 @@ class ActMain : AppCompatActivity() private lateinit var btnQuickTootMenu : ImageButton lateinit var post_helper : PostHelper + private var quickTootVisibility : TootVisibility = TootVisibility.AccountSetting + class PhoneEnv { internal lateinit var pager : MyViewPager internal lateinit var pager_adapter : ColumnPagerAdapter @@ -722,15 +724,25 @@ class ActMain : AppCompatActivity() } private val dlgQuickTootMenu = DlgQuickTootMenu(this, object : DlgQuickTootMenu.Callback { + + override var visibility : TootVisibility + get() = quickTootVisibility + set(value) { + if(value != quickTootVisibility) { + quickTootVisibility = value + pref.edit().put(Pref.spQuickTootVisibility, value.id.toString()).apply() + } + } + override fun onMacro(text : String) { val editable = etQuickToot.text - if(editable?.isNotEmpty() ==true) { + if(editable?.isNotEmpty() == true) { val start = etQuickToot.selectionStart val end = etQuickToot.selectionEnd editable.replace(start, end, text) etQuickToot.requestFocus() etQuickToot.setSelection(start + text.length) - }else{ + } else { etQuickToot.setText(text) etQuickToot.requestFocus() etQuickToot.setSelection(text.length) @@ -779,7 +791,12 @@ class ActMain : AppCompatActivity() post_helper.content = etQuickToot.text.toString().trim { it <= ' ' } post_helper.spoiler_text = null - post_helper.visibility = account.visibility + + post_helper.visibility = when(quickTootVisibility) { + TootVisibility.AccountSetting -> account.visibility + else -> quickTootVisibility + } + post_helper.bNSFW = false post_helper.in_reply_to_id = null post_helper.attachment_list = null @@ -1255,7 +1272,9 @@ class ActMain : AppCompatActivity() internal fun initUI() { setContentView(R.layout.act_main) - + quickTootVisibility = + TootVisibility.parseSavedVisibility(Pref.spQuickTootVisibility(pref)) + ?: quickTootVisibility Column.reloadDefaultColor(this, pref) @@ -1912,8 +1931,8 @@ class ActMain : AppCompatActivity() } val (r2, ti) = client.parseInstanceInformation(client.getInstanceInformation()) - if(ti==null) return r2 - val misskeyVersion = when{ + if(ti == null) return r2 + val misskeyVersion = when { ti.versionGE(TootInstance.MISSKEY_VERSION_11) -> 11 else -> 10 } @@ -1922,7 +1941,7 @@ class ActMain : AppCompatActivity() this.host = instance val client_name = Pref.spClientName(this@ActMain) - val result = client.authentication2Misskey(client_name, token,misskeyVersion) + val result = client.authentication2Misskey(client_name, token, misskeyVersion) this.ta = TootParser( this@ActMain , LinkHelper.newLinkHelper(instance, misskeyVersion = misskeyVersion) @@ -2071,8 +2090,6 @@ class ActMain : AppCompatActivity() // アカウント追加時 val user = ta.username + "@" + host - - val row_id = SavedAccount.insert( host, user, diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt b/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt index 50c38276..82e52d17 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt @@ -678,6 +678,8 @@ class ActPost : AppCompatActivity(), appendContentText(account?.default_text, selectBefore = true) + cbNSFW.isChecked = account?.default_sensitive ?: false + // 再編集 sv = intent.getStringExtra(KEY_REDRAFT_STATUS) if(sv != null && account != null) { @@ -708,6 +710,10 @@ class ActPost : AppCompatActivity(), } } + if( this.attachment_list.isNotEmpty() ) { + cbNSFW.isChecked = base_status.sensitive == true + } + // 再編集の場合はdefault_textは反映されない val decodeOptions = DecodeOptions(this) @@ -722,7 +728,7 @@ class ActPost : AppCompatActivity(), etContentWarning.setText(text) etContentWarning.setSelection(text.length) cbContentWarning.isChecked = text.isNotEmpty() - cbNSFW.isChecked = base_status.sensitive == true + val src_enquete = base_status.enquete val src_items = src_enquete?.items @@ -790,7 +796,6 @@ class ActPost : AppCompatActivity(), } else { cbContentWarning.isChecked = false } - cbNSFW.isChecked = item.sensitive visibility = item.visibility // 2019/1/7 どうも添付データを古い投稿から引き継げないようだ…。 @@ -812,6 +817,9 @@ class ActPost : AppCompatActivity(), log.trace(ex) } } + if( this.attachment_list.isNotEmpty()) { + cbNSFW.isChecked = item.sensitive + } } } catch(ex : Throwable) { log.trace(ex) diff --git a/app/src/main/java/jp/juggler/subwaytooter/App1.kt b/app/src/main/java/jp/juggler/subwaytooter/App1.kt index 5b61714f..c45f74bb 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/App1.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/App1.kt @@ -113,8 +113,10 @@ class App1 : Application() { // 2018/10/31 v296 33 => 34 UserRelationMisskey に blocked_by を追加 // 2018/10/31 v296 34 => 35 UserRelationMisskey に requested_by を追加 // 2018/12/6 v317 35 => 36 ContentWarningテーブルの作り直し。 - - internal const val DB_VERSION = 36 + // 2019/6/4 v351 36 => 37 SavedAccount テーブルに項目追加。 + // 2019/6/4 v351 37 => 38 SavedAccount テーブルに項目追加。 + + internal const val DB_VERSION = 38 private val tableList = arrayOf( LogData, diff --git a/app/src/main/java/jp/juggler/subwaytooter/ItemViewHolder.kt b/app/src/main/java/jp/juggler/subwaytooter/ItemViewHolder.kt index 8f39949e..062565ea 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ItemViewHolder.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ItemViewHolder.kt @@ -563,7 +563,7 @@ internal class ItemViewHolder( llContentWarning.visibility = View.VISIBLE tvContentWarning.text = decoded_spoiler_text spoiler_invalidator.register(decoded_spoiler_text) - val cw_shown = ContentWarning.isShown(item.uri, false) + val cw_shown = ContentWarning.isShown(item.uri, access_info.expand_cw) showContent(cw_shown) } @@ -1272,7 +1272,7 @@ internal class ItemViewHolder( llContentWarning.visibility = View.VISIBLE tvContentWarning.text = status.decoded_spoiler_text spoiler_invalidator.register(status.decoded_spoiler_text) - val cw_shown = ContentWarning.isShown(status, false) + val cw_shown = ContentWarning.isShown(status, access_info.expand_cw) showContent(cw_shown) } @@ -1281,7 +1281,7 @@ internal class ItemViewHolder( llContentWarning.visibility = View.VISIBLE tvContentWarning.text = r.decoded_spoiler_text spoiler_invalidator.register(r.decoded_spoiler_text) - val cw_shown = ContentWarning.isShown(status, false) + val cw_shown = ContentWarning.isShown(status, access_info.expand_cw) showContent(cw_shown) } diff --git a/app/src/main/java/jp/juggler/subwaytooter/Pref.kt b/app/src/main/java/jp/juggler/subwaytooter/Pref.kt index 3350cd9f..76655f64 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/Pref.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/Pref.kt @@ -491,6 +491,7 @@ object Pref { val spTimeZone = StringPref("TimeZone","") val spQuickTootMacro = StringPref("QuickTootMacro","") + val spQuickTootVisibility = StringPref("QuickTootVisibility","") // long val lpTabletTootDefaultAccount = LongPref("tablet_toot_default_account", - 1L) diff --git a/app/src/main/java/jp/juggler/subwaytooter/Styler.kt b/app/src/main/java/jp/juggler/subwaytooter/Styler.kt index d6ce199b..690d25e1 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/Styler.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/Styler.kt @@ -38,6 +38,7 @@ object Styler { TootVisibility.DirectSpecified -> R.drawable.ic_mail TootVisibility.DirectPrivate -> R.drawable.ic_lock TootVisibility.WebSetting -> R.drawable.ic_question + TootVisibility.AccountSetting -> R.drawable.ic_question TootVisibility.LocalPublic -> R.drawable.ic_local_ltl TootVisibility.LocalHome -> R.drawable.ic_local_home @@ -51,6 +52,7 @@ object Styler { TootVisibility.DirectSpecified -> R.drawable.ic_mail TootVisibility.DirectPrivate -> R.drawable.ic_mail TootVisibility.WebSetting -> R.drawable.ic_question + TootVisibility.AccountSetting -> R.drawable.ic_question TootVisibility.LocalPublic -> R.drawable.ic_local_ltl TootVisibility.LocalHome -> R.drawable.ic_local_lock_open @@ -79,6 +81,7 @@ object Styler { TootVisibility.DirectSpecified -> R.string.visibility_direct TootVisibility.DirectPrivate -> R.string.visibility_private TootVisibility.WebSetting -> R.string.visibility_web_setting + TootVisibility.AccountSetting-> R.string.visibility_account_setting TootVisibility.LocalPublic -> R.string.visibility_local_public TootVisibility.LocalHome -> R.string.visibility_local_home @@ -91,6 +94,7 @@ object Styler { TootVisibility.DirectSpecified -> R.string.visibility_direct TootVisibility.DirectPrivate -> R.string.visibility_direct TootVisibility.WebSetting -> R.string.visibility_web_setting + TootVisibility.AccountSetting-> R.string.visibility_account_setting TootVisibility.LocalPublic -> R.string.visibility_local_public TootVisibility.LocalHome -> R.string.visibility_local_unlisted diff --git a/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootVisibility.kt b/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootVisibility.kt index babf2213..7364af85 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootVisibility.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootVisibility.kt @@ -9,7 +9,10 @@ enum class TootVisibility( ) { // IDは下書き保存などで永続化するので、リリース後は変更しないこと! - + + // アカウント設定に合わせる。 + AccountSetting(-1, 200, strMastodon = "account_setting", strMisskey = "account_setting"), + // WebUIの設定に合わせる。 WebSetting(0, 100, strMastodon = "web_setting", strMisskey = "web_setting"), diff --git a/app/src/main/java/jp/juggler/subwaytooter/dialog/DlgQuickTootMenu.kt b/app/src/main/java/jp/juggler/subwaytooter/dialog/DlgQuickTootMenu.kt index ef3b3c04..6503c748 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/dialog/DlgQuickTootMenu.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/dialog/DlgQuickTootMenu.kt @@ -1,25 +1,23 @@ package jp.juggler.subwaytooter.dialog import android.annotation.SuppressLint +import android.app.AlertDialog import android.app.Dialog import android.view.View import android.view.WindowManager import android.widget.Button import android.widget.EditText -import jp.juggler.subwaytooter.ActMain -import jp.juggler.subwaytooter.Pref -import jp.juggler.subwaytooter.R -import jp.juggler.subwaytooter.put import jp.juggler.util.dismissSafe import java.lang.ref.WeakReference import android.view.Gravity - - +import jp.juggler.subwaytooter.* +import jp.juggler.subwaytooter.api.entity.TootVisibility class DlgQuickTootMenu( internal val activity : ActMain, internal val callback : Callback -) { +) : View.OnClickListener { + companion object { val etTextIds = arrayOf( R.id.etText0, @@ -37,10 +35,22 @@ class DlgQuickTootMenu( R.id.btnText4, R.id.btnText5 ) + + val visibilityList = arrayOf( + TootVisibility.AccountSetting, + TootVisibility.WebSetting, + TootVisibility.Public, + TootVisibility.UnlistedHome, + TootVisibility.PrivateFollowers, + TootVisibility.DirectSpecified + ) + } interface Callback { fun onMacro(text:String) + + var visibility : TootVisibility } var dialogRef : WeakReference? = null @@ -55,17 +65,13 @@ class DlgQuickTootMenu( } val etText = arrayOfNulls(6) + private lateinit var btnVisibility :Button @SuppressLint("InflateParams") fun show(){ val view = activity.layoutInflater.inflate(R.layout.dlg_quick_toot_menu, null, false) - view.findViewById