Changes For Folder Feature

This commit is contained in:
Binondi
2025-06-03 15:09:19 +05:30
parent 4069ddc200
commit eb7f61fbc8
15 changed files with 105 additions and 103 deletions

View File

@@ -47,7 +47,6 @@ class HiddenActivity : AppCompatActivity() {
binding = ActivityHiddenBinding.inflate(layoutInflater)
setContentView(binding.root)
// Initialize managers
fileManager = FileManager(this, this)
folderManager = FolderManager(this)
dialogUtil = DialogUtil(this)
@@ -56,16 +55,16 @@ class HiddenActivity : AppCompatActivity() {
setupClickListeners()
setupBackPressedHandler()
// Initialize permissions and load data
fileManager.askPermission(this)
// Set initial orientation icon based on saved preference
refreshCurrentView()
}
private fun setupInitialUIState() {
binding.addFolder.visibility = View.VISIBLE
binding.settings.visibility = View.VISIBLE
binding.folderOrientation.visibility = View.VISIBLE
binding.deleteSelected.visibility = View.GONE
binding.delete.visibility = View.GONE
binding.menuButton.visibility = View.GONE

View File

@@ -125,7 +125,7 @@ class PreviewActivity : AppCompatActivity() {
private fun clickListeners() {
binding.delete.setOnClickListener {
val fileUri = FileManager.FileManager().getContentUriImage(this, files[binding.viewPager.currentItem], filetype)
val fileUri = FileManager.FileManager().getContentUriImage(this, files[binding.viewPager.currentItem])
if (fileUri != null) {
dialogUtil.showMaterialDialog(
getString(R.string.delete_file),
@@ -153,7 +153,7 @@ class PreviewActivity : AppCompatActivity() {
}
binding.unHide.setOnClickListener {
val fileUri = FileManager.FileManager().getContentUriImage(this, files[binding.viewPager.currentItem], filetype)
val fileUri = FileManager.FileManager().getContentUriImage(this, files[binding.viewPager.currentItem])
if (fileUri != null) {
dialogUtil.showMaterialDialog(
getString(R.string.un_hide_file),

View File

@@ -27,7 +27,6 @@ import devs.org.calculator.utils.DialogUtil
import devs.org.calculator.utils.FileManager
import devs.org.calculator.utils.FileManager.Companion.HIDDEN_DIR
import devs.org.calculator.utils.FolderManager
import devs.org.calculator.utils.PrefsUtil
import kotlinx.coroutines.launch
import java.io.File
@@ -52,7 +51,7 @@ class ViewFolderActivity : AppCompatActivity() {
private var customDialog: androidx.appcompat.app.AlertDialog? = null
private var dialogShowTime: Long = 0
private val MINIMUM_DIALOG_DURATION = 1700L
private val MINIMUM_DIALOG_DURATION = 1200L
override fun onCreate(savedInstanceState: Bundle?) {
@@ -110,6 +109,7 @@ class ViewFolderActivity : AppCompatActivity() {
}
}
@SuppressLint("SetTextI18n")
private fun showCustomDialog(count: Int) {
val dialogView = ProccessingDialogBinding.inflate(layoutInflater)
customDialog = MaterialAlertDialogBuilder(this)
@@ -129,16 +129,26 @@ class ViewFolderActivity : AppCompatActivity() {
mainHandler.postDelayed({
customDialog?.dismiss()
customDialog = null
updateFilesToAdapter()
}, remainingTime)
} else {
customDialog?.dismiss()
customDialog = null
updateFilesToAdapter()
}
}
private fun updateFilesToAdapter() {
openFolder(currentFolder!!)
}
private fun processSelectedFiles(uriList: List<Uri>) {
val targetFolder = currentFolder ?: hiddenDir
if (!targetFolder.exists()) {
targetFolder.mkdirs()
File(targetFolder, ".nomedia").createNewFile()
}
showCustomDialog(uriList.size)
lifecycleScope.launch {
@@ -147,8 +157,9 @@ class ViewFolderActivity : AppCompatActivity() {
object : FileProcessCallback {
override fun onFilesProcessedSuccessfully(copiedFiles: List<File>) {
mainHandler.post {
refreshCurrentView()
dismissCustomDialog()
mainHandler.postDelayed({
dismissCustomDialog()
}, 1000)
}
}
@@ -188,6 +199,11 @@ class ViewFolderActivity : AppCompatActivity() {
}
private fun openFolder(folder: File) {
// Ensure folder exists and has .nomedia file
if (!folder.exists()) {
folder.mkdirs()
File(folder, ".nomedia").createNewFile()
}
val files = folderManager.getFilesInFolder(folder)
binding.folderName.text = folder.name
@@ -212,7 +228,7 @@ class ViewFolderActivity : AppCompatActivity() {
fileAdapter = FileAdapter(this, this, folder, prefs.getBoolean("showFileName", true),
onFolderLongClick = { isSelected ->
handleFileSelectionModeChange(isSelected, 0)
handleFileSelectionModeChange(isSelected)
}).apply {
setFileOperationCallback(object : FileAdapter.FileOperationCallback {
override fun onFileDeleted(file: File) {
@@ -228,7 +244,7 @@ class ViewFolderActivity : AppCompatActivity() {
}
override fun onSelectionModeChanged(isSelectionMode: Boolean, selectedCount: Int) {
handleFileSelectionModeChange(isSelectionMode, selectedCount)
handleFileSelectionModeChange(isSelectionMode)
}
override fun onSelectionCountChanged(selectedCount: Int) {
@@ -243,18 +259,16 @@ class ViewFolderActivity : AppCompatActivity() {
binding.recyclerView.visibility = View.VISIBLE
binding.noItems.visibility = View.GONE
// Setup menu button click listener
binding.menuButton.setOnClickListener {
fileAdapter?.let { adapter ->
showFileOptionsMenu(adapter.getSelectedItems())
}
}
// Set initial UI state
showFileViewIcons()
}
@Deprecated("This method has been deprecated in favor of using the\n {@link OnBackPressedDispatcher} via {@link #getOnBackPressedDispatcher()}.\n The OnBackPressedDispatcher controls how back button events are dispatched\n to one or more {@link OnBackPressedCallback} objects.")
@SuppressLint("MissingSuperCall")
override fun onBackPressed() {
handleBackPress()
@@ -268,7 +282,7 @@ class ViewFolderActivity : AppCompatActivity() {
super.onBackPressed()
}
private fun handleFileSelectionModeChange(isSelectionMode: Boolean, selectedCount: Int) {
private fun handleFileSelectionModeChange(isSelectionMode: Boolean) {
if (isSelectionMode) {
showFileSelectionIcons()
} else {
@@ -277,7 +291,6 @@ class ViewFolderActivity : AppCompatActivity() {
}
private fun updateSelectionCountDisplay(selectedCount: Int) {
// Update any UI elements that show selection count
if (selectedCount > 0) {
showFileSelectionIcons()
} else {
@@ -366,13 +379,10 @@ class ViewFolderActivity : AppCompatActivity() {
private fun refreshCurrentFolder() {
currentFolder?.let { folder ->
val files = folderManager.getFilesInFolder(folder)
fileAdapter?.submitList(files)
if (files.isEmpty()) {
showEmptyState()
} else {
if (files.isNotEmpty()) {
binding.recyclerView.visibility = View.VISIBLE
binding.noItems.visibility = View.GONE
fileAdapter?.submitList(files.toMutableList())
fileAdapter?.let { adapter ->
if (adapter.isInSelectionMode()) {
showFileSelectionIcons()
@@ -380,6 +390,8 @@ class ViewFolderActivity : AppCompatActivity() {
showFileViewIcons()
}
}
} else {
showEmptyState()
}
}
}
@@ -414,6 +426,7 @@ class ViewFolderActivity : AppCompatActivity() {
addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
}
closeFabs()
pickImageLauncher.launch(intent)
}
@@ -481,14 +494,17 @@ class ViewFolderActivity : AppCompatActivity() {
var allUnhidden = true
selectedFiles.forEach { file ->
try {
val fileUri = Uri.fromFile(file)
val result = fileManager.copyFileToNormalDir(fileUri)
if (result == null) {
allUnhidden = false
val fileUri = FileManager.FileManager().getContentUriImage(this@ViewFolderActivity, file)
if (fileUri != null) {
val result = fileManager.copyFileToNormalDir(fileUri)
if (result == null) {
allUnhidden = false
}
} else {
// Delete the hidden file after successful copy
file.delete()
allUnhidden = false
}
} catch (e: Exception) {
allUnhidden = false
}

View File

@@ -472,7 +472,7 @@ class FileAdapter(
override fun onBindViewHolder(holder: FileViewHolder, position: Int, payloads: MutableList<Any>) {
if (payloads.isEmpty()) {
super.onBindViewHolder(holder, position, payloads)
onBindViewHolder(holder, position)
} else {
if (position < itemCount) {
val file = getItem(position)
@@ -481,9 +481,18 @@ class FileAdapter(
}
}
/**
* Enter selection mode and notify callback immediately
*/
override fun submitList(list: List<File>?) {
val currentList = currentList.toMutableList()
if (list == null) {
currentList.clear()
super.submitList(null)
} else {
// Create a new list to force update
val newList = list.toMutableList()
super.submitList(newList)
}
}
fun enterSelectionMode() {
if (!isSelectionMode) {
isSelectionMode = true
@@ -491,9 +500,6 @@ class FileAdapter(
}
}
/**
* Exit selection mode and clear all selections
*/
fun exitSelectionMode() {
if (isSelectionMode) {
isSelectionMode = false
@@ -503,9 +509,6 @@ class FileAdapter(
}
}
/**
* Clear selection without exiting selection mode
*/
fun clearSelection() {
if (selectedItems.isNotEmpty()) {
val previouslySelected = selectedItems.toSet()
@@ -519,9 +522,6 @@ class FileAdapter(
}
}
/**
* Select all items
*/
fun selectAll() {
if (!isSelectionMode) {
enterSelectionMode()
@@ -542,9 +542,6 @@ class FileAdapter(
updateSelectionItems(selectedItems.toSet(), previouslySelected)
}
/**
* Efficiently update selection UI for changed items only
*/
private fun updateSelectionItems(newSelections: Set<Int>, oldSelections: Set<Int>) {
val changedItems = (oldSelections - newSelections) + (newSelections - oldSelections)
changedItems.forEach { position ->
@@ -554,36 +551,24 @@ class FileAdapter(
}
}
/**
* Centralized method to notify selection mode changes
*/
private fun notifySelectionModeChange() {
fileOperationCallback?.get()?.onSelectionModeChanged(isSelectionMode, selectedItems.size)
onFolderLongClick(isSelectionMode)
}
/**
* Get selected files
*/
fun getSelectedItems(): List<File> {
return selectedItems.mapNotNull { position ->
if (position < itemCount) getItem(position) else null
}
}
/**
* Get selected file count
*/
fun getSelectedCount(): Int = selectedItems.size
/**
* Check if in selection mode
*/
fun isInSelectionMode(): Boolean = isSelectionMode
/**
* Delete selected files with proper error handling and background processing
*/
fun deleteSelectedFiles() {
val selectedFiles = getSelectedItems()
if (selectedFiles.isEmpty()) return
@@ -647,9 +632,7 @@ class FileAdapter(
}
}
/**
* Share selected files
*/
fun shareSelectedFiles() {
val selectedFiles = getSelectedItems()
if (selectedFiles.isEmpty()) return
@@ -707,10 +690,7 @@ class FileAdapter(
exitSelectionMode()
}
/**
* Handle back press - exit selection mode if active
* @return true if selection mode was active and has been exited, false otherwise
*/
fun onBackPressed(): Boolean {
return if (isSelectionMode) {
exitSelectionMode()
@@ -720,10 +700,6 @@ class FileAdapter(
}
}
/**
* Force refresh of all selection states
* Call this if you notice selection UI issues
*/
fun refreshSelectionStates() {
if (isSelectionMode) {
selectedItems.forEach { position ->
@@ -736,9 +712,6 @@ class FileAdapter(
}
}
/**
* Clean up resources to prevent memory leaks
*/
fun cleanup() {
try {
if (!fileExecutor.isShutdown) {
@@ -751,10 +724,6 @@ class FileAdapter(
fileOperationCallback?.clear()
fileOperationCallback = null
}
/**
* Call this from the activity's onDestroy()
*/
override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) {
super.onDetachedFromRecyclerView(recyclerView)
cleanup()

View File

@@ -17,7 +17,8 @@ class FileDiffCallback : DiffUtil.ItemCallback<File>() {
oldItem.length() == newItem.length() &&
oldItem.lastModified() == newItem.lastModified() &&
oldItem.canRead() == newItem.canRead() &&
oldItem.canWrite() == newItem.canWrite()
oldItem.canWrite() == newItem.canWrite() &&
oldItem.exists() == newItem.exists()
}
override fun getChangePayload(oldItem: File, newItem: File): Any? {
@@ -37,6 +38,10 @@ class FileDiffCallback : DiffUtil.ItemCallback<File>() {
changes.add("MODIFIED_DATE_CHANGED")
}
if (oldItem.exists() != newItem.exists()) {
changes.add("EXISTENCE_CHANGED")
}
return if (changes.isNotEmpty()) changes else null
}
}

View File

@@ -20,6 +20,7 @@ import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import devs.org.calculator.callbacks.FileProcessCallback
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.io.File
@@ -79,6 +80,12 @@ class FileManager(private val context: Context, private val lifecycleOwner: Life
// Get the target directory (i am using the current opened folder as target folder)
val targetDir = folderName
// Ensure target directory exists and has .nomedia file
if (!targetDir.exists()) {
targetDir.mkdirs()
File(targetDir, ".nomedia").createNewFile()
}
// Create target file
val mimeType = contentResolver.getType(uri)
@@ -219,11 +226,7 @@ class FileManager(private val context: Context, private val lifecycleOwner: Life
if (documentFile?.exists() == true && documentFile.canWrite()) {
val deleted = documentFile.delete()
withContext(Dispatchers.Main) {
if (deleted) {
// Toast.makeText(context, "File deleted successfully", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(context, "Failed to hide/unhide file", Toast.LENGTH_SHORT).show()
}
}
return@withContext
}
@@ -232,7 +235,7 @@ class FileManager(private val context: Context, private val lifecycleOwner: Life
try {
context.contentResolver.delete(photoUri, null, null)
withContext(Dispatchers.Main) {
// Toast.makeText(context, "File deleted successfully", Toast.LENGTH_SHORT).show()
// Toast.makeText(context, "File deleted successfully", Toast.LENGTH_SHORT).show()
}
} catch (e: SecurityException) {
// Handle security exception for Android 10 and above
@@ -290,8 +293,8 @@ class FileManager(private val context: Context, private val lifecycleOwner: Life
}
}
class FileManager(){
fun getContentUriImage(context: Context, file: File, fileType: FileType): Uri? {
class FileManager{
fun getContentUriImage(context: Context, file: File): Uri? {
// Query MediaStore for the file
val projection = arrayOf(MediaStore.MediaColumns._ID)
@@ -341,7 +344,7 @@ class FileManager(private val context: Context, private val lifecycleOwner: Life
suspend fun processMultipleFiles(
uriList: List<Uri>,
fileType: File,
targetFolder: File,
callback: FileProcessCallback,
currentDir: File? = null
) {
@@ -349,12 +352,14 @@ class FileManager(private val context: Context, private val lifecycleOwner: Life
val copiedFiles = mutableListOf<File>()
for (uri in uriList) {
try {
val file = copyFileToHiddenDir(uri, fileType, currentDir)
val file = copyFileToHiddenDir(uri, targetFolder, currentDir)
file?.let { copiedFiles.add(it) }
} catch (e: Exception) {
e.printStackTrace()
}
}
delay(500)
withContext(Dispatchers.Main) {
if (copiedFiles.isNotEmpty()) {
callback.onFilesProcessedSuccessfully(copiedFiles)

View File

@@ -5,6 +5,6 @@
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?attr/colorPrimary"
android:fillColor="#fff"
android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"/>
</vector>

View File

@@ -5,5 +5,5 @@
android:viewportHeight="24">
<path
android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z"
android:fillColor="?attr/colorPrimary"/>
android:fillColor="#fff"/>
</vector>

View File

@@ -5,5 +5,5 @@
android:viewportHeight="16">
<path
android:pathData="M4,13L2,13L2,11L4,11ZM14,11L6,11v2h8ZM4,7L2,7L2,9L4,9ZM14,7L6,7L6,9h8ZM4,3L2,3L2,5L4,5ZM14,3L6,3L6,5h8Z"
android:fillColor="?attr/colorPrimary"/>
android:fillColor="#ffffff"/>
</vector>

View File

@@ -2,7 +2,7 @@
android:height="24dp" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp">
<path android:fillColor="?attr/colorPrimary"
android:pathData="M12,12H12.01M12,6H12.01M12,18H12.01M13,12C13,12.552 12.552,13 12,13C11.448,13 11,12.552 11,12C11,11.448 11.448,11 12,11C12.552,11 13,11.448 13,12ZM13,18C13,18.552 12.552,19 12,19C11.448,19 11,18.552 11,18C11,17.448 11.448,17 12,17C12.552,17 13,17.448 13,18ZM13,6C13,6.552 12.552,7 12,7C11.448,7 11,6.552 11,6C11,5.448 11.448,5 12,5C12.552,5 13,5.448 13,6Z" android:strokeColor="?attr/colorPrimary" android:strokeLineCap="round" android:strokeLineJoin="round" android:strokeWidth="2"/>
<path android:fillColor="#fff"
android:pathData="M12,12H12.01M12,6H12.01M12,18H12.01M13,12C13,12.552 12.552,13 12,13C11.448,13 11,12.552 11,12C11,11.448 11.448,11 12,11C12.552,11 13,11.448 13,12ZM13,18C13,18.552 12.552,19 12,19C11.448,19 11,18.552 11,18C11,17.448 11.448,17 12,17C12.552,17 13,17.448 13,18ZM13,6C13,6.552 12.552,7 12,7C11.448,7 11,6.552 11,6C11,5.448 11.448,5 12,5C12.552,5 13,5.448 13,6Z" android:strokeColor="#fff" android:strokeLineCap="round" android:strokeLineJoin="round" android:strokeWidth="2"/>
</vector>

View File

@@ -5,5 +5,5 @@
android:viewportHeight="24">
<path
android:pathData="M4,13.743l-1,0.579a1,1 0,0 0,-0.366 1.366l1.488,2.578a1,1 0,0 0,1.366 0.366L6.5,18.05a1.987,1.987 0,0 1,1.986 0l0.02,0.011a1.989,1.989 0,0 1,1 1.724V21a1,1 0,0 0,1 1h3a1,1 0,0 0,1 -1V19.782a1.985,1.985 0,0 1,0.995 -1.721l0.021,-0.012a1.987,1.987 0,0 1,1.986 0l1.008,0.582a1,1 0,0 0,1.366 -0.366l1.488,-2.578A1,1 0,0 0,21 14.322l-1,-0.579a1.994,1.994 0,0 1,-1 -1.733v-0.021a1.991,1.991 0,0 1,1 -1.732l1,-0.579a1,1 0,0 0,0.366 -1.366L19.876,5.734a1,1 0,0 0,-1.366 -0.366L17.5,5.95a1.987,1.987 0,0 1,-1.986 0L15.5,5.94a1.989,1.989 0,0 1,-1 -1.724V3a1,1 0,0 0,-1 -1h-3a1,1 0,0 0,-1 1V4.294A1.856,1.856 0,0 1,8.57 5.9l-0.153,0.088a1.855,1.855 0,0 1,-1.853 0L5.49,5.368a1,1 0,0 0,-1.366 0.366L2.636,8.312A1,1 0,0 0,3 9.678l1,0.579A1.994,1.994 0,0 1,5 11.99v0.021A1.991,1.991 0,0 1,4 13.743ZM12,9a3,3 0,1 1,-3 3A3,3 0,0 1,12 9Z"
android:fillColor="?attr/colorPrimary"/>
android:fillColor="#fff"/>
</vector>

View File

@@ -23,6 +23,7 @@
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_back"
app:tint="@color/svgTintColor"
android:scaleType="fitCenter"
android:background="#00000000"
android:padding="8dp"
@@ -38,17 +39,18 @@
android:layout_weight="1"
android:id="@+id/folderName"/>
<ImageButton
<androidx.appcompat.widget.AppCompatImageButton
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_edit"
app:tint="?attr/colorPrimary"
android:scaleType="fitCenter"
android:padding="9dp"
android:visibility="gone"
android:background="#00000000"
android:id="@+id/edit"/>
<ImageButton
<androidx.appcompat.widget.AppCompatImageButton
android:id="@+id/delete"
android:layout_width="40dp"
android:layout_height="40dp"
@@ -56,31 +58,36 @@
android:padding="9dp"
android:scaleType="fitCenter"
android:src="@drawable/ic_delete"
app:tint="?attr/colorPrimary"
android:visibility="gone" />
<ImageButton
<androidx.appcompat.widget.AppCompatImageButton
android:id="@+id/menuButton"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_more"
app:tint="?attr/colorPrimary"
android:scaleType="fitCenter"
android:padding="9dp"
android:visibility="gone"
android:background="#00000000"/>
<ImageButton
<androidx.appcompat.widget.AppCompatImageButton
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_list"
android:scaleType="fitCenter"
app:tint="?attr/colorPrimary"
android:background="#00000000"
android:padding="8dp"
android:id="@+id/folderOrientation"/>
<ImageButton
<androidx.appcompat.widget.AppCompatImageButton
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_settings"
android:scaleType="fitCenter"
app:tint="?attr/colorPrimary"
android:background="#00000000"
android:padding="8dp"
android:id="@+id/settings"/>

View File

@@ -23,6 +23,7 @@
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_back"
app:tint="@color/svgTintColor"
android:scaleType="fitCenter"
android:background="#00000000"
android:padding="8dp"
@@ -39,11 +40,12 @@
android:id="@+id/folderName"/>
<ImageButton
<androidx.appcompat.widget.AppCompatImageButton
android:id="@+id/menuButton"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_more"
app:tint="?attr/colorPrimary"
android:scaleType="fitCenter"
android:padding="7dp"
android:visibility="gone"
@@ -100,7 +102,6 @@
android:text="@string/add_image"
app:tint="@color/white"
android:visibility="gone"
app:fabCustomSize="48dp"
android:backgroundTint="?attr/colorPrimary"
app:layout_constraintBottom_toTopOf="@+id/addVideo"
app:layout_constraintEnd_toEndOf="@+id/addVideo"
@@ -113,7 +114,6 @@
android:layout_marginBottom="10dp"
android:src="@drawable/video_add"
android:text="@string/add_image"
app:fabCustomSize="49dp"
android:visibility="gone"
app:tint="@color/white"
android:backgroundTint="?attr/colorPrimary"
@@ -129,7 +129,6 @@
android:layout_marginBottom="10dp"
android:src="@drawable/music_add"
android:text="@string/add_image"
app:fabCustomSize="51dp"
android:visibility="gone"
app:tint="@color/white"
android:backgroundTint="?attr/colorPrimary"
@@ -144,7 +143,6 @@
android:src="@drawable/document_add"
android:text="@string/add_image"
android:layout_marginBottom="10dp"
app:fabCustomSize="54dp"
app:tint="@color/white"
android:visibility="gone"
android:backgroundTint="?attr/colorPrimary"
@@ -161,7 +159,6 @@
android:src="@drawable/ic_add"
android:backgroundTint="?attr/colorPrimary"
android:text="@string/add_image"
app:fabCustomSize="60dp"
app:tint="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />

View File

@@ -3,6 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_marginHorizontal="2dp"
android:layout_height="wrap_content">
<com.google.android.material.card.MaterialCardView
@@ -45,6 +46,7 @@
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center"
app:tint="?attr/colorPrimary"
android:src="@drawable/ic_folder" />
<TextView

View File

@@ -3,6 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_marginHorizontal="8dp"
android:layout_height="wrap_content">
<com.google.android.material.card.MaterialCardView
@@ -48,6 +49,7 @@
android:layout_height="48dp"
android:padding="8dp"
android:layout_gravity="center"
app:tint="?attr/colorPrimary"
android:src="@drawable/ic_folder" />
<LinearLayout