diff --git a/.idea/misc.xml b/.idea/misc.xml index f6899e2e..c727cda3 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -40,7 +40,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 8b5720e3..d84d0457 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ android { targetSdkVersion target_sdk_version minSdkVersion min_sdk_version - versionCode 361 - versionName "3.6.1" + versionCode 362 + versionName "3.6.2" applicationId "jp.juggler.subwaytooter" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt b/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt index eaf268eb..53f392be 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt @@ -150,6 +150,8 @@ class ActAccountSetting private lateinit var listFieldValueInvalidator : List private lateinit var btnFields : View + private lateinit var etMaxTootChars : EditText + /////////////////////////////////////////////////// internal var visibility = TootVisibility.Public @@ -296,6 +298,7 @@ class ActAccountSetting btnProfileHeader = findViewById(R.id.btnProfileHeader) etDisplayName = findViewById(R.id.etDisplayName) etDefaultText = findViewById(R.id.etDefaultText) + etMaxTootChars = findViewById(R.id.etMaxTootChars) btnDisplayName = findViewById(R.id.btnDisplayName) etNote = findViewById(R.id.etNote) btnNote = findViewById(R.id.btnNote) @@ -362,7 +365,7 @@ class ActAccountSetting name_invalidator = NetworkEmojiInvalidator(handler, etDisplayName) note_invalidator = NetworkEmojiInvalidator(handler, etNote) default_text_invalidator = NetworkEmojiInvalidator(handler, etDefaultText) - + listFieldNameInvalidator = listEtFieldName.map { NetworkEmojiInvalidator(handler, it) } @@ -393,6 +396,40 @@ class ActAccountSetting } }) + etMaxTootChars.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged( + s : CharSequence?, + start : Int, + count : Int, + after : Int + ) { + } + + override fun onTextChanged( + s : CharSequence?, + start : Int, + before : Int, + count : Int + ) { + } + + override fun afterTextChanged(s : Editable?) { + val num = etMaxTootChars.parseInt() + if( num != null && num >= 0){ + saveUIToData() + } + } + }) + + } + + private fun EditText.parseInt():Int?{ + val sv = this.text?.toString() ?: return null + return try{ + Integer.parseInt(sv,10) + }catch(ex:Throwable){ + null + } } private fun loadUIFromData(a : SavedAccount) { @@ -431,7 +468,8 @@ class ActAccountSetting notification_sound_uri = a.sound_uri etDefaultText.setText(a.default_text) - + etMaxTootChars.setText(a.max_toot_chars.toString()) + loading = false val enabled = ! a.isPseudo @@ -502,7 +540,14 @@ class ActAccountSetting account.confirm_unfavourite = cbConfirmUnfavourite.isChecked account.confirm_post = cbConfirmToot.isChecked account.default_text = etDefaultText.text.toString() - + + val num = etMaxTootChars.parseInt() + account.max_toot_chars = if( num != null && num >= 0){ + num + }else{ + 0 + } + account.saveSetting() } @@ -1303,7 +1348,7 @@ class ActAccountSetting private fun openPicker(permission_request_code : Int) { val permissionCheck = ContextCompat.checkSelfPermission( this, - android.Manifest.permission.WRITE_EXTERNAL_STORAGE + Manifest.permission.WRITE_EXTERNAL_STORAGE ) if(permissionCheck != PackageManager.PERMISSION_GRANTED) { preparePermission(permission_request_code) diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt b/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt index 4335b983..3fe2e5a3 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt @@ -844,9 +844,9 @@ class ActPost : AppCompatActivity(), val decodeOptions = DecodeOptions(this, mentionFullAcct = true) - var text : CharSequence = if( account.isMisskey){ + var text : CharSequence = if(account.isMisskey) { base_status.content ?: "" - }else{ + } else { decodeOptions.decodeHTML(base_status.content) } etContent.setText(text) @@ -1250,10 +1250,11 @@ class ActPost : AppCompatActivity(), } else -> { - val info = account.instance - // 情報がないか古いなら再取得 + // インスタンス情報を確認する + val info = account.instance if(info == null || System.currentTimeMillis() - info.time_parse >= 300000L) { + // 情報がないか古いなら再取得 // 同時に実行するタスクは1つまで var lastTask = lastInstanceTask @@ -1293,7 +1294,13 @@ class ActPost : AppCompatActivity(), if(max != null && max > 0) return max } } - return 500 + + // アカウント設定で指定した値があるならそれを使う + val forceMaxTootChars = account?.max_toot_chars + return when { + forceMaxTootChars != null && forceMaxTootChars > 0 -> forceMaxTootChars + else -> 500 + } } private fun updateTextCount() { diff --git a/app/src/main/java/jp/juggler/subwaytooter/App1.kt b/app/src/main/java/jp/juggler/subwaytooter/App1.kt index c45f74bb..cb8e8cbf 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/App1.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/App1.kt @@ -115,8 +115,8 @@ class App1 : Application() { // 2018/12/6 v317 35 => 36 ContentWarningテーブルの作り直し。 // 2019/6/4 v351 36 => 37 SavedAccount テーブルに項目追加。 // 2019/6/4 v351 37 => 38 SavedAccount テーブルに項目追加。 - - internal const val DB_VERSION = 38 + // 2019/8/12 v362 38 => 39 SavedAccount テーブルに項目追加。 + internal const val DB_VERSION = 39 private val tableList = arrayOf( LogData, diff --git a/app/src/main/java/jp/juggler/subwaytooter/table/SavedAccount.kt b/app/src/main/java/jp/juggler/subwaytooter/table/SavedAccount.kt index 7ca3bbac..d224546e 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/table/SavedAccount.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/table/SavedAccount.kt @@ -64,6 +64,8 @@ class SavedAccount( var default_sensitive = false var expand_cw = false + var max_toot_chars = 0 + private val refInstance = AtomicReference(null) // DBには保存しない @@ -158,6 +160,7 @@ class SavedAccount( this.default_sensitive = cursor.getBoolean(COL_DEFAULT_SENSITIVE) this.expand_cw = cursor.getBoolean(COL_EXPAND_CW) + this.max_toot_chars = cursor.getInt(COL_MAX_TOOT_CHARS) } @@ -219,6 +222,7 @@ class SavedAccount( cv.put(COL_DEFAULT_SENSITIVE, default_sensitive.b2i()) cv.put(COL_EXPAND_CW, expand_cw.b2i()) + cv.put(COL_MAX_TOOT_CHARS,max_toot_chars) // UIからは更新しない // notification_tag @@ -430,6 +434,7 @@ class SavedAccount( private const val COL_DEFAULT_SENSITIVE = "default_sensitive" private const val COL_EXPAND_CW = "expand_cw" + private const val COL_MAX_TOOT_CHARS = "max_toot_chars" ///////////////////////////////// // login information @@ -503,6 +508,9 @@ class SavedAccount( + ",$COL_DEFAULT_SENSITIVE integer default 0" + ",$COL_EXPAND_CW integer default 0" + // スキーマ39から + + ",$COL_MAX_TOOT_CHARS integer default 0" + + ")" ) db.execSQL("create index if not exists ${table}_user on ${table}(u)") @@ -663,6 +671,14 @@ class SavedAccount( } } + + if(oldVersion < 39 && newVersion >= 39) { + try { + db.execSQL("alter table $table add column $COL_MAX_TOOT_CHARS integer default 0") + } catch(ex : Throwable) { + log.trace(ex) + } + } } // 横断検索用の、何とも紐ついていないアカウント diff --git a/app/src/main/res/layout/act_account_setting.xml b/app/src/main/res/layout/act_account_setting.xml index 3fde1be2..19754d87 100644 --- a/app/src/main/res/layout/act_account_setting.xml +++ b/app/src/main/res/layout/act_account_setting.xml @@ -723,6 +723,24 @@ + + + + + + + + + + diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 8f0c2e08..911cbbe8 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -922,5 +922,6 @@ スイッチボタンの色 + 投稿の最大文字数(0:デフォルト。サーバがmax_toot_charsを提供する場合はこの設定は無視されます) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 85318b9c..00055c62 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -915,5 +915,6 @@ Top Bottom Switch button color + maximum character count in status (0:default. if server provides max_toot_chars, this setting is ignored.) \ No newline at end of file