sorting + slideshow

This commit is contained in:
Owen
2025-08-21 10:41:41 -04:00
parent db2326f3e7
commit 92dcfbd0ae
11 changed files with 110 additions and 1 deletions

View File

@@ -70,6 +70,7 @@ dependencies {
implementation(libs.androidx.activity)
implementation(libs.androidx.constraintlayout)
implementation(libs.androidx.gridlayout)
implementation(libs.androidx.lifecycle.process)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)

View File

@@ -118,6 +118,13 @@ class HiddenActivity : AppCompatActivity() {
binding.folderOrientation.setIconResource(R.drawable.ic_list)
}
}
binding.random.setOnClickListener {
val folders = folderManager.getFoldersInDirectory(hiddenDir)
val randomIndex = (Math.random() * folders.size).toInt()
val folder = folders[randomIndex]
startActivity(Intent(this,ViewFolderActivity::class.java).putExtra("folder",folder.toString()))
}
}
private fun showGridUI() {
@@ -399,6 +406,7 @@ class HiddenActivity : AppCompatActivity() {
}
private fun showFolderViewIcons() {
binding.random.visibility = View.VISIBLE
binding.folderOrientation.visibility = View.VISIBLE
binding.settings.visibility = View.VISIBLE
binding.delete.visibility = View.GONE
@@ -412,6 +420,7 @@ class HiddenActivity : AppCompatActivity() {
}
}
private fun showFolderSelectionIcons() {
binding.random.visibility = View.GONE
binding.folderOrientation.visibility = View.GONE
binding.settings.visibility = View.GONE
binding.delete.visibility = View.VISIBLE

View File

@@ -0,0 +1,43 @@
package devs.org.calculator.activities
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.ProcessLifecycleOwner
abstract class SecureBaseActivity : AppCompatActivity() {
class AppLifecycleObserver : DefaultLifecycleObserver {
companion object {
var wasInBackground = false
}
override fun onStart(owner: LifecycleOwner) {
wasInBackground = true
}
override fun onStop(owner: LifecycleOwner) {
wasInBackground = false
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifecycleObserver())
}
override fun onResume() {
super.onResume()
if (AppLifecycleObserver.wasInBackground) {
AppLifecycleObserver.wasInBackground = false
val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(intent)
finish()
}
}
}

View File

@@ -327,6 +327,10 @@ class ViewFolderActivity : AppCompatActivity() {
binding.swipeLayout.visibility = View.VISIBLE
binding.noItems.visibility = View.GONE
binding.selectAllButton.setOnClickListener {
fileAdapter?.toggleSelectAll()
}
binding.menuButton.setOnClickListener {
fileAdapter?.let { adapter ->
showFileOptionsMenu(adapter.getSelectedItems())
@@ -762,6 +766,7 @@ class ViewFolderActivity : AppCompatActivity() {
private fun showFileViewIcons() {
binding.menuButton.visibility = View.GONE
binding.selectAllButton.visibility = View.GONE
binding.fabExpend.visibility = View.VISIBLE
binding.addImage.visibility = View.INVISIBLE
binding.addVideo.visibility = View.INVISIBLE
@@ -773,6 +778,7 @@ class ViewFolderActivity : AppCompatActivity() {
private fun showFileSelectionIcons() {
binding.menuButton.visibility = View.VISIBLE
binding.selectAllButton.visibility = View.VISIBLE
binding.fabExpend.visibility = View.GONE
binding.addImage.visibility = View.INVISIBLE
binding.addVideo.visibility = View.INVISIBLE

View File

@@ -495,6 +495,31 @@ class FileAdapter(
}
}
fun toggleSelectAll() {
if (!isSelectionMode) {
isSelectionMode = true
notifySelectionModeChange()
}
val filesInFolder = FolderManager().getFilesInFolder(currentFolder)
if (selectedItems.size == filesInFolder.size) {
selectedItems.clear()
onSelectionCountChanged(0)
notifyDataSetChanged()
// for (i in 0 until filesInFolder.size) {
// notifyItemChanged(i)
// notifyChan
// }
} else {
for (i in 0 until filesInFolder.size) {
if (!selectedItems.contains(i)) {
selectedItems.add(i)
notifyItemChanged(i)
}
}
onSelectionCountChanged(filesInFolder.size)
}
}
@SuppressLint("NotifyDataSetChanged")
fun exitSelectionMode() {
if (isSelectionMode) {

View File

@@ -39,7 +39,7 @@ class FolderManager {
directory.listFiles()?.filter { it.isDirectory && it.name != ".nomedia" } ?: emptyList()
} else {
emptyList()
}.sortedBy { it.name }
}.sortedBy { it.name.lowercase() }
}
fun getFilesInFolder(folder: File): List<File> {

View File

@@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="960" android:viewportWidth="960" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M340,680Q365,680 382.5,662.5Q400,645 400,620Q400,595 382.5,577.5Q365,560 340,560Q315,560 297.5,577.5Q280,595 280,620Q280,645 297.5,662.5Q315,680 340,680ZM340,400Q365,400 382.5,382.5Q400,365 400,340Q400,315 382.5,297.5Q365,280 340,280Q315,280 297.5,297.5Q280,315 280,340Q280,365 297.5,382.5Q315,400 340,400ZM620,680Q645,680 662.5,662.5Q680,645 680,620Q680,595 662.5,577.5Q645,560 620,560Q595,560 577.5,577.5Q560,595 560,620Q560,645 577.5,662.5Q595,680 620,680ZM620,400Q645,400 662.5,382.5Q680,365 680,340Q680,315 662.5,297.5Q645,280 620,280Q595,280 577.5,297.5Q560,315 560,340Q560,365 577.5,382.5Q595,400 620,400ZM200,840Q167,840 143.5,816.5Q120,793 120,760L120,200Q120,167 143.5,143.5Q167,120 200,120L760,120Q793,120 816.5,143.5Q840,167 840,200L840,760Q840,793 816.5,816.5Q793,840 760,840L200,840ZM200,760L760,760Q760,760 760,760Q760,760 760,760L760,200Q760,200 760,200Q760,200 760,200L200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760ZM200,200L200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760L200,760Q200,760 200,760Q200,760 200,760L200,200Q200,200 200,200Q200,200 200,200Z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="960" android:viewportWidth="960" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M268,720L42,494L99,438L269,608L269,608L325,664L268,720ZM494,720L268,494L324,437L494,607L862,239L918,296L494,720ZM494,494L437,438L635,240L692,296L494,494Z"/>
</vector>

View File

@@ -60,6 +60,12 @@
app:icon="@drawable/ic_more"
style="@style/Widget.Material3.Button.IconButton"/>
<com.google.android.material.button.MaterialButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:icon="@drawable/ic_dice"
style="@style/Widget.Material3.Button.IconButton"
android:id="@+id/random" />
<com.google.android.material.button.MaterialButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@@ -39,6 +39,13 @@
android:layout_weight="1"
android:id="@+id/folderName"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/selectAllButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:icon="@drawable/ic_select_all"
android:visibility="gone"
style="@style/Widget.Material3.Button.IconButton"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/menuButton"

View File

@@ -20,6 +20,7 @@ roomRuntime = "2.7.1"
swiperefreshlayout = "1.2.0-beta01"
viewpager = "1.1.0"
zoomage = "1.3.1"
lifecycleProcess = "2.9.2"
[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
@@ -43,6 +44,7 @@ material-color-utilities = { module = "com.google.android.material:material-colo
androidx-gridlayout = { group = "androidx.gridlayout", name = "gridlayout", version.ref = "gridlayout" }
photoview = { module = "com.github.chrisbanes:PhotoView", version.ref = "photoview" }
zoomage = { module = "com.jsibbold:zoomage", version.ref = "zoomage" }
androidx-lifecycle-process = { group = "androidx.lifecycle", name = "lifecycle-process", version.ref = "lifecycleProcess" }
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }