Skip to content

Commit a7d23a7

Browse files
committed
Being able to exclude albums/assets from the Seasonal/Random/Recent/Photos views/screensavers
1 parent 34cd2b5 commit a7d23a7

File tree

6 files changed

+87
-28
lines changed

6 files changed

+87
-28
lines changed

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ android {
3030
applicationId "nl.giejay.android.tv.immich"
3131
minSdkVersion 24
3232
targetSdkVersion 35
33-
versionCode 84
34-
versionName "3.2.0"
33+
versionCode 85
34+
versionName "3.3.0"
3535

3636
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
3737
testOptions.unitTests.includeAndroidResources = true

app/src/main/java/nl/giejay/android/tv/immich/album/AlbumFragment.kt

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,32 +11,51 @@ import nl.giejay.android.tv.immich.card.Card
1111
import nl.giejay.android.tv.immich.home.HomeFragmentDirections
1212
import nl.giejay.android.tv.immich.shared.fragment.VerticalCardGridFragment
1313
import nl.giejay.android.tv.immich.shared.prefs.ALBUMS_SORTING
14-
import nl.giejay.android.tv.immich.shared.prefs.LiveSharedPreferences
14+
import nl.giejay.android.tv.immich.shared.prefs.EXCLUDE_ASSETS_IN_ALBUM
1515
import nl.giejay.android.tv.immich.shared.prefs.PreferenceManager
1616
import nl.giejay.android.tv.immich.shared.prefs.SCREENSAVER_ALBUMS
17+
import nl.giejay.android.tv.immich.shared.prefs.StringSetPref
18+
import nl.giejay.android.tv.immich.shared.prefs.ViewPrefScreen
1719
import timber.log.Timber
1820

21+
enum class SelectionType {
22+
SET_SCREENSAVER,
23+
EXCLUDED_ALBUMS,
24+
}
25+
1926
class AlbumFragment : VerticalCardGridFragment<Album>() {
27+
private lateinit var selectionTypeKey: StringSetPref
28+
private val selectionType: SelectionType
29+
get() = arguments?.getString("selectionType")?.let { SelectionType.valueOf(it) } ?: SelectionType.SET_SCREENSAVER
2030

2131
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
2232
super.onViewCreated(view, savedInstanceState)
33+
selectionTypeKey = when (selectionType) {
34+
SelectionType.SET_SCREENSAVER -> {
35+
SCREENSAVER_ALBUMS
36+
}
37+
38+
SelectionType.EXCLUDED_ALBUMS -> {
39+
EXCLUDE_ASSETS_IN_ALBUM
40+
}
41+
}
2342
PreferenceManager.subscribe(ALBUMS_SORTING) {
2443
resortItems()
2544
}
2645
}
2746

2847
override fun sortItems(items: List<Album>): List<Album> {
29-
return if (selectionMode) {
48+
if(selectionMode) {
3049
val sorted = items.sortedWith(PreferenceManager.get(ALBUMS_SORTING).sort)
31-
val selected = sorted.filter { PreferenceManager.get(SCREENSAVER_ALBUMS).contains(it.id) }
50+
val selected = sorted.filter { PreferenceManager.get(selectionTypeKey).contains(it.id) }
3251
val unselected = sorted.filter { !selected.contains(it) }
33-
selected + unselected
52+
return selected + unselected
3453
} else {
3554
try {
36-
items.sortedWith(PreferenceManager.get(ALBUMS_SORTING).sort)
55+
return items.sortedWith(PreferenceManager.get(ALBUMS_SORTING).sort)
3756
} catch (e: IllegalArgumentException) {
3857
Timber.e(e, "Could not sort using sorting order: " + PreferenceManager.get(ALBUMS_SORTING).toString())
39-
items
58+
return items
4059
}
4160
}
4261
}
@@ -54,11 +73,11 @@ class AlbumFragment : VerticalCardGridFragment<Album>() {
5473
}
5574

5675
override fun onItemSelected(card: Card, indexOf: Int) {
57-
val currentAlbums = PreferenceManager.get(SCREENSAVER_ALBUMS)
76+
val currentAlbums = PreferenceManager.get(selectionTypeKey)
5877
if (card.selected) {
59-
PreferenceManager.save(SCREENSAVER_ALBUMS, currentAlbums + card.id)
78+
PreferenceManager.save(selectionTypeKey, currentAlbums + card.id)
6079
} else {
61-
PreferenceManager.save(SCREENSAVER_ALBUMS, currentAlbums - card.id)
80+
PreferenceManager.save(selectionTypeKey, currentAlbums - card.id)
6281
}
6382
}
6483

@@ -88,7 +107,16 @@ class AlbumFragment : VerticalCardGridFragment<Album>() {
88107
a.id,
89108
ApiUtil.getThumbnailUrl(a.albumThumbnailAssetId, "thumbnail"),
90109
ApiUtil.getFileUrl(a.albumThumbnailAssetId, "IMAGE"),
91-
if (selectionMode) PreferenceManager.get(SCREENSAVER_ALBUMS).contains(a.id) else false
110+
if (selectionMode) PreferenceManager.get(selectionTypeKey).contains(a.id) else false
92111
)
93112
}
113+
114+
override fun onDestroyView() {
115+
super.onDestroyView()
116+
if(this.selectionMode){
117+
findNavController().navigate(
118+
HomeFragmentDirections.actionGlobalToSettingsDialog(ViewPrefScreen.key)
119+
)
120+
}
121+
}
94122
}

