ganfra
1 year ago
27 changed files with 298 additions and 84 deletions
@ -0,0 +1,81 @@
@@ -0,0 +1,81 @@
|
||||
/* |
||||
* Copyright (c) 2023 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.features.messages.impl.timeline.components.event |
||||
|
||||
import androidx.compose.foundation.Image |
||||
import androidx.compose.foundation.layout.Box |
||||
import androidx.compose.foundation.layout.aspectRatio |
||||
import androidx.compose.foundation.layout.heightIn |
||||
import androidx.compose.material3.MaterialTheme |
||||
import androidx.compose.runtime.Composable |
||||
import androidx.compose.ui.Alignment |
||||
import androidx.compose.ui.Modifier |
||||
import androidx.compose.ui.graphics.ColorFilter |
||||
import androidx.compose.ui.layout.ContentScale |
||||
import androidx.compose.ui.res.painterResource |
||||
import androidx.compose.ui.tooling.preview.Preview |
||||
import androidx.compose.ui.tooling.preview.PreviewParameter |
||||
import androidx.compose.ui.unit.dp |
||||
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemImageContent |
||||
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemImageContentProvider |
||||
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemVideoContent |
||||
import io.element.android.libraries.designsystem.components.blurhash.BlurHashAsyncImage |
||||
import io.element.android.libraries.designsystem.preview.ElementPreviewDark |
||||
import io.element.android.libraries.designsystem.preview.ElementPreviewLight |
||||
import io.element.android.libraries.matrix.ui.media.MediaRequestData |
||||
import kotlin.math.min |
||||
|
||||
@Composable |
||||
fun TimelineItemVideoView( |
||||
content: TimelineItemVideoContent, |
||||
modifier: Modifier = Modifier, |
||||
) { |
||||
val maxHeight = min(300, content.height ?: Int.MAX_VALUE) |
||||
Box( |
||||
modifier = modifier |
||||
.heightIn(max = maxHeight.dp) |
||||
.aspectRatio(content.aspectRatio), |
||||
contentAlignment = Alignment.Center, |
||||
) { |
||||
BlurHashAsyncImage( |
||||
blurHash = content.blurhash, |
||||
model = MediaRequestData(content.thumbnailSource, MediaRequestData.Kind.Content), |
||||
contentScale = ContentScale.Fit, |
||||
) |
||||
Image( |
||||
painterResource(id = androidx.media3.ui.R.drawable.exo_ic_play_circle_filled), |
||||
contentDescription = null, |
||||
colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onBackground) |
||||
) |
||||
|
||||
} |
||||
} |
||||
|
||||
@Preview |
||||
@Composable |
||||
internal fun TimelineItemVideoViewLightPreview(@PreviewParameter(TimelineItemImageContentProvider::class) content: TimelineItemImageContent) = |
||||
ElementPreviewLight { ContentToPreview(content) } |
||||
|
||||
@Preview |
||||
@Composable |
||||
internal fun TimelineItemVideoViewDarkPreview(@PreviewParameter(TimelineItemImageContentProvider::class) content: TimelineItemImageContent) = |
||||
ElementPreviewDark { ContentToPreview(content) } |
||||
|
||||
@Composable |
||||
private fun ContentToPreview(content: TimelineItemImageContent) { |
||||
TimelineItemImageView(content) |
||||
} |
@ -0,0 +1,33 @@
@@ -0,0 +1,33 @@
|
||||
/* |
||||
* Copyright (c) 2022 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.features.messages.impl.timeline.model.event |
||||
|
||||
import io.element.android.libraries.matrix.api.media.MatrixMediaSource |
||||
|
||||
data class TimelineItemVideoContent( |
||||
val body: String, |
||||
val duration: Long, |
||||
val videoSource: MatrixMediaSource, |
||||
val thumbnailSource: MatrixMediaSource?, |
||||
val aspectRatio: Float, |
||||
val blurhash: String?, |
||||
val height: Int?, |
||||
val width: Int?, |
||||
val mimetype: String?, |
||||
) : TimelineItemEventContent { |
||||
override val type: String = "TimelineItemImageContent" |
||||
} |
@ -0,0 +1,42 @@
@@ -0,0 +1,42 @@
|
||||
/* |
||||
* Copyright (c) 2023 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.features.messages.impl.timeline.model.event |
||||
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider |
||||
import io.element.android.libraries.matrix.api.media.MatrixMediaSource |
||||
import io.element.android.libraries.matrix.ui.media.MediaRequestData |
||||
|
||||
open class TimelineItemVideoContentProvider : PreviewParameterProvider<TimelineItemVideoContent> { |
||||
override val values: Sequence<TimelineItemVideoContent> |
||||
get() = sequenceOf( |
||||
aTimelineItemVideoContent(), |
||||
aTimelineItemVideoContent().copy(aspectRatio = 1.0f), |
||||
aTimelineItemVideoContent().copy(aspectRatio = 1.5f), |
||||
) |
||||
} |
||||
|
||||
fun aTimelineItemVideoContent() = TimelineItemVideoContent( |
||||
body = "a video", |
||||
thumbnailSource = MatrixMediaSource(url = ""), |
||||
blurhash = "TQF5:I_NtRE4kXt7Z#MwkCIARPjr", |
||||
aspectRatio = 0.5f, |
||||
duration = 0, |
||||
videoSource = MatrixMediaSource(""), |
||||
height = null, |
||||
width = null, |
||||
mimetype = null |
||||
) |
@ -0,0 +1,25 @@
@@ -0,0 +1,25 @@
|
||||
/* |
||||
* Copyright (c) 2023 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.libraries.matrix.api.media |
||||
|
||||
import android.os.Parcelable |
||||
import kotlinx.parcelize.Parcelize |
||||
|
||||
@Parcelize |
||||
data class MatrixMediaSource( |
||||
val url: String |
||||
) : Parcelable |
Loading…
Reference in new issue