Code improvements
* Renamed methods so that they are more understandable * Removed ``SearchIndexItem``
This commit is contained in:
parent
b16e972710
commit
e2f449f0c8
|
@ -171,6 +171,7 @@ public class SettingsActivity extends AppCompatActivity implements
|
||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceStartFragment(final PreferenceFragmentCompat caller,
|
public boolean onPreferenceStartFragment(final PreferenceFragmentCompat caller,
|
||||||
final Preference preference) {
|
final Preference preference) {
|
||||||
|
preference.getExtras()
|
||||||
showSettingsFragment(instantiateFragment(preference.getFragment()));
|
showSettingsFragment(instantiateFragment(preference.getFragment()));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -221,20 +222,24 @@ public class SettingsActivity extends AppCompatActivity implements
|
||||||
searchContainer.findViewById(R.id.toolbar_search_clear)
|
searchContainer.findViewById(R.id.toolbar_search_clear)
|
||||||
.setOnClickListener(ev -> resetSearchText());
|
.setOnClickListener(ev -> resetSearchText());
|
||||||
|
|
||||||
prepareSearchConfig();
|
ensureSearchRepresentsApplicationState();
|
||||||
|
|
||||||
// Build search configuration using SettingsResourceRegistry
|
// Build search configuration using SettingsResourceRegistry
|
||||||
final PreferenceSearchConfiguration config = new PreferenceSearchConfiguration();
|
final PreferenceSearchConfiguration config = new PreferenceSearchConfiguration();
|
||||||
SettingsResourceRegistry.getInstance().getAllEntries().stream()
|
|
||||||
.filter(SettingsResourceRegistry.SettingRegistryEntry::isSearchable)
|
|
||||||
.map(SettingsResourceRegistry.SettingRegistryEntry::getPreferencesResId)
|
|
||||||
.forEach(config::index);
|
|
||||||
|
|
||||||
// Build search items
|
// Build search items
|
||||||
final PreferenceParser parser = new PreferenceParser(getApplicationContext(), config);
|
final PreferenceParser parser = new PreferenceParser(getApplicationContext(), config);
|
||||||
final PreferenceSearcher searcher = new PreferenceSearcher(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)
|
.map(parser::parse)
|
||||||
|
// Add it to the searcher
|
||||||
.forEach(searcher::add);
|
.forEach(searcher::add);
|
||||||
|
|
||||||
if (restored) {
|
if (restored) {
|
||||||
|
@ -252,7 +257,13 @@ public class SettingsActivity extends AppCompatActivity implements
|
||||||
searchFragment.setSearcher(searcher);
|
searchFragment.setSearcher(searcher);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void prepareSearchConfig() {
|
/**
|
||||||
|
* Ensures that the search shows the correct/available search results.
|
||||||
|
* <br/>
|
||||||
|
* 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
|
// Check if the update settings are available
|
||||||
if (!CheckForNewAppVersion.isReleaseApk(App.getApp())) {
|
if (!CheckForNewAppVersion.isReleaseApk(App.getApp())) {
|
||||||
SettingsResourceRegistry.getInstance()
|
SettingsResourceRegistry.getInstance()
|
||||||
|
|
|
@ -39,27 +39,22 @@ public class PreferenceParser {
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<PreferenceSearchItem> parse(
|
public List<PreferenceSearchItem> parse(
|
||||||
final PreferenceSearchConfiguration.SearchIndexItem item
|
@XmlRes final int resId
|
||||||
) {
|
) {
|
||||||
Objects.requireNonNull(item, "item can't be null");
|
|
||||||
|
|
||||||
final List<PreferenceSearchItem> results = new ArrayList<>();
|
final List<PreferenceSearchItem> results = new ArrayList<>();
|
||||||
final XmlPullParser xpp = context.getResources().getXml(item.getResId());
|
final XmlPullParser xpp = context.getResources().getXml(resId);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
xpp.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
xpp.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
||||||
xpp.setFeature(XmlPullParser.FEATURE_REPORT_NAMESPACE_ATTRIBUTES, true);
|
xpp.setFeature(XmlPullParser.FEATURE_REPORT_NAMESPACE_ATTRIBUTES, true);
|
||||||
|
|
||||||
final List<String> breadcrumbs = new ArrayList<>();
|
final List<String> breadcrumbs = new ArrayList<>();
|
||||||
if (!TextUtils.isEmpty(item.getBreadcrumb())) {
|
|
||||||
breadcrumbs.add(item.getBreadcrumb());
|
|
||||||
}
|
|
||||||
while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
|
while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
|
||||||
if (xpp.getEventType() == XmlPullParser.START_TAG) {
|
if (xpp.getEventType() == XmlPullParser.START_TAG) {
|
||||||
final PreferenceSearchItem result = parseSearchResult(
|
final PreferenceSearchItem result = parseSearchResult(
|
||||||
xpp,
|
xpp,
|
||||||
joinBreadcrumbs(breadcrumbs),
|
joinBreadcrumbs(breadcrumbs),
|
||||||
item.getResId()
|
resId
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!searchConfiguration.getParserIgnoreElements().contains(xpp.getName())
|
if (!searchConfiguration.getParserIgnoreElements().contains(xpp.getName())
|
||||||
|
@ -79,7 +74,7 @@ public class PreferenceParser {
|
||||||
xpp.next();
|
xpp.next();
|
||||||
}
|
}
|
||||||
} catch (final Exception e) {
|
} 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;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,10 @@
|
||||||
package org.schabi.newpipe.settings.preferencesearch;
|
package org.schabi.newpipe.settings.preferencesearch;
|
||||||
|
|
||||||
import android.os.Parcel;
|
|
||||||
import android.os.Parcelable;
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import androidx.annotation.XmlRes;
|
|
||||||
import androidx.preference.PreferenceCategory;
|
import androidx.preference.PreferenceCategory;
|
||||||
import androidx.preference.PreferenceScreen;
|
import androidx.preference.PreferenceScreen;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
@ -16,8 +12,6 @@ import java.util.function.BinaryOperator;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public class PreferenceSearchConfiguration {
|
public class PreferenceSearchConfiguration {
|
||||||
private final ArrayList<SearchIndexItem> itemsToIndex = new ArrayList<>();
|
|
||||||
|
|
||||||
private BinaryOperator<String> breadcrumbConcat =
|
private BinaryOperator<String> breadcrumbConcat =
|
||||||
(s1, s2) -> TextUtils.isEmpty(s1) ? s2 : (s1 + " > " + s2);
|
(s1, s2) -> TextUtils.isEmpty(s1) ? s2 : (s1 + " > " + s2);
|
||||||
|
|
||||||
|
@ -38,27 +32,11 @@ public class PreferenceSearchConfiguration {
|
||||||
this.searcher = Objects.requireNonNull(searcher);
|
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<SearchIndexItem> getFiles() {
|
|
||||||
return itemsToIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BinaryOperator<String> getBreadcrumbConcat() {
|
public BinaryOperator<String> getBreadcrumbConcat() {
|
||||||
return breadcrumbConcat;
|
return breadcrumbConcat;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PreferenceSearchFunction getSearchMatcher() {
|
public PreferenceSearchFunction getSearcher() {
|
||||||
return searcher;
|
return searcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,81 +48,6 @@ public class PreferenceSearchConfiguration {
|
||||||
return parserContainerElements;
|
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<SearchIndexItem> 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
|
@FunctionalInterface
|
||||||
public interface PreferenceSearchFunction {
|
public interface PreferenceSearchFunction {
|
||||||
Stream<PreferenceSearchItem> search(
|
Stream<PreferenceSearchItem> search(
|
||||||
|
|
|
@ -24,7 +24,7 @@ public class PreferenceSearcher {
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
return configuration.getSearchMatcher()
|
return configuration.getSearcher()
|
||||||
.search(allEntries.stream(), keyword)
|
.search(allEntries.stream(), keyword)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue