メディアビューアの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
private lateinit var mediaList: ArrayList<TootAttachment>
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

View File

@ -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 : View> 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 : 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? =
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
}

View File

@ -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"
/>
</com.google.android.flexbox.FlexboxLayout>
</LinearLayout>