This commit is contained in:
Binondi
2024-12-14 14:56:05 +05:30
parent 8e03bfc847
commit f6ba65a4c0
13 changed files with 235 additions and 29 deletions

View File

@@ -55,4 +55,5 @@ dependencies {
implementation("androidx.documentfile:documentfile:1.0.1")
implementation("com.github.chrisbanes:PhotoView:2.3.0")
implementation("androidx.viewpager:viewpager:1.0.0")
implementation("com.jsibbold:zoomage:1.3.1")
}

View File

@@ -58,7 +58,6 @@
android:exported="true" />
<activity
android:name=".activities.PreviewActivity"
android:theme="@style/Theme.AppCompat.NoActionBar"
android:configChanges="orientation|screenSize"/>
</application>

View File

@@ -52,7 +52,8 @@ abstract class BaseGalleryActivity : AppCompatActivity() {
private fun setupRecyclerView() {
binding.recyclerView.layoutManager = GridLayoutManager(this, 3)
adapter = FileAdapter(
fileType
fileType,
this
)
binding.recyclerView.adapter = adapter
}

View File

@@ -5,6 +5,7 @@ import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import devs.org.calculator.adapters.ImagePreviewAdapter
import devs.org.calculator.databinding.ActivityPreviewBinding
import devs.org.calculator.utils.FileManager
import java.io.File
class PreviewActivity : AppCompatActivity() {
@@ -12,27 +13,49 @@ class PreviewActivity : AppCompatActivity() {
private lateinit var binding: ActivityPreviewBinding
private var currentPosition: Int = 0
private lateinit var files: List<File>
private lateinit var type: String
private lateinit var filetype: FileManager.FileType
private lateinit var adapter: ImagePreviewAdapter
private lateinit var fileManager: FileManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityPreviewBinding.inflate(layoutInflater)
setContentView(binding.root)
setSupportActionBar(binding.toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.title = ""
fileManager = FileManager(this, this)
currentPosition = intent.getIntExtra("position", 0)
val filePath = intent.getStringExtra("file_path") ?: return
val file = File(filePath)
files = file.parentFile?.listFiles()?.toList() ?: listOf(file)
type = intent.getStringExtra("type").toString()
filetype = when(type){
"IMAGE" ->{
FileManager.FileType.IMAGE
}
"VIDEO" ->{
FileManager.FileType.VIDEO
}
"AUDIO" ->{
FileManager.FileType.AUDIO
}
else -> {
FileManager.FileType.DOCUMENT
}
}
files = fileManager.getFilesInHiddenDir(filetype)
setupImagePreview()
}
private fun setupImagePreview() {
val adapter = ImagePreviewAdapter(this, files)
adapter = ImagePreviewAdapter(this, files,filetype)
binding.viewPager.adapter = adapter
binding.viewPager.setCurrentItem(currentPosition, false)
}
override fun onSupportNavigateUp(): Boolean {

View File

@@ -1,5 +1,7 @@
package devs.org.calculator.adapters
import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@@ -9,10 +11,12 @@ import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import devs.org.calculator.R
import devs.org.calculator.activities.PreviewActivity
import devs.org.calculator.utils.FileManager
import kotlinx.coroutines.NonDisposableHandle.parent
import java.io.File
class FileAdapter(private val fileType: FileManager.FileType) :
class FileAdapter(private val fileType: FileManager.FileType, var context: Context) :
ListAdapter<File, FileAdapter.FileViewHolder>(FileDiffCallback()) {
private val selectedItems = mutableSetOf<Int>()
@@ -45,7 +49,29 @@ class FileAdapter(private val fileType: FileManager.FileType) :
imageView.setImageResource(resourceId)
}
}
itemView.setOnClickListener { }
itemView.setOnClickListener {
var fileTypes = when(fileType){
FileManager.FileType.IMAGE -> {
"IMAGE"
}
FileManager.FileType.VIDEO -> {
"VIDEO"
}
FileManager.FileType.AUDIO -> {
"AUDIO"
}
else -> "DOCUMENT"
}
val intent = Intent(context, PreviewActivity::class.java).apply {
putExtra("type", fileTypes)
putExtra("position", position)
}
context.startActivity(intent)
}
}
}

View File

@@ -1,33 +1,98 @@
package devs.org.calculator.adapters
import android.content.Context
import android.net.Uri
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.MediaController
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import devs.org.calculator.databinding.ItemFileBinding
import devs.org.calculator.databinding.ViewpagerItemsBinding
import devs.org.calculator.utils.FileManager
import java.io.File
class ImagePreviewAdapter(
private val context: Context,
private val images: List<File>
private val images: List<File>,
private var fileType: FileManager.FileType
) : RecyclerView.Adapter<ImagePreviewAdapter.ImageViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageViewHolder {
val binding = ItemFileBinding.inflate(
LayoutInflater.from(context), parent, false
val binding = ViewpagerItemsBinding.inflate(LayoutInflater.from(context), parent, false
)
return ImageViewHolder(binding)
}
override fun onBindViewHolder(holder: ImageViewHolder, position: Int) {
val imageUrl = images[position]
Glide.with(context)
.load(imageUrl)
.into(holder.binding.imageView)
holder.bind(imageUrl)
}
override fun getItemCount(): Int = images.size
inner class ImageViewHolder(val binding: ItemFileBinding) : RecyclerView.ViewHolder(binding.root)
}
inner class ImageViewHolder(val binding: ViewpagerItemsBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(file: File) {
when (fileType) {
FileManager.FileType.VIDEO -> {
binding.imageView.visibility = View.GONE
binding.videoView.visibility = View.VISIBLE
// Set up the VideoView with the current video file
val videoUri = Uri.fromFile(file)
binding.videoView.setVideoURI(videoUri)
binding.videoView.start()
// Create and attach MediaController
val mediaController = MediaController(context)
mediaController.setAnchorView(binding.videoView)
binding.videoView.setMediaController(mediaController)
// Handle the "Next" button logic
mediaController.setPrevNextListeners(
{ // Next button clicked
val nextPosition = (adapterPosition + 1) % images.size // Loop to start if last
playVideoAtPosition(nextPosition)
},
{ // Previous button clicked
val prevPosition = if (adapterPosition - 1 < 0) images.size - 1 else adapterPosition - 1
playVideoAtPosition(prevPosition)
}
)
// Play next video automatically when the current one finishes
binding.videoView.setOnCompletionListener {
val nextPosition = (adapterPosition + 1) % images.size // Loop to start if last
playVideoAtPosition(nextPosition)
}
}
FileManager.FileType.IMAGE -> {
binding.imageView.visibility = View.VISIBLE
binding.videoView.visibility = View.GONE
Glide.with(context)
.load(file)
.into(binding.imageView)
}
FileManager.FileType.AUDIO -> {
// Handle audio if necessary
}
else -> {
// Handle other types if necessary
}
}
}
private fun playVideoAtPosition(position: Int) {
val nextFile = images[position]
if (fileType == FileManager.FileType.VIDEO) {
val videoUri = Uri.fromFile(nextFile)
binding.videoView.setVideoURI(videoUri)
binding.videoView.start()
}
}
}
}