app/src/main/java/nl/giejay/android/tv/immich/api/ApiClient.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import nl.giejay.android.tv.immich.api.model.Person
1212
import nl.giejay.android.tv.immich.api.model.SearchRequest
1313
import nl.giejay.android.tv.immich.api.service.ApiService
1414
import nl.giejay.android.tv.immich.api.util.ApiUtil.executeAPICall
15+
import nl.giejay.android.tv.immich.shared.prefs.EXCLUDE_ASSETS_IN_ALBUM
1516
import nl.giejay.android.tv.immich.shared.prefs.PhotosOrder
1617
import nl.giejay.android.tv.immich.shared.prefs.PreferenceManager
1718
import nl.giejay.android.tv.immich.shared.prefs.RECENT_ASSETS_MONTHS_BACK
@@ -119,7 +120,15 @@ class ApiClient(private val config: ApiClientConfig) {
119120
executeAPICall(200) { service.randomAssets(searchRequest) }
120121
} else {
121122
executeAPICall(200) { service.listAssets(searchRequest) }.map { res -> res.assets.items }
122-
}).map { it.filter(excludeByTag()) }
123+
}).map { it.filter(excludeByTag()) }.map {
124+
val excludedAlbums = PreferenceManager.get(EXCLUDE_ASSETS_IN_ALBUM)
125+
if(excludedAlbums.isNotEmpty()){
126+
val excludedAssets = excludedAlbums.toList().flatMap { albumId -> listAssetsFromAlbum(albumId).getOrNull()?.assets ?: emptyList() }.map { it.id }
127+
it.filterNot { asset -> excludedAssets.contains(asset.id) }
128+
} else {
129+
it
130+
}
131+
}
123132
}
124133

125134
private fun excludeByTag() = { asset: Asset ->

app/src/main/java/nl/giejay/android/tv/immich/shared/prefs/Pref.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,15 +148,15 @@ sealed class StringPref(defaultValue: String, title: String, summary: String) :
148148
}
149149
}
150150

