Skip to content

Commit 34cd2b5

Browse files
committed
Add sort by asset count of album
Extract the title of options from the Enum instead of XML
1 parent d77fb9c commit 34cd2b5

File tree

9 files changed

+153
-43
lines changed

9 files changed

+153
-43
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 83
34-
versionName "3.1.1"
33+
versionCode 84
34+
versionName "3.2.0"
3535

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

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ data class Album(
99
val albumThumbnailAssetId: String?,
1010
val updatedAt: Date,
1111
val endDate: Date?,
12+
val assetCount: Int
1213
)

app/src/main/java/nl/giejay/android/tv/immich/castconnect/CastMediaLoadCommandCallback.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@ class CastMediaLoadCommandCallback(
4747
mediaLoadRequestData: MediaLoadRequestData
4848
): Task<MediaLoadRequestData> {
4949
return Tasks.call {
50-
var videoToPlay = Album("", "sdf", "sdf", "", Date(), Date())
51-
if (videoToPlay != null) {
52-
onLoaded(videoToPlay, mediaLoadRequestData)
53-
} else {
54-
Timber.w("Failed to convert cast load request to application-specific video")
55-
}
50+
// var videoToPlay = Album("", "sdf", "sdf", "", Date(), Date())
51+
// if (videoToPlay != null) {
52+
// onLoaded(videoToPlay, mediaLoadRequestData)
53+
// } else {
54+
// Timber.w("Failed to convert cast load request to application-specific video")
55+
// }
5656

5757
mediaLoadRequestData
5858
}
Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,26 @@
11
package nl.giejay.android.tv.immich.screensaver
22

3-
enum class ScreenSaverType {
4-
ALBUMS, RANDOM, RECENT, SIMILAR_TIME_PERIOD
3+
import nl.giejay.android.tv.immich.shared.prefs.EnumWithTitle
4+
5+
enum class ScreenSaverType : EnumWithTitle {
6+
ALBUMS {
7+
override fun getTitle(): String {
8+
return "Albums"
9+
}
10+
},
11+
RANDOM {
12+
override fun getTitle(): String {
13+
return "Random"
14+
}
15+
},
16+
RECENT {
17+
override fun getTitle(): String {
18+
return "Recent"
19+
}
20+
},
21+
SIMILAR_TIME_PERIOD {
22+
override fun getTitle(): String {
23+
return "Seasonal"
24+
}
25+
}
526
}

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

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,35 @@ package nl.giejay.android.tv.immich.shared.prefs
22

33
import nl.giejay.android.tv.immich.api.model.Album
44

5-
enum class AlbumsOrder(val sort: Comparator<Album>) {
6-
ALPHABETICALLY_A_Z(compareBy{it.albumName}),
7-
ALPHABETICALLY_Z_A(ALPHABETICALLY_A_Z.sort.reversed()),
8-
LAST_UPDATED(compareByDescending{it.endDate}),
9-
LEAST_UPDATED(LAST_UPDATED.sort.reversed());
5+
enum class AlbumsOrder(val sort: Comparator<Album>) : EnumWithTitle {
6+
ALPHABETICALLY_A_Z(compareBy { it.albumName }) {
7+
override fun getTitle(): String {
8+
return "Alphabetically (A-Z)";
9+
}
10+
},
11+
ALPHABETICALLY_Z_A(ALPHABETICALLY_A_Z.sort.reversed()) {
12+
override fun getTitle(): String {
13+
return "Alphabetically (Z-A)"
14+
}
15+
},
16+
LAST_UPDATED(compareByDescending { it.endDate }) {
17+
override fun getTitle(): String {
18+
return "Last updated"
19+
}
20+
},
21+
LEAST_UPDATED(LAST_UPDATED.sort.reversed()) {
22+
override fun getTitle(): String {
23+
return "Least updated"
24+
}
25+
},
26+
ASSET_COUNT(compareBy<Album> { it.assetCount }.reversed()) {
27+
override fun getTitle(): String {
28+
return "Asset count"
29+
}
30+
};
1031

1132
companion object {
12-
fun valueOfSafe(name: String, default: AlbumsOrder): AlbumsOrder{
33+
fun valueOfSafe(name: String, default: AlbumsOrder): AlbumsOrder {
1334
return entries.find { it.toString() == name } ?: default
1435
}
1536
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package nl.giejay.android.tv.immich.shared.prefs
2+
3+
interface EnumWithTitle{
4+
fun getTitle(): String
5+
}

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

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,39 @@ package nl.giejay.android.tv.immich.shared.prefs
33
import nl.giejay.android.tv.immich.api.model.Asset
44
import nl.giejay.android.tv.immich.shared.util.Utils.compareToNullSafe
55

6-
enum class PhotosOrder(val sort: Comparator<Asset>) {
6+
enum class PhotosOrder(val sort: Comparator<Asset>): EnumWithTitle {
77
NEWEST_OLDEST(
88
{ a1, a2 ->
99
(a2.exifInfo?.dateTimeOriginal ?: a2.fileModifiedAt)?.compareToNullSafe(
1010
a1.exifInfo?.dateTimeOriginal ?: a1.fileModifiedAt
1111
) ?: 1
1212
}
13-
),
13+
) {
14+
override fun getTitle(): String {
15+
return "Newest - Oldest"
16+
}
17+
},
1418
OLDEST_NEWEST(
1519
{ a1, a2 ->
1620
(a1.exifInfo?.dateTimeOriginal ?: a1.fileModifiedAt)?.compareToNullSafe(
1721
a2.exifInfo?.dateTimeOriginal ?: a2.fileModifiedAt
1822
) ?: 1
1923
}
20-
),
21-
ALPHABETICALLY_A_Z({ a1, a2 -> a1.deviceAssetId?.compareToNullSafe(a2.deviceAssetId) ?: 1 }),
22-
ALPHABETICALLY_Z_A({ a2, a1 -> a1.deviceAssetId?.compareToNullSafe(a2.deviceAssetId) ?: 1 });
24+
) {
25+
override fun getTitle(): String {
26+
return "Oldest - Newest"
27+
}
28+
},
29+
ALPHABETICALLY_A_Z({ a1, a2 -> a1.deviceAssetId?.compareToNullSafe(a2.deviceAssetId) ?: 1 }) {
30+
override fun getTitle(): String {
31+
return "Alphabetically (A-Z)"
32+
}
33+
},
34+
ALPHABETICALLY_Z_A({ a2, a1 -> a1.deviceAssetId?.compareToNullSafe(a2.deviceAssetId) ?: 1 }) {
35+
override fun getTitle(): String {
36+
return "Alphabetically (Z-A)"
37+
}
38+
};
2339

2440
companion object {
2541
fun valueOfSafe(name: String, default: PhotosOrder): PhotosOrder{

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

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ import androidx.preference.SeekBarPreference
1212
import nl.giejay.android.tv.immich.shared.prefs.PreferenceManager.sharedPreference
1313

1414

15-
sealed class PrefScreen(val title: String, val key: String, val children: List<PrefCategory>, val onViewCreated: (PreferenceManager) -> Unit = {}){
15+
sealed class PrefScreen(val title: String, val key: String, val children: List<PrefCategory>, val onViewCreated: (PreferenceManager) -> Unit = {}) {
1616
fun findByKey(key: String): Pref<*, *, *>? {
1717
return children.firstNotNullOfOrNull { it.findByKey(key) }
1818
}
1919
}
2020

21-
data class PrefCategory(val title: String, val children: List<Pref<*, *, *>>){
21+
data class PrefCategory(val title: String, val children: List<Pref<*, *, *>>) {
2222
fun findByKey(key: String): Pref<*, *, *>? {
2323
return children.find { it.key() == key }
2424
}
@@ -52,7 +52,7 @@ sealed class Pref<T, PREF : Preference, PREFTYPE>(val defaultValue: T, val title
5252
abstract fun createPref(context: Context): PREF
5353
}
5454

55-
sealed class NotUserEditableStringPref(title: String, summary: String): Pref<String, Preference, String>("", title, summary){
55+
sealed class NotUserEditableStringPref(title: String, summary: String) : Pref<String, Preference, String>("", title, summary) {
5656
override fun save(sharedPreferences: SharedPreferences, value: String) {
5757
sharedPreference.edit().putString(key(), value).apply()
5858
}
@@ -62,7 +62,9 @@ sealed class NotUserEditableStringPref(title: String, summary: String): Pref<Str
6262
}
6363
}
6464

65-
sealed class ActionPref(title: String, summary: String, val onClick: (Context, NavController) -> Boolean): Pref<String, Preference, String>("", title, summary){
65+
sealed class ActionPref(title: String, summary: String, val onClick: (Context, NavController) -> Boolean) : Pref<String, Preference, String>("",
66+
title,
67+
summary) {
6668
override fun save(sharedPreferences: SharedPreferences, value: String) {
6769

6870
}
@@ -78,8 +80,9 @@ sealed class ActionPref(title: String, summary: String, val onClick: (Context, N
7880
}
7981
}
8082

81-
sealed class EnumPref<T : Enum<T>>(defaultValue: T, title: String, summary: String,
82-
val titlesResourceId: Int, val valuesResourceId: Int) : Pref<T, ListPreference, String>(defaultValue, title, summary) {
83+
sealed class EnumPref<T>(defaultValue: T, title: String, summary: String,
84+
val titlesResourceId: Int, val valuesResourceId: Int) : Pref<T, ListPreference, String>
85+
(defaultValue, title, summary) where T : Enum<T> {
8386
override fun save(sharedPreferences: SharedPreferences, value: T) {
8487
sharedPreferences.edit().putString(key(), value.toString()).apply()
8588
}
@@ -99,7 +102,31 @@ sealed class EnumPref<T : Enum<T>>(defaultValue: T, title: String, summary: Stri
99102
}
100103
}
101104

102-
sealed class BooleanPref(defaultValue: Boolean, title: String, summary: String) : Pref<Boolean, CheckBoxPreference, Boolean>(defaultValue, title, summary) {
105+
sealed class EnumByTitlePref<T>(defaultValue: T, title: String, summary: String) : Pref<T, ListPreference, String>(defaultValue, title, summary) where T : Enum<T>, T : EnumWithTitle {
106+
override fun save(sharedPreferences: SharedPreferences, value: T) {
107+
sharedPreferences.edit().putString(key(), value.toString()).apply()
108+
}
109+
110+
override fun toPrefValue(value: T): String {
111+
return value.toString()
112+
}
113+
114+
abstract override fun fromPrefValue(prefValue: String): T
115+
116+
abstract fun getEnumEntries(): Array<T>
117+
118+
override fun createPref(context: Context): ListPreference {
119+
val listPreference = ListPreference(context)
120+
listPreference.entries = getEnumEntries().map { it.getTitle() }.toTypedArray()
121+
listPreference.dialogTitle = summary
122+
listPreference.entryValues = getEnumEntries().map { it.toString() }.toTypedArray()
123+
return listPreference
124+
}
125+
}
126+
127+
sealed class BooleanPref(defaultValue: Boolean, title: String, summary: String) : Pref<Boolean, CheckBoxPreference, Boolean>(defaultValue,
128+
title,
129+
summary) {
103130
override fun save(sharedPreferences: SharedPreferences, value: Boolean) {
104131
sharedPreference.edit().putBoolean(key(), value).apply()
105132
}
@@ -109,7 +136,9 @@ sealed class BooleanPref(defaultValue: Boolean, title: String, summary: String)
109136
}
110137
}
111138

112-
sealed class StringPref(defaultValue: String, title: String, summary: String) : Pref<String, EditTextPreference, String>(defaultValue, title, summary) {
139+
sealed class StringPref(defaultValue: String, title: String, summary: String) : Pref<String, EditTextPreference, String>(defaultValue,
140+
title,
141+
summary) {
113142
override fun save(sharedPreferences: SharedPreferences, value: String) {
114143
sharedPreference.edit().putString(key(), value).apply()
115144
}

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

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -101,15 +101,17 @@ data object SCREENSAVER_ANIMATE_ASSET_SLIDE : BooleanPref(true, "Slide the new a
101101
data object SCREENSAVER_ALBUMS : StringSetPref(mutableSetOf(), "Set albums to show in screensaver", "Set albums to show in screensaver")
102102
data object SCREENSAVER_INCLUDE_VIDEOS : BooleanPref(false, "Include videos", "Include videos in screensaver")
103103
data object SCREENSAVER_PLAY_SOUND : BooleanPref(false, "Play sound", "Play sound of videos during screensaver")
104-
data object SCREENSAVER_TYPE : EnumPref<ScreenSaverType>(ScreenSaverType.RECENT,
104+
data object SCREENSAVER_TYPE : EnumByTitlePref<ScreenSaverType>(ScreenSaverType.RECENT,
105105
"Screensaver type",
106-
"What to show: albums, random, recent etc.",
107-
R.array.screensaver_type_values,
108-
R.array.screensaver_type_keys) {
106+
"What to show: albums, random, recent etc.") {
109107

110108
override fun fromPrefValue(prefValue: String): ScreenSaverType {
111109
return ScreenSaverType.valueOf(prefValue)
112110
}
111+
112+
override fun getEnumEntries(): Array<ScreenSaverType> {
113+
return ScreenSaverType.entries.toTypedArray()
114+
}
113115
}
114116

115117
// slider/viewer
@@ -153,42 +155,57 @@ data object SLIDER_GLIDE_TRANSFORMATION : EnumPref<GlideTransformations>(GlideTr
153155

154156

155157
// other
156-
data object ALBUMS_SORTING : EnumPref<AlbumsOrder>(AlbumsOrder.LAST_UPDATED,
158+
data object ALBUMS_SORTING : EnumByTitlePref<AlbumsOrder>(AlbumsOrder.LAST_UPDATED,
157159
"Albums",
158-
"Set the order in which albums should appear",
159-
R.array.albums_order,
160-
R.array.albums_order_keys) {
160+
"Set the order in which albums should appear") {
161+
161162
override fun fromPrefValue(prefValue: String): AlbumsOrder {
162163
return AlbumsOrder.valueOfSafe(prefValue, defaultValue)
163164
}
165+
166+
override fun getEnumEntries(): Array<AlbumsOrder> {
167+
return AlbumsOrder.entries.toTypedArray();
168+
}
164169
}
165170

166-
data object PHOTOS_SORTING : EnumPref<PhotosOrder>(PhotosOrder.OLDEST_NEWEST,
171+
data object PHOTOS_SORTING : EnumByTitlePref<PhotosOrder>(PhotosOrder.OLDEST_NEWEST,
167172
"Photos in albums",
168-
"Set the order in which photos should appear inside albums", R.array.photos_order, R.array.photos_order_keys) {
173+
"Set the order in which photos should appear inside albums") {
169174
override fun fromPrefValue(prefValue: String): PhotosOrder {
170175
return PhotosOrder.valueOfSafe(prefValue, defaultValue)
171176
}
177+
178+
override fun getEnumEntries(): Array<PhotosOrder> {
179+
return PhotosOrder.entries.toTypedArray()
180+
}
172181
}
173182

174-
data class PHOTOS_SORTING_FOR_SPECIFIC_ALBUM(val albumId: String) : EnumPref<PhotosOrder>(PreferenceManager.get(PHOTOS_SORTING),
183+
data class PHOTOS_SORTING_FOR_SPECIFIC_ALBUM(val albumId: String) : EnumByTitlePref<PhotosOrder>(PreferenceManager.get(PHOTOS_SORTING),
175184
"Photos in album $albumId",
176-
"Set the order in which photos should appear inside $albumId", R.array.photos_order, R.array.photos_order_keys) {
185+
"Set the order in which photos should appear inside $albumId") {
177186
override fun fromPrefValue(prefValue: String): PhotosOrder {
178187
return PhotosOrder.valueOfSafe(prefValue, defaultValue)
179188
}
180189

190+
override fun getEnumEntries(): Array<PhotosOrder> {
191+
return PhotosOrder.entries.toTypedArray()
192+
}
193+
181194
override fun key(): String {
182195
return "photos_sorting_${albumId}"
183196
}
184197
}
185198

186-
data object ALL_ASSETS_SORTING : EnumPref<PhotosOrder>(PhotosOrder.NEWEST_OLDEST,
199+
data object ALL_ASSETS_SORTING : EnumByTitlePref<PhotosOrder>(PhotosOrder.NEWEST_OLDEST,
187200
"Photos",
188-
"Set the order in which photos should appear in the Photos tab", R.array.all_assets_order, R.array.all_assets_order_keys) {
201+
"Set the order in which photos should appear in the Photos tab") {
189202
override fun fromPrefValue(prefValue: String): PhotosOrder {
190203
return PhotosOrder.valueOfSafe(prefValue, defaultValue)
191204
}
205+
206+
override fun getEnumEntries(): Array<PhotosOrder> {
207+
return PhotosOrder.entries.toTypedArray()
208+
}
192209
}
193210

194211
// other

0 commit comments

Comments
 (0)