Code improvements

* Renamed methods so that they are more understandable
* Removed ``SearchIndexItem``
This commit is contained in:
litetex 2022-01-09 15:22:05 +01:00
parent b16e972710
commit e2f449f0c8
4 changed files with 24 additions and 115 deletions

View file

@ -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.
* <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
if (!CheckForNewAppVersion.isReleaseApk(App.getApp())) {
SettingsResourceRegistry.getInstance()

View file

@ -39,27 +39,22 @@ public class PreferenceParser {
}
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 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<String> 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;
}

View file

@ -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<SearchIndexItem> itemsToIndex = new ArrayList<>();
private BinaryOperator<String> 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<SearchIndexItem> getFiles() {
return itemsToIndex;
}
public BinaryOperator<String> 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<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
public interface PreferenceSearchFunction {
Stream<PreferenceSearchItem> search(

View file

@ -24,7 +24,7 @@ public class PreferenceSearcher {
return new ArrayList<>();
}
return configuration.getSearchMatcher()
return configuration.getSearcher()
.search(allEntries.stream(), keyword)
.collect(Collectors.toList());
}