Support source filter editing

The API for filter is undocumented on the Selfoss API reference, but does exist. We can now allow users setting and modifying filters inside the application.
This commit is contained in:
2025-04-12 23:58:12 +02:00
parent ceba58e98f
commit b1259fdc92
6 changed files with 34 additions and 7 deletions
@@ -65,6 +65,7 @@ class UpsertSourceActivity :
private fun initFields(items: Map<String, SelfossModel.Spout>) { private fun initFields(items: Map<String, SelfossModel.Spout>) {
binding.nameInput.setText(existingSource!!.title) binding.nameInput.setText(existingSource!!.title)
binding.tags.setText(existingSource!!.tags?.joinToString(", ")) binding.tags.setText(existingSource!!.tags?.joinToString(", "))
binding.filter.setText(existingSource!!.filter)
binding.sourceUri.setText(existingSource!!.params?.url) binding.sourceUri.setText(existingSource!!.params?.url)
binding.spoutsSpinner.setSelection(items.keys.indexOf(existingSource!!.spout)) binding.spoutsSpinner.setSelection(items.keys.indexOf(existingSource!!.spout))
binding.progress.visibility = View.GONE binding.progress.visibility = View.GONE
@@ -169,6 +170,7 @@ class UpsertSourceActivity :
url, url,
mSpoutsValue!!, mSpoutsValue!!,
binding.tags.text.toString(), binding.tags.text.toString(),
binding.filter.text.toString(),
) )
} else { } else {
repository.createSource( repository.createSource(
@@ -176,6 +178,7 @@ class UpsertSourceActivity :
url, url,
mSpoutsValue!!, mSpoutsValue!!,
binding.tags.text.toString(), binding.tags.text.toString(),
binding.filter.text.toString(),
) )
} }
if (successfullyAddedSource) { if (successfullyAddedSource) {
@@ -64,15 +64,28 @@
android:id="@+id/tags" android:id="@+id/tags"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:minHeight="48dp"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:autofillHints="false" android:autofillHints="false"
android:hint="@string/add_source_hint_tags" android:hint="@string/add_source_hint_tags"
android:inputType="text" android:inputType="text"
android:minHeight="48dp"
android:textColorHint="?android:textColorPrimary" android:textColorHint="?android:textColorPrimary"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/sourceUri" /> app:layout_constraintTop_toBottomOf="@+id/sourceUri" />
<EditText
android:id="@+id/filter"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:autofillHints="false"
android:hint="@string/add_source_hint_filter"
android:inputType="text"
android:minHeight="48dp"
android:textColorHint="?android:textColorPrimary"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tags" />
<Spinner <Spinner
android:id="@+id/spoutsSpinner" android:id="@+id/spoutsSpinner"
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -80,7 +93,7 @@
android:minHeight="48dp" android:minHeight="48dp"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tags" /> app:layout_constraintTop_toBottomOf="@+id/filter" />
<Button <Button
android:id="@+id/saveBtn" android:id="@+id/saveBtn"
@@ -17,6 +17,7 @@
<string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string> <string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string>
<string name="add_source_hint_url">"Link"</string> <string name="add_source_hint_url">"Link"</string>
<string name="add_source_hint_name">"Name"</string> <string name="add_source_hint_name">"Name"</string>
<string name="add_source_hint_filter">/Filter/</string>
<string name="add_source">"Add a source"</string> <string name="add_source">"Add a source"</string>
<string name="add_source_save">"Save"</string> <string name="add_source_save">"Save"</string>
<string name="wrong_infos">"Check your details again."</string> <string name="wrong_infos">"Check your details again."</string>
@@ -102,6 +102,7 @@ class SelfossModel {
override var error: String? = null, override var error: String? = null,
override var icon: String? = null, override var icon: String? = null,
var params: SourceParams? = null, var params: SourceParams? = null,
var filter: String? = null,
) : Source ) : Source
@Serializable @Serializable
@@ -368,6 +368,7 @@ class Repository(
url: String, url: String,
spout: String, spout: String,
tags: String, tags: String,
filter: String,
): Boolean { ): Boolean {
var response = false var response = false
if (connectivityService.isNetworkAvailable()) { if (connectivityService.isNetworkAvailable()) {
@@ -377,6 +378,7 @@ class Repository(
url, url,
spout, spout,
tags, tags,
filter,
).isSuccess == true ).isSuccess == true
} }
@@ -389,10 +391,11 @@ class Repository(
url: String, url: String,
spout: String, spout: String,
tags: String, tags: String,
filter: String,
): Boolean { ): Boolean {
var response = false var response = false
if (connectivityService.isNetworkAvailable()) { if (connectivityService.isNetworkAvailable()) {
response = api.updateSourceForVersion(id, title, url, spout, tags).isSuccess == true response = api.updateSourceForVersion(id, title, url, spout, tags, filter).isSuccess == true
} }
return response return response
@@ -638,12 +638,13 @@ class SelfossApi(
url: String, url: String,
spout: String, spout: String,
tags: String, tags: String,
filter: String,
): SuccessResponse = ): SuccessResponse =
maybeResponse( maybeResponse(
if (appSettingsService.getApiVersion() > 1) { if (appSettingsService.getApiVersion() > 1) {
createSource("tags[]", title, url, spout, tags) createSource("tags[]", title, url, spout, tags, filter)
} else { } else {
createSource("tags", title, url, spout, tags) createSource("tags", title, url, spout, tags, filter)
}, },
) )
@@ -653,6 +654,7 @@ class SelfossApi(
url: String, url: String,
spout: String, spout: String,
tags: String, tags: String,
filter: String,
): HttpResponse? = ): HttpResponse? =
client.tryToSubmitForm( client.tryToSubmitForm(
url = url("/source"), url = url("/source"),
@@ -665,6 +667,7 @@ class SelfossApi(
append("title", title) append("title", title)
append("url", url) append("url", url)
append("spout", spout) append("spout", spout)
append("filter", filter)
append(tagsParamName, tags) append(tagsParamName, tags)
}, },
block = { block = {
@@ -694,12 +697,13 @@ class SelfossApi(
url: String, url: String,
spout: String, spout: String,
tags: String, tags: String,
filter: String,
): SuccessResponse = ): SuccessResponse =
maybeResponse( maybeResponse(
if (appSettingsService.getApiVersion() > 1) { if (appSettingsService.getApiVersion() > 1) {
updateSource(id, "tags[]", title, url, spout, tags) updateSource(id, "tags[]", title, url, spout, tags, filter)
} else { } else {
updateSource(id, "tags", title, url, spout, tags) updateSource(id, "tags", title, url, spout, tags, filter)
}, },
) )
@@ -710,6 +714,7 @@ class SelfossApi(
url: String, url: String,
spout: String, spout: String,
tags: String, tags: String,
filter: String,
): HttpResponse? = ): HttpResponse? =
client.tryToSubmitForm( client.tryToSubmitForm(
url = url("/source/$id"), url = url("/source/$id"),
@@ -723,6 +728,7 @@ class SelfossApi(
append("url", url) append("url", url)
append("spout", spout) append("spout", spout)
append(tagsParamName, tags) append(tagsParamName, tags)
append("filter", filter)
}, },
block = { block = {
if (appSettingsService if (appSettingsService