メディアビューアのcbMuteを静止画の場合はgoneにする

This commit is contained in:
tateisu 2022-01-05 12:24:28 +09:00
parent 8cec86b2ef
commit dac4ed79c2
3 changed files with 109 additions and 91 deletions

View File

@ -89,6 +89,8 @@ class ActMediaViewer : AppCompatActivity(), View.OnClickListener {
} }
} }
class DownloadHistory(val time: Long, val url: String)
internal var idx: Int = 0 internal var idx: Int = 0
private lateinit var mediaList: ArrayList<TootAttachment> private lateinit var mediaList: ArrayList<TootAttachment>
private lateinit var serviceType: ServiceType 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) { override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState) super.onSaveInstanceState(outState)
@ -291,11 +350,15 @@ class ActMediaViewer : AppCompatActivity(), View.OnClickListener {
internal fun load(state: Bundle? = null) { internal fun load(state: Bundle? = null) {
exoPlayer.stop() exoPlayer.stop()
viewBinding.pbvImage.visibility = View.GONE
viewBinding.exoView.visibility = View.GONE // いったんすべて隠す
viewBinding.tvError.visibility = View.GONE viewBinding.run {
viewBinding.svDescription.visibility = View.GONE pbvImage.gone()
viewBinding.tvStatus.visibility = View.GONE exoView.gone()
tvError.gone()
svDescription.gone()
tvStatus.gone()
}
if (idx < 0 || idx >= mediaList.size) { if (idx < 0 || idx >= mediaList.size) {
showError(getString(R.string.media_attachment_empty)) showError(getString(R.string.media_attachment_empty))
@ -304,39 +367,39 @@ class ActMediaViewer : AppCompatActivity(), View.OnClickListener {
val ta = mediaList[idx] val ta = mediaList[idx]
val description = ta.description val description = ta.description
if (showDescription && description?.isNotEmpty() == true) { if (showDescription && description?.isNotEmpty() == true) {
viewBinding.svDescription.visibility = View.VISIBLE viewBinding.svDescription.visible()
viewBinding.tvDescription.text = description viewBinding.tvDescription.text = description
} }
when (ta.type) { when (ta.type) {
TootAttachmentType.Unknown,
-> showError(getString(R.string.media_attachment_type_error, ta.type.id))
TootAttachmentType.Unknown -> TootAttachmentType.Image,
showError(getString(R.string.media_attachment_type_error, ta.type.id)) -> loadBitmap(ta)
TootAttachmentType.Image ->
loadBitmap(ta)
TootAttachmentType.Video, TootAttachmentType.Video,
TootAttachmentType.GIFV, TootAttachmentType.GIFV,
TootAttachmentType.Audio, TootAttachmentType.Audio,
-> -> loadVideo(ta, state)
loadVideo(ta, state)
} }
} }
private fun showError(message: String) { private fun showError(message: String) {
viewBinding.exoView.visibility = View.GONE viewBinding.run {
viewBinding.pbvImage.visibility = View.GONE exoView.gone()
viewBinding.tvError.visibility = View.VISIBLE pbvImage.gone()
viewBinding.tvError.text = message tvError.visible().text = message
}
} }
@SuppressLint("StaticFieldLeak") @SuppressLint("StaticFieldLeak")
private fun loadVideo(ta: TootAttachment, state: Bundle? = null) { private fun loadVideo(ta: TootAttachment, state: Bundle? = null) {
viewBinding.cbMute.vg(true) viewBinding.cbMute.visible().run {
if (viewBinding.cbMute.isChecked && lastVolume.isFinite()) { if (isChecked && lastVolume.isFinite()) {
exoPlayer.volume = 0f exoPlayer.volume = 0f
}
} }
val url = ta.getLargeUrl(appPref) 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( private fun decodeBitmap(
options: BitmapFactory.Options, options: BitmapFactory.Options,
data: ByteArray, data: ByteArray,
@ -561,7 +568,11 @@ class ActMediaViewer : AppCompatActivity(), View.OnClickListener {
@SuppressLint("StaticFieldLeak") @SuppressLint("StaticFieldLeak")
private fun loadBitmap(ta: TootAttachment) { 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) val urlList = ta.getLargeUrlList(appPref)
if (urlList.isEmpty()) { if (urlList.isEmpty()) {
@ -569,12 +580,6 @@ class ActMediaViewer : AppCompatActivity(), View.OnClickListener {
return return
} }
viewBinding.tvStatus.visibility = View.VISIBLE
viewBinding.tvStatus.text = null
viewBinding.pbvImage.visibility = View.VISIBLE
viewBinding.pbvImage.setBitmap(null)
launchMain { launchMain {
val options = BitmapFactory.Options() 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) { private fun download(ta: TootAttachmentLike) {
if (!checkPermission()) return if (!checkPermission()) return

View File

@ -3,7 +3,6 @@ package jp.juggler.util
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.content.ContextWrapper import android.content.ContextWrapper
import android.content.SharedPreferences
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.graphics.Color import android.graphics.Color
import android.os.Build import android.os.Build
@ -71,12 +70,25 @@ fun View.showKeyboard() {
} }
// set visibility VISIBLE or GONE // set visibility VISIBLE or GONE
// return true if visible // return this or null
// レシーバがnullableなのはplatform typeによるnull例外を避ける目的
fun <T : View> T?.vg(visible: Boolean): T? { fun <T : View> T?.vg(visible: Boolean): T? {
this?.visibility = if (visible) View.VISIBLE else View.GONE this?.visibility = if (visible) View.VISIBLE else View.GONE
return if (visible) this else null return if (visible) this else null
} }
// set visibility VISIBLE or INVISIBLE
// return this or null
// レシーバがnullableなのはplatform typeによるnull例外を避ける目的
fun <T : View> T?.visibleOrInvisible(visible: Boolean): T? {
this?.visibility = if (visible) View.VISIBLE else View.INVISIBLE
return if (visible) this else null
}
fun <T : View> T.visible(): T = apply { visibility = View.VISIBLE }
fun <T : View> T.invisible(): T = apply { visibility = View.INVISIBLE }
fun <T : View> T.gone(): T = apply { visibility = View.GONE }
fun ViewGroup.generateLayoutParamsEx(): ViewGroup.LayoutParams? = fun ViewGroup.generateLayoutParamsEx(): ViewGroup.LayoutParams? =
try { try {
val parser = resources.getLayout(R.layout.generate_params) 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 get() = text
set(value){ set(value) {
vg(value?.isNotEmpty() ==true)?.text = value vg(value?.isNotEmpty() == true)?.text = value
} }

View File

@ -111,7 +111,10 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="48dp" android:layout_height="48dp"
android:layout_marginStart="12dp" android:layout_marginStart="12dp"
android:text="@string/mute" /> android:text="@string/mute"
android:visibility="gone"
tools:visibility="visible"
/>
</com.google.android.flexbox.FlexboxLayout> </com.google.android.flexbox.FlexboxLayout>
</LinearLayout> </LinearLayout>