diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 1bec35e..31d977a 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -1,6 +1,22 @@ + + diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..61a9130 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 7ac24c7..9bba60d 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,8 +1,10 @@ + diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..eb2873e --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 7bfef59..d5d35ec 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 80ad4d5..c2b7ddc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,14 +10,14 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { - compileSdkVersion compileSdk + compileSdkVersion 30 defaultConfig { applicationId "com.obs.marveleditor" - minSdkVersion minSdk + minSdkVersion 21 targetSdkVersion targetSdk - versionCode 1 + versionCode 2 versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } buildTypes { release { @@ -36,15 +36,20 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:${kotlinVersion}" - implementation "com.android.support:appcompat-v7:${appCompat}" - implementation "com.android.support.constraint:constraint-layout:${constraint}" - implementation "com.android.support:design:${appCompat}" + implementation "androidx.appcompat:appcompat:${appCompat}" + implementation "androidx.constraintlayout:constraintlayout:${constraint}" + implementation "androidx.cardview:cardview:${cardView}" + implementation 'com.google.android.material:material:1.2.1' //exoplayer + //implementation "com.google.android.exoplayer:exoplayer:${exoPlayer}" implementation "com.google.android.exoplayer:exoplayer-core:${exoPlayerCore}" implementation "com.google.android.exoplayer:exoplayer-dash:${exoPlayer}" implementation "com.google.android.exoplayer:exoplayer-ui:${exoPlayer}" + // RecyclerView + implementation "androidx.recyclerview:recyclerview:${recyclerView}" + //ffmpeg implementation "com.writingminds:FFmpegAndroid:${FFmpeg}" implementation "org.jcodec:jcodec-android:${jcodec}" @@ -61,7 +66,7 @@ dependencies { //fresco implementation "com.facebook.fresco:fresco:${fresco}" - testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + testImplementation 'junit:junit:4.13.1' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fbb67fb..c85d2a7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,8 @@ tools:node="replace"/> + + diff --git a/app/src/main/java/com/obs/marveleditor/MainActivity.kt b/app/src/main/java/com/obs/marveleditor/MainActivity.kt index f3b0356..3ac3558 100644 --- a/app/src/main/java/com/obs/marveleditor/MainActivity.kt +++ b/app/src/main/java/com/obs/marveleditor/MainActivity.kt @@ -8,7 +8,7 @@ package com.obs.marveleditor import android.os.Bundle -import android.support.v7.app.AppCompatActivity +import androidx.appcompat.app.AppCompatActivity import com.facebook.drawee.backends.pipeline.Fresco import com.obs.marveleditor.fragments.OptiMasterProcessorFragment diff --git a/app/src/main/java/com/obs/marveleditor/OptiSplashScreen.kt b/app/src/main/java/com/obs/marveleditor/OptiSplashScreen.kt index d4608c2..b08a989 100644 --- a/app/src/main/java/com/obs/marveleditor/OptiSplashScreen.kt +++ b/app/src/main/java/com/obs/marveleditor/OptiSplashScreen.kt @@ -10,7 +10,7 @@ package com.obs.marveleditor import android.content.Intent import android.os.Bundle import android.os.Handler -import android.support.v7.app.AppCompatActivity +import androidx.appcompat.app.AppCompatActivity class OptiSplashScreen : AppCompatActivity() { diff --git a/app/src/main/java/com/obs/marveleditor/OptiTrimmerActivity.java b/app/src/main/java/com/obs/marveleditor/OptiTrimmerActivity.java index f6bff94..4fbb2c4 100644 --- a/app/src/main/java/com/obs/marveleditor/OptiTrimmerActivity.java +++ b/app/src/main/java/com/obs/marveleditor/OptiTrimmerActivity.java @@ -11,8 +11,10 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.util.Log; + +import androidx.appcompat.app.AppCompatActivity; + import com.obs.marveleditor.videoTrimmer.OptiHgLVideoTrimmer; import com.obs.marveleditor.videoTrimmer.interfaces.OptiOnHgLVideoListener; import com.obs.marveleditor.videoTrimmer.interfaces.OptiOnTrimVideoListener; diff --git a/app/src/main/java/com/obs/marveleditor/OptiVideoEditor.kt b/app/src/main/java/com/obs/marveleditor/OptiVideoEditor.kt index a0d5507..ec6cb7a 100644 --- a/app/src/main/java/com/obs/marveleditor/OptiVideoEditor.kt +++ b/app/src/main/java/com/obs/marveleditor/OptiVideoEditor.kt @@ -46,6 +46,11 @@ class OptiVideoEditor private constructor(private val context: Context) { private var audioFile: File? = null //for filter private var filterCommand: String? = null + //for merge + private var width: String? = null + private var height: String? = null + private var textFile: File? = null + private var isMP4: Boolean? = false companion object { fun with(context: Context): OptiVideoEditor { @@ -123,6 +128,18 @@ class OptiVideoEditor private constructor(private val context: Context) { return this } + fun setFileWidthHeight(width: String, height: String): OptiVideoEditor { + this.width = width + this.height = height + return this + } + + fun setTextFile(file: File, isMP4: Boolean): OptiVideoEditor { + textFile = file + this.isMP4 = isMP4 + return this + } + fun setSize(size: String): OptiVideoEditor { this.size = size return this @@ -199,28 +216,43 @@ class OptiVideoEditor private constructor(private val context: Context) { cmd = arrayOf( "-y", "-i", videoFile!!.path, "-vf", "drawtext=fontfile=" + font!!.path + ": text=" + text + ": fontcolor=" + color + ": fontsize=" + size + border + ": " + position, - "-c:v", "libx264", "-c:a", "copy", "-movflags", "+faststart", outputFile.path) + "-c:v", "libx264", "-crf", "23", "-preset", "ultrafast", "-c:a", "copy", "-movflags", "+faststart", outputFile.path) } OptiConstant.VIDEO_CLIP_ART_OVERLAY -> { //Clipart overlay on video - Need video file, image path, position to apply & output file - cmd = arrayOf("-y", "-i", videoFile!!.path, "-i", imagePath!!, "-filter_complex", position!!, "-codec:a", "copy", outputFile.path) + cmd = arrayOf("-y", "-i", videoFile!!.path, "-i", imagePath!!, "-filter_complex", position!!, + "-c:v", "libx264", "-crf", "23", "-preset", "ultrafast", "-codec:a", "copy", outputFile.path) } OptiConstant.MERGE_VIDEO -> { //Merge videos - Need two video file, approx video size & output file - cmd = arrayOf("-y", "-i", videoFile!!.path, "-i", videoFileTwo!!.path, "-strict", "experimental", "-filter_complex", + /*cmd = arrayOf("-y", "-i", videoFile!!.path, "-i", videoFileTwo!!.path, "-strict", "experimental", "-filter_complex", "[0:v]scale=iw*min(1920/iw\\,1080/ih):ih*min(1920/iw\\,1080/ih), pad=1920:1080:(1920-iw*min(1920/iw\\,1080/ih))/2:(1080-ih*min(1920/iw\\,1080/ih))/2,setsar=1:1[v0];[1:v] scale=iw*min(1920/iw\\,1080/ih):ih*min(1920/iw\\,1080/ih), pad=1920:1080:(1920-iw*min(1920/iw\\,1080/ih))/2:(1080-ih*min(1920/iw\\,1080/ih))/2,setsar=1:1[v1];[v0][0:a][v1][1:a] concat=n=2:v=1:a=1", - "-ab", "48000", "-ac", "2", "-ar", "22050", "-s", "1920x1080", "-vcodec", "libx264", "-crf", "27", - "-q", "4", "-preset", "ultrafast", outputFile.path) + "-ab", "48000", "-ac", "2", "-ar", "22050", "-s", "1920x1080", "-vcodec", "-c:v", "libx264", "-crf", "23", + "-preset", "veryfast", outputFile.path)*/ + cmd = if(!isMP4!!) { + //concat video filter for other video format files + arrayOf( + "-y", "-i", videoFile!!.path, "-i", videoFileTwo!!.path, "-filter_complex", + "[0:v]setsar=1:1[v0];[1:v]scale=$width:$height,setsar=1:1[v1];[v0][0:a][v1][1:a] concat=n=2:v=1:a=1", + "-c:v", "libx264", "-crf", "23", "-preset", "ultrafast", outputFile.path + ) + } else { + //concat demuxer - for mp4 video format files + arrayOf("-y", "-f", "concat", "-safe", "0", "-i", textFile!!.path, + "-c:v", "libx264", "-crf", "23", "-preset", "ultrafast", "-c:a", "copy", "-strict", "-2", outputFile.path) + } } OptiConstant.VIDEO_PLAYBACK_SPEED -> { //Video playback speed - Need video file, speed & tempo value according to playback and output file cmd = if (havingAudio) { - arrayOf("-y", "-i", videoFile!!.path, "-filter_complex", ffmpegFS!!, "-map", "[v]", "-map", "[a]", outputFile.path) + arrayOf("-y", "-i", videoFile!!.path, "-filter_complex", ffmpegFS!!, "-map", "[v]", "-map", "[a]", + "-c:v", "libx264", "-crf", "23", "-preset", "ultrafast", outputFile.path) } else { - arrayOf("-y", "-i", videoFile!!.path, "-filter:v", ffmpegFS!!, outputFile.path) + arrayOf("-y", "-i", videoFile!!.path, "-filter:v", ffmpegFS!!, + "-c:v", "libx264", "-crf", "23", "-preset", "ultrafast", outputFile.path) } } @@ -236,7 +268,11 @@ class OptiVideoEditor private constructor(private val context: Context) { OptiConstant.VIDEO_TRIM -> { //Video trim - Need video file, start time, end time & output file - cmd = arrayOf("-y", "-i", videoFile!!.path, "-ss", startTime, "-t", endTime, "-c", "copy", outputFile.path) + //-t will have the duration (in seconds) that we want to trim from startTime + Log.v(tagName, "final: $startTime, $endTime") + //cmd = arrayOf("-y", "-i", videoFile!!.path, "-ss", startTime, "-t", endTime, "-c", "copy", outputFile.path) + cmd = arrayOf("-y", "-i", videoFile!!.path, "-ss", startTime, "-t", endTime, "-c", "copy", + "-preset", "ultrafast", outputFile.path) } OptiConstant.VIDEO_TRANSITION -> { @@ -246,7 +282,8 @@ class OptiVideoEditor private constructor(private val context: Context) { OptiConstant.CONVERT_AVI_TO_MP4 -> { //Convert .avi to .mp4 - Need avi video file, command, mp4 output file - cmd = arrayOf("-y", "-i", videoFile!!.path, "-c:v", "libx264", "-crf", "19", "-preset", "slow", "-c:a", "aac", "-b:a", "192k", "-ac", "2", outputFile.path) + //cmd = arrayOf("-y", "-i", videoFile!!.path, "-c:v", "libx264", "-crf", "19", "-preset", "slow", "-c:a", "aac", "-b:a", "192k", "-ac", "2", outputFile.path) + cmd = arrayOf("-y", "-i", videoFile!!.path, "-c:v", "libx264", "-crf", "19", "-preset", "ultrafast", "-c:a", "aac", "-b:a", "192k", "-ac", "2", outputFile.path) } } diff --git a/app/src/main/java/com/obs/marveleditor/adapter/OptiClipArtAdapter.kt b/app/src/main/java/com/obs/marveleditor/adapter/OptiClipArtAdapter.kt index 38e814f..413e079 100644 --- a/app/src/main/java/com/obs/marveleditor/adapter/OptiClipArtAdapter.kt +++ b/app/src/main/java/com/obs/marveleditor/adapter/OptiClipArtAdapter.kt @@ -10,12 +10,13 @@ package com.obs.marveleditor.adapter import android.content.Context import android.graphics.Color import android.net.Uri -import android.support.v7.widget.RecyclerView import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView +import androidx.appcompat.widget.AppCompatImageView +import androidx.recyclerview.widget.RecyclerView import com.obs.marveleditor.R import com.obs.marveleditor.interfaces.OptiClipArtListener import java.io.File @@ -64,6 +65,6 @@ class OptiClipArtAdapter(clipArtList: ArrayList, val context: Context, o } class MyPostViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var tvClipArt: ImageView = itemView.findViewById(R.id.tv_clip_art) + var tvClipArt: AppCompatImageView = itemView.findViewById(R.id.tv_clip_art) } } \ No newline at end of file diff --git a/app/src/main/java/com/obs/marveleditor/adapter/OptiFilterAdapter.kt b/app/src/main/java/com/obs/marveleditor/adapter/OptiFilterAdapter.kt index 426f0db..5a0f118 100644 --- a/app/src/main/java/com/obs/marveleditor/adapter/OptiFilterAdapter.kt +++ b/app/src/main/java/com/obs/marveleditor/adapter/OptiFilterAdapter.kt @@ -10,13 +10,14 @@ package com.obs.marveleditor.adapter import android.content.Context import android.graphics.Bitmap import android.graphics.Color -import android.support.constraint.ConstraintLayout -import android.support.v7.widget.RecyclerView import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView +import androidx.appcompat.widget.AppCompatTextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.RecyclerView import com.facebook.drawee.view.SimpleDraweeView import com.obs.marveleditor.R import com.obs.marveleditor.interfaces.OptiFilterListener @@ -64,7 +65,7 @@ class OptiFilterAdapter(filterList: ArrayList, bitmap: Bitmap, val conte } class MyPostViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var tvFilter: TextView = itemView.findViewById(R.id.tvFilter) + var tvFilter: AppCompatTextView = itemView.findViewById(R.id.tvFilter) var ivFilter: SimpleDraweeView = itemView.findViewById(R.id.ivFilter) var clFilter: ConstraintLayout = itemView.findViewById(R.id.clFilter) } diff --git a/app/src/main/java/com/obs/marveleditor/adapter/OptiPlaybackSpeedAdapter.kt b/app/src/main/java/com/obs/marveleditor/adapter/OptiPlaybackSpeedAdapter.kt index 3112094..5085bbf 100644 --- a/app/src/main/java/com/obs/marveleditor/adapter/OptiPlaybackSpeedAdapter.kt +++ b/app/src/main/java/com/obs/marveleditor/adapter/OptiPlaybackSpeedAdapter.kt @@ -9,12 +9,13 @@ package com.obs.marveleditor.adapter import android.content.Context import android.graphics.Color -import android.support.v7.widget.RecyclerView import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView +import androidx.appcompat.widget.AppCompatTextView +import androidx.recyclerview.widget.RecyclerView import com.obs.marveleditor.R import com.obs.marveleditor.interfaces.OptiPlaybackSpeedListener import com.obs.marveleditor.utils.OptiConstant @@ -95,6 +96,6 @@ class OptiPlaybackSpeedAdapter(private val playbackList: ArrayList, val } class MyPostViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var tvSpeed: TextView = itemView.findViewById(R.id.tv_speed) + var tvSpeed: AppCompatTextView = itemView.findViewById(R.id.tv_speed) } } \ No newline at end of file diff --git a/app/src/main/java/com/obs/marveleditor/adapter/OptiPositionAdapter.kt b/app/src/main/java/com/obs/marveleditor/adapter/OptiPositionAdapter.kt index 323d1c0..0a89541 100644 --- a/app/src/main/java/com/obs/marveleditor/adapter/OptiPositionAdapter.kt +++ b/app/src/main/java/com/obs/marveleditor/adapter/OptiPositionAdapter.kt @@ -9,12 +9,13 @@ package com.obs.marveleditor.adapter import android.content.Context import android.graphics.Color -import android.support.v7.widget.RecyclerView import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView +import androidx.appcompat.widget.AppCompatTextView +import androidx.recyclerview.widget.RecyclerView import com.obs.marveleditor.R import com.obs.marveleditor.interfaces.OptiPositionListener @@ -63,6 +64,6 @@ class OptiPositionAdapter(positionList: ArrayList, val context: Context, } class MyPostViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var tvSpeed: TextView = itemView.findViewById(R.id.tv_speed) + var tvSpeed: AppCompatTextView = itemView.findViewById(R.id.tv_speed) } } \ No newline at end of file diff --git a/app/src/main/java/com/obs/marveleditor/adapter/OptiTransitionAdapter.kt b/app/src/main/java/com/obs/marveleditor/adapter/OptiTransitionAdapter.kt index 13be594..1ee0d43 100644 --- a/app/src/main/java/com/obs/marveleditor/adapter/OptiTransitionAdapter.kt +++ b/app/src/main/java/com/obs/marveleditor/adapter/OptiTransitionAdapter.kt @@ -9,12 +9,13 @@ package com.obs.marveleditor.adapter import android.content.Context import android.graphics.Color -import android.support.v7.widget.RecyclerView import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView +import androidx.appcompat.widget.AppCompatTextView +import androidx.recyclerview.widget.RecyclerView import com.obs.marveleditor.R import com.obs.marveleditor.interfaces.OptiFilterListener @@ -58,7 +59,7 @@ class OptiTransitionAdapter (transitionList: ArrayList, val context: Con } class MyPostViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var tvSpeed: TextView = itemView.findViewById(R.id.tv_speed) + var tvSpeed: AppCompatTextView = itemView.findViewById(R.id.tv_speed) } override fun getItemCount(): Int { diff --git a/app/src/main/java/com/obs/marveleditor/adapter/OptiVideoOptionsAdapter.kt b/app/src/main/java/com/obs/marveleditor/adapter/OptiVideoOptionsAdapter.kt index 9b1b0a8..1f2874d 100644 --- a/app/src/main/java/com/obs/marveleditor/adapter/OptiVideoOptionsAdapter.kt +++ b/app/src/main/java/com/obs/marveleditor/adapter/OptiVideoOptionsAdapter.kt @@ -8,11 +8,12 @@ package com.obs.marveleditor.adapter import android.content.Context -import android.support.v7.widget.RecyclerView import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView +import androidx.appcompat.widget.AppCompatImageView +import androidx.recyclerview.widget.RecyclerView import com.obs.marveleditor.R import com.obs.marveleditor.interfaces.OptiVideoOptionListener import com.obs.marveleditor.utils.OptiConstant @@ -75,7 +76,7 @@ class OptiVideoOptionsAdapter(videoOptions: ArrayList, val context: Cont } class MyPostViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var ivOption: ImageView = itemView.findViewById(R.id.iv_option) + var ivOption: AppCompatImageView = itemView.findViewById(R.id.iv_option) } override fun getItemCount(): Int { diff --git a/app/src/main/java/com/obs/marveleditor/fragments/OptiAddClipArtFragment.kt b/app/src/main/java/com/obs/marveleditor/fragments/OptiAddClipArtFragment.kt index d6be063..829694f 100644 --- a/app/src/main/java/com/obs/marveleditor/fragments/OptiAddClipArtFragment.kt +++ b/app/src/main/java/com/obs/marveleditor/fragments/OptiAddClipArtFragment.kt @@ -10,15 +10,16 @@ package com.obs.marveleditor.fragments import android.content.Context import android.os.Bundle import android.os.Environment -import android.support.design.widget.BottomSheetDialogFragment -import android.support.v7.widget.LinearLayoutManager -import android.support.v7.widget.RecyclerView import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.Toast +import androidx.appcompat.widget.AppCompatImageView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.obs.marveleditor.utils.OptiConstant import com.obs.marveleditor.OptiVideoEditor import com.obs.marveleditor.R @@ -39,8 +40,8 @@ class OptiAddClipArtFragment : BottomSheetDialogFragment(), OptiClipArtListener, private lateinit var linearLayoutManagerTwo: LinearLayoutManager private lateinit var rvClipArt: RecyclerView private lateinit var rvPosition: RecyclerView - private lateinit var ivClose: ImageView - private lateinit var ivDone: ImageView + private lateinit var ivClose: AppCompatImageView + private lateinit var ivDone: AppCompatImageView private var videoFile: File? = null private var clipArtFilePath: ArrayList = ArrayList() private var positionList: ArrayList = ArrayList() diff --git a/app/src/main/java/com/obs/marveleditor/fragments/OptiAddMusicFragment.kt b/app/src/main/java/com/obs/marveleditor/fragments/OptiAddMusicFragment.kt index 5cc4049..127e9c1 100644 --- a/app/src/main/java/com/obs/marveleditor/fragments/OptiAddMusicFragment.kt +++ b/app/src/main/java/com/obs/marveleditor/fragments/OptiAddMusicFragment.kt @@ -17,15 +17,15 @@ import android.net.Uri import android.os.Bundle import android.provider.MediaStore import android.provider.Settings -import android.support.v4.app.ActivityCompat -import android.support.v7.widget.AppCompatButton -import android.support.v7.widget.AppCompatImageView -import android.support.v7.widget.AppCompatTextView import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.* +import androidx.appcompat.widget.AppCompatButton +import androidx.appcompat.widget.AppCompatImageView +import androidx.appcompat.widget.AppCompatTextView +import androidx.core.app.ActivityCompat import com.obs.marveleditor.utils.OptiConstant import com.obs.marveleditor.R import com.obs.marveleditor.interfaces.OptiFFMpegCallback @@ -66,10 +66,10 @@ class OptiAddMusicFragment : OptiBaseCreatorDialogFragment(), OptiDialogueHelper private var durationSet: Boolean = false private var flLoadingView: FrameLayout? = null private var pbLoading: ProgressBar? = null - private var tvSelectedAudio: TextView? = null - private var ivRadio: ImageView? = null + private var tvSelectedAudio: AppCompatTextView? = null + private var ivRadio: AppCompatImageView? = null private var masterAudioFile: File? = null - private var tvSubTitle: TextView? = null + private var tvSubTitle: AppCompatTextView? = null private var nextAction: Int = 1 private var seekToValue: Long = 0L private var minSeekValue: Float = 0F @@ -103,7 +103,7 @@ class OptiAddMusicFragment : OptiBaseCreatorDialogFragment(), OptiDialogueHelper mContext = context acivClose?.setOnClickListener { - dialog.dismiss() + dialog?.dismiss() helper?.onDidNothing() } @@ -115,18 +115,21 @@ class OptiAddMusicFragment : OptiBaseCreatorDialogFragment(), OptiDialogueHelper checkPermission(OptiConstant.AUDIO_GALLERY, Manifest.permission.READ_EXTERNAL_STORAGE) } - sbrvVideoTrim?.setOnSeekBarRangedChangeListener(object : SeekBarRangedView.OnSeekBarRangedChangeListener { - override fun onChanged(view: SeekBarRangedView?, minValue: Float, maxValue: Float) { + val callback = object : SeekBarRangedView.SeekBarRangedChangeCallback { + + override fun onChanged(minValue: Float, maxValue: Float) { exoPlayer?.seekTo(minValue.toLong()) } - override fun onChanging(view: SeekBarRangedView?, minValue: Float, maxValue: Float) { + override fun onChanging(minValue: Float, maxValue: Float) { minSeekValue = minValue maxSeekValue = maxValue actvStartTime?.text = secToTime(minValue.toLong()) actvEndTime?.text = secToTime(maxValue.toLong()) } - }) + } + + sbrvVideoTrim?.actionCallback = callback setControls(false) } @@ -142,10 +145,12 @@ class OptiAddMusicFragment : OptiBaseCreatorDialogFragment(), OptiDialogueHelper } private fun initializePlayer() { - exoPlayer = ExoPlayerFactory.newSimpleInstance( - activity, DefaultRenderersFactory(activity), - DefaultTrackSelector(), DefaultLoadControl() - ) + exoPlayer = activity?.let { + ExoPlayerFactory.newSimpleInstance( + it, DefaultRenderersFactory(activity!!), + DefaultTrackSelector(), DefaultLoadControl() + ) + } ePlayer?.player = exoPlayer @@ -153,7 +158,11 @@ class OptiAddMusicFragment : OptiBaseCreatorDialogFragment(), OptiDialogueHelper exoPlayer?.addListener(playerListener) - exoPlayer?.prepare(buildMediaSource(Uri.fromFile(masterAudioFile), VideoFrom.LOCAL)) + buildMediaSource(Uri.fromFile(masterAudioFile), VideoFrom.LOCAL)?.let { + exoPlayer?.prepare( + it + ) + } exoPlayer?.seekTo(0) @@ -199,16 +208,23 @@ class OptiAddMusicFragment : OptiBaseCreatorDialogFragment(), OptiDialogueHelper } private val playerListener = object : Player.EventListener { - override fun onPlaybackParametersChanged(playbackParameters: PlaybackParameters?) { + override fun onPlaybackParametersChanged(playbackParameters: PlaybackParameters) { + //no implementation } override fun onSeekProcessed() { + //no implementation } - override fun onTracksChanged(trackGroups: TrackGroupArray?, trackSelections: TrackSelectionArray?) { + override fun onTracksChanged( + trackGroups: TrackGroupArray, + trackSelections: TrackSelectionArray + ) { + //no implementation } - override fun onPlayerError(error: ExoPlaybackException?) { + override fun onPlayerError(error: ExoPlaybackException) { + //no implementation } override fun onLoadingChanged(isLoading: Boolean) { @@ -216,17 +232,20 @@ class OptiAddMusicFragment : OptiBaseCreatorDialogFragment(), OptiDialogueHelper } override fun onPositionDiscontinuity(reason: Int) { + //no implementation } override fun onRepeatModeChanged(repeatMode: Int) { + //no implementation } override fun onShuffleModeEnabledChanged(shuffleModeEnabled: Boolean) { + //no implementation } - override fun onTimelineChanged(timeline: Timeline?, manifest: Any?, reason: Int) { + /*override fun onTimelineChanged(timeline: Timeline, reason: Int) { - } + }*/ override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) { @@ -245,12 +264,12 @@ class OptiAddMusicFragment : OptiBaseCreatorDialogFragment(), OptiDialogueHelper if (!durationSet) { durationSet = true val duration = exoPlayer?.duration - sbrvVideoTrim?.maxValue = duration?.toFloat()!! + sbrvVideoTrim?.setMaxValue(duration?.toFloat()!!) actvStartTime?.text = secToTime(0) - actvEndTime?.text = secToTime(duration) + actvEndTime?.text = duration?.let { secToTime(it) } //set min & max seek value for audio trimming minSeekValue = 0F - maxSeekValue = duration.toFloat() + maxSeekValue = duration?.toFloat() ?: 0F } } } @@ -262,7 +281,7 @@ class OptiAddMusicFragment : OptiBaseCreatorDialogFragment(), OptiDialogueHelper } override fun setMode(mode: Int) { - + //no implementation } override fun setHelper(helper: CallBacks) { @@ -274,11 +293,11 @@ class OptiAddMusicFragment : OptiBaseCreatorDialogFragment(), OptiDialogueHelper } override fun dismiss() { - + //no implementation } override fun permissionsBlocked() { - + //no implementation } override fun onStop() { @@ -368,7 +387,7 @@ class OptiAddMusicFragment : OptiBaseCreatorDialogFragment(), OptiDialogueHelper } } } catch (e: Exception) { - + Log.v(tagName, "Exception: " + e.localizedMessage) } } } @@ -438,7 +457,7 @@ class OptiAddMusicFragment : OptiBaseCreatorDialogFragment(), OptiDialogueHelper muxVideoPlayer() } else { helper?.showLoading(false) - dialog.dismiss() + dialog?.dismiss() } } @@ -467,7 +486,7 @@ class OptiAddMusicFragment : OptiBaseCreatorDialogFragment(), OptiDialogueHelper } } - override fun onCancel(dialog: DialogInterface?) { + override fun onCancel(dialog: DialogInterface) { super.onCancel(dialog) releasePlayer() } diff --git a/app/src/main/java/com/obs/marveleditor/fragments/OptiAddTextFragment.kt b/app/src/main/java/com/obs/marveleditor/fragments/OptiAddTextFragment.kt index 796c2e6..70f0222 100644 --- a/app/src/main/java/com/obs/marveleditor/fragments/OptiAddTextFragment.kt +++ b/app/src/main/java/com/obs/marveleditor/fragments/OptiAddTextFragment.kt @@ -10,9 +10,6 @@ package com.obs.marveleditor.fragments import android.content.Context import android.os.Bundle import android.os.Environment -import android.support.design.widget.BottomSheetDialogFragment -import android.support.v7.widget.LinearLayoutManager -import android.support.v7.widget.RecyclerView import android.util.Log import android.view.LayoutInflater import android.view.View @@ -20,6 +17,11 @@ import android.view.ViewGroup import android.widget.EditText import android.widget.ImageView import android.widget.Toast +import androidx.appcompat.widget.AppCompatEditText +import androidx.appcompat.widget.AppCompatImageView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.obs.marveleditor.utils.OptiConstant import com.obs.marveleditor.OptiVideoEditor import com.obs.marveleditor.R @@ -36,14 +38,14 @@ class OptiAddTextFragment : BottomSheetDialogFragment(), OptiPositionListener, O private lateinit var rootView: View private lateinit var linearLayoutManager: LinearLayoutManager private lateinit var rvPosition: RecyclerView - private lateinit var ivClose: ImageView - private lateinit var ivDone: ImageView + private lateinit var ivClose: AppCompatImageView + private lateinit var ivDone: AppCompatImageView private var videoFile: File? = null private var helper: OptiBaseCreatorDialogFragment.CallBacks? = null private lateinit var optiPositionAdapter: OptiPositionAdapter private var positionList: ArrayList = ArrayList() private var selectedPositionItem: String? = null - private var etText: EditText? = null + private var etText: AppCompatEditText? = null private var positionStr: String? = null private var mContext: Context? = null diff --git a/app/src/main/java/com/obs/marveleditor/fragments/OptiBaseCreatorDialogFragment.kt b/app/src/main/java/com/obs/marveleditor/fragments/OptiBaseCreatorDialogFragment.kt index bb60b1e..0f48991 100644 --- a/app/src/main/java/com/obs/marveleditor/fragments/OptiBaseCreatorDialogFragment.kt +++ b/app/src/main/java/com/obs/marveleditor/fragments/OptiBaseCreatorDialogFragment.kt @@ -15,12 +15,12 @@ import android.content.pm.PackageManager import android.net.Uri import android.os.Bundle import android.provider.Settings -import android.support.v4.app.ActivityCompat -import android.support.v4.app.DialogFragment import android.widget.Toast import com.github.hiteshsondhi88.libffmpeg.FFmpeg import java.io.File import android.webkit.MimeTypeMap +import androidx.core.app.ActivityCompat +import androidx.fragment.app.DialogFragment import com.obs.marveleditor.R abstract class OptiBaseCreatorDialogFragment : DialogFragment() { @@ -55,7 +55,7 @@ abstract class OptiBaseCreatorDialogFragment : DialogFragment() { } } - override fun onCancel(dialog: DialogInterface?) { + override fun onCancel(dialog: DialogInterface) { super.onCancel(dialog) stopRunningProcess() } diff --git a/app/src/main/java/com/obs/marveleditor/fragments/OptiFilterFragment.kt b/app/src/main/java/com/obs/marveleditor/fragments/OptiFilterFragment.kt index bb30a29..3149f5a 100644 --- a/app/src/main/java/com/obs/marveleditor/fragments/OptiFilterFragment.kt +++ b/app/src/main/java/com/obs/marveleditor/fragments/OptiFilterFragment.kt @@ -12,15 +12,16 @@ import android.graphics.Bitmap import android.media.ThumbnailUtils import android.os.Bundle import android.provider.MediaStore -import android.support.design.widget.BottomSheetDialogFragment -import android.support.v7.widget.LinearLayoutManager -import android.support.v7.widget.RecyclerView import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.Toast +import androidx.appcompat.widget.AppCompatImageView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.obs.marveleditor.OptiVideoEditor import com.obs.marveleditor.R import com.obs.marveleditor.adapter.OptiFilterAdapter @@ -37,8 +38,8 @@ class OptiFilterFragment : BottomSheetDialogFragment(), OptiFilterListener, Opti private lateinit var rootView: View private lateinit var linearLayoutManager: LinearLayoutManager private lateinit var rvFilter: RecyclerView - private lateinit var ivClose: ImageView - private lateinit var ivDone: ImageView + private lateinit var ivClose: AppCompatImageView + private lateinit var ivDone: AppCompatImageView private var videoFile: File? = null private var helper: OptiBaseCreatorDialogFragment.CallBacks? = null private var filterList: ArrayList = ArrayList() diff --git a/app/src/main/java/com/obs/marveleditor/fragments/OptiMasterProcessorFragment.kt b/app/src/main/java/com/obs/marveleditor/fragments/OptiMasterProcessorFragment.kt index 0099545..8583657 100644 --- a/app/src/main/java/com/obs/marveleditor/fragments/OptiMasterProcessorFragment.kt +++ b/app/src/main/java/com/obs/marveleditor/fragments/OptiMasterProcessorFragment.kt @@ -23,18 +23,20 @@ import android.os.Environment import android.os.Handler import android.provider.MediaStore import android.provider.Settings -import android.support.design.widget.BottomSheetDialogFragment -import android.support.v4.app.ActivityCompat -import android.support.v4.app.Fragment -import android.support.v4.content.ContextCompat -import android.support.v4.content.FileProvider -import android.support.v7.widget.LinearLayoutManager -import android.support.v7.widget.RecyclerView import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.* +import androidx.appcompat.widget.AppCompatImageButton +import androidx.appcompat.widget.AppCompatImageView +import androidx.appcompat.widget.AppCompatTextView +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import androidx.core.content.FileProvider +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.github.hiteshsondhi88.libffmpeg.FFmpeg import com.github.hiteshsondhi88.libffmpeg.FFmpegLoadBinaryResponseHandler import com.github.hiteshsondhi88.libffmpeg.exceptions.FFmpegNotSupportedException @@ -44,6 +46,7 @@ import com.google.android.exoplayer2.trackselection.DefaultTrackSelector import com.google.android.exoplayer2.trackselection.TrackSelectionArray import com.google.android.exoplayer2.ui.PlayerView import com.google.android.exoplayer2.util.Util +import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.obs.marveleditor.OptiVideoEditor import com.obs.marveleditor.utils.OptiCommonMethods import com.obs.marveleditor.utils.OptiConstant @@ -70,10 +73,10 @@ class OptiMasterProcessorFragment : Fragment(), OptiBaseCreatorDialogFragment.Ca private var permissionList: ArrayList = ArrayList() private lateinit var preferences: SharedPreferences private lateinit var progressBar: ProgressBar - private var tvVideoProcessing: TextView? = null + private var tvVideoProcessing: AppCompatTextView? = null private var handler: Handler = Handler() - private var ibGallery: ImageButton? = null - private var ibCamera: ImageButton? = null + private var ibGallery: AppCompatImageButton? = null + private var ibCamera: AppCompatImageButton? = null private var masterVideoFile: File? = null private var playbackPosition: Long = 0 private var currentWindow: Int = 0 @@ -86,10 +89,10 @@ class OptiMasterProcessorFragment : Fragment(), OptiBaseCreatorDialogFragment.Ca private lateinit var optiVideoOptionsAdapter: OptiVideoOptionsAdapter private var videoOptions: ArrayList = ArrayList() private var orientationLand: Boolean = false - private var tvSave: ImageView? = null + private var tvSave: AppCompatImageView? = null private var isLargeVideo: Boolean? = false private var mContext: Context? = null - private var tvInfo: TextView? = null + private var tvInfo: AppCompatTextView? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { rootView = inflater.inflate(R.layout.opti_video_processor_fragment, container, false) @@ -184,16 +187,18 @@ class OptiMasterProcessorFragment : Fragment(), OptiBaseCreatorDialogFragment.Ca } tvInfo?.setOnClickListener{ - OptiVideoOptionFragment.newInstance().apply { - setHelper(this@OptiMasterProcessorFragment) - }.show(fragmentManager, "OptiVideoOptionFragment") + fragmentManager?.let { it1 -> + OptiVideoOptionFragment.newInstance().apply { + setHelper(this@OptiMasterProcessorFragment) + }.show(it1, "OptiVideoOptionFragment") + } } } - override fun onConfigurationChanged(newConfig: Configuration?) { + override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) //for playing video in landscape mode - if (newConfig!!.orientation == Configuration.ORIENTATION_LANDSCAPE) { + if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { Log.v(tagName, "orientation: ORIENTATION_LANDSCAPE") orientationLand = true } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { @@ -207,7 +212,7 @@ class OptiMasterProcessorFragment : Fragment(), OptiBaseCreatorDialogFragment.Ca } override fun onAudioFileProcessed(convertedAudioFile: File) { - + //no implementation } override fun reInitPlayer() { @@ -566,7 +571,7 @@ class OptiMasterProcessorFragment : Fragment(), OptiBaseCreatorDialogFragment.Ca } } } catch (e: Exception) { - + Log.v(tagName, "Exception: " + e.localizedMessage) } } } @@ -607,11 +612,13 @@ class OptiMasterProcessorFragment : Fragment(), OptiBaseCreatorDialogFragment.Ca tvInfo!!.visibility= View.GONE ePlayer?.useController = true - exoPlayer = ExoPlayerFactory.newSimpleInstance( - activity, - DefaultRenderersFactory(activity), - DefaultTrackSelector(), DefaultLoadControl() - ) + exoPlayer = activity?.let { + ExoPlayerFactory.newSimpleInstance( + it, + DefaultRenderersFactory(activity!!), + DefaultTrackSelector(), DefaultLoadControl() + ) + } ePlayer?.player = exoPlayer @@ -619,7 +626,11 @@ class OptiMasterProcessorFragment : Fragment(), OptiBaseCreatorDialogFragment.Ca exoPlayer?.addListener(playerListener) - exoPlayer?.prepare(VideoUtils.buildMediaSource(Uri.fromFile(masterVideoFile), VideoFrom.LOCAL)) + VideoUtils.buildMediaSource(Uri.fromFile(masterVideoFile), VideoFrom.LOCAL)?.let { + exoPlayer?.prepare( + it + ) + } exoPlayer?.seekTo(0) @@ -630,16 +641,22 @@ class OptiMasterProcessorFragment : Fragment(), OptiBaseCreatorDialogFragment.Ca } private val playerListener = object : Player.EventListener { - override fun onPlaybackParametersChanged(playbackParameters: PlaybackParameters?) { + override fun onPlaybackParametersChanged(playbackParameters: PlaybackParameters) { + //no implementation } override fun onSeekProcessed() { + //no implementation } - override fun onTracksChanged(trackGroups: TrackGroupArray?, trackSelections: TrackSelectionArray?) { + override fun onTracksChanged( + trackGroups: TrackGroupArray, + trackSelections: TrackSelectionArray + ) { + //no implementation } - override fun onPlayerError(error: ExoPlaybackException?) { + override fun onPlayerError(error: ExoPlaybackException) { Log.v(tagName, "onPlayerError: ${error.toString()}") Toast.makeText(mContext, "Video format is not supported", Toast.LENGTH_LONG).show() } @@ -649,17 +666,20 @@ class OptiMasterProcessorFragment : Fragment(), OptiBaseCreatorDialogFragment.Ca } override fun onPositionDiscontinuity(reason: Int) { + //no implementation } override fun onRepeatModeChanged(repeatMode: Int) { + //no implementation } override fun onShuffleModeEnabledChanged(shuffleModeEnabled: Boolean) { + //no implementation } - override fun onTimelineChanged(timeline: Timeline?, manifest: Any?, reason: Int) { + /*override fun onTimelineChanged(timeline: Timeline, reason: Int) { - } + }*/ override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) { @@ -849,7 +869,7 @@ class OptiMasterProcessorFragment : Fragment(), OptiBaseCreatorDialogFragment.Ca private fun showBottomSheetDialogFragment(bottomSheetDialogFragment: BottomSheetDialogFragment) { val bundle = Bundle() bottomSheetDialogFragment.arguments = bundle - bottomSheetDialogFragment.show(fragmentManager, bottomSheetDialogFragment.tag) + fragmentManager?.let { bottomSheetDialogFragment.show(it, bottomSheetDialogFragment.tag) } } override fun videoOption(option: String) { @@ -895,11 +915,13 @@ class OptiMasterProcessorFragment : Fragment(), OptiBaseCreatorDialogFragment.Ca /*val duration = OptiCommonMethods.convertDurationInSec(timeInMillis) Log.v(tagName, "videoDuration: $duration")*/ - OptiAddMusicFragment.newInstance().apply { - setHelper(this@OptiMasterProcessorFragment) - setFilePathFromSource(file) - setDuration(timeInMillis) - }.show(fragmentManager, "OptiAddMusicFragment") + fragmentManager?.let { + OptiAddMusicFragment.newInstance().apply { + setHelper(this@OptiMasterProcessorFragment) + setFilePathFromSource(file) + setDuration(timeInMillis) + }.show(it, "OptiAddMusicFragment") + } } if (masterVideoFile == null) { @@ -916,10 +938,12 @@ class OptiMasterProcessorFragment : Fragment(), OptiBaseCreatorDialogFragment.Ca playbackPosition = 0 currentWindow = 0 - OptiPlaybackSpeedDialogFragment.newInstance().apply { - setHelper(this@OptiMasterProcessorFragment) - setFilePathFromSource(file) - }.show(fragmentManager, "OptiPlaybackSpeedDialogFragment") + fragmentManager?.let { + OptiPlaybackSpeedDialogFragment.newInstance().apply { + setHelper(this@OptiMasterProcessorFragment) + setFilePathFromSource(file) + }.show(it, "OptiPlaybackSpeedDialogFragment") + } } if (masterVideoFile == null) { @@ -963,9 +987,11 @@ class OptiMasterProcessorFragment : Fragment(), OptiBaseCreatorDialogFragment.Ca } OptiConstant.MERGE -> { - OptiMergeFragment.newInstance().apply { - setHelper(this@OptiMasterProcessorFragment) - }.show(fragmentManager, "OptiMergeFragment") + fragmentManager?.let { + OptiMergeFragment.newInstance().apply { + setHelper(this@OptiMasterProcessorFragment) + }.show(it, "OptiMergeFragment") + } } OptiConstant.TRANSITION -> { diff --git a/app/src/main/java/com/obs/marveleditor/fragments/OptiMergeFragment.kt b/app/src/main/java/com/obs/marveleditor/fragments/OptiMergeFragment.kt index 3c7f563..0918662 100644 --- a/app/src/main/java/com/obs/marveleditor/fragments/OptiMergeFragment.kt +++ b/app/src/main/java/com/obs/marveleditor/fragments/OptiMergeFragment.kt @@ -13,34 +13,39 @@ import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.graphics.Bitmap +import android.media.MediaMetadataRetriever import android.media.ThumbnailUtils import android.net.Uri import android.os.Bundle import android.provider.MediaStore import android.provider.Settings -import android.support.design.widget.BottomSheetDialogFragment -import android.support.v4.app.ActivityCompat import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.Toast +import androidx.appcompat.widget.AppCompatImageView +import androidx.core.app.ActivityCompat +import androidx.core.app.ActivityCompat.startActivityForResult import com.obs.marveleditor.utils.OptiConstant import com.obs.marveleditor.R import com.obs.marveleditor.utils.OptiUtils import com.obs.marveleditor.interfaces.OptiDialogueHelper import com.facebook.drawee.view.SimpleDraweeView +import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.obs.marveleditor.OptiVideoEditor import com.obs.marveleditor.interfaces.OptiFFMpegCallback +import com.obs.marveleditor.utils.OptiCommonMethods import java.io.File +import java.io.FileWriter class OptiMergeFragment : BottomSheetDialogFragment(), OptiDialogueHelper, OptiFFMpegCallback { private var tagName: String = OptiMergeFragment::class.java.simpleName private lateinit var rootView: View - private lateinit var ivClose: ImageView - private lateinit var ivDone: ImageView + private lateinit var ivClose: AppCompatImageView + private lateinit var ivDone: AppCompatImageView private lateinit var ivVideoOne: SimpleDraweeView private lateinit var ivVideoTwo: SimpleDraweeView private var videoFileOne: File? = null @@ -49,6 +54,7 @@ class OptiMergeFragment : BottomSheetDialogFragment(), OptiDialogueHelper, OptiF private var bmThumbnailTwo: Bitmap? = null private var helper: OptiBaseCreatorDialogFragment.CallBacks? = null private var mContext: Context? = null + private var isMP4: Boolean? = false override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { rootView = inflater.inflate(R.layout.opti_fragment_merge_dialog, container, false) @@ -74,6 +80,29 @@ class OptiMergeFragment : BottomSheetDialogFragment(), OptiDialogueHelper, OptiF if (videoFileOne != null && videoFileTwo != null) { dismiss() + val metaRetriever = MediaMetadataRetriever() + metaRetriever.setDataSource(videoFileOne!!.absolutePath) + val height = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT) + val width = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH) + Log.v(tagName, "height: $height, width: $width") + + //create text file for concat demuxer + val txtFile = OptiUtils.createTextFile(context!!) + Log.v(tagName, "txtFile: ${txtFile.absolutePath}") + + val writer = FileWriter(txtFile) + writer.append("file '" + videoFileOne!!.absolutePath + "'") + writer.append("\n") + writer.append("file '" + videoFileTwo!!.absolutePath + "'") + writer.flush() + writer.close() + + val extensionOne = OptiCommonMethods.getFileExtension(videoFileOne!!.absolutePath) + val extensionTwo = OptiCommonMethods.getFileExtension(videoFileTwo!!.absolutePath) + Log.v(tagName, "extensionOne: $extensionOne, extensionTwo: $extensionTwo") + + isMP4 = extensionOne == OptiConstant.VIDEO_FORMAT && extensionTwo == OptiConstant.VIDEO_FORMAT + //output file is generated and send to video processing val outputFile = OptiUtils.createVideoFile(context!!) Log.v(tagName, "outputFile: ${outputFile.absolutePath}") @@ -82,7 +111,9 @@ class OptiMergeFragment : BottomSheetDialogFragment(), OptiDialogueHelper, OptiF .setType(OptiConstant.MERGE_VIDEO) .setFile(videoFileOne!!) .setFileTwo(videoFileTwo!!) + .setTextFile(txtFile, isMP4!!) .setOutputPath(outputFile.path) + .setFileWidthHeight(width!!, height!!) .setCallback(this) .main() diff --git a/app/src/main/java/com/obs/marveleditor/fragments/OptiPlaybackSpeedDialogFragment.kt b/app/src/main/java/com/obs/marveleditor/fragments/OptiPlaybackSpeedDialogFragment.kt index 28c38ba..1942910 100644 --- a/app/src/main/java/com/obs/marveleditor/fragments/OptiPlaybackSpeedDialogFragment.kt +++ b/app/src/main/java/com/obs/marveleditor/fragments/OptiPlaybackSpeedDialogFragment.kt @@ -9,15 +9,16 @@ package com.obs.marveleditor.fragments import android.content.Context import android.os.Bundle -import android.support.design.widget.BottomSheetDialogFragment -import android.support.v7.widget.LinearLayoutManager -import android.support.v7.widget.RecyclerView import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.Toast +import androidx.appcompat.widget.AppCompatImageView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.obs.marveleditor.utils.OptiConstant import com.obs.marveleditor.OptiVideoEditor import com.obs.marveleditor.R @@ -37,8 +38,8 @@ class OptiPlaybackSpeedDialogFragment : BottomSheetDialogFragment(), OptiDialogu private lateinit var rvPlaybackSpeed: RecyclerView private lateinit var optiPlaybackSpeedAdapter: OptiPlaybackSpeedAdapter private var playbackSpeed: ArrayList = ArrayList() - private lateinit var ivClose: ImageView - private lateinit var ivDone: ImageView + private lateinit var ivClose: AppCompatImageView + private lateinit var ivDone: AppCompatImageView private var masterFile: File? = null private var isHavingAudio = true private var helper: OptiBaseCreatorDialogFragment.CallBacks? = null diff --git a/app/src/main/java/com/obs/marveleditor/fragments/OptiTransitionFragment.kt b/app/src/main/java/com/obs/marveleditor/fragments/OptiTransitionFragment.kt index 4c0dded..b780657 100644 --- a/app/src/main/java/com/obs/marveleditor/fragments/OptiTransitionFragment.kt +++ b/app/src/main/java/com/obs/marveleditor/fragments/OptiTransitionFragment.kt @@ -9,15 +9,16 @@ package com.obs.marveleditor.fragments import android.content.Context import android.os.Bundle -import android.support.design.widget.BottomSheetDialogFragment -import android.support.v7.widget.LinearLayoutManager -import android.support.v7.widget.RecyclerView import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.Toast +import androidx.appcompat.widget.AppCompatImageView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.obs.marveleditor.OptiVideoEditor import com.obs.marveleditor.R import com.obs.marveleditor.adapter.OptiTransitionAdapter @@ -34,8 +35,8 @@ class OptiTransitionFragment : BottomSheetDialogFragment(), OptiFilterListener, private lateinit var rootView: View private lateinit var linearLayoutManager: LinearLayoutManager private lateinit var rvTransition: RecyclerView - private lateinit var ivClose: ImageView - private lateinit var ivDone: ImageView + private lateinit var ivClose: AppCompatImageView + private lateinit var ivDone: AppCompatImageView private var videoFile: File? = null private var helper: OptiBaseCreatorDialogFragment.CallBacks? = null private var transitionList: ArrayList = ArrayList() diff --git a/app/src/main/java/com/obs/marveleditor/fragments/OptiTrimFragment.kt b/app/src/main/java/com/obs/marveleditor/fragments/OptiTrimFragment.kt index 015ecff..a60a7b7 100644 --- a/app/src/main/java/com/obs/marveleditor/fragments/OptiTrimFragment.kt +++ b/app/src/main/java/com/obs/marveleditor/fragments/OptiTrimFragment.kt @@ -9,15 +9,16 @@ package com.obs.marveleditor.fragments import android.content.Context import android.os.Bundle -import android.support.design.widget.BottomSheetDialogFragment -import android.support.v7.widget.AppCompatTextView import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.Toast +import androidx.appcompat.widget.AppCompatImageView +import androidx.appcompat.widget.AppCompatTextView import com.github.guilhe.views.SeekBarRangedView +import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.obs.marveleditor.utils.OptiConstant import com.obs.marveleditor.OptiVideoEditor import com.obs.marveleditor.R @@ -30,8 +31,8 @@ class OptiTrimFragment : BottomSheetDialogFragment(), OptiFFMpegCallback { private var tagName: String = OptiTrimFragment::class.java.simpleName private lateinit var rootView: View - private lateinit var ivClose: ImageView - private lateinit var ivDone: ImageView + private lateinit var ivClose: AppCompatImageView + private lateinit var ivDone: AppCompatImageView private var videoFile: File? = null private var helper: OptiBaseCreatorDialogFragment.CallBacks? = null private var sbrvVideoTrim: SeekBarRangedView? = null @@ -81,22 +82,23 @@ class OptiTrimFragment : BottomSheetDialogFragment(), OptiFFMpegCallback { Log.v(tagName, "duration: $duration") Log.v(tagName, "duration: " + VideoUtils.secToTime(duration!!)) - sbrvVideoTrim?.minValue = 0f - sbrvVideoTrim?.maxValue = duration?.toFloat()!! + sbrvVideoTrim?.setMinValue(0f) + sbrvVideoTrim?.setMaxValue(duration?.toFloat()!!) actvStartTime?.text = VideoUtils.secToTime(0) actvEndTime?.text = VideoUtils.secToTime(duration!!) - sbrvVideoTrim?.setOnSeekBarRangedChangeListener(object : SeekBarRangedView.OnSeekBarRangedChangeListener { - override fun onChanged(view: SeekBarRangedView?, minValue: Float, maxValue: Float) { + val callback = object : SeekBarRangedView.SeekBarRangedChangeCallback { + override fun onChanged(minValue: Float, maxValue: Float) { //exoPlayer?.seekTo(minValue.toLong()) } - override fun onChanging(view: SeekBarRangedView?, minValue: Float, maxValue: Float) { + override fun onChanging(minValue: Float, maxValue: Float) { Log.v(tagName, "minValue: $minValue, maxValue: $maxValue") actvStartTime?.text = VideoUtils.secToTime(minValue.toLong()) actvEndTime?.text = VideoUtils.secToTime(maxValue.toLong()) } - }) + } + sbrvVideoTrim?.actionCallback = callback } fun setHelper(helper: OptiBaseCreatorDialogFragment.CallBacks) { diff --git a/app/src/main/java/com/obs/marveleditor/fragments/OptiVideoOptionFragment.kt b/app/src/main/java/com/obs/marveleditor/fragments/OptiVideoOptionFragment.kt index 75538c5..1a893dd 100644 --- a/app/src/main/java/com/obs/marveleditor/fragments/OptiVideoOptionFragment.kt +++ b/app/src/main/java/com/obs/marveleditor/fragments/OptiVideoOptionFragment.kt @@ -8,11 +8,12 @@ package com.obs.marveleditor.fragments import android.os.Bundle -import android.support.v7.widget.AppCompatImageView import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView +import androidx.appcompat.widget.AppCompatImageView +import androidx.appcompat.widget.AppCompatTextView import com.obs.marveleditor.R import com.obs.marveleditor.interfaces.OptiDialogueHelper import java.io.File @@ -36,8 +37,8 @@ class OptiVideoOptionFragment : OptiBaseCreatorDialogFragment(), OptiDialogueHel //private var tagName: String = OptiVideoOptionFragment::class.java.simpleName private var acivClose: AppCompatImageView? = null - private var tvGallery: TextView? = null - private var tvCamera: TextView? = null + private var tvGallery: AppCompatTextView? = null + private var tvCamera: AppCompatTextView? = null private var helper: CallBacks? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -54,16 +55,16 @@ class OptiVideoOptionFragment : OptiBaseCreatorDialogFragment(), OptiDialogueHel tvCamera = inflate?.findViewById(R.id.tvCamera) acivClose?.setOnClickListener { - dialog.dismiss() + dialog?.dismiss() } tvGallery?.setOnClickListener { - dialog.dismiss() + dialog?.dismiss() helper?.openGallery() } tvCamera?.setOnClickListener { - dialog.dismiss() + dialog?.dismiss() helper?.openCamera() } } diff --git a/app/src/main/java/com/obs/marveleditor/utils/OptiConstant.kt b/app/src/main/java/com/obs/marveleditor/utils/OptiConstant.kt index 3679972..d865d8b 100644 --- a/app/src/main/java/com/obs/marveleditor/utils/OptiConstant.kt +++ b/app/src/main/java/com/obs/marveleditor/utils/OptiConstant.kt @@ -71,6 +71,7 @@ class OptiConstant { const val VIDEO_FORMAT = ".mp4" const val AUDIO_FORMAT = ".mp3" const val AVI_FORMAT = ".avi" + const val TXT_FORMAT = ".txt" const val VIDEO_LIMIT = 4 //4 minutes } diff --git a/app/src/main/java/com/obs/marveleditor/utils/OptiCustomRangeSeekBar.java b/app/src/main/java/com/obs/marveleditor/utils/OptiCustomRangeSeekBar.java index 73f2a1c..92e91f0 100644 --- a/app/src/main/java/com/obs/marveleditor/utils/OptiCustomRangeSeekBar.java +++ b/app/src/main/java/com/obs/marveleditor/utils/OptiCustomRangeSeekBar.java @@ -25,11 +25,13 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; -import android.support.annotation.NonNull; -import android.support.v4.content.ContextCompat; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; + +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; + import com.obs.marveleditor.R; import com.obs.marveleditor.interfaces.OptiOnRangeSeekBarChangeListener; diff --git a/app/src/main/java/com/obs/marveleditor/utils/OptiUtils.kt b/app/src/main/java/com/obs/marveleditor/utils/OptiUtils.kt index a073ceb..9d2cdc0 100644 --- a/app/src/main/java/com/obs/marveleditor/utils/OptiUtils.kt +++ b/app/src/main/java/com/obs/marveleditor/utils/OptiUtils.kt @@ -101,6 +101,14 @@ object OptiUtils { } } + fun createTextFile(context: Context): File { + val timeStamp: String = SimpleDateFormat(OptiConstant.DATE_FORMAT, Locale.getDefault()).format(Date()) + val imageFileName: String = OptiConstant.APP_NAME + timeStamp + "_" + val storageDir: File = context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)!! + if (!storageDir.exists()) storageDir.mkdirs() + return File.createTempFile(imageFileName, OptiConstant.TXT_FORMAT, storageDir) + } + fun refreshGalleryAlone(context: Context) { try { val mediaScanIntent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE) @@ -134,16 +142,16 @@ object OptiUtils { fun createVideoFile(context: Context): File { val timeStamp: String = SimpleDateFormat(OptiConstant.DATE_FORMAT, Locale.getDefault()).format(Date()) val imageFileName: String = OptiConstant.APP_NAME + timeStamp + "_" - val storageDir: File = context.getExternalFilesDir(Environment.DIRECTORY_MOVIES) - if (!storageDir.exists()) storageDir.mkdirs() + val storageDir: File? = context.getExternalFilesDir(Environment.DIRECTORY_MOVIES) + if (storageDir != null && !storageDir.exists()) storageDir.mkdirs() return File.createTempFile(imageFileName, OptiConstant.VIDEO_FORMAT, storageDir) } fun createAudioFile(context: Context): File { val timeStamp: String = SimpleDateFormat(OptiConstant.DATE_FORMAT, Locale.getDefault()).format(Date()) val imageFileName: String = OptiConstant.APP_NAME + timeStamp + "_" - val storageDir: File = context.getExternalFilesDir(Environment.DIRECTORY_MOVIES) - if (!storageDir.exists()) storageDir.mkdirs() + val storageDir: File? = context.getExternalFilesDir(Environment.DIRECTORY_MOVIES) + if (storageDir != null && !storageDir.exists()) storageDir.mkdirs() return File.createTempFile(imageFileName, OptiConstant.AUDIO_FORMAT, storageDir) } @@ -151,9 +159,9 @@ object OptiUtils { val retriever = MediaMetadataRetriever() retriever.setDataSource(context, Uri.fromFile(file)) val time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION) - val timeInMillis = time.toLong() + val timeInMillis = time?.toLong() retriever.release() - return timeInMillis + return timeInMillis ?: 0 } } diff --git a/app/src/main/java/com/obs/marveleditor/utils/OptiVideoUtils.kt b/app/src/main/java/com/obs/marveleditor/utils/OptiVideoUtils.kt index 56a25d7..77aacc5 100644 --- a/app/src/main/java/com/obs/marveleditor/utils/OptiVideoUtils.kt +++ b/app/src/main/java/com/obs/marveleditor/utils/OptiVideoUtils.kt @@ -48,7 +48,11 @@ object VideoUtils { } } - return ExtractorMediaSource.Factory(factory).createMediaSource(fileDataSource.uri) + return fileDataSource.uri?.let { + ExtractorMediaSource.Factory(factory).createMediaSource( + it + ) + } } VideoFrom.REMOTE -> { diff --git a/app/src/main/java/com/obs/marveleditor/videoTrimmer/OptiHgLVideoTrimmer.java b/app/src/main/java/com/obs/marveleditor/videoTrimmer/OptiHgLVideoTrimmer.java index fd86b47..d12a5ca 100644 --- a/app/src/main/java/com/obs/marveleditor/videoTrimmer/OptiHgLVideoTrimmer.java +++ b/app/src/main/java/com/obs/marveleditor/videoTrimmer/OptiHgLVideoTrimmer.java @@ -13,8 +13,6 @@ import android.os.Build; import android.os.Handler; import android.os.Message; -import android.support.annotation.NonNull; -import android.support.annotation.RequiresApi; import android.util.AttributeSet; import android.util.Log; import android.view.GestureDetector; @@ -22,12 +20,16 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -import android.widget.*; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.SeekBar; +import android.widget.TextView; +import android.widget.Toast; +import android.widget.VideoView; -import java.io.File; -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.List; +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; import com.obs.marveleditor.R; import com.obs.marveleditor.videoTrimmer.interfaces.OptiOnHgLVideoListener; @@ -41,6 +43,11 @@ import com.obs.marveleditor.videoTrimmer.view.OptiThumb; import com.obs.marveleditor.videoTrimmer.view.OptiTimeLineView; +import java.io.File; +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; + import static com.obs.marveleditor.videoTrimmer.utils.OptiTrimVideoUtils.stringForTime; public class OptiHgLVideoTrimmer extends FrameLayout { diff --git a/app/src/main/java/com/obs/marveleditor/videoTrimmer/utils/OptiFileUtils.java b/app/src/main/java/com/obs/marveleditor/videoTrimmer/utils/OptiFileUtils.java index 9b40adc..fa31c3f 100644 --- a/app/src/main/java/com/obs/marveleditor/videoTrimmer/utils/OptiFileUtils.java +++ b/app/src/main/java/com/obs/marveleditor/videoTrimmer/utils/OptiFileUtils.java @@ -16,7 +16,8 @@ import android.os.Environment; import android.provider.DocumentsContract; import android.provider.MediaStore; -import android.support.annotation.NonNull; + +import androidx.annotation.NonNull; public class OptiFileUtils { diff --git a/app/src/main/java/com/obs/marveleditor/videoTrimmer/view/OptiProgressBarView.java b/app/src/main/java/com/obs/marveleditor/videoTrimmer/view/OptiProgressBarView.java index b729aae..f24571c 100644 --- a/app/src/main/java/com/obs/marveleditor/videoTrimmer/view/OptiProgressBarView.java +++ b/app/src/main/java/com/obs/marveleditor/videoTrimmer/view/OptiProgressBarView.java @@ -11,11 +11,12 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; -import android.support.annotation.NonNull; -import android.support.v4.content.ContextCompat; import android.util.AttributeSet; import android.view.View; +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; + import com.obs.marveleditor.R; import com.obs.marveleditor.videoTrimmer.interfaces.OptiOnProgressVideoListener; import com.obs.marveleditor.videoTrimmer.interfaces.OptiOnRangeSeekBarListener; diff --git a/app/src/main/java/com/obs/marveleditor/videoTrimmer/view/OptiRangeSeekBarView.java b/app/src/main/java/com/obs/marveleditor/videoTrimmer/view/OptiRangeSeekBarView.java index d61527c..6021560 100644 --- a/app/src/main/java/com/obs/marveleditor/videoTrimmer/view/OptiRangeSeekBarView.java +++ b/app/src/main/java/com/obs/marveleditor/videoTrimmer/view/OptiRangeSeekBarView.java @@ -11,11 +11,13 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; -import android.support.annotation.NonNull; -import android.support.v4.content.ContextCompat; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; + +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; + import com.obs.marveleditor.R; import com.obs.marveleditor.videoTrimmer.interfaces.OptiOnRangeSeekBarListener; diff --git a/app/src/main/java/com/obs/marveleditor/videoTrimmer/view/OptiThumb.java b/app/src/main/java/com/obs/marveleditor/videoTrimmer/view/OptiThumb.java index 56919b3..42896e4 100644 --- a/app/src/main/java/com/obs/marveleditor/videoTrimmer/view/OptiThumb.java +++ b/app/src/main/java/com/obs/marveleditor/videoTrimmer/view/OptiThumb.java @@ -10,8 +10,11 @@ import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.support.annotation.NonNull; + +import androidx.annotation.NonNull; + import com.obs.marveleditor.R; + import java.util.List; import java.util.Vector; diff --git a/app/src/main/java/com/obs/marveleditor/videoTrimmer/view/OptiTimeLineView.java b/app/src/main/java/com/obs/marveleditor/videoTrimmer/view/OptiTimeLineView.java index 2ea6dc5..f681f27 100644 --- a/app/src/main/java/com/obs/marveleditor/videoTrimmer/view/OptiTimeLineView.java +++ b/app/src/main/java/com/obs/marveleditor/videoTrimmer/view/OptiTimeLineView.java @@ -13,12 +13,13 @@ import android.media.MediaMetadataRetriever; import android.net.Uri; import android.os.Build; -import android.support.annotation.NonNull; -import android.support.annotation.RequiresApi; import android.util.AttributeSet; import android.util.LongSparseArray; import android.view.View; +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; + import com.obs.marveleditor.R; import com.obs.marveleditor.videoTrimmer.utils.OptiBackgroundExecutor; import com.obs.marveleditor.videoTrimmer.utils.OptiUiThreadExecutor; diff --git a/app/src/main/res/drawable-hdpi/ic_settings.png b/app/src/main/res/drawable-hdpi/ic_settings.png new file mode 100644 index 0000000..a3e8e0e Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_settings.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_settings.png b/app/src/main/res/drawable-xhdpi/ic_settings.png new file mode 100644 index 0000000..0a90935 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_settings.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_settings.png b/app/src/main/res/drawable-xxhdpi/ic_settings.png new file mode 100644 index 0000000..14dc2c7 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_settings.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_settings.png b/app/src/main/res/drawable-xxxhdpi/ic_settings.png new file mode 100644 index 0000000..c4be262 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_settings.png differ diff --git a/app/src/main/res/drawable/curve_shape_background_black.xml b/app/src/main/res/drawable/curve_shape_background_black.xml new file mode 100644 index 0000000..872a082 --- /dev/null +++ b/app/src/main/res/drawable/curve_shape_background_black.xml @@ -0,0 +1,18 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_hide.xml b/app/src/main/res/drawable/ic_hide.xml new file mode 100644 index 0000000..bd43feb --- /dev/null +++ b/app/src/main/res/drawable/ic_hide.xml @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_video_cutline.png b/app/src/main/res/drawable/ic_video_cutline.png new file mode 100644 index 0000000..bb5e4c7 Binary files /dev/null and b/app/src/main/res/drawable/ic_video_cutline.png differ diff --git a/app/src/main/res/drawable/rounded_corners.xml b/app/src/main/res/drawable/rounded_corners.xml new file mode 100644 index 0000000..2a24999 --- /dev/null +++ b/app/src/main/res/drawable/rounded_corners.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 8b49e5a..72f699f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,13 +1,11 @@ - - - + app:layout_constraintBottom_toBottomOf="parent" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/opti_activity_trimmer.xml b/app/src/main/res/layout/opti_activity_trimmer.xml index 5a8a2ff..36b9f99 100644 --- a/app/src/main/res/layout/opti_activity_trimmer.xml +++ b/app/src/main/res/layout/opti_activity_trimmer.xml @@ -5,8 +5,7 @@ ~ * */ --> - diff --git a/app/src/main/res/layout/opti_add_music_includer.xml b/app/src/main/res/layout/opti_add_music_includer.xml index 1f68697..019d934 100644 --- a/app/src/main/res/layout/opti_add_music_includer.xml +++ b/app/src/main/res/layout/opti_add_music_includer.xml @@ -1,5 +1,4 @@ - - + android:layout_width="match_parent" + android:layout_height="match_parent"> \ No newline at end of file diff --git a/app/src/main/res/layout/opti_add_video_includer.xml b/app/src/main/res/layout/opti_add_video_includer.xml index 59ab59e..e31b2fc 100644 --- a/app/src/main/res/layout/opti_add_video_includer.xml +++ b/app/src/main/res/layout/opti_add_video_includer.xml @@ -1,5 +1,4 @@ - - + android:layout_width="match_parent" + android:layout_height="match_parent"> \ No newline at end of file diff --git a/app/src/main/res/layout/opti_clipart_view.xml b/app/src/main/res/layout/opti_clipart_view.xml index 9b20b44..f48b889 100644 --- a/app/src/main/res/layout/opti_clipart_view.xml +++ b/app/src/main/res/layout/opti_clipart_view.xml @@ -1,17 +1,16 @@ - - - + - + android:contentDescription="@string/app_name" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/opti_filter_view.xml b/app/src/main/res/layout/opti_filter_view.xml index c546ec9..266b4de 100644 --- a/app/src/main/res/layout/opti_filter_view.xml +++ b/app/src/main/res/layout/opti_filter_view.xml @@ -1,19 +1,18 @@ - - - + - + android:background="@drawable/curve_shape_bg" /> - + - + app:layout_constraintBottom_toBottomOf="parent" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/opti_fragment_add_clip_art.xml b/app/src/main/res/layout/opti_fragment_add_clip_art.xml index 24e6f34..e6565d4 100644 --- a/app/src/main/res/layout/opti_fragment_add_clip_art.xml +++ b/app/src/main/res/layout/opti_fragment_add_clip_art.xml @@ -1,19 +1,17 @@ - - - - + android:contentDescription="@string/app_name" /> - + android:contentDescription="@string/app_name" /> - + app:layout_constraintTop_toBottomOf="@+id/iv_close" /> - + app:layout_constraintTop_toBottomOf="@+id/rvClipArt" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/opti_fragment_add_music_dialog.xml b/app/src/main/res/layout/opti_fragment_add_music_dialog.xml index 32c2dd3..6bfbce6 100644 --- a/app/src/main/res/layout/opti_fragment_add_music_dialog.xml +++ b/app/src/main/res/layout/opti_fragment_add_music_dialog.xml @@ -1,13 +1,11 @@ - - - - + android:textSize="@dimen/textLarge" /> - + app:srcCompat="@drawable/close" /> + android:background="@color/colorDivider" /> - - + app:layout_constraintEnd_toStartOf="@+id/ivRadio" /> - - + app:layout_constraintStart_toEndOf="@+id/tv_selected_audio" /> + + android:background="@color/colorDivider" /> - + android:textSize="@dimen/textLarge" /> + custom:rounded="false" /> - + android:gravity="start|center_vertical" /> - + android:gravity="end|center_vertical" /> - + android:visibility="visible" /> + android:indeterminate="true" /> - + android:text="@string/processing_video" /> diff --git a/app/src/main/res/layout/opti_fragment_add_text.xml b/app/src/main/res/layout/opti_fragment_add_text.xml index b8060d3..37e3991 100644 --- a/app/src/main/res/layout/opti_fragment_add_text.xml +++ b/app/src/main/res/layout/opti_fragment_add_text.xml @@ -1,19 +1,17 @@ - - - - + android:contentDescription="@string/app_name" /> - + android:contentDescription="@string/app_name" /> - + android:inputType="text" /> - + app:layout_constraintTop_toBottomOf="@+id/etText" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/opti_fragment_add_video_dialog.xml b/app/src/main/res/layout/opti_fragment_add_video_dialog.xml index f2f692a..2fc1235 100644 --- a/app/src/main/res/layout/opti_fragment_add_video_dialog.xml +++ b/app/src/main/res/layout/opti_fragment_add_video_dialog.xml @@ -1,13 +1,11 @@ - - - - + android:textSize="@dimen/textLarge" /> - + app:srcCompat="@drawable/close" /> + android:background="@color/colorDivider" /> - - + app:layout_constraintTop_toTopOf="parent" /> - + app:layout_constraintTop_toBottomOf="@+id/tvGallery" /> - + diff --git a/app/src/main/res/layout/opti_fragment_filter_dialog.xml b/app/src/main/res/layout/opti_fragment_filter_dialog.xml index aa33762..737c62c 100644 --- a/app/src/main/res/layout/opti_fragment_filter_dialog.xml +++ b/app/src/main/res/layout/opti_fragment_filter_dialog.xml @@ -1,19 +1,17 @@ - - - - + android:contentDescription="@string/app_name" /> - + android:contentDescription="@string/app_name" /> - + app:layout_constraintTop_toBottomOf="@+id/iv_close" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/opti_fragment_merge_dialog.xml b/app/src/main/res/layout/opti_fragment_merge_dialog.xml index 4a4de4c..cf18355 100644 --- a/app/src/main/res/layout/opti_fragment_merge_dialog.xml +++ b/app/src/main/res/layout/opti_fragment_merge_dialog.xml @@ -1,19 +1,17 @@ - - - - + android:contentDescription="@string/app_name" /> - + android:contentDescription="@string/app_name" /> - - + - + - - + - + - + app:layout_constraintBottom_toBottomOf="parent" /> - + app:layout_constraintBottom_toBottomOf="parent" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/opti_fragment_playback_speed_dialog.xml b/app/src/main/res/layout/opti_fragment_playback_speed_dialog.xml index c9e72b0..50ea3db 100644 --- a/app/src/main/res/layout/opti_fragment_playback_speed_dialog.xml +++ b/app/src/main/res/layout/opti_fragment_playback_speed_dialog.xml @@ -1,19 +1,17 @@ - - - - + android:contentDescription="@string/app_name" /> - + android:contentDescription="@string/app_name" /> - + app:layout_constraintTop_toBottomOf="@+id/iv_close" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/opti_fragment_transition.xml b/app/src/main/res/layout/opti_fragment_transition.xml index 1306030..5a859e8 100644 --- a/app/src/main/res/layout/opti_fragment_transition.xml +++ b/app/src/main/res/layout/opti_fragment_transition.xml @@ -1,19 +1,17 @@ - - - - + android:contentDescription="@string/app_name" /> - + android:contentDescription="@string/app_name" /> - + app:layout_constraintTop_toBottomOf="@+id/iv_close" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/opti_fragment_trim.xml b/app/src/main/res/layout/opti_fragment_trim.xml index 2ee15c6..7528867 100644 --- a/app/src/main/res/layout/opti_fragment_trim.xml +++ b/app/src/main/res/layout/opti_fragment_trim.xml @@ -1,19 +1,18 @@ - - - - + android:contentDescription="@string/app_name" /> - + android:contentDescription="@string/app_name" /> + app:layout_constraintTop_toBottomOf="@+id/iv_done" /> - + android:gravity="start|center_vertical" /> - + android:gravity="end|center_vertical" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/opti_layout_custom_exo_player.xml b/app/src/main/res/layout/opti_layout_custom_exo_player.xml index b1d9aca..c12e66b 100644 --- a/app/src/main/res/layout/opti_layout_custom_exo_player.xml +++ b/app/src/main/res/layout/opti_layout_custom_exo_player.xml @@ -1,5 +1,4 @@ - - + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent"> - + android:paddingEnd="@dimen/_15sdp" /> - + android:paddingEnd="@dimen/_15sdp" /> - - + android:visibility="gone" /> @@ -77,7 +76,7 @@ android:background="@color/black" app:controller_layout_id="@layout/exo_playback_control_view" app:surface_type="surface_view" - app:use_controller="false"/> + app:use_controller="false" /> + android:progressTint="@color/white" /> - + \ No newline at end of file diff --git a/app/src/main/res/layout/opti_option_view.xml b/app/src/main/res/layout/opti_option_view.xml index 32dc3a8..cf68eb3 100644 --- a/app/src/main/res/layout/opti_option_view.xml +++ b/app/src/main/res/layout/opti_option_view.xml @@ -1,18 +1,17 @@ - - - + - + app:layout_constraintBottom_toBottomOf="parent" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/opti_option_view_land.xml b/app/src/main/res/layout/opti_option_view_land.xml index 18346ed..9a9fb74 100644 --- a/app/src/main/res/layout/opti_option_view_land.xml +++ b/app/src/main/res/layout/opti_option_view_land.xml @@ -1,18 +1,17 @@ - - - + - + app:layout_constraintBottom_toBottomOf="parent" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/opti_playback_view.xml b/app/src/main/res/layout/opti_playback_view.xml index d321fa6..0652fc2 100644 --- a/app/src/main/res/layout/opti_playback_view.xml +++ b/app/src/main/res/layout/opti_playback_view.xml @@ -1,17 +1,16 @@ - - - + - + app:layout_constraintBottom_toBottomOf="parent" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/opti_splash_screen.xml b/app/src/main/res/layout/opti_splash_screen.xml index dfcd4f9..6aead91 100644 --- a/app/src/main/res/layout/opti_splash_screen.xml +++ b/app/src/main/res/layout/opti_splash_screen.xml @@ -1,18 +1,16 @@ - - - - + app:layout_constraintStart_toStartOf="parent" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/opti_video_processor_fragment.xml b/app/src/main/res/layout/opti_video_processor_fragment.xml index 334b969..c9e9ade 100644 --- a/app/src/main/res/layout/opti_video_processor_fragment.xml +++ b/app/src/main/res/layout/opti_video_processor_fragment.xml @@ -1,20 +1,18 @@ - - - - @@ -23,7 +21,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toTopOf="@+id/exoPlayer"/> + app:layout_constraintBottom_toTopOf="@+id/exoPlayer" /> + app:layout_constraintTop_toTopOf="parent" /> - + app:layout_constraintTop_toTopOf="parent" /> + style="?android:attr/progressBarStyleHorizontal" /> - + android:layout_marginBottom="@dimen/_10sdp" /> - + app:layout_constraintEnd_toEndOf="parent" /> - + android:orientation="horizontal" /> - + android:contentDescription="@string/app_name" /> - + android:contentDescription="@string/app_name" /> - + - + diff --git a/app/src/main/res/layout/opti_view_time_line.xml b/app/src/main/res/layout/opti_view_time_line.xml index ebd6b76..6ac95d3 100644 --- a/app/src/main/res/layout/opti_view_time_line.xml +++ b/app/src/main/res/layout/opti_view_time_line.xml @@ -1,5 +1,4 @@ - - - - - + android:layout_above="@+id/layout" + android:background="@android:color/black" + android:gravity="center" + android:orientation="vertical"> - + + + android:contentDescription="@string/play_time" /> - - + android:layout_alignParentBottom="true" + android:background="@color/background_video_color"> + + + android:id="@+id/timeVideoView" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@+id/handlerTop" /> + android:id="@+id/timeLineView" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@+id/timeVideoView" /> + android:id="@+id/timeLineBar" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignTop="@+id/timeLineView" /> + android:id="@+id/lineTop" + android:layout_width="match_parent" + android:layout_height="1dp" + android:layout_below="@+id/timeLineBar" + android:background="@color/line_button" /> - -