Skip to content
This repository was archived by the owner on Oct 10, 2024. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 35 additions & 68 deletions app/src/main/java/com/abedelazizshe/lightcompressor/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -30,15 +30,27 @@ import kotlinx.coroutines.launch
* [email protected]
*/
class MainActivity : AppCompatActivity() {

companion object {
const val REQUEST_SELECT_VIDEO = 0
const val REQUEST_CAPTURE_VIDEO = 1
}

private val uris = mutableListOf<Uri>()
private val data = mutableListOf<VideoDetailsModel>()
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)
Expand All @@ -58,67 +70,34 @@ class MainActivity : AppCompatActivity() {
VideoCompressor.cancel()
}

val recyclerview = findViewById<RecyclerView>(R.id.recyclerview)
recyclerview.layoutManager = LinearLayoutManager(this)
adapter = RecyclerViewAdapter(applicationContext, data)
recyclerview.adapter = adapter
findViewById<RecyclerView>(R.id.recyclerview).apply {
layoutManager = LinearLayoutManager(context)
adapter = [email protected]
}
}

//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() {
Expand Down Expand Up @@ -149,40 +128,28 @@ class MainActivity : AppCompatActivity() {
GlobalScope.launch {
VideoCompressor.start(
context = applicationContext,
uris,
uris = uris,
isStreamable = true,
saveAt = Environment.DIRECTORY_MOVIES,
listener = object : CompressionListener {
override fun onProgress(index: Int, percent: Float) {
//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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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<VideoDetailsModel>) :
class RecyclerViewAdapter(
val videos: MutableList<VideoDetailsModel>,
private val itemOnClick: (VideoDetailsModel) -> Unit
) :
RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
Expand All @@ -21,8 +24,7 @@ class RecyclerViewAdapter(private val context: Context, private val list: List<V
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {

val itemsViewModel = list[position]
val itemsViewModel = videos[position]
val newSize = "Size after compression: ${itemsViewModel.newSize}"
val progress = "${itemsViewModel.progress.toLong()}%"

Expand All @@ -44,18 +46,24 @@ class RecyclerViewAdapter(private val context: Context, private val list: List<V
holder.newSize.visibility = View.GONE
}

Glide.with(context).load(itemsViewModel.uri).into(holder.videoImage)
Glide.with(holder.videoImage.context)
.load(itemsViewModel.uri).into(holder.videoImage)

holder.itemView.setOnClickListener {
VideoPlayerActivity.start(
it.context,
itemsViewModel.playableVideoPath
)
itemOnClick(itemsViewModel)
}
}

override fun getItemCount(): Int {
return list.size
override fun getItemCount() = videos.size

fun clear() {
notifyItemRangeRemoved(0, videos.size - 1)
videos.clear()
}

fun updateItem(index: Int, path: String?, uri: Uri, size: String, percent: Float) {
videos[index] = VideoDetailsModel(path, uri, size, percent)
notifyItemChanged(index)
}

class ViewHolder(ItemView: View) : RecyclerView.ViewHolder(ItemView) {
Expand Down