diff --git a/app/build.gradle b/app/build.gradle index d54e1eaf..e09ea30c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -133,7 +133,7 @@ dependencies { // Use the most recent version of CameraX - def cameraX_version = '1.1.0-rc01' + def cameraX_version = '1.1.0-rc02' implementation "androidx.camera:camera-core:$cameraX_version" implementation "androidx.camera:camera-camera2:$cameraX_version" // CameraX Lifecycle library @@ -142,8 +142,6 @@ dependencies { // CameraX View class implementation "androidx.camera:camera-view:$cameraX_version" - implementation 'com.davemorrissey.labs:subsampling-scale-image-view-androidx:3.10.0' - def room_version = "2.4.2" implementation "androidx.room:room-runtime:$room_version" kapt "androidx.room:room-compiler:$room_version" @@ -155,6 +153,8 @@ dependencies { * ---------------------------------------------------------- */ + implementation 'com.davemorrissey.labs:subsampling-scale-image-view-androidx:3.10.0' + implementation 'com.arthenica:ffmpeg-kit-full:4.5.1-1.LTS' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4a3bdf48..89f1821d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,11 @@ android:name=".posts.AlbumActivity" android:exported="false" android:theme="@style/AppTheme.ActionBar.Transparent"/> + + } - }.show() - } else { - val intent = Intent(this, PhotoEditActivity::class.java) - .putExtra(PhotoEditActivity.PICTURE_URI, photoData[position].imageUri) - .putExtra(PhotoEditActivity.PICTURE_POSITION, position) - editResultContract.launch(intent) - } + val intent = Intent( + this, + if(photoData[position].video) VideoEditActivity::class.java else 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/photoEdit/VideoEditActivity.kt b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/VideoEditActivity.kt new file mode 100644 index 00000000..53c3240d --- /dev/null +++ b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/VideoEditActivity.kt @@ -0,0 +1,57 @@ +package org.pixeldroid.app.postCreation.photoEdit + +import android.net.Uri +import android.os.Bundle +import android.util.Log +import androidx.core.net.toUri +import com.arthenica.ffmpegkit.* +import com.arthenica.ffmpegkit.MediaInformation.KEY_DURATION +import com.bumptech.glide.Glide +import org.pixeldroid.app.databinding.ActivityVideoEditBinding +import org.pixeldroid.app.utils.BaseActivity +import java.io.File + + +class VideoEditActivity : BaseActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val binding = ActivityVideoEditBinding.inflate(layoutInflater) + + setContentView(binding.root) + val uri = intent.getParcelableExtra(PhotoEditActivity.PICTURE_URI) as Uri? + val videoPosition = intent.getIntExtra(PhotoEditActivity.PICTURE_POSITION, -1) + + val inputVideoPath =if(uri.toString().startsWith("content://")) FFmpegKitConfig.getSafParameterForRead(this, uri) else uri.toString() + val inputVideoPath2 =if(uri.toString().startsWith("content://")) FFmpegKitConfig.getSafParameterForRead(this, uri) else uri.toString() + val mediaInformation: MediaInformation? = FFprobeKit.getMediaInformation(inputVideoPath).mediaInformation + + val duration: Long? = mediaInformation?.getNumberProperty(KEY_DURATION) + + val file = File.createTempFile("temp_img", ".png").toUri() + + val outputImagePath =if(file.toString().startsWith("content://")) FFmpegKitConfig.getSafParameterForWrite(this, file) else file.toString() + + val session = FFmpegKit.execute( + "-i $inputVideoPath2 -filter_complex \"select='not(mod(n,1000))',scale=240:-1,tile=layout=4x1\" -vframes 1 -q:v 2 -y $outputImagePath" + ) + if (ReturnCode.isSuccess(session.returnCode)) { + Glide.with(this).load(file).into(binding.thumbnails) + // SUCCESS + } else if (ReturnCode.isCancel(session.returnCode)) { + + // CANCEL + } else { + + // FAILURE + Log.d("VideoEditActivity", + String.format("Command failed with state %s and rc %s.%s", + session.state, + session.returnCode, + session.failStackTrace)) + } + + } + companion object { + const val VIDEO_TAG = "VideoEditTag" + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_video_edit.xml b/app/src/main/res/layout/activity_video_edit.xml new file mode 100644 index 00000000..d7c9300f --- /dev/null +++ b/app/src/main/res/layout/activity_video_edit.xml @@ -0,0 +1,15 @@ + + + + + \ 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 885c39c2..0e756cb5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -262,4 +262,5 @@ For more info about Pixelfed, you can check here: https://pixelfed.org" 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 + Reel showing thumbnails of the video you are editing \ No newline at end of file diff --git a/build.gradle b/build.gradle index 5d5d8d52..c2731152 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.1.3' + classpath 'com.android.tools.build:gradle:7.2.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 39b9af83..02b00d99 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue Jun 07 20:42:16 CEST 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME