Skip to content

Commit 9be3a9c

Browse files
committed
Refactored app flow and album logic
1 parent a8989b0 commit 9be3a9c

File tree

21 files changed

+638
-553
lines changed

21 files changed

+638
-553
lines changed

app/src/main/java/com/anthonyla/paperize/core/WallpaperUtil.kt

Lines changed: 20 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -419,26 +419,21 @@ suspend fun getWallpaperFromFolder(folderUri: String, context: Context): List<Wa
419419
}
420420

421421
/**
422-
* Get the last modified date of a folder
423-
* @param folderUri URI of the folder
424-
* @param context Android context
422+
* Get the folder name from the folder URI
425423
*/
426-
suspend fun getFolderLastModified(folderUri: String, context: Context): Long = withContext(Dispatchers.IO) {
427-
val contentResolver = context.contentResolver
428-
val projection = arrayOf(
429-
DocumentsContract.Document.COLUMN_LAST_MODIFIED,
430-
)
431-
val childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(
432-
folderUri.toUri(),
433-
DocumentsContract.getTreeDocumentId(folderUri.toUri())
434-
)
435-
val cursor = contentResolver.query(childrenUri, projection, null, null, null)
436-
cursor?.use {
437-
if (it.moveToFirst()) {
438-
return@use it.getLong(it.getColumnIndexOrThrow(DocumentsContract.Document.COLUMN_LAST_MODIFIED))
424+
suspend fun getFolderMetadata(folderUri: String, context: Context): Metadata = withContext(Dispatchers.IO) {
425+
return@withContext try {
426+
val uri = folderUri.toUri()
427+
try {
428+
val file = DocumentFileCompat.fromTreeUri(context, uri)
429+
Metadata(file?.name?.substringBeforeLast('.', file.name).toString(), file?.lastModified ?: 0)
430+
} catch (_: Exception) {
431+
val file = DocumentFile.fromTreeUri(context, uri)
432+
Metadata(file?.name?.substringBeforeLast('.', file.name.toString()) ?: "", file?.lastModified() ?: 0)
439433
}
434+
} catch (_: Exception) {
435+
Metadata("", 0)
440436
}
441-
return@withContext 0
442437
}
443438

444439
/**
@@ -451,13 +446,13 @@ suspend fun getImageMetadata(context: Context, uriString: String): Metadata = wi
451446
val uri = uriString.toUri()
452447
try {
453448
val file = DocumentFileCompat.fromSingleUri(context, uri)
454-
return@withContext Metadata(file?.name?.substringBeforeLast('.', file.name).toString(), file?.lastModified ?: 0)
449+
Metadata(file?.name?.substringBeforeLast('.', file.name).toString(), file?.lastModified ?: 0)
455450
} catch (_: Exception) {
456451
val file = DocumentFile.fromSingleUri(context, uri)
457-
return@withContext Metadata(file?.name?.substringBeforeLast('.', file.name.toString()) ?: "", file?.lastModified() ?: 0)
452+
Metadata(file?.name?.substringBeforeLast('.', file.name.toString()) ?: "", file?.lastModified() ?: 0)
458453
}
459454
} catch (_: Exception) {
460-
return@withContext Metadata("", 0)
455+
Metadata("", 0)
461456
}
462457
}
463458

@@ -482,33 +477,24 @@ suspend fun findFirstValidUri(
482477
return@withContext null
483478
}
484479

485-
/**
486-
* Get the folder name from the folder URI
487-
*/
488-
suspend fun getFolderNameFromUri(folderUri: String, context: Context): String? = withContext(Dispatchers.IO) {
489-
return@withContext try {
490-
DocumentFileCompat.fromTreeUri(context, folderUri.toUri())?.name
491-
} catch (_: Exception) {
492-
DocumentFile.fromTreeUri(context, folderUri.toUri())?.name
493-
}
494-
}
495-
496480
/**
497481
* Check if a URI is valid
498482
*/
499483
fun isValidUri(context: Context, uriString: String?): Boolean {
500484
val uri = uriString?.decompress("content://com.android.externalstorage.documents/")?.toUri()
501-
if (uri == null) { return false }
485+
?: return false
502486
return try {
503487
DocumentFileCompat.fromSingleUri(context, uri)?.exists() ?: false
504488
} catch (_: Exception) {
505489
DocumentFile.fromSingleUri(context, uri)?.exists() ?: false
506490
}
507491
}
508492

493+
/**
494+
* Check if a URI is a directory
495+
*/
509496
fun isDirectory(context: Context, uriString: String?): Boolean {
510-
val uri = uriString?.toUri()
511-
if (uri == null) { return false }
497+
val uri = uriString?.toUri() ?: return false
512498
return try {
513499
DocumentFileCompat.fromSingleUri(context, uri)?.isDirectory() ?: false
514500
} catch (_: Exception) {

app/src/main/java/com/anthonyla/paperize/feature/wallpaper/presentation/MainActivity.kt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,22 @@ import androidx.activity.enableEdgeToEdge
2020
import androidx.activity.viewModels
2121
import androidx.compose.foundation.layout.fillMaxSize
2222
import androidx.compose.material3.Surface
23+
import androidx.compose.runtime.LaunchedEffect
24+
import androidx.compose.runtime.getValue
25+
import androidx.compose.runtime.mutableStateOf
26+
import androidx.compose.runtime.remember
27+
import androidx.compose.runtime.setValue
2328
import androidx.compose.ui.Modifier
2429
import androidx.compose.ui.unit.dp
2530
import androidx.core.animation.doOnEnd
2631
import androidx.core.app.ActivityCompat
2732
import androidx.core.content.ContextCompat
2833
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
29-
import androidx.core.view.WindowCompat
30-
import androidx.lifecycle.Lifecycle
31-
import androidx.lifecycle.compose.LifecycleEventEffect
3234
import androidx.lifecycle.compose.collectAsStateWithLifecycle
33-
import androidx.lifecycle.lifecycleScope
3435
import com.anthonyla.paperize.core.SettingsConstants
3536
import com.anthonyla.paperize.core.Type
3637
import com.anthonyla.paperize.data.settings.SettingsDataStore
38+
import com.anthonyla.paperize.feature.wallpaper.presentation.album.AlbumsViewModel
3739
import com.anthonyla.paperize.feature.wallpaper.presentation.settings_screen.SettingsEvent
3840
import com.anthonyla.paperize.feature.wallpaper.presentation.settings_screen.SettingsState
3941
import com.anthonyla.paperize.feature.wallpaper.presentation.settings_screen.SettingsViewModel
@@ -42,7 +44,6 @@ import com.anthonyla.paperize.feature.wallpaper.wallpaper_alarmmanager.Wallpaper
4244
import com.anthonyla.paperize.feature.wallpaper.wallpaper_alarmmanager.WallpaperAlarmSchedulerImpl
4345
import com.anthonyla.paperize.feature.wallpaper.wallpaper_alarmmanager.WallpaperReceiver
4446
import dagger.hilt.android.AndroidEntryPoint
45-
import kotlinx.coroutines.launch
4647
import kotlinx.coroutines.runBlocking
4748
import javax.inject.Inject
4849

@@ -51,6 +52,7 @@ import javax.inject.Inject
5152
class MainActivity : ComponentActivity() {
5253
@Inject lateinit var settingsDataStoreImpl: SettingsDataStore
5354
private val settingsViewModel: SettingsViewModel by viewModels()
55+
5456
private val context = this
5557
override fun onCreate(savedInstanceState: Bundle?) {
5658
enableEdgeToEdge(
@@ -79,9 +81,11 @@ class MainActivity : ComponentActivity() {
7981
val isFirstLaunch = runBlocking { settingsDataStoreImpl.getBoolean(SettingsConstants.FIRST_LAUNCH) } ?: true
8082
val scheduler = WallpaperAlarmSchedulerImpl(context)
8183

82-
LifecycleEventEffect(Lifecycle.Event.ON_CREATE) {
83-
lifecycleScope.launch {
84+
var hasScheduleRun by remember { mutableStateOf(false) }
85+
LaunchedEffect(settingsState.value) {
86+
if (!hasScheduleRun && settingsState.value.initialized) {
8487
handleWallpaperScheduling(settingsState.value, scheduler)
88+
hasScheduleRun = true
8589
}
8690
}
8791

0 commit comments

Comments
 (0)