diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/PostCreationActivity.kt b/app/src/main/java/org/pixeldroid/app/postCreation/PostCreationActivity.kt index 1724b18a..72e83164 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/PostCreationActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/PostCreationActivity.kt @@ -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 = 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 { 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) + } } } \ No newline at end of file diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/SquareLayout.kt b/app/src/main/java/org/pixeldroid/app/postCreation/SquareLayout.kt index cbee61a6..f024d76b 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/SquareLayout.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/SquareLayout.kt @@ -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) diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/carousel/CarouselAdapter.kt b/app/src/main/java/org/pixeldroid/app/postCreation/carousel/CarouselAdapter.kt index ca2c6384..e61febde 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/carousel/CarouselAdapter.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/carousel/CarouselAdapter.kt @@ -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 } - } } diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/carousel/CarouselItem.kt b/app/src/main/java/org/pixeldroid/app/postCreation/carousel/CarouselItem.kt index 4e6f854e..37dfda86 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/carousel/CarouselItem.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/carousel/CarouselItem.kt @@ -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) -} \ No newline at end of file + val caption: String? = null, + val video: Boolean +) \ No newline at end of file diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/carousel/ImageCarousel.kt b/app/src/main/java/org/pixeldroid/app/postCreation/carousel/ImageCarousel.kt index a95ed00d..5b628b3f 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/carousel/ImageCarousel.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/carousel/ImageCarousel.kt @@ -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 diff --git a/app/src/main/java/org/pixeldroid/app/posts/MediaViewerActivity.kt b/app/src/main/java/org/pixeldroid/app/posts/MediaViewerActivity.kt index 5ac282af..2ca2e423 100644 --- a/app/src/main/java/org/pixeldroid/app/posts/MediaViewerActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/posts/MediaViewerActivity.kt @@ -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?) { diff --git a/app/src/main/java/org/pixeldroid/app/posts/StatusViewHolder.kt b/app/src/main/java/org/pixeldroid/app/posts/StatusViewHolder.kt index 62891e34..a1127538 100644 --- a/app/src/main/java/org/pixeldroid/app/posts/StatusViewHolder.kt +++ b/app/src/main/java/org/pixeldroid/app/posts/StatusViewHolder.kt @@ -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 decoder.isMutableRequired = true } } else { + @Suppress("DEPRECATION") val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri) modifyOrientation(bitmap!!, contentResolver, uri!!) } diff --git a/app/src/main/res/layout/add_more_album_creation.xml b/app/src/main/res/layout/add_more_album_creation.xml index 9b6b498d..65be5e0b 100644 --- a/app/src/main/res/layout/add_more_album_creation.xml +++ b/app/src/main/res/layout/add_more_album_creation.xml @@ -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" diff --git a/app/src/main/res/layout/image_album_creation.xml b/app/src/main/res/layout/image_album_creation.xml index 1409a55e..974cfd55 100644 --- a/app/src/main/res/layout/image_album_creation.xml +++ b/app/src/main/res/layout/image_album_creation.xml @@ -1,15 +1,29 @@ + android:focusable="true" + android:foreground="?selectableItemBackground"> + + android:scaleType="centerCrop" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_carousel.xml b/app/src/main/res/layout/item_carousel.xml index 85b4fef0..04d83070 100644 --- a/app/src/main/res/layout/item_carousel.xml +++ b/app/src/main/res/layout/item_carousel.xml @@ -1,9 +1,28 @@ - + android:layout_height="match_parent"> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e9739025..885c39c2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -261,4 +261,5 @@ For more info about Pixelfed, you can check here: https://pixelfed.org" Camera permission not granted, grant the permission in settings if you want to let PixelDroid use the camera Storage permission not granted, grant the permission in settings if you want to let PixelDroid show the thumbnail Play video + Video editing is not yet supported \ No newline at end of file