From d8005577966689bc889dec84930654db587c6d3d Mon Sep 17 00:00:00 2001 From: tateisu Date: Tue, 31 May 2022 23:39:22 +0900 Subject: [PATCH] =?UTF-8?q?=E6=8A=95=E7=A8=BF=E7=94=BB=E9=9D=A2=E3=81=AB?= =?UTF-8?q?=E8=A8=80=E8=AA=9E=E9=81=B8=E6=8A=9E=E3=82=92=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E3=80=82=E8=A8=80=E8=AA=9E=E9=81=B8=E6=8A=9E=E3=81=AE=E5=80=99?= =?UTF-8?q?=E8=A3=9C=E3=81=AB=E3=80=8CWeb=E8=A8=AD=E5=AE=9A=E3=82=92?= =?UTF-8?q?=E4=BD=BF=E3=81=86=E3=80=8D=E3=82=92=E8=BF=BD=E5=8A=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + .../juggler/subwaytooter/ActAccountSetting.kt | 24 ++------- .../java/jp/juggler/subwaytooter/ActPost.kt | 12 +++++ .../subwaytooter/actmain/ActMainQuickPost.kt | 1 + .../subwaytooter/actpost/ActPostAccount.kt | 4 ++ .../subwaytooter/actpost/ActPostExtra.kt | 26 +++++++--- .../subwaytooter/table/SavedAccount.kt | 44 +++++++--------- .../jp/juggler/subwaytooter/util/PostImpl.kt | 12 ++++- .../juggler/subwaytooter/util/PostLanguage.kt | 24 +++++++++ app/src/main/java/jp/juggler/util/Json.kt | 1 + .../main/java/jp/juggler/util/JsonDelegate.kt | 50 +++++++++++++++++++ .../main/java/jp/juggler/util/JsonProperty.kt | 32 ------------ app/src/main/res/layout/act_post.xml | 23 ++++++++- app/src/main/res/values-ja/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 15 files changed, 172 insertions(+), 87 deletions(-) create mode 100644 app/src/main/java/jp/juggler/subwaytooter/util/PostLanguage.kt create mode 100644 app/src/main/java/jp/juggler/util/JsonDelegate.kt delete mode 100644 app/src/main/java/jp/juggler/util/JsonProperty.kt diff --git a/.gitignore b/.gitignore index d8bec687..3c64d6e0 100644 --- a/.gitignore +++ b/.gitignore @@ -128,3 +128,5 @@ _Emoji/*.log _Emoji/*.txt detektReport/ + +.idea/deploymentTargetDropDown.xml diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt b/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt index fd5843f2..41f2baaa 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt @@ -37,10 +37,7 @@ import jp.juggler.subwaytooter.pref.PrefB import jp.juggler.subwaytooter.pref.PrefS import jp.juggler.subwaytooter.table.AcctColor import jp.juggler.subwaytooter.table.SavedAccount -import jp.juggler.subwaytooter.util.DecodeOptions -import jp.juggler.subwaytooter.util.EmojiDecoder -import jp.juggler.subwaytooter.util.NetworkEmojiInvalidator -import jp.juggler.subwaytooter.util.openBrowser +import jp.juggler.subwaytooter.util.* import jp.juggler.util.* import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString @@ -152,20 +149,7 @@ class ActAccountSetting : AppCompatActivity(), View.OnClickListener, internal var visibility = TootVisibility.Public private val languages by lazy { - ArrayList>().apply { - add(Pair("", getString(R.string.device_language))) - val nameMap = HashMap() - addAll( - Locale.getAvailableLocales().mapNotNull { locale -> - locale.language.takeIf { it.length == 2 || it.contains('-') } - ?.also { code -> nameMap[code] = "$code ${locale.displayLanguage}" } - } - .toSet() - .toList() - .sorted() - .map { Pair(it, nameMap[it]!!) } - ) - } + loadLanguageList() } /////////////////////////////////////////////////////////////////// @@ -610,8 +594,8 @@ class ActAccountSetting : AppCompatActivity(), View.OnClickListener, account.movieTranscodeBitrate = etMovieBitrate.text.toString() account.movieTranscodeFramerate = etMovieFrameRate.text.toString() account.movieTranscodeSquarePixels = etMovieSquarePixels.text.toString() - account.lang = - languages.elementAtOrNull(spLanguageCode.selectedItemPosition)?.first ?: "" + account.lang = languages.elementAtOrNull(spLanguageCode.selectedItemPosition)?.first + ?: SavedAccount.LANG_WEB } account.saveSetting() diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt b/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt index 98327ff2..371d5158 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt @@ -110,6 +110,10 @@ class ActPost : AppCompatActivity(), var density: Float = 0f + val languages by lazy{ + loadLanguageList() + } + private lateinit var progressChannel: Channel /////////////////////////////////////////////////// @@ -434,5 +438,13 @@ class ActPost : AppCompatActivity(), views.etContent.contentMineTypeArray = AttachmentUploader.acceptableMimeTypes.toTypedArray() views.etContent.contentCallback = { addAttachment(it) } + + views.spLanguage.adapter =ArrayAdapter( + this, + android.R.layout.simple_spinner_item, + languages.map { it.second }.toTypedArray() + ).apply { + setDropDownViewResource(R.layout.lv_spinner_dropdown) + } } } diff --git a/app/src/main/java/jp/juggler/subwaytooter/actmain/ActMainQuickPost.kt b/app/src/main/java/jp/juggler/subwaytooter/actmain/ActMainQuickPost.kt index 1816b15a..e475de33 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/actmain/ActMainQuickPost.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/actmain/ActMainQuickPost.kt @@ -131,6 +131,7 @@ fun ActMain.performQuickPost(account: SavedAccount?) { editStatusId = null, emojiMapCustom = App1.custom_emoji_lister.getMapNonBlocking(account), useQuoteToot = false, + lang = account.lang, ).runSuspend() if (postResult is PostResult.Normal) { diff --git a/app/src/main/java/jp/juggler/subwaytooter/actpost/ActPostAccount.kt b/app/src/main/java/jp/juggler/subwaytooter/actpost/ActPostAccount.kt index 5d8f35ac..17e80537 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/actpost/ActPostAccount.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/actpost/ActPostAccount.kt @@ -9,12 +9,14 @@ import jp.juggler.subwaytooter.table.AcctColor import jp.juggler.subwaytooter.table.SavedAccount import jp.juggler.util.* import org.jetbrains.anko.textColor +import kotlin.math.max private val log = LogCategory("ActPostAccount") fun ActPost.selectAccount(a: SavedAccount?) { this.account = a + completionHelper.setInstance(a) if (a == null) { @@ -28,6 +30,8 @@ fun ActPost.selectAccount(a: SavedAccount?) { App1.custom_emoji_lister.getList(a) } + views.spLanguage.setSelection(max(0,languages.indexOfFirst { it.first == a.lang})) + val ac = AcctColor.load(a) views.btnAccount.text = ac.nickname diff --git a/app/src/main/java/jp/juggler/subwaytooter/actpost/ActPostExtra.kt b/app/src/main/java/jp/juggler/subwaytooter/actpost/ActPostExtra.kt index 9feda9e7..20aec5c5 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/actpost/ActPostExtra.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/actpost/ActPostExtra.kt @@ -4,14 +4,22 @@ import android.content.Intent import android.net.Uri import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity -import jp.juggler.subwaytooter.* +import jp.juggler.subwaytooter.ActMain +import jp.juggler.subwaytooter.ActPost +import jp.juggler.subwaytooter.App1 +import jp.juggler.subwaytooter.R import jp.juggler.subwaytooter.actmain.onCompleteActPost -import jp.juggler.subwaytooter.api.entity.* +import jp.juggler.subwaytooter.api.entity.TootPollsType +import jp.juggler.subwaytooter.api.entity.TootVisibility +import jp.juggler.subwaytooter.api.entity.unknownHostAndDomain import jp.juggler.subwaytooter.dialog.ActionsDialog import jp.juggler.subwaytooter.pref.PrefB import jp.juggler.subwaytooter.table.PostDraft import jp.juggler.subwaytooter.table.SavedAccount -import jp.juggler.subwaytooter.util.* +import jp.juggler.subwaytooter.util.DecodeOptions +import jp.juggler.subwaytooter.util.PostAttachment +import jp.juggler.subwaytooter.util.PostImpl +import jp.juggler.subwaytooter.util.PostResult import jp.juggler.util.* private val log = LogCategory("ActPostExtra") @@ -316,7 +324,7 @@ fun ActPost.performPost() { } } - val postResult = PostImpl( + val postResult = PostImpl( activity = activity, account = account, content = views.etContent.text.toString().trim { it <= ' ' }, @@ -339,9 +347,11 @@ fun ActPost.performPost() { editStatusId = states.editStatusId, emojiMapCustom = App1.custom_emoji_lister.getMapNonBlocking(account), useQuoteToot = views.cbQuote.isChecked, + lang = languages.elementAtOrNull(views.spLanguage.selectedItemPosition)?.first + ?: SavedAccount.LANG_WEB ).runSuspend() - when(postResult){ - is PostResult.Normal ->{ + when (postResult) { + is PostResult.Normal -> { val data = Intent() data.putExtra(ActPost.EXTRA_POSTED_ACCT, postResult.targetAccount.acct.ascii) postResult.status.id.putTo(data, ActPost.EXTRA_POSTED_STATUS_ID) @@ -363,10 +373,10 @@ fun ActPost.performPost() { this@performPost.finish() } } - is PostResult.Scheduled ->{ + is PostResult.Scheduled -> { showToast(false, getString(R.string.scheduled_status_sent)) val data = Intent() - data.putExtra(ActPost.EXTRA_POSTED_ACCT,postResult. targetAccount.acct.ascii) + data.putExtra(ActPost.EXTRA_POSTED_ACCT, postResult.targetAccount.acct.ascii) if (isMultiWindowPost) { resetText() 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 e8937af7..2e9fcf45 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/table/SavedAccount.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/table/SavedAccount.kt @@ -15,7 +15,6 @@ import jp.juggler.subwaytooter.notification.PollingWorker import jp.juggler.subwaytooter.util.LinkHelper import jp.juggler.util.* import java.util.* -import kotlin.collections.ArrayList import kotlin.math.max class SavedAccount( @@ -88,33 +87,25 @@ class SavedAccount( private val extraJson = JsonObject() - var movieTranscodeMode: Int by JsonProperty( - extraJson, - "movieTranscodeMode", - 0) + private val jsonDelegates = JsonDelegates(extraJson) - var movieTranscodeBitrate: String by JsonProperty( - extraJson, - "movieTranscodeBitrate", - "2000000") - var movieTranscodeFramerate: String by JsonProperty( - extraJson, - "movieTranscodeFramerate", - "30") - var movieTranscodeSquarePixels: String by JsonProperty( - extraJson, - "movieTranscodeSquarePixels", - "2304000") + @JsonPropInt("movieTranscodeMode", 0) + var movieTranscodeMode by jsonDelegates.int - var lang: String by JsonProperty( - extraJson, - "lang", - "") + @JsonPropString("movieTranscodeBitrate", "2000000") + var movieTranscodeBitrate by jsonDelegates.string - var notification_status_reference: Boolean by JsonProperty( - extraJson, - "notification_status_reference", - true) + @JsonPropString("movieTranscodeFramerate", "30") + var movieTranscodeFramerate by jsonDelegates.string + + @JsonPropString("movieTranscodeSquarePixels", "2304000") + var movieTranscodeSquarePixels by jsonDelegates.string + + @JsonPropString("lang2", LANG_WEB) + var lang by jsonDelegates.string + + @JsonPropBoolean("notification_status_reference", true) + var notification_status_reference by jsonDelegates.boolean init { val tmpAcct = Acct.parse(acctArg) @@ -601,6 +592,9 @@ class SavedAccount( } } + const val LANG_WEB = "(web)" + const val LANG_DEVICE = "(device)" + private const val REGISTER_KEY_UNREGISTERED = "unregistered" fun clearRegistrationCache() { diff --git a/app/src/main/java/jp/juggler/subwaytooter/util/PostImpl.kt b/app/src/main/java/jp/juggler/subwaytooter/util/PostImpl.kt index 6fc27ff3..a8b71ebc 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/util/PostImpl.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/util/PostImpl.kt @@ -55,6 +55,7 @@ class PostImpl( val editStatusId: EntityId?, val emojiMapCustom: HashMap?, var useQuoteToot: Boolean, + var lang : String, ) { companion object { private val log = LogCategory("PostImpl") @@ -283,7 +284,16 @@ class PostImpl( private fun encodeParamsMastodon(json: JsonObject, instance: TootInstance) { - json["language"] = account.lang.notBlank() ?: Locale.getDefault().language + when(val lang = lang.trim()){ + // Web設定に従うなら指定しない + SavedAccount.LANG_WEB,"" -> Unit + // 端末の言語コード + SavedAccount.LANG_DEVICE-> + json["language"] = Locale.getDefault().language + // その他 + else-> + json["language"] = lang + } visibilityChecked?.let { json["visibility"] = it.strMastodon } diff --git a/app/src/main/java/jp/juggler/subwaytooter/util/PostLanguage.kt b/app/src/main/java/jp/juggler/subwaytooter/util/PostLanguage.kt new file mode 100644 index 00000000..e55c960b --- /dev/null +++ b/app/src/main/java/jp/juggler/subwaytooter/util/PostLanguage.kt @@ -0,0 +1,24 @@ +package jp.juggler.subwaytooter.util + +import android.content.Context +import jp.juggler.subwaytooter.R +import jp.juggler.subwaytooter.table.SavedAccount +import java.util.* + +// 言語コードと表示文字列のペアのリストを返す +fun Context.loadLanguageList() = + ArrayList>().apply { + add(Pair(SavedAccount.LANG_WEB, getString(R.string.use_web_settings))) + add(Pair(SavedAccount.LANG_DEVICE, getString(R.string.device_language))) + val nameMap = HashMap() + addAll( + Locale.getAvailableLocales().mapNotNull { locale -> + locale.language.takeIf { it.length == 2 || it.contains('-') } + ?.also { code -> nameMap[code] = "$code ${locale.displayLanguage}" } + } + .toSet() + .toList() + .sorted() + .map { Pair(it, nameMap[it]!!) } + ) + } diff --git a/app/src/main/java/jp/juggler/util/Json.kt b/app/src/main/java/jp/juggler/util/Json.kt index 71f8b2a9..6bb68237 100644 --- a/app/src/main/java/jp/juggler/util/Json.kt +++ b/app/src/main/java/jp/juggler/util/Json.kt @@ -12,6 +12,7 @@ class JsonException : RuntimeException { private const val CHAR0 = '\u0000' +@Suppress("RegExpUnnecessaryNonCapturingGroup") private val reDecimal = """(?:\A-0\z)|[.eE]""".toRegex() // Tests if the value should be tried as a decimal. diff --git a/app/src/main/java/jp/juggler/util/JsonDelegate.kt b/app/src/main/java/jp/juggler/util/JsonDelegate.kt new file mode 100644 index 00000000..3c3bfa65 --- /dev/null +++ b/app/src/main/java/jp/juggler/util/JsonDelegate.kt @@ -0,0 +1,50 @@ +package jp.juggler.util + +import kotlin.reflect.KProperty +import kotlin.reflect.full.findAnnotation + +private interface JsonAnnotationBase :Annotation +annotation class JsonPropInt(val key:String,val defVal:Int) +annotation class JsonPropString(val key:String,val defVal:String) +annotation class JsonPropBoolean(val key:String,val defVal:Boolean) + +class JsonDelegate(val parent: JsonDelegates) + +class JsonDelegates(val src: JsonObject){ + val int = JsonDelegate(this) + val string = JsonDelegate(this) + val boolean = JsonDelegate(this) +} + +private fun getMetaString(property: KProperty<*>) = + property.findAnnotation() + ?: error("${property.name}, required=String, defined=(missing)") + +operator fun JsonDelegate.getValue(thisRef: Any?, property: KProperty<*>): String = + getMetaString(property).let { parent.src.string(it.key) ?: it.defVal } + +operator fun JsonDelegate.setValue(thisRef: Any?, property: KProperty<*>, value: String) { + getMetaString(property).let { parent.src[it.key] = value } +} + +private fun getMetaInt(property: KProperty<*>) = + property.findAnnotation() + ?: error("${property.name}, required=Int, defined=(missing)") + +operator fun JsonDelegate.getValue(thisRef: Any?, property: KProperty<*>): Int = + getMetaInt(property).let { parent.src.int(it.key) ?: it.defVal } + +operator fun JsonDelegate.setValue(thisRef: Any?, property: KProperty<*>, value: Int) { + getMetaInt(property).let { parent.src[it.key] = value } +} + +private fun getMetaBoolean(property: KProperty<*>) = + property.findAnnotation() + ?: error("${property.name}, required=Boolean, defined=(missing)") + +operator fun JsonDelegate.getValue(thisRef: Any?, property: KProperty<*>): Boolean = + getMetaBoolean(property).let { parent.src.boolean(it.key) ?: it.defVal } + +operator fun JsonDelegate.setValue(thisRef: Any?, property: KProperty<*>, value: Boolean) { + getMetaBoolean(property).let { parent.src[it.key] = value } +} diff --git a/app/src/main/java/jp/juggler/util/JsonProperty.kt b/app/src/main/java/jp/juggler/util/JsonProperty.kt deleted file mode 100644 index 4ff6324c..00000000 --- a/app/src/main/java/jp/juggler/util/JsonProperty.kt +++ /dev/null @@ -1,32 +0,0 @@ -package jp.juggler.util - -import kotlin.reflect.KProperty - -class JsonProperty( - val src: JsonObject, - val key: String, - val defVal: ValueType, -) - -operator fun JsonProperty.getValue(thisRef: Any?, property: KProperty<*>): String { - return src.string(key) ?: defVal -} - -operator fun JsonProperty.setValue(thisRef: Any?, property: KProperty<*>, value: String) { - src[key] = value -} - -operator fun JsonProperty.getValue(thisRef: Any?, property: KProperty<*>): Int { - return src.int(key) ?: defVal -} - -operator fun JsonProperty.setValue(thisRef: Any?, property: KProperty<*>, value: Int) { - src[key] = value -} -operator fun JsonProperty.getValue(thisRef: Any?, property: KProperty<*>): Boolean { - return src.boolean(key) ?: defVal -} - -operator fun JsonProperty.setValue(thisRef: Any?, property: KProperty<*>, value: Boolean) { - src[key] = value -} diff --git a/app/src/main/res/layout/act_post.xml b/app/src/main/res/layout/act_post.xml index 2163deca..14f0bb56 100644 --- a/app/src/main/res/layout/act_post.xml +++ b/app/src/main/res/layout/act_post.xml @@ -209,7 +209,7 @@ android:layout_gravity="bottom" android:layout_marginTop="8dp" android:layout_weight="1" - android:text="@string/status" /> + android:text="@string/content" /> + + + + + + + カスタム: %1$s その他 Misskeyは添付データの重複を許可していません。 + Web設定を使う + 本文 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b9a7cba0..dcb17fdd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1156,4 +1156,6 @@ Custom: %1$s Others Misskey does not allow duplicate in attachments. + (Use web setting) + Content