From 24db0cef5252b6a26a7ff140a81354711c89a897 Mon Sep 17 00:00:00 2001 From: Isaac Shoebottom Date: Wed, 7 Dec 2022 23:38:27 -0400 Subject: [PATCH] Fix compressing and add a cancel to in progress conversions --- app/build.gradle | 2 +- .../main/java/ca/unb/lantau/MainActivity.kt | 90 +++++++++++++------ .../ui/compressing/CompressingAdapter.kt | 10 ++- .../lantau/ui/compressing/CompressingItem.kt | 4 +- app/src/main/res/drawable/ic_cancel.xml | 5 ++ app/src/main/res/layout/item_compressing.xml | 53 +++++++---- app/src/main/res/values/strings.xml | 1 + 7 files changed, 119 insertions(+), 46 deletions(-) create mode 100644 app/src/main/res/drawable/ic_cancel.xml diff --git a/app/build.gradle b/app/build.gradle index e6c77e6..be85479 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -43,7 +43,7 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1' implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3' implementation 'androidx.navigation:navigation-ui-ktx:2.5.3' - implementation 'com.arthenica:ffmpeg-kit-full:5.1.LTS' + implementation 'com.arthenica:ffmpeg-kit-full-gpl:5.1.LTS' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.4' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0' diff --git a/app/src/main/java/ca/unb/lantau/MainActivity.kt b/app/src/main/java/ca/unb/lantau/MainActivity.kt index 5c09849..185e9a6 100644 --- a/app/src/main/java/ca/unb/lantau/MainActivity.kt +++ b/app/src/main/java/ca/unb/lantau/MainActivity.kt @@ -13,6 +13,8 @@ import android.provider.MediaStore import android.util.Log import android.view.Menu import android.view.MenuItem +import android.widget.ImageButton +import android.widget.TextView import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels @@ -22,22 +24,21 @@ import androidx.navigation.findNavController import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupWithNavController -import com.arthenica.ffmpegkit.FFmpegKit -import com.arthenica.ffmpegkit.FFmpegKitConfig -import com.example.myapplication.R -import com.example.myapplication.databinding.ActivityMainBinding import ca.unb.lantau.ui.completed.CompletedAdapter import ca.unb.lantau.ui.completed.CompletedItem import ca.unb.lantau.ui.compressing.CompressingAdapter import ca.unb.lantau.ui.compressing.CompressingItem import ca.unb.lantau.ui.settings.SettingsViewModel +import com.arthenica.ffmpegkit.* +import com.example.myapplication.R +import com.example.myapplication.databinding.ActivityMainBinding import com.google.android.material.bottomnavigation.BottomNavigationView import java.io.File import java.util.* +import java.util.concurrent.Executors class MainActivity : AppCompatActivity() { - private lateinit var binding: ActivityMainBinding private val settingsViewModel: SettingsViewModel by viewModels() @@ -144,9 +145,9 @@ class MainActivity : AppCompatActivity() { Log.i("ethan", settingsViewModel.getSize().toString()) Log.i("ethan", fileSize.toString()) - val bitrate = (settingsViewModel.getSize() * 1000000) / (duration!! / 1000) + val bitrate = (settingsViewModel.getSize() * 1_000_000) / (duration!! / 1_000) - val item = CompressingItem(fileName!!, 0.0, fileDate) + val item = CompressingItem(fileName!!, 0.0, fileDate, "Not started", ImageButton(this),null) val outputFile = File(this.getExternalFilesDir(null), "converted_$fileName") @@ -154,27 +155,64 @@ class MainActivity : AppCompatActivity() { val handler = Handler(Looper.getMainLooper()) - val command = "-i $inUri -b:v $bitrate ${outputFile.absolutePath} -y" - Log.i("ethan", command) - val session = FFmpegKit.executeAsync(command) { - compressingItems.remove(item) - completedAdapter.refreshList(this) + val tempFile = File(this.cacheDir, "temp_$fileName") + val tempVideoFile = File(this.cacheDir, "tempVideo_$fileName") - handler.post { - Toast.makeText( - this, - "Finished converting $fileName", - Toast.LENGTH_SHORT - ).show() - compressingAdapter.notifyDataSetChanged() + val firstPass = "-i $inUri -codec:v libx264 -passlogfile ${tempFile.absolutePath} -preset veryfast -b:v $bitrate -maxrate $bitrate -minrate $bitrate -codec:a aac -pass 1 ${tempVideoFile.absolutePath} -y" + val secondPass = "-i ${tempVideoFile.absolutePath} -codec:v libx264 -passlogfile ${tempFile.absolutePath} -preset veryfast -b:v $bitrate -maxrate $bitrate -minrate $bitrate -codec:a aac -pass 2 ${outputFile.absolutePath} -y" + Log.i("Lantau", firstPass) + Log.i("Lantau", secondPass) + + + val firstPassSession = FFmpegKit.executeAsync(firstPass) { session -> + if (session.returnCode.isValueSuccess) { + val secondPassSession = FFmpegKit.executeAsync(secondPass) { session2 -> + if (session2.returnCode.isValueSuccess) { + handler.post { + handler.post { + Toast.makeText( + applicationContext, + "Finished converting $fileName", + Toast.LENGTH_SHORT + ).show() + + compressingItems.remove(item) + compressingAdapter.notifyDataSetChanged() + completedAdapter.refreshList(applicationContext) + tempFile.delete() + tempVideoFile.delete() + } + } + } else { + handler.post { + Toast.makeText( + applicationContext, + "Failed to convert $fileName during second pass", + Toast.LENGTH_SHORT + ).show() + compressingItems.remove(item) + compressingAdapter.notifyDataSetChanged() + } + } + } + item.status = "Second pass running" + item.session = secondPassSession + Log.i("Lantau", Arrays.deepToString(secondPassSession.arguments)) + } else { + handler.post { + Toast.makeText( + applicationContext, + "Failed to convert $fileName during first pass", + Toast.LENGTH_SHORT + ).show() + compressingItems.remove(item) + compressingAdapter.notifyDataSetChanged() + } } } - - - Log.i("Tag", Arrays.deepToString(session.arguments)) - Log.i("Tag", session.output) - - + item.status = "First pass running" + item.session = firstPassSession + Log.i("Lantau", Arrays.deepToString(firstPassSession.arguments)) compressingAdapter.notifyDataSetChanged() } else { Toast.makeText( @@ -190,7 +228,7 @@ class MainActivity : AppCompatActivity() { val compressingItems: MutableList = mutableListOf() val compressingAdapter = CompressingAdapter(compressingItems) - val completedItems: MutableList = mutableListOf() + private val completedItems: MutableList = mutableListOf() val completedAdapter = CompletedAdapter(completedItems) } } \ No newline at end of file diff --git a/app/src/main/java/ca/unb/lantau/ui/compressing/CompressingAdapter.kt b/app/src/main/java/ca/unb/lantau/ui/compressing/CompressingAdapter.kt index 811c20b..f4f67f3 100644 --- a/app/src/main/java/ca/unb/lantau/ui/compressing/CompressingAdapter.kt +++ b/app/src/main/java/ca/unb/lantau/ui/compressing/CompressingAdapter.kt @@ -3,6 +3,7 @@ package ca.unb.lantau.ui.compressing import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ImageButton import android.widget.ProgressBar import android.widget.TextView import androidx.recyclerview.widget.RecyclerView @@ -14,6 +15,8 @@ class CompressingAdapter(private val mCompressingItems: MutableList + + diff --git a/app/src/main/res/layout/item_compressing.xml b/app/src/main/res/layout/item_compressing.xml index 90d6d68..fa4941c 100644 --- a/app/src/main/res/layout/item_compressing.xml +++ b/app/src/main/res/layout/item_compressing.xml @@ -1,26 +1,45 @@ - - - - - - + android:layout_height="match_parent" + android:layout_weight="5" + android:orientation="vertical"> + + + + + + + + + + + \ 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 d5ee2ef..1563b33 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,4 +14,5 @@ Youtube Share Delete + Cancel \ No newline at end of file