Add compressed adapter
This commit is contained in:
parent
43132f9cdf
commit
04d81adc2b
@ -23,6 +23,8 @@ import androidx.navigation.ui.setupWithNavController
|
|||||||
import com.arthenica.ffmpegkit.FFmpegKit
|
import com.arthenica.ffmpegkit.FFmpegKit
|
||||||
import com.arthenica.ffmpegkit.FFmpegKitConfig
|
import com.arthenica.ffmpegkit.FFmpegKitConfig
|
||||||
import com.example.myapplication.databinding.ActivityMainBinding
|
import com.example.myapplication.databinding.ActivityMainBinding
|
||||||
|
import com.example.myapplication.ui.completed.CompletedAdapter
|
||||||
|
import com.example.myapplication.ui.completed.CompletedItem
|
||||||
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.google.android.material.bottomnavigation.BottomNavigationView
|
import com.google.android.material.bottomnavigation.BottomNavigationView
|
||||||
@ -128,10 +130,11 @@ class MainActivity : AppCompatActivity() {
|
|||||||
val command = "-i $inUri -c:v mpeg4 ${outputFile.absolutePath} -y"
|
val command = "-i $inUri -c:v mpeg4 ${outputFile.absolutePath} -y"
|
||||||
val session = FFmpegKit.executeAsync(command) {
|
val session = FFmpegKit.executeAsync(command) {
|
||||||
compressingItems.remove(item)
|
compressingItems.remove(item)
|
||||||
|
completedAdapter.refreshList(this)
|
||||||
|
|
||||||
handler.post {
|
handler.post {
|
||||||
Toast.makeText(this, "Finished converting $fileName", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Finished converting $fileName", Toast.LENGTH_SHORT).show()
|
||||||
adapter.notifyDataSetChanged()
|
compressingAdapter.notifyDataSetChanged()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,13 +147,15 @@ class MainActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
adapter.notifyDataSetChanged()
|
compressingAdapter.notifyDataSetChanged()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val compressingItems: MutableList<CompressingItem> = mutableListOf()
|
val compressingItems: MutableList<CompressingItem> = mutableListOf()
|
||||||
|
val compressingAdapter = CompressingAdapter(compressingItems)
|
||||||
|
|
||||||
val adapter = CompressingAdapter(compressingItems)
|
val completedItems: MutableList<CompletedItem> = mutableListOf()
|
||||||
|
val completedAdapter = CompletedAdapter(completedItems)
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,67 @@
|
|||||||
|
package com.example.myapplication.ui.completed
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.StrictMode
|
||||||
|
import android.os.StrictMode.VmPolicy
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.ImageButton
|
||||||
|
import android.widget.TextView
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.example.myapplication.R
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
|
class CompletedAdapter(private val mCompletedList: MutableList<CompletedItem>): RecyclerView.Adapter<CompletedAdapter.ViewHolder>() {
|
||||||
|
inner class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
|
||||||
|
val filename: TextView = itemView.findViewById(R.id.compressed_filename)
|
||||||
|
val date: TextView = itemView.findViewById(R.id.compressed_date)
|
||||||
|
var shareButton: ImageButton = itemView.findViewById(R.id.compressed_share)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||||
|
val compressingItemView = LayoutInflater.from(parent.context).inflate(R.layout.item_compressed, parent, false)
|
||||||
|
return ViewHolder(compressingItemView)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
|
val compressingItem: CompletedItem = mCompletedList[position]
|
||||||
|
holder.filename.text = compressingItem.filename
|
||||||
|
holder.date.text = compressingItem.date.toString()
|
||||||
|
holder.shareButton.setOnClickListener { shareFile(holder.itemView.context, compressingItem.uri) }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun shareFile(context: Context?, uri: Uri) {
|
||||||
|
val builder = VmPolicy.Builder()
|
||||||
|
StrictMode.setVmPolicy(builder.build()) // this is a hack to allow sharing files from the app
|
||||||
|
|
||||||
|
|
||||||
|
val intent = Intent(Intent.ACTION_SEND)
|
||||||
|
intent.type = "video/mp4"
|
||||||
|
intent.putExtra(Intent.EXTRA_STREAM, uri)
|
||||||
|
intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
|
||||||
|
context?.startActivity(Intent.createChooser(intent, "Share Video"))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItemCount(): Int {
|
||||||
|
return mCompletedList.size
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("NotifyDataSetChanged") //this is fine because it is a custom adapter
|
||||||
|
fun refreshList(context: Context) {
|
||||||
|
mCompletedList.clear()
|
||||||
|
context.getExternalFilesDir(null)?.listFiles()?.forEach {
|
||||||
|
if (it.name.endsWith(".mp4")) {
|
||||||
|
val completedItem = CompletedItem(it.name, Date(it.lastModified()), ImageButton(context), Uri.fromFile(it))
|
||||||
|
mCompletedList.add(completedItem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
notifyDataSetChanged()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -7,6 +7,10 @@ import android.view.ViewGroup
|
|||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.example.myapplication.MainActivity
|
||||||
|
import com.example.myapplication.R
|
||||||
import com.example.myapplication.databinding.FragmentCompletedBinding
|
import com.example.myapplication.databinding.FragmentCompletedBinding
|
||||||
|
|
||||||
class CompletedFragment : Fragment() {
|
class CompletedFragment : Fragment() {
|
||||||
@ -22,17 +26,21 @@ class CompletedFragment : Fragment() {
|
|||||||
container: ViewGroup?,
|
container: ViewGroup?,
|
||||||
savedInstanceState: Bundle?
|
savedInstanceState: Bundle?
|
||||||
): View {
|
): View {
|
||||||
val dashboardViewModel =
|
val dashboardViewModel = ViewModelProvider(this).get(CompletedViewModel::class.java)
|
||||||
ViewModelProvider(this).get(CompletedViewModel::class.java)
|
|
||||||
|
|
||||||
_binding = FragmentCompletedBinding.inflate(inflater, container, false)
|
_binding = FragmentCompletedBinding.inflate(inflater, container, false)
|
||||||
val root: View = binding.root
|
val root: View = binding.root
|
||||||
|
|
||||||
val textView: TextView = binding.textCompleted
|
val completedRecycler = binding.root.findViewById<View>(R.id.compressed_recycler_view) as? RecyclerView
|
||||||
|
completedRecycler?.adapter = MainActivity.completedAdapter
|
||||||
|
completedRecycler?.layoutManager = LinearLayoutManager(binding.root.context)
|
||||||
|
|
||||||
|
MainActivity.completedAdapter.refreshList(binding.root.context)
|
||||||
|
|
||||||
dashboardViewModel.text.observe(viewLifecycleOwner) {
|
dashboardViewModel.text.observe(viewLifecycleOwner) {
|
||||||
textView.text = it
|
//do nothing
|
||||||
}
|
}
|
||||||
return root
|
return binding.root
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroyView() {
|
override fun onDestroyView() {
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.example.myapplication.ui.completed
|
||||||
|
|
||||||
|
import android.net.Uri
|
||||||
|
import android.widget.ImageButton
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
data class CompletedItem(val filename: String, val date: Date, val button: ImageButton, val uri: Uri)
|
@ -1,34 +1,37 @@
|
|||||||
package com.example.myapplication.ui.compressing
|
package com.example.myapplication.ui.compressing
|
||||||
|
|
||||||
import android.view.LayoutInflater
|
import android.content.Context
|
||||||
import android.view.View
|
import android.view.LayoutInflater
|
||||||
import android.view.ViewGroup
|
import android.view.View
|
||||||
import android.widget.ProgressBar
|
import android.view.ViewGroup
|
||||||
import android.widget.TextView
|
import android.widget.ProgressBar
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import android.widget.TextView
|
||||||
import com.example.myapplication.R
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.example.myapplication.R
|
||||||
class CompressingAdapter(private val mCompressingItems: MutableList<CompressingItem>): RecyclerView.Adapter<CompressingAdapter.ViewHolder>() {
|
import com.example.myapplication.ui.completed.CompletedItem
|
||||||
inner class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
|
import java.util.*
|
||||||
val filename: TextView = itemView.findViewById(R.id.compressing_filename)
|
|
||||||
val date: TextView = itemView.findViewById(R.id.compressing_date)
|
class CompressingAdapter(private val mCompressingItems: MutableList<CompressingItem>): RecyclerView.Adapter<CompressingAdapter.ViewHolder>() {
|
||||||
val progress: ProgressBar = itemView.findViewById(R.id.compressing_progress)
|
inner class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
|
||||||
}
|
val filename: TextView = itemView.findViewById(R.id.compressing_filename)
|
||||||
|
val date: TextView = itemView.findViewById(R.id.compressing_date)
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
val progress: ProgressBar = itemView.findViewById(R.id.compressing_progress)
|
||||||
val compressingItemView = LayoutInflater.from(parent.context).inflate(R.layout.item_compressing, parent, false)
|
}
|
||||||
return ViewHolder(compressingItemView)
|
|
||||||
}
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||||
|
val compressingItemView = LayoutInflater.from(parent.context).inflate(R.layout.item_compressing, parent, false)
|
||||||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
return ViewHolder(compressingItemView)
|
||||||
val compressingItem: CompressingItem = mCompressingItems[position]
|
}
|
||||||
holder.filename.text = compressingItem.filename
|
|
||||||
holder.date.text = compressingItem.date.toString()
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
holder.progress.progress = compressingItem.progress.toInt()
|
val compressingItem: CompressingItem = mCompressingItems[position]
|
||||||
|
holder.filename.text = compressingItem.filename
|
||||||
}
|
holder.date.text = compressingItem.date.toString()
|
||||||
|
holder.progress.progress = compressingItem.progress.toInt()
|
||||||
override fun getItemCount(): Int {
|
|
||||||
return mCompressingItems.size
|
}
|
||||||
}
|
|
||||||
|
override fun getItemCount(): Int {
|
||||||
|
return mCompressingItems.size
|
||||||
|
}
|
||||||
}
|
}
|
@ -9,7 +9,6 @@ import androidx.lifecycle.ViewModelProvider
|
|||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.example.myapplication.MainActivity
|
import com.example.myapplication.MainActivity
|
||||||
import com.example.myapplication.MainActivity.Companion.compressingItems
|
|
||||||
import com.example.myapplication.R
|
import com.example.myapplication.R
|
||||||
import com.example.myapplication.databinding.FragmentCompressingBinding
|
import com.example.myapplication.databinding.FragmentCompressingBinding
|
||||||
|
|
||||||
@ -30,12 +29,13 @@ class CompressingFragment : Fragment() {
|
|||||||
|
|
||||||
|
|
||||||
val compressingRecycler = binding.root.findViewById<View>(R.id.compressing_recycler_view) as? RecyclerView
|
val compressingRecycler = binding.root.findViewById<View>(R.id.compressing_recycler_view) as? RecyclerView
|
||||||
compressingRecycler?.adapter = MainActivity.adapter
|
compressingRecycler?.adapter = MainActivity.compressingAdapter
|
||||||
compressingRecycler?.layoutManager = LinearLayoutManager(binding.root.context)
|
compressingRecycler?.layoutManager = LinearLayoutManager(binding.root.context)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return binding.root
|
return binding.root
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroyView() {
|
override fun onDestroyView() {
|
||||||
|
5
app/src/main/res/drawable/ic_share.xml
Normal file
5
app/src/main/res/drawable/ic_share.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<vector android:height="24dp" android:tint="#000000"
|
||||||
|
android:viewportHeight="24" android:viewportWidth="24"
|
||||||
|
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z"/>
|
||||||
|
</vector>
|
@ -6,15 +6,14 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:context=".ui.completed.CompletedFragment">
|
tools:context=".ui.completed.CompletedFragment">
|
||||||
|
|
||||||
<TextView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/text_completed"
|
android:id="@+id/compressed_recycler_view"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="match_parent"
|
||||||
android:layout_marginStart="8dp"
|
android:layout_marginStart="16dp"
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
android:layout_marginEnd="8dp"
|
android:layout_marginEnd="16dp"
|
||||||
android:textAlignment="center"
|
android:layout_marginBottom="8dp"
|
||||||
android:textSize="20sp"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
@ -12,7 +12,9 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_marginStart="16dp"
|
android:layout_marginStart="16dp"
|
||||||
android:layout_marginEnd="16dp"
|
android:layout_marginEnd="16dp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent" />
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
31
app/src/main/res/layout/item_compressed.xml
Normal file
31
app/src/main/res/layout/item_compressed.xml
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="3"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/compressed_filename"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/compressed_date"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/compressed_share"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
app:srcCompat="@drawable/ic_share"
|
||||||
|
android:contentDescription="@string/share_button" />
|
||||||
|
</LinearLayout>
|
@ -1,29 +1,26 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:orientation="horizontal"
|
android:orientation="vertical"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:paddingTop="10dp"
|
android:paddingTop="10dp"
|
||||||
android:paddingBottom="10dp">
|
android:paddingBottom="10dp">
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
<TextView
|
||||||
android:layout_height="wrap_content"
|
android:id="@+id/compressing_filename"
|
||||||
android:orientation="vertical">
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
<TextView
|
|
||||||
android:id="@+id/compressing_filename"
|
<TextView
|
||||||
android:layout_width="wrap_content"
|
android:id="@+id/compressing_date"
|
||||||
android:layout_height="wrap_content" />
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
<TextView
|
|
||||||
android:id="@+id/compressing_date"
|
<ProgressBar
|
||||||
android:layout_width="wrap_content"
|
android:id="@+id/compressing_progress"
|
||||||
android:layout_height="wrap_content" />
|
style="@android:style/Widget.Holo.ProgressBar.Horizontal"
|
||||||
</LinearLayout>
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
<ProgressBar
|
|
||||||
android:id="@+id/compressing_progress"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
@ -12,4 +12,5 @@
|
|||||||
<string name="settings_custom_size_hint">Enter Size in MB</string>
|
<string name="settings_custom_size_hint">Enter Size in MB</string>
|
||||||
<string name="files">Files</string>
|
<string name="files">Files</string>
|
||||||
<string name="youtube">Youtube</string>
|
<string name="youtube">Youtube</string>
|
||||||
|
<string name="share_button">Share Button</string>
|
||||||
</resources>
|
</resources>
|
Loading…
Reference in New Issue
Block a user