Rudimentary video support in PostCreationActivity
This commit is contained in:
parent
63362a031b
commit
03f83790f2
|
@ -50,11 +50,12 @@ import kotlin.math.ceil
|
|||
private const val TAG = "Post Creation Activity"
|
||||
|
||||
data class PhotoData(
|
||||
var imageUri: Uri,
|
||||
var size: Long,
|
||||
var uploadId: String? = null,
|
||||
var progress: Int? = null,
|
||||
var imageDescription: String? = null,
|
||||
var imageUri: Uri,
|
||||
var size: Long,
|
||||
var uploadId: String? = null,
|
||||
var progress: Int? = null,
|
||||
var imageDescription: String? = null,
|
||||
var video: Boolean,
|
||||
)
|
||||
|
||||
class PostCreationActivity : BaseActivity() {
|
||||
|
@ -85,7 +86,7 @@ class PostCreationActivity : BaseActivity() {
|
|||
intent.clipData?.let { addPossibleImages(it) }
|
||||
|
||||
val carousel: ImageCarousel = binding.carousel
|
||||
carousel.addData(photoData.map { CarouselItem(it.imageUri) })
|
||||
carousel.addData(photoData.map { CarouselItem(it.imageUri, video = it.video) })
|
||||
carousel.layoutCarouselCallback = {
|
||||
if(it){
|
||||
// Became a carousel
|
||||
|
@ -138,7 +139,7 @@ class PostCreationActivity : BaseActivity() {
|
|||
binding.removePhotoButton.setOnClickListener {
|
||||
carousel.currentPosition.takeIf { it != -1 }?.let { currentPosition ->
|
||||
photoData.removeAt(currentPosition)
|
||||
carousel.addData(photoData.map { CarouselItem(it.imageUri, it.imageDescription) })
|
||||
carousel.addData(photoData.map { CarouselItem(it.imageUri, it.imageDescription, it.video) })
|
||||
binding.addPhotoButton.isEnabled = true
|
||||
}
|
||||
}
|
||||
|
@ -164,17 +165,17 @@ class PostCreationActivity : BaseActivity() {
|
|||
}
|
||||
for (i in 0 until count) {
|
||||
clipData.getItemAt(i).uri.let {
|
||||
val size = it.getSizeAndValidate()
|
||||
photoData.add(PhotoData(imageUri = it, size = size))
|
||||
val sizeAndVideoPair: Pair<Long, Boolean> = it.getSizeAndVideoValidate()
|
||||
photoData.add(PhotoData(imageUri = it, size = sizeAndVideoPair.first, video = sizeAndVideoPair.second))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the size of the file of the Uri, and opens a dialog in case it is too big or in case
|
||||
* the file is unsupported.
|
||||
* Returns the size of the file of the Uri, and whether it is a video,
|
||||
* and opens a dialog in case it is too big or in case the file is unsupported.
|
||||
*/
|
||||
private fun Uri.getSizeAndValidate(): Long {
|
||||
private fun Uri.getSizeAndVideoValidate(): Pair<Long, Boolean> {
|
||||
val size: Long =
|
||||
if (toString().startsWith("content")) {
|
||||
contentResolver.query(this, null, null, null, null)
|
||||
|
@ -209,7 +210,7 @@ class PostCreationActivity : BaseActivity() {
|
|||
setNegativeButton(android.R.string.ok) { _, _ -> }
|
||||
}.show()
|
||||
}
|
||||
return size
|
||||
return Pair(size, isVideo)
|
||||
}
|
||||
|
||||
private val addPhotoResultContract = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
|
||||
|
@ -217,7 +218,7 @@ class PostCreationActivity : BaseActivity() {
|
|||
result.data?.clipData?.let {
|
||||
addPossibleImages(it)
|
||||
}
|
||||
binding.carousel.addData(photoData.map { CarouselItem(it.imageUri, it.imageDescription) })
|
||||
binding.carousel.addData(photoData.map { CarouselItem(it.imageUri, it.imageDescription, it.video) })
|
||||
} else if (result.resultCode != Activity.RESULT_CANCELED) {
|
||||
Toast.makeText(applicationContext, "Error while adding images", Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
|
@ -309,8 +310,8 @@ class PostCreationActivity : BaseActivity() {
|
|||
*/
|
||||
private fun upload() {
|
||||
enableButton(false)
|
||||
binding.uploadProgressBar.visibility = View.VISIBLE
|
||||
binding.uploadCompletedTextview.visibility = View.INVISIBLE
|
||||
binding.uploadProgressBar.visibility = VISIBLE
|
||||
binding.uploadCompletedTextview.visibility = INVISIBLE
|
||||
binding.removePhotoButton.isEnabled = false
|
||||
binding.editPhotoButton.isEnabled = false
|
||||
binding.addPhotoButton.isEnabled = false
|
||||
|
@ -432,21 +433,30 @@ class PostCreationActivity : BaseActivity() {
|
|||
val position: Int = result.data!!.getIntExtra(PhotoEditActivity.PICTURE_POSITION, 0)
|
||||
photoData.getOrNull(position)?.apply {
|
||||
imageUri = result.data!!.getStringExtra(PhotoEditActivity.PICTURE_URI)!!.toUri()
|
||||
size = imageUri.getSizeAndValidate()
|
||||
val (imageSize, imageVideo) = imageUri.getSizeAndVideoValidate()
|
||||
size = imageSize
|
||||
video = imageVideo
|
||||
progress = null
|
||||
uploadId = null
|
||||
} ?: Toast.makeText(applicationContext, "Error while editing", Toast.LENGTH_SHORT).show()
|
||||
|
||||
binding.carousel.addData(photoData.map { CarouselItem(it.imageUri, it.imageDescription) })
|
||||
binding.carousel.addData(photoData.map { CarouselItem(it.imageUri, it.imageDescription, it.video) })
|
||||
} else if(result?.resultCode != Activity.RESULT_CANCELED){
|
||||
Toast.makeText(applicationContext, "Error while editing", Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
}
|
||||
|
||||
private fun edit(position: Int) {
|
||||
val intent = Intent(this, PhotoEditActivity::class.java)
|
||||
.putExtra(PhotoEditActivity.PICTURE_URI, photoData[position].imageUri)
|
||||
.putExtra(PhotoEditActivity.PICTURE_POSITION, position)
|
||||
editResultContract.launch(intent)
|
||||
if(photoData[position].video){
|
||||
AlertDialog.Builder(this).apply {
|
||||
setMessage(R.string.video_edit_not_yet_supported)
|
||||
setNegativeButton(android.R.string.ok) { _, _ -> }
|
||||
}.show()
|
||||
} else {
|
||||
val intent = Intent(this, PhotoEditActivity::class.java)
|
||||
.putExtra(PhotoEditActivity.PICTURE_URI, photoData[position].imageUri)
|
||||
.putExtra(PhotoEditActivity.PICTURE_POSITION, position)
|
||||
editResultContract.launch(intent)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -2,10 +2,11 @@ package org.pixeldroid.app.postCreation
|
|||
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.widget.FrameLayout
|
||||
import android.widget.RelativeLayout
|
||||
|
||||
internal class SquareLayout(context: Context, attrs: AttributeSet) :
|
||||
RelativeLayout(context, attrs) {
|
||||
FrameLayout(context, attrs) {
|
||||
|
||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
||||
super.onMeasure(widthMeasureSpec, widthMeasureSpec)
|
||||
|
|
|
@ -3,13 +3,17 @@ package org.pixeldroid.app.postCreation.carousel
|
|||
import android.graphics.drawable.Drawable
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.View.GONE
|
||||
import android.view.View.VISIBLE
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ImageButton
|
||||
import android.widget.ImageView
|
||||
import androidx.annotation.IdRes
|
||||
import androidx.annotation.LayoutRes
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.bumptech.glide.Glide
|
||||
import org.pixeldroid.app.R
|
||||
import org.pixeldroid.app.posts.MediaViewerActivity
|
||||
|
||||
|
||||
class CarouselAdapter(
|
||||
|
@ -26,6 +30,8 @@ class CarouselAdapter(
|
|||
|
||||
class MyViewHolder(itemView: View, imageViewId: Int) : RecyclerView.ViewHolder(itemView) {
|
||||
var img: ImageView = itemView.findViewById(imageViewId)
|
||||
// Null if not relevant
|
||||
val videoIndicator: ImageButton? = itemView.findViewById(R.id.videoIndicator)
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
|
||||
|
@ -60,10 +66,21 @@ class CarouselAdapter(
|
|||
}
|
||||
|
||||
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
|
||||
if(carousel) {
|
||||
if (carousel) {
|
||||
holder.img.scaleType = imageScaleType
|
||||
holder.videoIndicator?.setOnClickListener{
|
||||
with(dataList[position]) {
|
||||
MediaViewerActivity.openActivity(
|
||||
holder.itemView.context,
|
||||
imageUrl.toString(),
|
||||
caption
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
holder.videoIndicator?.visibility = if (dataList[position].video) VISIBLE else GONE
|
||||
|
||||
dataList.elementAtOrNull(position)?.let {
|
||||
Glide.with(holder.itemView.context)
|
||||
.load(it.imageUrl)
|
||||
|
@ -83,7 +100,6 @@ class CarouselAdapter(
|
|||
|
||||
true
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,6 @@ import android.net.Uri
|
|||
|
||||
data class CarouselItem constructor(
|
||||
val imageUrl: Uri,
|
||||
val caption: String? = null
|
||||
) {
|
||||
constructor(imageUrl: Uri) : this(imageUrl, null)
|
||||
}
|
||||
val caption: String? = null,
|
||||
val video: Boolean
|
||||
)
|
|
@ -49,7 +49,7 @@ class ImageCarousel(
|
|||
var indicator: CircleIndicator2? = null
|
||||
set(newIndicator) {
|
||||
indicator?.apply {
|
||||
// if we remove it form the view, then the caption textView constraint won't work.
|
||||
// if we remove it from the view, then the caption textView constraint won't work.
|
||||
this.visibility = View.GONE
|
||||
|
||||
isBuiltInIndicator = false
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package org.pixeldroid.app.posts
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import androidx.core.net.toUri
|
||||
import androidx.media2.common.MediaMetadata
|
||||
|
@ -15,6 +17,13 @@ class MediaViewerActivity : BaseActivity() {
|
|||
companion object {
|
||||
const val VIDEO_URL_TAG = "video_url_mediavieweractivity"
|
||||
const val VIDEO_DESCRIPTION_TAG = "video_description_mediavieweractivity"
|
||||
|
||||
fun openActivity(context: Context, url: String?, description: String?){
|
||||
val intent = Intent(context, MediaViewerActivity::class.java)
|
||||
intent.putExtra(VIDEO_URL_TAG, url)
|
||||
intent.putExtra(VIDEO_DESCRIPTION_TAG, description)
|
||||
context.startActivity(intent)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
|
|
|
@ -39,6 +39,7 @@ import com.karumi.dexter.listener.single.BasePermissionListener
|
|||
import kotlinx.coroutines.launch
|
||||
import org.pixeldroid.app.posts.MediaViewerActivity.Companion.VIDEO_DESCRIPTION_TAG
|
||||
import org.pixeldroid.app.posts.MediaViewerActivity.Companion.VIDEO_URL_TAG
|
||||
import org.pixeldroid.app.posts.MediaViewerActivity.Companion.openActivity
|
||||
import retrofit2.HttpException
|
||||
import java.io.IOException
|
||||
import kotlin.math.roundToInt
|
||||
|
@ -620,14 +621,12 @@ private class AlbumViewPagerAdapter(private val media_attachments: List<Attachme
|
|||
holder.videoPlayButton.visibility = if(video) View.VISIBLE else View.GONE
|
||||
|
||||
if(video){
|
||||
fun openActivity(){
|
||||
val intent = Intent(holder.binding.root.context, MediaViewerActivity::class.java)
|
||||
intent.putExtra(VIDEO_URL_TAG, url)
|
||||
intent.putExtra(VIDEO_DESCRIPTION_TAG, description)
|
||||
holder.binding.root.context.startActivity(intent)
|
||||
holder.videoPlayButton.setOnClickListener {
|
||||
openActivity(holder.binding.root.context, url, description)
|
||||
}
|
||||
holder.image.setOnClickListener {
|
||||
openActivity(holder.binding.root.context, url, description)
|
||||
}
|
||||
holder.videoPlayButton.setOnClickListener {openActivity()}
|
||||
holder.image.setOnClickListener {openActivity()}
|
||||
}
|
||||
|
||||
val description = description
|
||||
|
|
|
@ -73,6 +73,7 @@ fun bitmapFromUri(contentResolver: ContentResolver, uri: Uri?): Bitmap =
|
|||
)
|
||||
{ decoder, _, _ -> decoder.isMutableRequired = true }
|
||||
} else {
|
||||
@Suppress("DEPRECATION")
|
||||
val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri)
|
||||
modifyOrientation(bitmap!!, contentResolver, uri!!)
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
android:id="@+id/addPhotoSquare"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="50dp"
|
||||
android:layout_gravity="center"
|
||||
android:layout_centerInParent="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:background="@drawable/add_photo_button"
|
||||
|
|
|
@ -1,15 +1,29 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<org.pixeldroid.app.postCreation.SquareLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:foreground="?selectableItemBackground"
|
||||
android:clickable="true"
|
||||
android:focusable="true">
|
||||
android:focusable="true"
|
||||
android:foreground="?selectableItemBackground">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/galleryImage"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:contentDescription="@string/post_image"
|
||||
android:padding="8dp"
|
||||
android:scaleType="centerCrop"
|
||||
android:contentDescription="@string/post_image" />
|
||||
android:scaleType="centerCrop" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/videoIndicator"
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:layout_gravity="top"
|
||||
android:layout_margin="12dp"
|
||||
android:background="?attr/selectableItemBackgroundBorderless"
|
||||
android:contentDescription="@string/play_video"
|
||||
android:src="@drawable/play_circle_filled"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible" />
|
||||
</org.pixeldroid.app.postCreation.SquareLayout>
|
|
@ -1,9 +1,28 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/img"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:scaleType="centerInside"
|
||||
tools:ignore="ContentDescription"
|
||||
tools:src="@tools:sample/backgrounds/scenic" />
|
||||
android:layout_height="match_parent">
|
||||
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/img"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:adjustViewBounds="true"
|
||||
tools:ignore="ContentDescription" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/videoIndicator"
|
||||
android:visibility="gone"
|
||||
android:background="?attr/selectableItemBackgroundBorderless"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_gravity="center"
|
||||
android:scaleType="fitCenter"
|
||||
android:src="@drawable/play_circle_filled"
|
||||
android:contentDescription="@string/play_video" />
|
||||
|
||||
</FrameLayout>
|
|
@ -261,4 +261,5 @@ For more info about Pixelfed, you can check here: https://pixelfed.org"</string>
|
|||
<string name="no_camera_permission">Camera permission not granted, grant the permission in settings if you want to let PixelDroid use the camera</string>
|
||||
<string name="no_storage_permission">Storage permission not granted, grant the permission in settings if you want to let PixelDroid show the thumbnail</string>
|
||||
<string name="play_video">Play video</string>
|
||||
<string name="video_edit_not_yet_supported">Video editing is not yet supported</string>
|
||||
</resources>
|
Loading…
Reference in New Issue