diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java
index 4dfbf6c08..7d56863eb 100644
--- a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java
+++ b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java
@@ -171,6 +171,7 @@ public class SettingsActivity extends AppCompatActivity implements
@Override
public boolean onPreferenceStartFragment(final PreferenceFragmentCompat caller,
final Preference preference) {
+ preference.getExtras()
showSettingsFragment(instantiateFragment(preference.getFragment()));
return true;
}
@@ -221,20 +222,24 @@ public class SettingsActivity extends AppCompatActivity implements
searchContainer.findViewById(R.id.toolbar_search_clear)
.setOnClickListener(ev -> resetSearchText());
- prepareSearchConfig();
+ ensureSearchRepresentsApplicationState();
// Build search configuration using SettingsResourceRegistry
final PreferenceSearchConfiguration config = new PreferenceSearchConfiguration();
- SettingsResourceRegistry.getInstance().getAllEntries().stream()
- .filter(SettingsResourceRegistry.SettingRegistryEntry::isSearchable)
- .map(SettingsResourceRegistry.SettingRegistryEntry::getPreferencesResId)
- .forEach(config::index);
+
// Build search items
final PreferenceParser parser = new PreferenceParser(getApplicationContext(), config);
final PreferenceSearcher searcher = new PreferenceSearcher(config);
- config.getFiles().stream()
+
+ // Find all searchable SettingsResourceRegistry fragments
+ SettingsResourceRegistry.getInstance().getAllEntries().stream()
+ .filter(SettingsResourceRegistry.SettingRegistryEntry::isSearchable)
+ // Get the resId
+ .map(SettingsResourceRegistry.SettingRegistryEntry::getPreferencesResId)
+ // Parse
.map(parser::parse)
+ // Add it to the searcher
.forEach(searcher::add);
if (restored) {
@@ -252,7 +257,13 @@ public class SettingsActivity extends AppCompatActivity implements
searchFragment.setSearcher(searcher);
}
- private void prepareSearchConfig() {
+ /**
+ * Ensures that the search shows the correct/available search results.
+ *
+ * Some features are e.g. only available for debug builds, these should not
+ * be found when searching inside a release.
+ */
+ private void ensureSearchRepresentsApplicationState() {
// Check if the update settings are available
if (!CheckForNewAppVersion.isReleaseApk(App.getApp())) {
SettingsResourceRegistry.getInstance()
diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceParser.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceParser.java
index afd2c1b4f..ccddee97b 100644
--- a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceParser.java
+++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceParser.java
@@ -39,27 +39,22 @@ public class PreferenceParser {
}
public List parse(
- final PreferenceSearchConfiguration.SearchIndexItem item
+ @XmlRes final int resId
) {
- Objects.requireNonNull(item, "item can't be null");
-
final List results = new ArrayList<>();
- final XmlPullParser xpp = context.getResources().getXml(item.getResId());
+ final XmlPullParser xpp = context.getResources().getXml(resId);
try {
xpp.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
xpp.setFeature(XmlPullParser.FEATURE_REPORT_NAMESPACE_ATTRIBUTES, true);
final List breadcrumbs = new ArrayList<>();
- if (!TextUtils.isEmpty(item.getBreadcrumb())) {
- breadcrumbs.add(item.getBreadcrumb());
- }
while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
if (xpp.getEventType() == XmlPullParser.START_TAG) {
final PreferenceSearchItem result = parseSearchResult(
xpp,
joinBreadcrumbs(breadcrumbs),
- item.getResId()
+ resId
);
if (!searchConfiguration.getParserIgnoreElements().contains(xpp.getName())
@@ -79,7 +74,7 @@ public class PreferenceParser {
xpp.next();
}
} catch (final Exception e) {
- Log.w(TAG, "Failed to parse resid=" + item.getResId(), e);
+ Log.w(TAG, "Failed to parse resid=" + resId, e);
}
return results;
}
diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchConfiguration.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchConfiguration.java
index 1c9dc99aa..3d49140fb 100644
--- a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchConfiguration.java
+++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchConfiguration.java
@@ -1,14 +1,10 @@
package org.schabi.newpipe.settings.preferencesearch;
-import android.os.Parcel;
-import android.os.Parcelable;
import android.text.TextUtils;
-import androidx.annotation.XmlRes;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@@ -16,8 +12,6 @@ import java.util.function.BinaryOperator;
import java.util.stream.Stream;
public class PreferenceSearchConfiguration {
- private final ArrayList itemsToIndex = new ArrayList<>();
-
private BinaryOperator breadcrumbConcat =
(s1, s2) -> TextUtils.isEmpty(s1) ? s2 : (s1 + " > " + s2);
@@ -38,27 +32,11 @@ public class PreferenceSearchConfiguration {
this.searcher = Objects.requireNonNull(searcher);
}
- /**
- * Adds a new file to the index.
- *
- * @param resId The preference file to index
- * @return SearchIndexItem
- */
- public SearchIndexItem index(@XmlRes final int resId) {
- final SearchIndexItem item = new SearchIndexItem(resId, this);
- itemsToIndex.add(item);
- return item;
- }
-
- public List getFiles() {
- return itemsToIndex;
- }
-
public BinaryOperator getBreadcrumbConcat() {
return breadcrumbConcat;
}
- public PreferenceSearchFunction getSearchMatcher() {
+ public PreferenceSearchFunction getSearcher() {
return searcher;
}
@@ -70,81 +48,6 @@ public class PreferenceSearchConfiguration {
return parserContainerElements;
}
- /**
- * Adds a given R.xml resource to the search index.
- */
- public static final class SearchIndexItem implements Parcelable {
- private String breadcrumb = "";
- @XmlRes
- private final int resId;
- private final PreferenceSearchConfiguration searchConfiguration;
-
- /**
- * Includes the given R.xml resource in the index.
- *
- * @param resId The resource to index
- * @param searchConfiguration The configuration for the search
- */
- private SearchIndexItem(
- @XmlRes final int resId,
- final PreferenceSearchConfiguration searchConfiguration
- ) {
- this.resId = resId;
- this.searchConfiguration = searchConfiguration;
- }
-
- /**
- * Adds a breadcrumb.
- *
- * @param breadcrumb The breadcrumb to add
- * @return For chaining
- */
- @SuppressWarnings("HiddenField")
- public SearchIndexItem withBreadcrumb(final String breadcrumb) {
- this.breadcrumb =
- searchConfiguration.getBreadcrumbConcat().apply(this.breadcrumb, breadcrumb);
- return this;
- }
-
- @XmlRes
- int getResId() {
- return resId;
- }
-
- String getBreadcrumb() {
- return breadcrumb;
- }
-
- public static final Creator CREATOR = new Creator<>() {
- @Override
- public SearchIndexItem createFromParcel(final Parcel in) {
- return new SearchIndexItem(in);
- }
-
- @Override
- public SearchIndexItem[] newArray(final int size) {
- return new SearchIndexItem[size];
- }
- };
-
- private SearchIndexItem(final Parcel parcel) {
- this.breadcrumb = parcel.readString();
- this.resId = parcel.readInt();
- this.searchConfiguration = null;
- }
-
- @Override
- public void writeToParcel(final Parcel dest, final int flags) {
- dest.writeString(this.breadcrumb);
- dest.writeInt(this.resId);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
- }
-
@FunctionalInterface
public interface PreferenceSearchFunction {
Stream search(
diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearcher.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearcher.java
index 87dd11693..176dc5d14 100644
--- a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearcher.java
+++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearcher.java
@@ -24,7 +24,7 @@ public class PreferenceSearcher {
return new ArrayList<>();
}
- return configuration.getSearchMatcher()
+ return configuration.getSearcher()
.search(allEntries.stream(), keyword)
.collect(Collectors.toList());
}