Binary file not shown.

View File

@@ -1,27 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<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="match_parent"
android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
<LinearLayout
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_constraintEnd_toEndOf="parent"
android:orientation="horizontal"
android:gravity="center_vertical"
android:paddingLeft="15dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toTopOf="parent" >
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:textSize="22sp"
android:layout_height="wrap_content"
android:textStyle="bold"
android:text="Preview File"/>
</LinearLayout>
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar" />
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:layout_width="match_parent"
@@ -34,10 +45,11 @@
app:layout_constraintStart_toStartOf="parent">
<com.google.android.material.button.MaterialButton
android:id="@+id/unhide"
android:id="@+id/unHide"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="6dp"
android:minWidth="120dp"
android:text="Unhide" />
<com.google.android.material.button.MaterialButton
@@ -45,8 +57,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="6dp"
android:minWidth="120dp"
android:text="Delete" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView 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="match_parent"
android:layout_margin="4dp"
app:cardCornerRadius="8dp">
<com.jsibbold.zoomage.ZoomageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:zoomage_restrictBounds="false"
app:zoomage_animateOnReset="true"
app:zoomage_autoResetMode="UNDER"
app:zoomage_autoCenter="true"
app:zoomage_zoomable="true"
app:zoomage_translatable="true"
app:zoomage_minScale="0.6"
app:zoomage_maxScale="8"
/>
<VideoView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/videoView"/>
</com.google.android.material.card.MaterialCardView>

View File

@@ -10,7 +10,7 @@
<item name="colorSecondary">@android:color/system_accent2_200</item>
<item name="colorSecondaryVariant">@android:color/system_accent2_300</item>
<item name="colorOnSecondary">@color/black</item>
<item name="fontFamily">@font/ubuntu_regular</item>
<!-- Status bar color -->
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Base.Theme.Calculator" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Primary brand color -->
<item name="colorPrimary">@android:color/system_accent1_600</item>
<item name="colorPrimaryVariant">@android:color/system_accent1_700</item>
<item name="colorOnPrimary">@color/white</item>
<item name="fontFamily">@font/ubuntu_regular</item>
<!-- Secondary brand color -->
<item name="colorSecondary">@android:color/system_accent2_600</item>
<item name="colorSecondaryVariant">@android:color/system_accent2_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color -->
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<!-- Enable window decor fitting -->
<item name="android:windowLightStatusBar">true</item>
<item name="android:windowLightNavigationBar">true</item>
</style>
</resources>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Base.Theme.Calculator" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Primary brand color -->
<item name="colorPrimary">@android:color/system_accent1_600</item>
<item name="colorPrimaryVariant">@android:color/system_accent1_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color -->
<item name="colorSecondary">@android:color/system_accent2_600</item>
<item name="colorSecondaryVariant">@android:color/system_accent2_700</item>
<item name="colorOnSecondary">@color/black</item>
<item name="fontFamily">@font/ubuntu_regular</item>
<!-- Status bar color -->
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<!-- Enable window decor fitting -->
<item name="android:windowLightStatusBar">true</item>
<item name="android:windowLightNavigationBar">true</item>
</style>
</resources>

View File

@@ -5,6 +5,7 @@
<item name="colorPrimary">@android:color/system_accent1_600</item>
<item name="colorPrimaryVariant">@android:color/system_accent1_700</item>
<item name="colorOnPrimary">@color/white</item>
<item name="fontFamily">@font/ubuntu_regular</item>
<!-- Secondary brand color -->
<item name="colorSecondary">@android:color/system_accent2_600</item>