Skip to content

Commit 8eb9cb2

Browse files
committed
Fixed adding folder issue to already created album
Removed predictive back gestures due to unstable crashing Refactored viewmodel code for adding and removing wallpaper and folders Changed string literals to string resources
1 parent 3f412f4 commit 8eb9cb2

File tree

21 files changed

+274
-195
lines changed

21 files changed

+274
-195
lines changed

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ android {
1717
applicationId = "com.anthonyla.paperize"
1818
minSdk = 26
1919
targetSdk = 34
20-
versionCode = 8
21-
versionName = "1.1.0"
20+
versionCode = 9
21+
versionName = "1.1.1"
2222

2323
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2424
vectorDrawables {

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@
1616
android:icon="@mipmap/app_icon"
1717
android:label="@string/app_name"
1818
android:supportsRtl="true"
19-
android:theme="@style/Theme.Paperize"
20-
android:enableOnBackInvokedCallback="true"
21-
tools:targetApi="tiramisu">
19+
android:theme="@style/Theme.Paperize" tools:targetApi="tiramisu">
2220
<activity
2321
android:name=".feature.wallpaper.presentation.MainActivity"
2422
android:exported="true"

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

Lines changed: 52 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,6 @@ class AddAlbumViewModel @Inject constructor(
5858
folders = _state.value.folders,
5959
)
6060
repository.upsertAlbumWithWallpaperAndFolder(albumWithWallpaperAndFolder)
61-
62-
//Clear viewModel state after adding album
6361
_state.update { it.copy(
6462
initialAlbumName = "",
6563
displayedAlbumName = "",
@@ -76,13 +74,14 @@ class AddAlbumViewModel @Inject constructor(
7674
}
7775
is AddAlbumEvent.DeleteSelected -> {
7876
viewModelScope.launch {
79-
val wallpapersRemoved = _state.value.wallpapers.filterNot { it.wallpaperUri in _state.value.selectedWallpapers }
80-
val foldersRemoved = _state.value.folders.filterNot { it.folderUri in _state.value.selectedFolders }
81-
_state.update { it.copy(
82-
wallpapers = wallpapersRemoved,
83-
folders = foldersRemoved
84-
) }
85-
updateIsEmpty()
77+
_state.update {
78+
val wallpapersRemoved = it.wallpapers.filterNot { it.wallpaperUri in _state.value.selectedWallpapers }
79+
val foldersRemoved = it.folders.filterNot { it.folderUri in _state.value.selectedFolders }
80+
it.copy(
81+
wallpapers = wallpapersRemoved,
82+
folders = foldersRemoved,
83+
isEmpty = wallpapersRemoved.isEmpty() && foldersRemoved.isEmpty()
84+
) }
8685
}
8786
}
8887
is AddAlbumEvent.SetAlbumName -> {
@@ -97,18 +96,21 @@ class AddAlbumViewModel @Inject constructor(
9796
is AddAlbumEvent.ReflectAlbumName -> {
9897
if (event.newAlbumName != _state.value.initialAlbumName) {
9998
viewModelScope.launch {
100-
_state.update { it.copy(
101-
initialAlbumName = event.newAlbumName,
102-
displayedAlbumName = event.newAlbumName,
103-
coverUri = it.coverUri,
104-
wallpapers = it.wallpapers.map { wallpaper ->
99+
_state.update {
100+
val wallpapers = it.wallpapers.map { wallpaper ->
105101
wallpaper.copy(initialAlbumName = event.newAlbumName)
106-
},
107-
folders = it.folders.map { folder ->
102+
}
103+
val folders = it.folders.map { folder ->
108104
folder.copy(initialAlbumName = event.newAlbumName)
109-
},
110-
) }
111-
updateIsEmpty()
105+
}
106+
it.copy(
107+
initialAlbumName = event.newAlbumName,
108+
displayedAlbumName = event.newAlbumName,
109+
coverUri = it.coverUri,
110+
wallpapers = wallpapers,
111+
folders = folders,
112+
isEmpty = wallpapers.isEmpty() && folders.isEmpty()
113+
) }
112114
}
113115
}
114116
}
@@ -167,9 +169,9 @@ class AddAlbumViewModel @Inject constructor(
167169
_state.update { it.copy(
168170
selectedFolders = _state.value.folders.map { folder -> folder.folderUri },
169171
selectedWallpapers = _state.value.wallpapers.map { wallpaper -> wallpaper.wallpaperUri },
170-
selectedCount = it.folders.size + it.wallpapers.size
172+
selectedCount = it.folders.size + it.wallpapers.size,
173+
allSelected = true
171174
) }
172-
updateAllSelected()
173175
}
174176
}
175177
}
@@ -186,44 +188,53 @@ class AddAlbumViewModel @Inject constructor(
186188
is AddAlbumEvent.SelectFolder -> {
187189
viewModelScope.launch {
188190
if (!_state.value.selectedFolders.any { it == event.directoryUri }) {
189-
_state.update { it.copy(
190-
selectedFolders = it.selectedFolders.plus(event.directoryUri),
191-
selectedCount = it.selectedCount + 1
192-
) }
193-
updateAllSelected()
191+
_state.update {
192+
val folders = it.selectedFolders.plus(event.directoryUri)
193+
it.copy(
194+
selectedFolders = folders,
195+
selectedCount = it.selectedCount + 1,
196+
allSelected = folders.size + it.selectedWallpapers.size >= it.wallpapers.size + it.folders.size
197+
) }
194198
}
195199
}
196200
}
197201
is AddAlbumEvent.SelectWallpaper -> {
198202
viewModelScope.launch {
199203
if (!_state.value.selectedWallpapers.any { it == event.wallpaperUri }) {
200-
_state.update { it.copy(
201-
selectedWallpapers = it.selectedWallpapers.plus(event.wallpaperUri),
202-
selectedCount = it.selectedCount + 1
203-
) }
204-
updateAllSelected()
204+
_state.update {
205+
val wallpapers = it.selectedWallpapers.plus(event.wallpaperUri)
206+
it.copy(
207+
selectedWallpapers = wallpapers,
208+
selectedCount = it.selectedCount + 1,
209+
allSelected = it.selectedFolders.size + wallpapers.size >= it.wallpapers.size + it.folders.size
210+
) }
205211
}
206212
}
207213
}
208214
is AddAlbumEvent.RemoveFolderFromSelection -> {
209215
viewModelScope.launch {
210216
if (_state.value.selectedFolders.find { it == event.directoryUri } != null ) {
211-
_state.update { it.copy(
212-
selectedFolders = it.selectedFolders.minus(event.directoryUri),
213-
selectedCount = it.selectedCount - 1
214-
) }
215-
updateAllSelected()
217+
_state.update {
218+
val folders = it.selectedFolders.minus(event.directoryUri)
219+
it.copy(
220+
selectedFolders = folders,
221+
selectedCount = it.selectedCount - 1,
222+
allSelected = folders.size + it.selectedWallpapers.size >= it.wallpapers.size + it.folders.size
223+
224+
) }
216225
}
217226
}
218227
}
219228
is AddAlbumEvent.RemoveWallpaperFromSelection -> {
220229
viewModelScope.launch {
221230
if (_state.value.selectedWallpapers.find { it == event.wallpaperUri } != null ) {
222-
_state.update { it.copy(
223-
selectedWallpapers = it.selectedWallpapers.minus(event.wallpaperUri),
224-
selectedCount = it.selectedCount - 1
225-
) }
226-
updateAllSelected()
231+
_state.update {
232+
val wallpapers = it.selectedWallpapers.minus(event.wallpaperUri)
233+
it.copy(
234+
selectedWallpapers = wallpapers,
235+
selectedCount = it.selectedCount - 1,
236+
allSelected = it.selectedFolders.size + wallpapers.size >= it.wallpapers.size + it.folders.size
237+
) }
227238
}
228239
}
229240
}
@@ -246,22 +257,6 @@ class AddAlbumViewModel @Inject constructor(
246257
}
247258
}
248259

249-
private fun updateIsEmpty() {
250-
viewModelScope.launch {
251-
_state.update { it.copy(
252-
isEmpty = it.wallpapers.isEmpty() && it.folders.isEmpty()
253-
) }
254-
}
255-
}
256-
257-
private fun updateAllSelected() {
258-
viewModelScope.launch {
259-
_state.update { it.copy(
260-
allSelected = it.selectedFolders.size + it.selectedWallpapers.size >= it.wallpapers.size + it.folders.size
261-
) }
262-
}
263-
}
264-
265260
private fun getWallpaperFromFolder(folderUri: String, context: Context): List<String> {
266261
val folderDocumentFile = DocumentFileCompat.fromTreeUri(context, folderUri.toUri())
267262
return listFilesRecursive(folderDocumentFile, context)

app/src/main/java/com/anthonyla/paperize/feature/wallpaper/presentation/add_album_screen/components/DeleteImagesAlertDialog.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,17 @@ fun DeleteImagesAlertDialog(
2222
icon = {
2323
Icon(Icons.Outlined.Delete, contentDescription = stringResource(R.string.delete_confirmation))
2424
},
25-
title = { Text(text = "Delete these?") },
26-
text = { Text(text = "Are you sure you want to delete these wallpapers?") },
25+
title = { Text(text = stringResource(R.string.delete_these)) },
26+
text = { Text(text = stringResource(R.string.are_you_sure_you_want_to_delete_these_wallpapers)) },
2727
onDismissRequest = { onDismissRequest() },
2828
confirmButton = {
2929
TextButton(onClick = { onConfirmation() }) {
30-
Text("Confirm")
30+
Text(stringResource(R.string.confirm))
3131
}
3232
},
3333
dismissButton = {
3434
TextButton(onClick = { onDismissRequest() }) {
35-
Text("Cancel")
35+
Text(stringResource(R.string.cancel))
3636
}
3737
}
3838
)

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

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package com.anthonyla.paperize.feature.wallpaper.presentation.album_view_screen
33

44
import android.app.Application
55
import android.content.Context
6-
import android.webkit.MimeTypeMap
76
import androidx.core.net.toUri
87
import androidx.lifecycle.AndroidViewModel
98
import androidx.lifecycle.viewModelScope
@@ -39,10 +38,10 @@ class AlbumViewScreenViewModel @Inject constructor(
3938
event.albumsWithWallpaper.let { album ->
4039
val folders = album.folders.filter { _state.value.selectedFolders.contains(it.folderUri)}
4140
val wallpapers = album.wallpapers.filter { _state.value.selectedWallpapers.contains(it.wallpaperUri)}
42-
val doesContainCover = wallpapers.any { it.wallpaperUri == album.album.coverUri }
41+
val containsCoverUri = wallpapers.any { it.wallpaperUri == album.album.coverUri }
4342
repository.deleteFolderList(folders)
4443
repository.deleteWallpaperList(wallpapers)
45-
if (doesContainCover) {
44+
if (containsCoverUri) {
4645
repository.updateAlbum(album.album.copy(coverUri = null))
4746
}
4847
}
@@ -52,15 +51,15 @@ class AlbumViewScreenViewModel @Inject constructor(
5251
viewModelScope.launch {
5352
event.albumsWithWallpaper.let { album ->
5453
if (!_state.value.allSelected) {
55-
_state.update { state ->
56-
state.copy(
54+
_state.update { it ->
55+
it.copy(
5756
selectedFolders = album.folders.map { it.folderUri },
5857
selectedWallpapers = album.wallpapers.map { it.wallpaperUri },
5958
selectedCount = album.folders.size + album.wallpapers.size,
60-
maxSize = album.folders.size + album.wallpapers.size
59+
maxSize = album.folders.size + album.wallpapers.size,
60+
allSelected = true
6161
)
6262
}
63-
updateAllSelected()
6463
}
6564
}
6665
}
@@ -83,12 +82,13 @@ class AlbumViewScreenViewModel @Inject constructor(
8382
viewModelScope.launch {
8483
if (!_state.value.selectedFolders.any { it == event.directoryUri }) {
8584
_state.update {
85+
val folders = it.selectedFolders.plus(event.directoryUri)
8686
it.copy(
87-
selectedFolders = it.selectedFolders.plus(event.directoryUri),
88-
selectedCount = it.selectedCount + 1
87+
selectedFolders = folders,
88+
selectedCount = it.selectedCount + 1,
89+
allSelected = folders.size + it.selectedWallpapers.size >= it.maxSize
8990
)
9091
}
91-
updateAllSelected()
9292
}
9393
}
9494
}
@@ -97,12 +97,13 @@ class AlbumViewScreenViewModel @Inject constructor(
9797
viewModelScope.launch {
9898
if (!_state.value.selectedWallpapers.any { it == event.wallpaperUri }) {
9999
_state.update {
100+
val wallpapers = it.selectedWallpapers.plus(event.wallpaperUri)
100101
it.copy(
101102
selectedWallpapers = it.selectedWallpapers.plus(event.wallpaperUri),
102-
selectedCount = it.selectedCount + 1
103+
selectedCount = it.selectedCount + 1,
104+
allSelected = it.selectedFolders.size + wallpapers.size >= it.maxSize
103105
)
104106
}
105-
updateAllSelected()
106107
}
107108
}
108109
}
@@ -111,12 +112,13 @@ class AlbumViewScreenViewModel @Inject constructor(
111112
viewModelScope.launch {
112113
if (_state.value.selectedFolders.find { it == event.directoryUri } != null) {
113114
_state.update {
115+
val folders = it.selectedFolders.minus(event.directoryUri)
114116
it.copy(
115-
selectedFolders = it.selectedFolders.minus(event.directoryUri),
116-
selectedCount = it.selectedCount - 1
117+
selectedFolders = folders,
118+
selectedCount = it.selectedCount - 1,
119+
allSelected = folders.size + it.selectedWallpapers.size >= it.maxSize
117120
)
118121
}
119-
updateAllSelected()
120122
}
121123
}
122124
}
@@ -125,12 +127,13 @@ class AlbumViewScreenViewModel @Inject constructor(
125127
viewModelScope.launch {
126128
if (_state.value.selectedWallpapers.find { it == event.wallpaperUri } != null) {
127129
_state.update {
130+
val wallpapers = it.selectedWallpapers.minus(event.wallpaperUri)
128131
it.copy(
129-
selectedWallpapers = it.selectedWallpapers.minus(event.wallpaperUri),
130-
selectedCount = it.selectedCount - 1
132+
selectedWallpapers = wallpapers,
133+
selectedCount = it.selectedCount - 1,
134+
allSelected = it.selectedFolders.size + wallpapers.size >= it.maxSize
131135
)
132136
}
133-
updateAllSelected()
134137
}
135138
}
136139
}
@@ -161,22 +164,22 @@ class AlbumViewScreenViewModel @Inject constructor(
161164

162165
is AlbumViewEvent.AddWallpapers -> {
163166
viewModelScope.launch {
164-
val newWallpaperUris = event.wallpaperUris.filterNot { it in event.album.wallpapers.map { wallpaper -> wallpaper.wallpaperUri } }
165-
val newWallpapers = newWallpaperUris.map { uri ->
167+
val wallpaperUris = event.wallpaperUris.filterNot { it in event.album.wallpapers.map { wallpaper -> wallpaper.wallpaperUri } }
168+
val wallpapers = wallpaperUris.map { uri ->
166169
Wallpaper(
167170
initialAlbumName = event.album.album.initialAlbumName,
168171
wallpaperUri = uri,
169172
key = uri.hashCode() + event.album.album.initialAlbumName.hashCode(),
170173
)
171174
}
172-
repository.upsertWallpaperList(newWallpapers)
175+
repository.upsertWallpaperList(wallpapers)
173176
_state.update {
174177
it.copy(
175178
selectedFolders = emptyList(),
176179
selectedWallpapers = emptyList(),
177180
allSelected = false,
178181
selectedCount = 0,
179-
maxSize = _state.value.maxSize + newWallpapers.size
182+
maxSize = it.maxSize + wallpapers.size
180183
)
181184
}
182185
}
@@ -203,7 +206,7 @@ class AlbumViewScreenViewModel @Inject constructor(
203206
selectedWallpapers = emptyList(),
204207
allSelected = false,
205208
selectedCount = 0,
206-
maxSize = _state.value.maxSize + 1
209+
maxSize = it.maxSize + 1
207210
)
208211
}
209212
}
@@ -212,16 +215,6 @@ class AlbumViewScreenViewModel @Inject constructor(
212215
}
213216
}
214217

215-
private fun updateAllSelected() {
216-
viewModelScope.launch {
217-
_state.update {
218-
it.copy(
219-
allSelected = it.selectedFolders.size + it.selectedWallpapers.size >= _state.value.maxSize
220-
)
221-
}
222-
}
223-
}
224-
225218
private fun getWallpaperFromFolder(folderUri: String, context: Context): List<String> {
226219
val folderDocumentFile = DocumentFileCompat.fromTreeUri(context, folderUri.toUri())
227220
return listFilesRecursive(folderDocumentFile, context)
@@ -233,9 +226,8 @@ class AlbumViewScreenViewModel @Inject constructor(
233226
if (file.isDirectory()) {
234227
files.addAll(listFilesRecursive(file, context))
235228
} else {
236-
val extension = MimeTypeMap.getFileExtensionFromUrl(file.uri.toString())
237-
val allowedExtensions = listOf("jpg", "png", "heif", "webp")
238-
if (extension in allowedExtensions) {
229+
val allowedExtensions = listOf("jpg", "jpeg", "png", "heif", "webp", "JPG", "JPEG", "PNG", "HEIF", "WEBP")
230+
if (file.extension in allowedExtensions) {
239231
files.add(file.uri.toString())
240232
}
241233
}

0 commit comments

Comments
 (0)