Skip to content

Commit

Permalink
Make possible to index and ignore preferences programatically (#21)
Browse files Browse the repository at this point in the history
- Add a indexItem() method to index single preferences. With it, preferences created programmatically (i.e. not on a XML) can be index as well.
- Store these preferences on a parcelable list called `preferencesToIndex`

```
config.indexItem()
  .withKey("pref_key")
  .withTitle("title")
  .withResId(R.xml.abc)
```
  • Loading branch information
BrayanDSO committed Jul 27, 2022
1 parent ec062aa commit 0e001fe
Show file tree
Hide file tree
Showing 4 changed files with 165 additions and 11 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package com.bytehamster.lib.preferencesearch;

import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import androidx.annotation.XmlRes;
import org.apache.commons.text.similarity.FuzzyScore;

import java.util.ArrayList;
import java.util.Locale;

class PreferenceItem extends ListItem {
public class PreferenceItem extends ListItem implements Parcelable {
static final int TYPE = 2;
private static FuzzyScore fuzzyScore = new FuzzyScore(Locale.getDefault());

Expand All @@ -22,6 +25,30 @@ class PreferenceItem extends ListItem {
private float lastScore = 0;
private String lastKeyword = null;

PreferenceItem() {
}

private PreferenceItem(Parcel in) {
this.title = in.readString();
this.summary = in.readString();
this.key = in.readString();
this.breadcrumbs = in.readString();
this.keywords = in.readString();
this.resId = in.readInt();
}

public static final Creator<PreferenceItem> CREATOR = new Creator<PreferenceItem>() {
@Override
public PreferenceItem createFromParcel(Parcel in) {
return new PreferenceItem(in);
}

@Override
public PreferenceItem[] newArray(int size) {
return new PreferenceItem[size];
}
};

boolean hasData() {
return title != null || summary != null;
}
Expand Down Expand Up @@ -71,6 +98,44 @@ private String getInfo() {
return infoBuilder.toString();
}

public PreferenceItem withKey(String key) {
this.key = key;
return this;
}

public PreferenceItem withSummary(String summary) {
this.summary = summary;
return this;
}

public PreferenceItem withTitle(String title) {
this.title = title;
return this;
}

public PreferenceItem withEntries(String entries) {
this.entries = entries;
return this;
}

public PreferenceItem withKeywords(String keywords) {
this.keywords = keywords;
return this;
}

public PreferenceItem withResId(@XmlRes Integer resId) {
this.resId = resId;
return this;
}

/**
* @param breadcrumb The breadcrumb to add
* @return For chaining
*/
public PreferenceItem addBreadcrumb(String breadcrumb) {
this.breadcrumbs = Breadcrumb.concat(this.breadcrumbs, breadcrumb);
return this;
}

@Override
public String toString() {
Expand All @@ -81,4 +146,20 @@ public String toString() {
public int getType() {
return TYPE;
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(title);
parcel.writeString(summary);
parcel.writeString(key);
parcel.writeString(breadcrumbs);
parcel.writeString(keywords);
parcel.writeInt(resId);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,14 @@ void addResourceFile(SearchConfiguration.SearchIndexItem item) {
allEntries.addAll(parseFile(item));
}

void addPreferenceItems(ArrayList<PreferenceItem> preferenceItems) {
allEntries.addAll(preferenceItems);
}

private ArrayList<PreferenceItem> parseFile(SearchConfiguration.SearchIndexItem item) {
java.util.ArrayList<PreferenceItem> results = new ArrayList<>();
XmlPullParser xpp = context.getResources().getXml(item.getResId());
List<String> bannedKeys = item.getSearchConfiguration().getBannedKeys();

try {
xpp.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
Expand All @@ -47,12 +52,13 @@ private ArrayList<PreferenceItem> parseFile(SearchConfiguration.SearchIndexItem
PreferenceItem result = parseSearchResult(xpp);
result.resId = item.getResId();

if (!BLACKLIST.contains(xpp.getName()) && result.hasData()) {
if (!BLACKLIST.contains(xpp.getName())
&& result.hasData()
&& !"true".equals(getAttribute(xpp, NS_SEARCH, "ignore"))
&& !bannedKeys.contains(result.key)) {
result.breadcrumbs = joinBreadcrumbs(breadcrumbs);
result.keyBreadcrumbs = cleanupKeyBreadcrumbs(keyBreadcrumbs);
if (!"true".equals(getAttribute(xpp, NS_SEARCH, "ignore"))) {
results.add(result);
}
results.add(result);
}
if (CONTAINERS.contains(xpp.getName())) {
breadcrumbs.add(result.title == null ? "" : result.title);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,16 @@
import androidx.annotation.StringRes;
import androidx.annotation.XmlRes;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import com.bytehamster.lib.preferencesearch.ui.RevealAnimationSetting;

import java.util.ArrayList;
import java.util.Arrays;

public class SearchConfiguration {
private static final String ARGUMENT_INDEX_ITEMS = "items";
private static final String ARGUMENT_INDEX_FILES = "items";
private static final String ARGUMENT_INDEX_INDIVIDUAL_PREFERENCES = "individual_prefs";
private static final String ARGUMENT_FUZZY_ENABLED = "fuzzy";
private static final String ARGUMENT_HISTORY_ENABLED = "history_enabled";
private static final String ARGUMENT_SEARCH_BAR_ENABLED = "search_bar_enabled";
Expand All @@ -24,7 +28,9 @@ public class SearchConfiguration {
private static final String ARGUMENT_TEXT_CLEAR_HISTORY = "text_clear_history";
private static final String ARGUMENT_TEXT_NO_RESULTS = "text_no_results";

private ArrayList<SearchIndexItem> itemsToIndex = new ArrayList<>();
private ArrayList<SearchIndexItem> filesToIndex = new ArrayList<>();
private ArrayList<PreferenceItem> preferencesToIndex = new ArrayList<>();
private ArrayList<String> bannedKeys = new ArrayList<>();
private boolean historyEnabled = true;
private boolean breadcrumbsEnabled = false;
private boolean fuzzySearchEnabled = true;
Expand Down Expand Up @@ -69,7 +75,8 @@ public SearchPreferenceFragment showSearchFragment() {

private Bundle toBundle() {
Bundle arguments = new Bundle();
arguments.putParcelableArrayList(ARGUMENT_INDEX_ITEMS, itemsToIndex);
arguments.putParcelableArrayList(ARGUMENT_INDEX_FILES, filesToIndex);
arguments.putParcelableArrayList(ARGUMENT_INDEX_INDIVIDUAL_PREFERENCES, preferencesToIndex);
arguments.putBoolean(ARGUMENT_HISTORY_ENABLED, historyEnabled);
arguments.putParcelable(ARGUMENT_REVEAL_ANIMATION_SETTING, revealAnimationSetting);
arguments.putBoolean(ARGUMENT_FUZZY_ENABLED, fuzzySearchEnabled);
Expand All @@ -83,7 +90,8 @@ private Bundle toBundle() {

static SearchConfiguration fromBundle(Bundle bundle) {
SearchConfiguration config = new SearchConfiguration();
config.itemsToIndex = bundle.getParcelableArrayList(ARGUMENT_INDEX_ITEMS);
config.filesToIndex = bundle.getParcelableArrayList(ARGUMENT_INDEX_FILES);
config.preferencesToIndex = bundle.getParcelableArrayList(ARGUMENT_INDEX_INDIVIDUAL_PREFERENCES);
config.historyEnabled = bundle.getBoolean(ARGUMENT_HISTORY_ENABLED);
config.revealAnimationSetting = bundle.getParcelable(ARGUMENT_REVEAL_ANIMATION_SETTING);
config.fuzzySearchEnabled = bundle.getBoolean(ARGUMENT_FUZZY_ENABLED);
Expand Down Expand Up @@ -167,12 +175,66 @@ public void useAnimation(int centerX, int centerY, int width, int height, @Color
*/
public SearchIndexItem index(@XmlRes int resId) {
SearchIndexItem item = new SearchIndexItem(resId, this);
itemsToIndex.add(item);
filesToIndex.add(item);
return item;
}

/**
* Indexes a single preference
* @return the indexed PreferenceItem to configure it with chaining
* @see PreferenceItem for the available methods for configuring it
*/
public PreferenceItem indexItem() {
PreferenceItem preferenceItem = new PreferenceItem();
preferencesToIndex.add(preferenceItem);
return preferenceItem;
}

/**
* Indexes a single android preference
* @param preference to get its key, summary, title and entries
* @return the indexed PreferenceItem to configure it with chaining
* @see PreferenceItem for the available methods for configuring it
*/
public PreferenceItem indexItem(@NonNull Preference preference) {
PreferenceItem preferenceItem = new PreferenceItem();

if (preference.getKey() != null) {
preferenceItem.key = preference.getKey();
}
if (preference.getSummary() != null) {
preferenceItem.summary = preference.getSummary().toString();
}
if (preference.getTitle() != null) {
preferenceItem.title = preference.getTitle().toString();
}
if (preference instanceof ListPreference) {
ListPreference listPreference = ((ListPreference) preference);
if (listPreference.getEntries() != null) {
preferenceItem.entries = Arrays.toString(listPreference.getEntries());
}
}
preferencesToIndex.add(preferenceItem);
return preferenceItem;
}

ArrayList<String> getBannedKeys() {
return bannedKeys;
}

/**
* @param key of the preference to be ignored
*/
public void ignorePreference(@NonNull String key) {
bannedKeys.add(key);
}

ArrayList<SearchIndexItem> getFiles() {
return itemsToIndex;
return filesToIndex;
}

ArrayList<PreferenceItem> getPreferencesToIndex() {
return preferencesToIndex;
}

boolean isHistoryEnabled() {
Expand Down Expand Up @@ -274,6 +336,10 @@ String getBreadcrumb() {
return breadcrumb;
}

SearchConfiguration getSearchConfiguration() {
return searchConfiguration;
}

public static final Creator<SearchIndexItem> CREATOR = new Creator<SearchIndexItem>() {
@Override
public SearchIndexItem createFromParcel(Parcel in) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
for (SearchConfiguration.SearchIndexItem file : files) {
searcher.addResourceFile(file);
}
searcher.addPreferenceItems(searchConfiguration.getPreferencesToIndex());
loadHistory();
}

Expand Down

0 comments on commit 0e001fe

Please sign in to comment.