⚡
This commit is contained in:
@@ -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")
|
||||
}
|
||||
@@ -58,7 +58,6 @@
|
||||
android:exported="true" />
|
||||
<activity
|
||||
android:name=".activities.PreviewActivity"
|
||||
android:theme="@style/Theme.AppCompat.NoActionBar"
|
||||
android:configChanges="orientation|screenSize"/>
|
||||
</application>
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
BIN
app/src/main/res/font/ubuntu_regular.ttf
Normal file
BIN
app/src/main/res/font/ubuntu_regular.ttf
Normal file
Binary file not shown.
@@ -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>
|
||||
29
app/src/main/res/layout/viewpager_items.xml
Normal file
29
app/src/main/res/layout/viewpager_items.xml
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
24
app/src/main/res/values-v27/themes.xml
Normal file
24
app/src/main/res/values-v27/themes.xml
Normal 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>
|
||||
24
app/src/main/res/values-v31/themes.xml
Normal file
24
app/src/main/res/values-v31/themes.xml
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user