From dac4ed79c2aa42198e880eb3395fd18bd58912bd Mon Sep 17 00:00:00 2001 From: tateisu Date: Wed, 5 Jan 2022 12:24:28 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=A1=E3=83=87=E3=82=A3=E3=82=A2=E3=83=93?= =?UTF-8?q?=E3=83=A5=E3=83=BC=E3=82=A2=E3=81=AEcbMute=E3=82=92=E9=9D=99?= =?UTF-8?q?=E6=AD=A2=E7=94=BB=E3=81=AE=E5=A0=B4=E5=90=88=E3=81=AFgone?= =?UTF-8?q?=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jp/juggler/subwaytooter/ActMediaViewer.kt | 173 +++++++++--------- .../main/java/jp/juggler/util/ViewUtils.kt | 22 ++- app/src/main/res/layout/act_media_viewer.xml | 5 +- 3 files changed, 109 insertions(+), 91 deletions(-) diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActMediaViewer.kt b/app/src/main/java/jp/juggler/subwaytooter/ActMediaViewer.kt index 9ca2cb94..50610c54 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActMediaViewer.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ActMediaViewer.kt @@ -89,6 +89,8 @@ class ActMediaViewer : AppCompatActivity(), View.OnClickListener { } } + class DownloadHistory(val time: Long, val url: String) + internal var idx: Int = 0 private lateinit var mediaList: ArrayList private lateinit var serviceType: ServiceType @@ -155,6 +157,63 @@ class ActMediaViewer : AppCompatActivity(), View.OnClickListener { } } + + private val mediaSourceEventListener = object : MediaSourceEventListener { + override fun onLoadStarted( + windowIndex: Int, + mediaPeriodId: MediaSource.MediaPeriodId?, + loadEventInfo: LoadEventInfo, + mediaLoadData: MediaLoadData, + ) { + log.d("onLoadStarted") + } + + override fun onDownstreamFormatChanged( + windowIndex: Int, + mediaPeriodId: MediaSource.MediaPeriodId?, + mediaLoadData: MediaLoadData, + ) { + log.d("onDownstreamFormatChanged") + } + + override fun onUpstreamDiscarded( + windowIndex: Int, + mediaPeriodId: MediaSource.MediaPeriodId, + mediaLoadData: MediaLoadData, + ) { + log.d("onUpstreamDiscarded") + } + + override fun onLoadCompleted( + windowIndex: Int, + mediaPeriodId: MediaSource.MediaPeriodId?, + loadEventInfo: LoadEventInfo, + mediaLoadData: MediaLoadData, + ) { + log.d("onLoadCompleted") + } + + override fun onLoadCanceled( + windowIndex: Int, + mediaPeriodId: MediaSource.MediaPeriodId?, + loadEventInfo: LoadEventInfo, + mediaLoadData: MediaLoadData, + ) { + log.d("onLoadCanceled") + } + + override fun onLoadError( + windowIndex: Int, + mediaPeriodId: MediaSource.MediaPeriodId?, + loadEventInfo: LoadEventInfo, + mediaLoadData: MediaLoadData, + error: IOException, + wasCanceled: Boolean, + ) { + showError(error.withCaption("load error.")) + } + } + override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) @@ -291,11 +350,15 @@ class ActMediaViewer : AppCompatActivity(), View.OnClickListener { internal fun load(state: Bundle? = null) { exoPlayer.stop() - viewBinding.pbvImage.visibility = View.GONE - viewBinding.exoView.visibility = View.GONE - viewBinding.tvError.visibility = View.GONE - viewBinding.svDescription.visibility = View.GONE - viewBinding.tvStatus.visibility = View.GONE + + // いったんすべて隠す + viewBinding.run { + pbvImage.gone() + exoView.gone() + tvError.gone() + svDescription.gone() + tvStatus.gone() + } if (idx < 0 || idx >= mediaList.size) { showError(getString(R.string.media_attachment_empty)) @@ -304,39 +367,39 @@ class ActMediaViewer : AppCompatActivity(), View.OnClickListener { val ta = mediaList[idx] val description = ta.description if (showDescription && description?.isNotEmpty() == true) { - viewBinding.svDescription.visibility = View.VISIBLE + viewBinding.svDescription.visible() viewBinding.tvDescription.text = description } when (ta.type) { + TootAttachmentType.Unknown, + -> showError(getString(R.string.media_attachment_type_error, ta.type.id)) - TootAttachmentType.Unknown -> - showError(getString(R.string.media_attachment_type_error, ta.type.id)) - - TootAttachmentType.Image -> - loadBitmap(ta) + TootAttachmentType.Image, + -> loadBitmap(ta) TootAttachmentType.Video, TootAttachmentType.GIFV, TootAttachmentType.Audio, - -> - loadVideo(ta, state) + -> loadVideo(ta, state) } } private fun showError(message: String) { - viewBinding.exoView.visibility = View.GONE - viewBinding.pbvImage.visibility = View.GONE - viewBinding.tvError.visibility = View.VISIBLE - viewBinding.tvError.text = message + viewBinding.run { + exoView.gone() + pbvImage.gone() + tvError.visible().text = message + } } @SuppressLint("StaticFieldLeak") private fun loadVideo(ta: TootAttachment, state: Bundle? = null) { - viewBinding.cbMute.vg(true) - if (viewBinding.cbMute.isChecked && lastVolume.isFinite()) { - exoPlayer.volume = 0f + viewBinding.cbMute.visible().run { + if (isChecked && lastVolume.isFinite()) { + exoPlayer.volume = 0f + } } val url = ta.getLargeUrl(appPref) @@ -369,62 +432,6 @@ class ActMediaViewer : AppCompatActivity(), View.OnClickListener { } } - private val mediaSourceEventListener = object : MediaSourceEventListener { - override fun onLoadStarted( - windowIndex: Int, - mediaPeriodId: MediaSource.MediaPeriodId?, - loadEventInfo: LoadEventInfo, - mediaLoadData: MediaLoadData, - ) { - log.d("onLoadStarted") - } - - override fun onDownstreamFormatChanged( - windowIndex: Int, - mediaPeriodId: MediaSource.MediaPeriodId?, - mediaLoadData: MediaLoadData, - ) { - log.d("onDownstreamFormatChanged") - } - - override fun onUpstreamDiscarded( - windowIndex: Int, - mediaPeriodId: MediaSource.MediaPeriodId, - mediaLoadData: MediaLoadData, - ) { - log.d("onUpstreamDiscarded") - } - - override fun onLoadCompleted( - windowIndex: Int, - mediaPeriodId: MediaSource.MediaPeriodId?, - loadEventInfo: LoadEventInfo, - mediaLoadData: MediaLoadData, - ) { - log.d("onLoadCompleted") - } - - override fun onLoadCanceled( - windowIndex: Int, - mediaPeriodId: MediaSource.MediaPeriodId?, - loadEventInfo: LoadEventInfo, - mediaLoadData: MediaLoadData, - ) { - log.d("onLoadCanceled") - } - - override fun onLoadError( - windowIndex: Int, - mediaPeriodId: MediaSource.MediaPeriodId?, - loadEventInfo: LoadEventInfo, - mediaLoadData: MediaLoadData, - error: IOException, - wasCanceled: Boolean, - ) { - showError(error.withCaption("load error.")) - } - } - private fun decodeBitmap( options: BitmapFactory.Options, data: ByteArray, @@ -561,7 +568,11 @@ class ActMediaViewer : AppCompatActivity(), View.OnClickListener { @SuppressLint("StaticFieldLeak") private fun loadBitmap(ta: TootAttachment) { - viewBinding.cbMute.visibility = View.INVISIBLE + viewBinding.run { + cbMute.gone() + tvStatus.visible().text = null + pbvImage.visible().setBitmap(null) + } val urlList = ta.getLargeUrlList(appPref) if (urlList.isEmpty()) { @@ -569,12 +580,6 @@ class ActMediaViewer : AppCompatActivity(), View.OnClickListener { return } - viewBinding.tvStatus.visibility = View.VISIBLE - viewBinding.tvStatus.text = null - - viewBinding.pbvImage.visibility = View.VISIBLE - viewBinding.pbvImage.setBitmap(null) - launchMain { val options = BitmapFactory.Options() @@ -620,8 +625,6 @@ class ActMediaViewer : AppCompatActivity(), View.OnClickListener { } } - class DownloadHistory(val time: Long, val url: String) - private fun download(ta: TootAttachmentLike) { if (!checkPermission()) return diff --git a/app/src/main/java/jp/juggler/util/ViewUtils.kt b/app/src/main/java/jp/juggler/util/ViewUtils.kt index ae909c6f..8247067b 100644 --- a/app/src/main/java/jp/juggler/util/ViewUtils.kt +++ b/app/src/main/java/jp/juggler/util/ViewUtils.kt @@ -3,7 +3,6 @@ package jp.juggler.util import android.app.Activity import android.content.Context import android.content.ContextWrapper -import android.content.SharedPreferences import android.content.res.ColorStateList import android.graphics.Color import android.os.Build @@ -71,12 +70,25 @@ fun View.showKeyboard() { } // set visibility VISIBLE or GONE -// return true if visible +// return this or null +// レシーバがnullableなのはplatform typeによるnull例外を避ける目的 fun T?.vg(visible: Boolean): T? { this?.visibility = if (visible) View.VISIBLE else View.GONE return if (visible) this else null } +// set visibility VISIBLE or INVISIBLE +// return this or null +// レシーバがnullableなのはplatform typeによるnull例外を避ける目的 +fun T?.visibleOrInvisible(visible: Boolean): T? { + this?.visibility = if (visible) View.VISIBLE else View.INVISIBLE + return if (visible) this else null +} + +fun T.visible(): T = apply { visibility = View.VISIBLE } +fun T.invisible(): T = apply { visibility = View.INVISIBLE } +fun T.gone(): T = apply { visibility = View.GONE } + fun ViewGroup.generateLayoutParamsEx(): ViewGroup.LayoutParams? = try { val parser = resources.getLayout(R.layout.generate_params) @@ -274,8 +286,8 @@ private fun AppCompatActivity.setNavigationBarColorCompat(@ColorInt c: Int) { } } -var TextView.textOrGone :CharSequence? +var TextView.textOrGone: CharSequence? get() = text - set(value){ - vg(value?.isNotEmpty() ==true)?.text = value + set(value) { + vg(value?.isNotEmpty() == true)?.text = value } diff --git a/app/src/main/res/layout/act_media_viewer.xml b/app/src/main/res/layout/act_media_viewer.xml index afeff312..7a333b53 100644 --- a/app/src/main/res/layout/act_media_viewer.xml +++ b/app/src/main/res/layout/act_media_viewer.xml @@ -111,7 +111,10 @@ android:layout_width="wrap_content" android:layout_height="48dp" android:layout_marginStart="12dp" - android:text="@string/mute" /> + android:text="@string/mute" + android:visibility="gone" + tools:visibility="visible" + />