From 4f43dba3c46cd93edd48a05ed1547bc9e04918e1 Mon Sep 17 00:00:00 2001 From: tateisu Date: Sun, 23 Jun 2019 23:58:53 +0900 Subject: [PATCH] =?UTF-8?q?Misskey=E3=81=A7=E9=9F=B3=E5=A3=B0=E3=82=A2?= =?UTF-8?q?=E3=83=83=E3=83=97=E3=83=AD=E3=83=BC=E3=83=89=E5=AE=8C=E4=BA=86?= =?UTF-8?q?=E5=BE=8C=E3=81=AB=E8=A1=A8=E7=A4=BA=E3=81=8C=E5=A4=89=E3=82=8F?= =?UTF-8?q?=E3=82=89=E3=81=AA=E3=81=84=E5=95=8F=E9=A1=8C=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 2 +- .../jp/juggler/subwaytooter/ActMediaViewer.kt | 19 ++++--- .../java/jp/juggler/subwaytooter/ActPost.kt | 43 ++++++++------- .../jp/juggler/subwaytooter/ItemViewHolder.kt | 10 ++-- .../subwaytooter/api/entity/TootAttachment.kt | 53 ++++++++++++------- .../api/entity/TootAttachmentLike.kt | 27 ++++++---- .../api/entity/TootAttachmentMSP.kt | 4 +- app/src/main/res/drawable/ic_clip.xml | 9 ++++ .../{ic_attachment.xml => ic_image.xml} | 0 .../{ic_unknown.xml => ic_videocam.xml} | 2 +- app/src/main/res/layout/act_post.xml | 2 +- 11 files changed, 101 insertions(+), 70 deletions(-) create mode 100644 app/src/main/res/drawable/ic_clip.xml rename app/src/main/res/drawable/{ic_attachment.xml => ic_image.xml} (100%) rename app/src/main/res/drawable/{ic_unknown.xml => ic_videocam.xml} (63%) 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/src/main/java/jp/juggler/subwaytooter/ActMediaViewer.kt b/app/src/main/java/jp/juggler/subwaytooter/ActMediaViewer.kt index 268ea418..58639e41 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActMediaViewer.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ActMediaViewer.kt @@ -311,12 +311,17 @@ class ActMediaViewer : AppCompatActivity(), View.OnClickListener { } when(ta.type) { - TootAttachmentLike.TYPE_IMAGE -> loadBitmap(ta) - TootAttachmentLike.TYPE_VIDEO, - TootAttachmentLike.TYPE_GIFV, - TootAttachmentLike.TYPE_AUDIO -> loadVideo(ta, state) - // maybe TYPE_UNKNOWN - else -> showError(getString(R.string.media_attachment_type_error, ta.type)) + + TootAttachmentType.Unknown -> + showError(getString(R.string.media_attachment_type_error, ta.type.id)) + + TootAttachmentType.Image -> + loadBitmap(ta) + + TootAttachmentType.Video, + TootAttachmentType.GIFV, + TootAttachmentType.Audio -> + loadVideo(ta, state) } } @@ -358,7 +363,7 @@ class ActMediaViewer : AppCompatActivity(), View.OnClickListener { exoPlayer.prepare(mediaSource) exoPlayer.repeatMode = when(ta.type) { - TootAttachmentLike.TYPE_VIDEO -> Player.REPEAT_MODE_OFF + TootAttachmentType.Video -> Player.REPEAT_MODE_OFF // GIFV or AUDIO else -> Player.REPEAT_MODE_ALL } diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt b/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt index deb00d73..9702e335 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt @@ -1456,21 +1456,20 @@ class ActPost : AppCompatActivity(), a == null || pa.status != PostAttachment.STATUS_UPLOADED -> { iv.setDefaultImage(defaultColorIcon(this, R.drawable.ic_upload)) - iv.setErrorImage(defaultColorIcon(this, R.drawable.ic_unknown)) + iv.setErrorImage(defaultColorIcon(this, R.drawable.ic_clip)) iv.setImageUrl(pref, Styler.calcIconRound(iv.layoutParams.width), null) } - else -> { - iv.setDefaultImage(defaultColorIcon(this, R.drawable.ic_upload)) - iv.setErrorImage( - defaultColorIcon( - this, - when { - a.isAudio -> R.drawable.ic_music_note - else -> R.drawable.ic_unknown - } - ) - ) + else ->{ + val defaultIconId = when(a.type) { + TootAttachmentType.Image -> R.drawable.ic_image + TootAttachmentType.Video, + TootAttachmentType.GIFV ->R.drawable.ic_videocam + TootAttachmentType.Audio ->R.drawable.ic_music_note + else -> R.drawable.ic_clip + } + iv.setDefaultImage(defaultColorIcon(this,defaultIconId)) + iv.setErrorImage(defaultColorIcon(this,defaultIconId)) iv.setImageUrl(pref, Styler.calcIconRound(iv.layoutParams.width), a.preview_url) } } @@ -1485,25 +1484,25 @@ class ActPost : AppCompatActivity(), showToast(this, false, ex.withCaption("can't get attachment item[$idx].")) return } - + val a = ActionsDialog() - .addAction( getString(R.string.set_description) ){ + .addAction(getString(R.string.set_description)) { editAttachmentDescription(pa) } - - if( pa.attachment?.isAudio == true ){ + + if(pa.attachment?.isAudio == true) { // can't set focus - }else{ - a.addAction(getString(R.string.set_focus_point)){ + } else { + a.addAction(getString(R.string.set_focus_point)) { openFocusPoint(pa) } } - - a.addAction(getString(R.string.delete)){ + + a.addAction(getString(R.string.delete)) { deleteAttachment(pa) } - - a.show(this,title = getString(R.string.media_attachment)) + + a.show(this, title = getString(R.string.media_attachment)) } private fun openFocusPoint(pa : PostAttachment) { diff --git a/app/src/main/java/jp/juggler/subwaytooter/ItemViewHolder.kt b/app/src/main/java/jp/juggler/subwaytooter/ItemViewHolder.kt index 062565ea..6d1e342c 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ItemViewHolder.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ItemViewHolder.kt @@ -1632,14 +1632,14 @@ internal class ItemViewHolder( val showUrl : Boolean when(ta.type) { - TootAttachmentLike.TYPE_AUDIO -> { + TootAttachmentType.Audio -> { iv.setMediaType(0) iv.setDefaultImage(defaultColorIcon(activity, R.drawable.wide_music)) iv.setImageUrl(activity.pref, 0f, null) showUrl = true } - TootAttachmentLike.TYPE_UNKNOWN -> { + TootAttachmentType.Unknown -> { iv.setMediaType(0) iv.setDefaultImage(defaultColorIcon(activity, R.drawable.wide_question)) iv.setImageUrl(activity.pref, 0f, null) @@ -1657,8 +1657,8 @@ internal class ItemViewHolder( else -> { iv.setMediaType( when(ta.type) { - TootAttachmentLike.TYPE_VIDEO -> R.drawable.media_type_video - TootAttachmentLike.TYPE_GIFV -> R.drawable.media_type_gifv + TootAttachmentType.Video -> R.drawable.media_type_video + TootAttachmentType.GIFV -> R.drawable.media_type_gifv else -> 0 } ) @@ -2098,7 +2098,7 @@ internal class ItemViewHolder( is TootAttachment -> when { // unknownが1枚だけなら内蔵ビューアを使わずにインテントを投げる - item.type == TootAttachmentLike.TYPE_UNKNOWN && media_attachments.size == 1 -> + item.type == TootAttachmentType.Unknown && media_attachments.size == 1 -> App1.openCustomTab(activity, item) // 内蔵メディアビューアを使う diff --git a/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootAttachment.kt b/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootAttachment.kt index a1b1371e..8df3fa8d 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootAttachment.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootAttachment.kt @@ -36,13 +36,13 @@ class TootAttachment : TootAttachmentLike { fun decodeJson(src : JSONObject) = TootAttachment(src, decode = true) - private val ext_audio = arrayOf(".mpga",".mp3",".aac",".ogg") + private val ext_audio = arrayOf(".mpga", ".mp3", ".aac", ".ogg") - private fun guessMediaTypeByUrl(src : String?) : String? { + private fun guessMediaTypeByUrl(src : String?) : TootAttachmentType? { val uri = src.mayUri() ?: return null - if( ext_audio.find { uri.path?.endsWith(it) == true } != null ){ - return TootAttachmentLike.TYPE_AUDIO + if(ext_audio.find { uri.path?.endsWith(it) == true } != null) { + return TootAttachmentType.Audio } return null @@ -56,7 +56,7 @@ class TootAttachment : TootAttachmentLike { val id : EntityId //One of: "image", "video", "gifv". or may null ? may "unknown" ? - override val type : String? + override val type : TootAttachmentType //URL of the locally hosted version of the image val url : String? @@ -65,6 +65,8 @@ class TootAttachment : TootAttachmentLike { val remote_url : String? // URL of the preview image + // (Mastodon 2.9.2) audioのpreview_url は .mpga のURL + // (Misskey v11) audioのpreview_url は null val preview_url : String? // Shorter URL for the image, for insertion into text (only present on local images) @@ -92,10 +94,10 @@ class TootAttachment : TootAttachmentLike { else -> false } - override fun getUrlString() :String? = - if( remote_url?.isNotEmpty()==true){ + override fun getUrlString() : String? = + if(remote_url?.isNotEmpty() == true) { remote_url - }else{ + } else { url } @@ -106,12 +108,12 @@ class TootAttachment : TootAttachmentLike { id = EntityId.mayDefault(src.parseString("id")) val mimeType = src.parseString("type") ?: "?" - + this.type = when { - mimeType.startsWith("image/") -> TootAttachmentLike.TYPE_IMAGE - mimeType.startsWith("video/") -> TootAttachmentLike.TYPE_VIDEO - mimeType.startsWith("audio/") -> TootAttachmentLike.TYPE_AUDIO - else -> TootAttachmentLike.TYPE_UNKNOWN + mimeType.startsWith("image/") -> TootAttachmentType.Image + mimeType.startsWith("video/") -> TootAttachmentType.Video + mimeType.startsWith("audio/") -> TootAttachmentType.Audio + else -> TootAttachmentType.Unknown } url = src.parseString("url") @@ -142,11 +144,13 @@ class TootAttachment : TootAttachmentLike { description = src.parseString("description") isSensitive = false // Misskey用のパラメータなので、マストドンでは適当な値を使ってOK - var t = src.parseString("type") - if( t ==null || t == TootAttachmentLike.TYPE_UNKNOWN ){ - t = guessMediaTypeByUrl( remote_url ?: url) + type = when(val tmpType = parseType(src.parseString("type"))) { + null, TootAttachmentType.Unknown -> { + guessMediaTypeByUrl(remote_url ?: url) ?: TootAttachmentType.Unknown + } + + else -> tmpType } - type = t ?: TootAttachmentLike.TYPE_UNKNOWN val focus = src.optJSONObject("meta")?.optJSONObject("focus") focusX = parseFocusValue(focus, "x") @@ -159,6 +163,8 @@ class TootAttachment : TootAttachmentLike { } + private fun parseType(src : String?) = + TootAttachmentType.values().find { it.id == src } override val urlForThumbnail : String? get() = when { @@ -191,7 +197,7 @@ class TootAttachment : TootAttachmentLike { fun encodeJson() = jsonObject { put(KEY_IS_STRING_ID, true) put(KEY_ID, id.toString()) - put(KEY_TYPE, type) + put(KEY_TYPE, type.id) put(KEY_URL, url) put(KEY_REMOTE_URL, remote_url) put(KEY_PREVIEW_URL, preview_url) @@ -217,12 +223,19 @@ class TootAttachment : TootAttachmentLike { ) { id = EntityId.mayDefault(src.parseString(KEY_ID)) - - type = src.parseString(KEY_TYPE) url = src.parseString(KEY_URL) remote_url = src.parseString(KEY_REMOTE_URL) preview_url = src.parseString(KEY_PREVIEW_URL) text_url = src.parseString(KEY_TEXT_URL) + + type = when(val tmpType = parseType(src.parseString(KEY_TYPE))) { + null, TootAttachmentType.Unknown -> { + guessMediaTypeByUrl(remote_url ?: url) ?: TootAttachmentType.Unknown + } + + else -> tmpType + } + description = src.parseString(KEY_DESCRIPTION) isSensitive = src.optBoolean(KEY_IS_SENSITIVE) diff --git a/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootAttachmentLike.kt b/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootAttachmentLike.kt index 79c5e0ff..3ae852dc 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootAttachmentLike.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootAttachmentLike.kt @@ -1,16 +1,16 @@ package jp.juggler.subwaytooter.api.entity -interface TootAttachmentLike{ - - companion object { - const val TYPE_IMAGE = "image" - const val TYPE_VIDEO = "video" - const val TYPE_GIFV = "gifv" - const val TYPE_UNKNOWN = "unknown" - const val TYPE_AUDIO = "audio" - } +enum class TootAttachmentType(val id:String){ + Unknown("unknown"), + Image( "image"), + Video("video"), + GIFV("gifv"), + Audio("audio") +} - val type : String? +interface TootAttachmentLike{ + + val type : TootAttachmentType val description : String? val urlForThumbnail : String? @@ -23,6 +23,11 @@ interface TootAttachmentLike{ val isAudio : Boolean - get()= type == TYPE_AUDIO + get()= type == TootAttachmentType.Audio + + // GIFVの考慮漏れに注意? + val isVideo : Boolean + get()= type == TootAttachmentType.Video + } diff --git a/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootAttachmentMSP.kt b/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootAttachmentMSP.kt index a06400b5..8947a8e0 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootAttachmentMSP.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootAttachmentMSP.kt @@ -8,8 +8,8 @@ class TootAttachmentMSP( ) : TootAttachmentLike { - override val type : String? - get() = null + override val type : TootAttachmentType + get() = TootAttachmentType.Unknown override val description : String? get() = null diff --git a/app/src/main/res/drawable/ic_clip.xml b/app/src/main/res/drawable/ic_clip.xml new file mode 100644 index 00000000..c18714f5 --- /dev/null +++ b/app/src/main/res/drawable/ic_clip.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_attachment.xml b/app/src/main/res/drawable/ic_image.xml similarity index 100% rename from app/src/main/res/drawable/ic_attachment.xml rename to app/src/main/res/drawable/ic_image.xml diff --git a/app/src/main/res/drawable/ic_unknown.xml b/app/src/main/res/drawable/ic_videocam.xml similarity index 63% rename from app/src/main/res/drawable/ic_unknown.xml rename to app/src/main/res/drawable/ic_videocam.xml index d6fd5ce0..e23eac81 100644 --- a/app/src/main/res/drawable/ic_unknown.xml +++ b/app/src/main/res/drawable/ic_videocam.xml @@ -5,5 +5,5 @@ android:viewportHeight="24.0"> + android:pathData="M17,10.5V7c0,-0.55 -0.45,-1 -1,-1H4c-0.55,0 -1,0.45 -1,1v10c0,0.55 0.45,1 1,1h12c0.55,0 1,-0.45 1,-1v-3.5l4,4v-11l-4,4z"/> diff --git a/app/src/main/res/layout/act_post.xml b/app/src/main/res/layout/act_post.xml index 0a8b4c83..1fed7c14 100644 --- a/app/src/main/res/layout/act_post.xml +++ b/app/src/main/res/layout/act_post.xml @@ -517,7 +517,7 @@ android:layout_height="48dp" android:background="@drawable/btn_bg_transparent" android:contentDescription="@string/media_attachment" - android:src="@drawable/ic_attachment" + android:src="@drawable/ic_clip" android:tint="?attr/colorVectorDrawable" />