Made some changes
This commit is contained in:
BIN
app/src/main/assets/logo.png
Normal file
BIN
app/src/main/assets/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
@@ -54,7 +54,7 @@ class AudioGalleryActivity : BaseGalleryActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun openPreview(file: File) {
|
override fun openPreview() {
|
||||||
// Implement audio preview
|
// Implement audio preview
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -62,7 +62,7 @@ abstract class BaseGalleryActivity : AppCompatActivity() {
|
|||||||
adapter.submitList(files)
|
adapter.submitList(files)
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract fun openPreview(file: File)
|
abstract fun openPreview()
|
||||||
|
|
||||||
private fun checkPermissions() {
|
private fun checkPermissions() {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ class DocumentsActivity : BaseGalleryActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun openPreview(file: File) {
|
override fun openPreview() {
|
||||||
// Implement document preview
|
// Implement document preview
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
package devs.org.calculator.activities
|
package devs.org.calculator.activities
|
||||||
|
|
||||||
import android.app.RecoverableSecurityException
|
import android.app.RecoverableSecurityException
|
||||||
import android.content.Context
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
@@ -14,10 +13,8 @@ import androidx.activity.result.ActivityResultLauncher
|
|||||||
import androidx.activity.result.IntentSenderRequest
|
import androidx.activity.result.IntentSenderRequest
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.documentfile.provider.DocumentFile
|
import androidx.documentfile.provider.DocumentFile
|
||||||
import androidx.lifecycle.lifecycleScope
|
|
||||||
import devs.org.calculator.utils.FileManager
|
import devs.org.calculator.utils.FileManager
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
@@ -28,62 +25,6 @@ class ImageGalleryActivity : BaseGalleryActivity() {
|
|||||||
private var selectedImageUri: Uri? = null
|
private var selectedImageUri: Uri? = null
|
||||||
private lateinit var pickImageLauncher: ActivityResultLauncher<Intent>
|
private lateinit var pickImageLauncher: ActivityResultLauncher<Intent>
|
||||||
|
|
||||||
private suspend fun deletePhotoFromExternalStorage(photoUri: Uri) {
|
|
||||||
withContext(Dispatchers.IO) {
|
|
||||||
try {
|
|
||||||
// First try to delete using DocumentFile
|
|
||||||
val documentFile = DocumentFile.fromSingleUri(this@ImageGalleryActivity, photoUri)
|
|
||||||
if (documentFile?.exists() == true && documentFile.canWrite()) {
|
|
||||||
val deleted = documentFile.delete()
|
|
||||||
withContext(Dispatchers.Main) {
|
|
||||||
if (deleted) {
|
|
||||||
Toast.makeText(this@ImageGalleryActivity, "File deleted successfully", Toast.LENGTH_SHORT).show()
|
|
||||||
selectedImageUri = null
|
|
||||||
} else {
|
|
||||||
Toast.makeText(this@ImageGalleryActivity, "Failed to delete file", Toast.LENGTH_SHORT).show()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return@withContext
|
|
||||||
}
|
|
||||||
|
|
||||||
// If DocumentFile approach fails, try content resolver
|
|
||||||
try {
|
|
||||||
contentResolver.delete(photoUri, null, null)
|
|
||||||
withContext(Dispatchers.Main) {
|
|
||||||
Toast.makeText(this@ImageGalleryActivity, "File deleted successfully", Toast.LENGTH_SHORT).show()
|
|
||||||
}
|
|
||||||
} catch (e: SecurityException) {
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
|
||||||
val intentSender = when {
|
|
||||||
Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> {
|
|
||||||
MediaStore.createDeleteRequest(contentResolver, listOf(photoUri)).intentSender
|
|
||||||
}
|
|
||||||
else -> {
|
|
||||||
val recoverableSecurityException = e as? RecoverableSecurityException
|
|
||||||
recoverableSecurityException?.userAction?.actionIntent?.intentSender
|
|
||||||
}
|
|
||||||
}
|
|
||||||
intentSender?.let { sender ->
|
|
||||||
withContext(Dispatchers.Main) {
|
|
||||||
intentSenderLauncher.launch(
|
|
||||||
IntentSenderRequest.Builder(sender).build()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e: Exception) {
|
|
||||||
withContext(Dispatchers.Main) {
|
|
||||||
Toast.makeText(
|
|
||||||
this@ImageGalleryActivity,
|
|
||||||
"Error deleting file: ${e.message}",
|
|
||||||
Toast.LENGTH_LONG
|
|
||||||
).show()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
setupIntentSenderLauncher()
|
setupIntentSenderLauncher()
|
||||||
@@ -156,10 +97,9 @@ class ImageGalleryActivity : BaseGalleryActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun openPreview(file: File) {
|
override fun openPreview() {
|
||||||
val intent = Intent(this, PreviewActivity::class.java).apply {
|
val intent = Intent(this, PreviewActivity::class.java).apply {
|
||||||
putExtra(PreviewActivity.EXTRA_FILE_PATH, file.absolutePath)
|
putExtra("type", fileType)
|
||||||
putExtra(PreviewActivity.EXTRA_FILE_TYPE, fileType.name)
|
|
||||||
}
|
}
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,14 @@
|
|||||||
package devs.org.calculator.activities
|
package devs.org.calculator.activities
|
||||||
|
|
||||||
import ImagePreviewAdapter
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.View
|
|
||||||
import android.widget.MediaController
|
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import com.bumptech.glide.Glide
|
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() {
|
||||||
|
|
||||||
companion object {
|
|
||||||
const val EXTRA_FILE_PATH = "file_path"
|
|
||||||
const val EXTRA_FILE_TYPE = "file_type"
|
|
||||||
}
|
|
||||||
|
|
||||||
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>
|
||||||
@@ -41,7 +33,6 @@ class PreviewActivity : AppCompatActivity() {
|
|||||||
private fun setupImagePreview() {
|
private fun setupImagePreview() {
|
||||||
val adapter = ImagePreviewAdapter(this, files)
|
val adapter = ImagePreviewAdapter(this, files)
|
||||||
binding.viewPager.adapter = adapter
|
binding.viewPager.adapter = adapter
|
||||||
binding.viewPager.currentItem = currentPosition
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSupportNavigateUp(): Boolean {
|
override fun onSupportNavigateUp(): Boolean {
|
||||||
|
|||||||
@@ -55,10 +55,9 @@ class VideoGalleryActivity : BaseGalleryActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun openPreview(file: File) {
|
override fun openPreview() {
|
||||||
val intent = Intent(this, PreviewActivity::class.java).apply {
|
val intent = Intent(this, PreviewActivity::class.java).apply {
|
||||||
putExtra(PreviewActivity.EXTRA_FILE_PATH, file.absolutePath)
|
putExtra("type", fileType)
|
||||||
putExtra(PreviewActivity.EXTRA_FILE_TYPE, fileType.name)
|
|
||||||
}
|
}
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,36 +1,33 @@
|
|||||||
|
package devs.org.calculator.adapters
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.view.View
|
import android.view.LayoutInflater
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.viewpager.widget.PagerAdapter
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
import com.github.chrisbanes.photoview.PhotoView
|
import devs.org.calculator.databinding.ItemFileBinding
|
||||||
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>
|
||||||
) : PagerAdapter() {
|
) : RecyclerView.Adapter<ImagePreviewAdapter.ImageViewHolder>() {
|
||||||
|
|
||||||
override fun instantiateItem(container: ViewGroup, position: Int): Any {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageViewHolder {
|
||||||
val photoView = PhotoView(context)
|
val binding = ItemFileBinding.inflate(
|
||||||
photoView.layoutParams = ViewGroup.LayoutParams(
|
LayoutInflater.from(context), parent, false
|
||||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
|
||||||
ViewGroup.LayoutParams.MATCH_PARENT
|
|
||||||
)
|
)
|
||||||
|
return ImageViewHolder(binding)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: ImageViewHolder, position: Int) {
|
||||||
|
val imageUrl = images[position]
|
||||||
Glide.with(context)
|
Glide.with(context)
|
||||||
.load(images[position])
|
.load(imageUrl)
|
||||||
.into(photoView)
|
.into(holder.binding.imageView)
|
||||||
|
|
||||||
container.addView(photoView)
|
|
||||||
return photoView
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun destroyItem(container: ViewGroup, position: Int, obj: Any) {
|
override fun getItemCount(): Int = images.size
|
||||||
container.removeView(obj as View)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getCount(): Int = images.size
|
inner class ImageViewHolder(val binding: ItemFileBinding) : RecyclerView.ViewHolder(binding.root)
|
||||||
|
|
||||||
override fun isViewFromObject(view: View, obj: Any): Boolean = view === obj
|
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<androidx.constraintlayout.widget.ConstraintLayout 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_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
@@ -8,12 +9,44 @@
|
|||||||
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" />
|
android:background="?attr/colorPrimary"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
<androidx.viewpager.widget.ViewPager
|
<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="0dp"
|
||||||
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" />
|
||||||
|
|
||||||
</LinearLayout>
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_horizontal"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:padding="8dp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@+id/viewPager"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent">
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/unhide"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="6dp"
|
||||||
|
android:text="Unhide" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/delete"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="6dp"
|
||||||
|
android:text="Delete" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
Reference in New Issue
Block a user