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("androidx.documentfile:documentfile:1.0.1")
implementation("com.github.chrisbanes:PhotoView:2.3.0") implementation("com.github.chrisbanes:PhotoView:2.3.0")
implementation("androidx.viewpager:viewpager:1.0.0") implementation("androidx.viewpager:viewpager:1.0.0")
implementation("com.jsibbold:zoomage:1.3.1")
} }

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,7 @@
package devs.org.calculator.adapters package devs.org.calculator.adapters
import android.content.Context
import android.content.Intent
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
@@ -9,10 +11,12 @@ import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import devs.org.calculator.R import devs.org.calculator.R
import devs.org.calculator.activities.PreviewActivity
import devs.org.calculator.utils.FileManager import devs.org.calculator.utils.FileManager
import kotlinx.coroutines.NonDisposableHandle.parent
import java.io.File 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()) { ListAdapter<File, FileAdapter.FileViewHolder>(FileDiffCallback()) {
private val selectedItems = mutableSetOf<Int>() private val selectedItems = mutableSetOf<Int>()
@@ -45,7 +49,29 @@ class FileAdapter(private val fileType: FileManager.FileType) :
imageView.setImageResource(resourceId) 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 package devs.org.calculator.adapters
import android.content.Context import android.content.Context
import android.net.Uri
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.MediaController
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide 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 import java.io.File
class ImagePreviewAdapter( class ImagePreviewAdapter(
private val context: Context, private val context: Context,
private val images: List<File> private val images: List<File>,
private var fileType: FileManager.FileType
) : RecyclerView.Adapter<ImagePreviewAdapter.ImageViewHolder>() { ) : RecyclerView.Adapter<ImagePreviewAdapter.ImageViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageViewHolder {
val binding = ItemFileBinding.inflate( val binding = ViewpagerItemsBinding.inflate(LayoutInflater.from(context), parent, false
LayoutInflater.from(context), parent, false
) )
return ImageViewHolder(binding) return ImageViewHolder(binding)
} }
override fun onBindViewHolder(holder: ImageViewHolder, position: Int) { override fun onBindViewHolder(holder: ImageViewHolder, position: Int) {
val imageUrl = images[position] val imageUrl = images[position]
Glide.with(context) holder.bind(imageUrl)
.load(imageUrl)
.into(holder.binding.imageView)
} }
override fun getItemCount(): Int = images.size 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"?> <?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" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<androidx.appcompat.widget.Toolbar <LinearLayout
android:id="@+id/toolbar" android:id="@+id/toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
android:orientation="horizontal"
android:gravity="center_vertical"
android:paddingLeft="15dp"
app:layout_constraintStart_toStartOf="parent" 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 <androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager" android:id="@+id/viewPager"
android:layout_width="match_parent" 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_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_toBottomOf="@+id/toolbar" /> app:layout_constraintTop_toTopOf="parent" />
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -34,10 +45,11 @@
app:layout_constraintStart_toStartOf="parent"> app:layout_constraintStart_toStartOf="parent">
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/unhide" android:id="@+id/unHide"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="6dp" android:layout_margin="6dp"
android:minWidth="120dp"
android:text="Unhide" /> android:text="Unhide" />
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
@@ -45,8 +57,9 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="6dp" android:layout_margin="6dp"
android:minWidth="120dp"
android:text="Delete" /> android:text="Delete" />
</LinearLayout> </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="colorSecondary">@android:color/system_accent2_200</item>
<item name="colorSecondaryVariant">@android:color/system_accent2_300</item> <item name="colorSecondaryVariant">@android:color/system_accent2_300</item>
<item name="colorOnSecondary">@color/black</item> <item name="colorOnSecondary">@color/black</item>
<item name="fontFamily">@font/ubuntu_regular</item>
<!-- Status bar color --> <!-- Status bar color -->
<item name="android:statusBarColor">@android:color/transparent</item> <item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@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="colorPrimary">@android:color/system_accent1_600</item>
<item name="colorPrimaryVariant">@android:color/system_accent1_700</item> <item name="colorPrimaryVariant">@android:color/system_accent1_700</item>
<item name="colorOnPrimary">@color/white</item> <item name="colorOnPrimary">@color/white</item>
<item name="fontFamily">@font/ubuntu_regular</item>
<!-- Secondary brand color --> <!-- Secondary brand color -->
<item name="colorSecondary">@android:color/system_accent2_600</item> <item name="colorSecondary">@android:color/system_accent2_600</item>