151-
sealed class StringSetPref(defaultValue: Set<String>, title: String, summary: String) : Pref<Set<String>, ListPreference, Set<String>>(defaultValue,
151+
sealed class StringSetPref(defaultValue: Set<String>, title: String, summary: String) : Pref<Set<String>, Preference, Set<String>>(defaultValue,
152152
title,
153153
summary) {
154154
override fun save(sharedPreferences: SharedPreferences, value: Set<String>) {
155155
sharedPreference.edit().putStringSet(key(), value).apply()
156156
}
157157

158-
override fun createPref(context: Context): ListPreference {
159-
return ListPreference(context)
158+
override fun createPref(context: Context): Preference {
159+
return Preference(context)
160160
}
161161
}
162162

app/src/main/java/nl/giejay/android/tv/immich/shared/prefs/Preferences.kt

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ import android.os.Build
88
import android.view.LayoutInflater
99
import android.view.View
1010
import android.widget.Toast
11+
import androidx.navigation.NavController
1112
import androidx.preference.Preference
1213
import nl.giejay.android.tv.immich.R
14+
import nl.giejay.android.tv.immich.album.SelectionType
1315
import nl.giejay.android.tv.immich.screensaver.ScreenSaverType
1416
import nl.giejay.android.tv.immich.settings.ScreenSaverSettingsFragmentDirections
1517
import nl.giejay.mediaslider.transformations.GlideTransformations
@@ -82,23 +84,24 @@ private fun intentAvailable(intent: Intent, context: Context): Boolean {
8284
return infos.isNotEmpty()
8385
}
8486

85-
data object SCREENSAVER_SET_ALBUMS : ActionPref("Set albums to show in screensaver", "Set albums to show in screensaver", { context, navController ->
86-
navController.navigate(
87-
ScreenSaverSettingsFragmentDirections.actionGlobalAlbumFragment(
88-
true
89-
)
90-
)
91-
true
92-
})
93-
9487
data object SCREENSAVER_INTERVAL : IntListPref(3, "Interval", "Interval of the screensaver", R.array.interval_titles, R.array.interval_values)
9588
data object SCREENSAVER_SHOW_MEDIA_COUNT : BooleanPref(true, "Show media count", "Show the number of total items and currently selected item")
9689
data object SCREENSAVER_SHOW_DESCRIPTION : BooleanPref(true, "Show description", "Show description of asset in screensaver")
9790
data object SCREENSAVER_SHOW_ALBUM_NAME : BooleanPref(true, "Show album name", "Show album name of asset in screensaver")
9891
data object SCREENSAVER_SHOW_DATE : BooleanPref(true, "Show date", "Show date of asset in screensaver")
9992
data object SCREENSAVER_SHOW_CLOCK : BooleanPref(true, "Show clock", "Show clock in screensaver")
10093
data object SCREENSAVER_ANIMATE_ASSET_SLIDE : BooleanPref(true, "Slide the new asset in", "Slide the new asset in when transitioning")
101-
data object SCREENSAVER_ALBUMS : StringSetPref(mutableSetOf(), "Set albums to show in screensaver", "Set albums to show in screensaver")
94+
data object SCREENSAVER_ALBUMS : StringSetPref(mutableSetOf(), "Set albums to show in screensaver", "Set albums to show in screensaver"){
95+
override fun onClick(context: Context, controller: NavController): Boolean {
96+
controller.navigate(
97+
ScreenSaverSettingsFragmentDirections.actionGlobalAlbumFragment(
98+
true,
99+
SelectionType.SET_SCREENSAVER.toString()
100+
)
101+
)
102+
return true
103+
}
104+
}
102105
data object SCREENSAVER_INCLUDE_VIDEOS : BooleanPref(false, "Include videos", "Include videos in screensaver")
103106
data object SCREENSAVER_PLAY_SOUND : BooleanPref(false, "Play sound", "Play sound of videos during screensaver")
104107
data object SCREENSAVER_TYPE : EnumByTitlePref<ScreenSaverType>(ScreenSaverType.RECENT,
@@ -212,6 +215,9 @@ data object ALL_ASSETS_SORTING : EnumByTitlePref<PhotosOrder>(PhotosOrder.NEWEST
212215
data object DEBUG_MODE : BooleanPref(false, "Enable debug mode", "Enable this if you are experiencing issues.")
213216
data object LOAD_BACKGROUND_IMAGE : BooleanPref(true, "Load selected item as background", "Load the currently selected image/album as the background")
214217
data object HIDDEN_HOME_ITEMS : StringSetPref(emptySet(), "", "")
218+
data object USER_ID : NotUserEditableStringPref("User ID", "Your user id, needed for debugging")
219+
220+
// seasonal/random/recents
215221
data object SIMILAR_ASSETS_YEARS_BACK : IntListPref(10,
216222
"Seasonal photos years back",
217223
"How many years to go back when selecting seasonal photos",
@@ -230,7 +236,18 @@ data object RECENT_ASSETS_MONTHS_BACK : IntListPref(5,
230236
R.array.recent_assets_months_back,
231237
R.array.recent_assets_months_back)
232238

233-
data object USER_ID : NotUserEditableStringPref("User ID", "Your user id, needed for debugging")
239+
data object EXCLUDE_ASSETS_IN_ALBUM: StringSetPref(emptySet(), "Excluded albums", "Exclude assets in specific albums for random/seasonal view"){
240+
override fun onClick(context: Context, controller: NavController): Boolean {
241+
controller.navigate(
242+
ScreenSaverSettingsFragmentDirections.actionGlobalAlbumFragment(
243+
true,
244+
SelectionType.EXCLUDED_ALBUMS.toString()
245+
246+
)
247+
)
248+
return true
249+
}
250+
}
234251

235252
// Building the view
236253
data object ViewPrefScreen : PrefScreen("View Settings", "view",
@@ -250,6 +267,7 @@ data object ViewPrefScreen : PrefScreen("View Settings", "view",
250267
SIMILAR_ASSETS_YEARS_BACK,
251268
SIMILAR_ASSETS_PERIOD_DAYS,
252269
RECENT_ASSETS_MONTHS_BACK,
270+
EXCLUDE_ASSETS_IN_ALBUM,
253271
LOAD_BACKGROUND_IMAGE))
254272
)
255273
)
@@ -261,7 +279,7 @@ data object ScreensaverPrefScreen : PrefScreen("Screensaver Settings", "screensa
261279
SCREENSAVER_SET,
262280
SCREENSAVER_INTERVAL,
263281
SCREENSAVER_TYPE,
264-
SCREENSAVER_SET_ALBUMS,
282+
SCREENSAVER_ALBUMS,
265283
SCREENSAVER_SHOW_DESCRIPTION,
266284
SCREENSAVER_SHOW_ALBUM_NAME,
267285
SCREENSAVER_SHOW_DATE,

app/src/main/res/navigation/nav_graph.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,10 @@
172172
<argument
173173
android:name="selectionMode"
174174
app:argType="boolean" />
175+
176+
<argument
177+
android:name="selectionType"
178+
app:argType="string" />
175179
</fragment>
176180

177181
<fragment

0 commit comments

Comments
 (0)