add file compression
This commit is contained in:
parent
43132f9cdf
commit
209266116b
@ -4,7 +4,9 @@ import android.Manifest
|
|||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
|
import android.media.MediaMetadataRetriever
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
@ -14,6 +16,7 @@ import android.view.Menu
|
|||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
|
import androidx.activity.viewModels
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.app.ActivityCompat
|
import androidx.core.app.ActivityCompat
|
||||||
import androidx.navigation.findNavController
|
import androidx.navigation.findNavController
|
||||||
@ -25,6 +28,8 @@ import com.arthenica.ffmpegkit.FFmpegKitConfig
|
|||||||
import com.example.myapplication.databinding.ActivityMainBinding
|
import com.example.myapplication.databinding.ActivityMainBinding
|
||||||
import com.example.myapplication.ui.compressing.CompressingAdapter
|
import com.example.myapplication.ui.compressing.CompressingAdapter
|
||||||
import com.example.myapplication.ui.compressing.CompressingItem
|
import com.example.myapplication.ui.compressing.CompressingItem
|
||||||
|
import com.example.myapplication.ui.settings.SettingsFragment
|
||||||
|
import com.example.myapplication.ui.settings.SettingsViewModel
|
||||||
import com.google.android.material.bottomnavigation.BottomNavigationView
|
import com.google.android.material.bottomnavigation.BottomNavigationView
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@ -33,6 +38,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
|
|
||||||
private lateinit var binding: ActivityMainBinding
|
private lateinit var binding: ActivityMainBinding
|
||||||
|
private val settingsViewModel: SettingsViewModel by viewModels()
|
||||||
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
@ -79,7 +85,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
//runs when pressing "Files"
|
//runs when pressing "Files"
|
||||||
R.id.addFile -> {
|
R.id.addFile -> {
|
||||||
val intent = Intent()
|
val intent = Intent()
|
||||||
.setType("*/*")
|
.setType("video/*")
|
||||||
.setAction(Intent.ACTION_GET_CONTENT)
|
.setAction(Intent.ACTION_GET_CONTENT)
|
||||||
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||||
.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
|
.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
|
||||||
@ -87,7 +93,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
resultLauncher.launch(intent)
|
resultLauncher.launch(intent)
|
||||||
|
|
||||||
Toast.makeText(applicationContext, "Files", Toast.LENGTH_LONG).show()
|
//Toast.makeText(applicationContext, "Files", Toast.LENGTH_LONG).show()
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -114,37 +120,52 @@ class MainActivity : AppCompatActivity() {
|
|||||||
cursor?.moveToFirst()
|
cursor?.moveToFirst()
|
||||||
|
|
||||||
val fileDate = Date(System.currentTimeMillis())
|
val fileDate = Date(System.currentTimeMillis())
|
||||||
val fileName = cursor?.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME))
|
val fileName =
|
||||||
|
cursor?.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME))
|
||||||
|
val fileSize =
|
||||||
|
cursor?.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.SIZE))
|
||||||
|
?.toDouble()
|
||||||
|
|
||||||
val item = CompressingItem(fileName!!, 0.0, fileDate)
|
if (fileSize!! / 1000000 > settingsViewModel.getSize()) {
|
||||||
|
|
||||||
val outputFile = File(this.getExternalFilesDir(null), "converted_$fileName")
|
val mmr = MediaMetadataRetriever()
|
||||||
|
mmr.setDataSource(this, data)
|
||||||
|
val duration =
|
||||||
|
mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)?.toDouble()
|
||||||
|
Log.i("ethan", duration.toString())
|
||||||
|
|
||||||
compressingItems.add(item)
|
Log.i("ethan", settingsViewModel.getSize().toString())
|
||||||
|
Log.i("ethan", fileSize.toString())
|
||||||
|
val bitrate = (settingsViewModel.getSize()*1000000) / (duration!!/1000)
|
||||||
|
|
||||||
val handler = Handler(Looper.getMainLooper())
|
val item = CompressingItem(fileName!!, 0.0, fileDate)
|
||||||
|
|
||||||
|
val outputFile = File(this.getExternalFilesDir(null), "converted_$fileName")
|
||||||
|
|
||||||
val command = "-i $inUri -c:v mpeg4 ${outputFile.absolutePath} -y"
|
compressingItems.add(item)
|
||||||
val session = FFmpegKit.executeAsync(command) {
|
|
||||||
compressingItems.remove(item)
|
|
||||||
|
|
||||||
handler.post {
|
val handler = Handler(Looper.getMainLooper())
|
||||||
Toast.makeText(this, "Finished converting $fileName", Toast.LENGTH_SHORT).show()
|
|
||||||
adapter.notifyDataSetChanged()
|
val command = "-i $inUri -b:v $bitrate ${outputFile.absolutePath} -y"
|
||||||
|
Log.i("ethan",command)
|
||||||
|
val session = FFmpegKit.executeAsync(command) {
|
||||||
|
compressingItems.remove(item)
|
||||||
|
|
||||||
|
handler.post {
|
||||||
|
Toast.makeText(this, "Finished converting $fileName", Toast.LENGTH_SHORT).show()
|
||||||
|
adapter.notifyDataSetChanged()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Log.i("Tag", Arrays.deepToString(session.arguments))
|
||||||
|
Log.i("Tag", session.output)
|
||||||
|
|
||||||
|
|
||||||
|
adapter.notifyDataSetChanged()
|
||||||
|
}else{
|
||||||
|
Toast.makeText(applicationContext,"File is less than target size",Toast.LENGTH_LONG).show()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Log.i("Tag", Arrays.deepToString(session.arguments))
|
|
||||||
Log.i("Tag", session.output)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
adapter.notifyDataSetChanged()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,9 @@ import android.view.LayoutInflater
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
|
import androidx.activity.viewModels
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.fragment.app.activityViewModels
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
import com.example.myapplication.databinding.FragmentSettingsBinding
|
import com.example.myapplication.databinding.FragmentSettingsBinding
|
||||||
|
|
||||||
@ -20,12 +22,13 @@ class SettingsFragment : Fragment() {
|
|||||||
// onDestroyView.
|
// onDestroyView.
|
||||||
private val binding get() = _binding!!
|
private val binding get() = _binding!!
|
||||||
|
|
||||||
|
private val settingsViewModel: SettingsViewModel by activityViewModels()
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
container: ViewGroup?,
|
container: ViewGroup?,
|
||||||
savedInstanceState: Bundle?
|
savedInstanceState: Bundle?
|
||||||
): View {
|
): View {
|
||||||
val homeViewModel = ViewModelProvider(this)[SettingsViewModel::class.java]
|
|
||||||
|
|
||||||
_binding = FragmentSettingsBinding.inflate(inflater, container, false)
|
_binding = FragmentSettingsBinding.inflate(inflater, container, false)
|
||||||
val root: View = binding.root
|
val root: View = binding.root
|
||||||
@ -41,20 +44,20 @@ class SettingsFragment : Fragment() {
|
|||||||
binding.settingRadioGroup.setOnCheckedChangeListener{ group,checkedID ->
|
binding.settingRadioGroup.setOnCheckedChangeListener{ group,checkedID ->
|
||||||
|
|
||||||
if(checkedID == binding.settingDefaultSizeVideo.id){
|
if(checkedID == binding.settingDefaultSizeVideo.id){
|
||||||
homeViewModel.size.value = 8.0
|
settingsViewModel.size.value = 25.0
|
||||||
}else if(checkedID == binding.settingBigSizeVideo.id){
|
}else if(checkedID == binding.settingBigSizeVideo.id){
|
||||||
homeViewModel.size.value = 50.0
|
settingsViewModel.size.value = 50.0
|
||||||
}else if(checkedID == binding.settingHugeSize.id){
|
}else if(checkedID == binding.settingHugeSize.id){
|
||||||
homeViewModel.size.value = 500.0
|
settingsViewModel.size.value = 500.0
|
||||||
}else{
|
}else{
|
||||||
try{
|
try{
|
||||||
homeViewModel.size.value = binding.settingCustomSizeVideoText.text.toString().toDouble()
|
settingsViewModel.size.value = binding.settingCustomSizeVideoText.text.toString().toDouble()
|
||||||
}catch (e: NumberFormatException){
|
}catch (e: NumberFormatException){
|
||||||
homeViewModel.size.value = 0.0
|
settingsViewModel.size.value = 0.0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Toast.makeText(root.context,"" + homeViewModel.size.value,Toast.LENGTH_SHORT).show()
|
Toast.makeText(root.context,"" + settingsViewModel.size.value,Toast.LENGTH_SHORT).show()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,11 +73,11 @@ class SettingsFragment : Fragment() {
|
|||||||
override fun onTextChanged(s: CharSequence, start: Int,
|
override fun onTextChanged(s: CharSequence, start: Int,
|
||||||
before: Int, count: Int) {
|
before: Int, count: Int) {
|
||||||
try{
|
try{
|
||||||
homeViewModel.size.value = s.toString().toDouble()
|
settingsViewModel.size.value = s.toString().toDouble()
|
||||||
}catch (e: NumberFormatException){
|
}catch (e: NumberFormatException){
|
||||||
homeViewModel.size.value = 0.0
|
settingsViewModel.size.value = 0.0
|
||||||
}
|
}
|
||||||
Toast.makeText(root.context,"" + homeViewModel.size.value,Toast.LENGTH_SHORT).show()
|
Toast.makeText(root.context,"" + settingsViewModel.size.value,Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -13,7 +13,11 @@ class SettingsViewModel : ViewModel() {
|
|||||||
|
|
||||||
//size of the file, grab this for use
|
//size of the file, grab this for use
|
||||||
private val _size = MutableLiveData<Double>().apply {
|
private val _size = MutableLiveData<Double>().apply {
|
||||||
value = 8.0
|
value = 25.0
|
||||||
}
|
}
|
||||||
val size: MutableLiveData<Double> = _size
|
val size: MutableLiveData<Double> = _size
|
||||||
|
|
||||||
|
fun getSize(): Double{
|
||||||
|
return size.value!!
|
||||||
|
}
|
||||||
}
|
}
|
@ -5,7 +5,7 @@
|
|||||||
<string name="title_settings">Settings</string>
|
<string name="title_settings">Settings</string>
|
||||||
<string name="settings_video_size">Video Size</string>
|
<string name="settings_video_size">Video Size</string>
|
||||||
<string name="settings_image_size">Image Size</string>
|
<string name="settings_image_size">Image Size</string>
|
||||||
<string name="settings_default_size">8mb</string>
|
<string name="settings_default_size">25mb</string>
|
||||||
<string name="settings_big_size">50mb</string>
|
<string name="settings_big_size">50mb</string>
|
||||||
<string name="settings_huge_size">500mb</string>
|
<string name="settings_huge_size">500mb</string>
|
||||||
<string name="settings_custom_size">Custom</string>
|
<string name="settings_custom_size">Custom</string>
|
||||||
|
Loading…
Reference in New Issue
Block a user