From e1160ea84d4fb8eb9a89ca02f2ebec4584967373 Mon Sep 17 00:00:00 2001 From: jokopriyono Date: Wed, 26 Jan 2022 15:30:35 +0700 Subject: [PATCH] Code improvement --- .../lightcompressor/MainActivity.kt | 103 ++++++------------ .../lightcompressor/RecyclerViewAdapter.kt | 30 +++-- 2 files changed, 54 insertions(+), 79 deletions(-) diff --git a/app/src/main/java/com/abedelazizshe/lightcompressor/MainActivity.kt b/app/src/main/java/com/abedelazizshe/lightcompressor/MainActivity.kt index e6d7d00..15c7c87 100644 --- a/app/src/main/java/com/abedelazizshe/lightcompressor/MainActivity.kt +++ b/app/src/main/java/com/abedelazizshe/lightcompressor/MainActivity.kt @@ -3,7 +3,6 @@ package com.abedelazizshe.lightcompressor import android.Manifest import android.annotation.SuppressLint import android.app.Activity -import android.content.ClipData import android.content.Intent import android.content.pm.PackageManager import android.net.Uri @@ -12,6 +11,7 @@ import android.os.Environment import android.provider.MediaStore import android.util.Log import android.view.View +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat @@ -30,15 +30,27 @@ import kotlinx.coroutines.launch * elaziz.shehadeh@gmail.com */ class MainActivity : AppCompatActivity() { - - companion object { - const val REQUEST_SELECT_VIDEO = 0 - const val REQUEST_CAPTURE_VIDEO = 1 - } - private val uris = mutableListOf() - private val data = mutableListOf() - private lateinit var adapter: RecyclerViewAdapter + private val adapter = RecyclerViewAdapter(mutableListOf()) { + VideoPlayerActivity.start(this, it.playableVideoPath) + } + private val intentPickVideo = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + reset() + if (it.resultCode == Activity.RESULT_OK) { + if (it.data?.clipData != null) { + for (i in 0 until it.data!!.clipData!!.itemCount) { + val videoItem = it.data!!.clipData!!.getItemAt(i) + uris.add(videoItem.uri) + } + processVideo() + } else if (it.data?.data != null) { + uris.add(it.data!!.data!!) + processVideo() + } + } + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -58,67 +70,34 @@ class MainActivity : AppCompatActivity() { VideoCompressor.cancel() } - val recyclerview = findViewById(R.id.recyclerview) - recyclerview.layoutManager = LinearLayoutManager(this) - adapter = RecyclerViewAdapter(applicationContext, data) - recyclerview.adapter = adapter + findViewById(R.id.recyclerview).apply { + layoutManager = LinearLayoutManager(context) + adapter = this@MainActivity.adapter + } } //Pick a video file from device private fun pickVideo() { - val intent = Intent() - intent.apply { + val intent = Intent().apply { type = "video/*" action = Intent.ACTION_PICK + putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true) } - intent.putExtra( - Intent.EXTRA_ALLOW_MULTIPLE, - true - ) - startActivityForResult(Intent.createChooser(intent, "Select video"), REQUEST_SELECT_VIDEO) + intentPickVideo.launch(Intent.createChooser(intent, "Select video")) } private fun dispatchTakeVideoIntent() { Intent(MediaStore.ACTION_VIDEO_CAPTURE).also { takeVideoIntent -> takeVideoIntent.resolveActivity(packageManager)?.also { - startActivityForResult(takeVideoIntent, REQUEST_CAPTURE_VIDEO) - } - } - } - - @SuppressLint("SetTextI18n") - override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) { - - reset() - - if (resultCode == Activity.RESULT_OK) - if (requestCode == REQUEST_SELECT_VIDEO || requestCode == REQUEST_CAPTURE_VIDEO) { - handleResult(intent) + intentPickVideo.launch(takeVideoIntent) } - - super.onActivityResult(requestCode, resultCode, intent) - } - - private fun handleResult(data: Intent?) { - val clipData: ClipData? = data?.clipData - if (clipData != null) { - for (i in 0 until clipData.itemCount) { - val videoItem = clipData.getItemAt(i) - uris.add(videoItem.uri) - } - processVideo() - } else if (data != null && data.data != null) { - val uri = data.data - uris.add(uri!!) - processVideo() } } private fun reset() { uris.clear() + adapter.clear() mainContents.visibility = View.GONE - data.clear() - adapter.notifyDataSetChanged() } private fun setReadStoragePermission() { @@ -149,7 +128,7 @@ class MainActivity : AppCompatActivity() { GlobalScope.launch { VideoCompressor.start( context = applicationContext, - uris, + uris = uris, isStreamable = true, saveAt = Environment.DIRECTORY_MOVIES, listener = object : CompressionListener { @@ -157,32 +136,20 @@ class MainActivity : AppCompatActivity() { //Update UI if (percent <= 100 && percent.toInt() % 5 == 0) runOnUiThread { - data[index] = VideoDetailsModel( - "", - uris[index], - "", - percent - ) - adapter.notifyDataSetChanged() + adapter.updateItem(index, "", uris[index], "", percent) } } override fun onStart(index: Int) { - data.add( + adapter.videos.add( index, VideoDetailsModel("", uris[index], "") ) - adapter.notifyDataSetChanged() + adapter.notifyItemInserted(index) } override fun onSuccess(index: Int, size: Long, path: String?) { - data[index] = VideoDetailsModel( - path, - uris[index], - getFileSize(size), - 100F - ) - adapter.notifyDataSetChanged() + adapter.updateItem(index, path, uris[index], getFileSize(size), 100F) } override fun onFailure(index: Int, failureMessage: String) { diff --git a/app/src/main/java/com/abedelazizshe/lightcompressor/RecyclerViewAdapter.kt b/app/src/main/java/com/abedelazizshe/lightcompressor/RecyclerViewAdapter.kt index a3e1b33..a6ddf94 100644 --- a/app/src/main/java/com/abedelazizshe/lightcompressor/RecyclerViewAdapter.kt +++ b/app/src/main/java/com/abedelazizshe/lightcompressor/RecyclerViewAdapter.kt @@ -1,6 +1,6 @@ package com.abedelazizshe.lightcompressor -import android.content.Context +import android.net.Uri import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,7 +10,10 @@ import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide -class RecyclerViewAdapter(private val context: Context, private val list: List) : +class RecyclerViewAdapter( + val videos: MutableList, + private val itemOnClick: (VideoDetailsModel) -> Unit +) : RecyclerView.Adapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { @@ -21,8 +24,7 @@ class RecyclerViewAdapter(private val context: Context, private val list: List