mirror of
https://github.com/TeamNewPipe/NewPipe.git
synced 2024-11-22 11:02:35 +01:00
Applied code changes for preference search framework
This commit is contained in:
parent
12a78a826d
commit
07fb319e88
@ -17,7 +17,7 @@ public class AppearanceSettingsFragment extends BasePreferenceFragment {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
|
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
|
||||||
addPreferencesFromResource(R.xml.appearance_settings);
|
addPreferencesFromResourceRegistry();
|
||||||
|
|
||||||
final String themeKey = getString(R.string.theme_key);
|
final String themeKey = getString(R.string.theme_key);
|
||||||
// the key of the active theme when settings were opened (or recreated after theme change)
|
// the key of the active theme when settings were opened (or recreated after theme change)
|
||||||
|
@ -28,6 +28,11 @@ public abstract class BasePreferenceFragment extends PreferenceFragmentCompat {
|
|||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void addPreferencesFromResourceRegistry() {
|
||||||
|
addPreferencesFromResource(
|
||||||
|
SettingsResourceRegistry.getInstance().getPreferencesResId(this.getClass()));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onViewCreated(@NonNull final View rootView,
|
public void onViewCreated(@NonNull final View rootView,
|
||||||
@Nullable final Bundle savedInstanceState) {
|
@Nullable final Bundle savedInstanceState) {
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
package org.schabi.newpipe.settings;
|
package org.schabi.newpipe.settings;
|
||||||
|
|
||||||
|
import static org.schabi.newpipe.extractor.utils.Utils.isBlank;
|
||||||
|
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@ -38,9 +41,6 @@ import java.util.Date;
|
|||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import static org.schabi.newpipe.extractor.utils.Utils.isBlank;
|
|
||||||
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
|
|
||||||
|
|
||||||
public class ContentSettingsFragment extends BasePreferenceFragment {
|
public class ContentSettingsFragment extends BasePreferenceFragment {
|
||||||
private static final String ZIP_MIME_TYPE = "application/zip";
|
private static final String ZIP_MIME_TYPE = "application/zip";
|
||||||
|
|
||||||
@ -70,7 +70,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
|
|||||||
importExportDataPathKey = getString(R.string.import_export_data_path);
|
importExportDataPathKey = getString(R.string.import_export_data_path);
|
||||||
youtubeRestrictedModeEnabledKey = getString(R.string.youtube_restricted_mode_enabled);
|
youtubeRestrictedModeEnabledKey = getString(R.string.youtube_restricted_mode_enabled);
|
||||||
|
|
||||||
addPreferencesFromResource(R.xml.content_settings);
|
addPreferencesFromResourceRegistry();
|
||||||
|
|
||||||
final Preference importDataPreference = requirePreference(R.string.import_data);
|
final Preference importDataPreference = requirePreference(R.string.import_data);
|
||||||
importDataPreference.setOnPreferenceClickListener((Preference p) -> {
|
importDataPreference.setOnPreferenceClickListener((Preference p) -> {
|
||||||
|
@ -54,7 +54,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
|
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
|
||||||
addPreferencesFromResource(R.xml.download_settings);
|
addPreferencesFromResourceRegistry();
|
||||||
|
|
||||||
downloadPathVideoPreference = getString(R.string.download_path_video_key);
|
downloadPathVideoPreference = getString(R.string.download_path_video_key);
|
||||||
downloadPathAudioPreference = getString(R.string.download_path_audio_key);
|
downloadPathAudioPreference = getString(R.string.download_path_audio_key);
|
||||||
|
@ -29,7 +29,7 @@ public class HistorySettingsFragment extends BasePreferenceFragment {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
|
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
|
||||||
addPreferencesFromResource(R.xml.history_settings);
|
addPreferencesFromResourceRegistry();
|
||||||
|
|
||||||
cacheWipeKey = getString(R.string.metadata_cache_wipe_key);
|
cacheWipeKey = getString(R.string.metadata_cache_wipe_key);
|
||||||
viewsHistoryClearKey = getString(R.string.clear_views_history_key);
|
viewsHistoryClearKey = getString(R.string.clear_views_history_key);
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
package org.schabi.newpipe.settings;
|
package org.schabi.newpipe.settings;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
|
|
||||||
import org.schabi.newpipe.App;
|
import org.schabi.newpipe.App;
|
||||||
@ -12,10 +16,15 @@ import org.schabi.newpipe.R;
|
|||||||
public class MainSettingsFragment extends BasePreferenceFragment {
|
public class MainSettingsFragment extends BasePreferenceFragment {
|
||||||
public static final boolean DEBUG = MainActivity.DEBUG;
|
public static final boolean DEBUG = MainActivity.DEBUG;
|
||||||
|
|
||||||
|
private SettingsActivity settingsActivity;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
|
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
|
||||||
addPreferencesFromResource(R.xml.main_settings);
|
addPreferencesFromResourceRegistry();
|
||||||
|
|
||||||
|
setHasOptionsMenu(true); // Otherwise onCreateOptionsMenu is not called
|
||||||
|
|
||||||
|
// Check if the app is updatable
|
||||||
if (!CheckForNewAppVersion.isReleaseApk(App.getApp())) {
|
if (!CheckForNewAppVersion.isReleaseApk(App.getApp())) {
|
||||||
final Preference update
|
final Preference update
|
||||||
= findPreference(getString(R.string.update_pref_screen_key));
|
= findPreference(getString(R.string.update_pref_screen_key));
|
||||||
@ -24,4 +33,36 @@ public class MainSettingsFragment extends BasePreferenceFragment {
|
|||||||
defaultPreferences.edit().putBoolean(getString(R.string.update_app_key), false).apply();
|
defaultPreferences.edit().putBoolean(getString(R.string.update_app_key), false).apply();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreateOptionsMenu(
|
||||||
|
@NonNull final Menu menu,
|
||||||
|
@NonNull final MenuInflater inflater
|
||||||
|
) {
|
||||||
|
super.onCreateOptionsMenu(menu, inflater);
|
||||||
|
|
||||||
|
// -- Link settings activity and register menu --
|
||||||
|
settingsActivity = (SettingsActivity) getActivity();
|
||||||
|
|
||||||
|
inflater.inflate(R.menu.menu_settings_main_fragment, menu);
|
||||||
|
|
||||||
|
final MenuItem menuSearchItem = menu.getItem(0);
|
||||||
|
|
||||||
|
settingsActivity.setMenuSearchItem(menuSearchItem);
|
||||||
|
|
||||||
|
menuSearchItem.setOnMenuItemClickListener(ev -> {
|
||||||
|
settingsActivity.setSearchActive(true);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
// Unlink activity so that we don't get memory problems
|
||||||
|
if (settingsActivity != null) {
|
||||||
|
settingsActivity.setMenuSearchItem(null);
|
||||||
|
settingsActivity = null;
|
||||||
|
}
|
||||||
|
super.onDestroy();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ import org.schabi.newpipe.R
|
|||||||
|
|
||||||
class NotificationSettingsFragment : BasePreferenceFragment() {
|
class NotificationSettingsFragment : BasePreferenceFragment() {
|
||||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||||
addPreferencesFromResource(R.xml.notification_settings)
|
addPreferencesFromResourceRegistry()
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
|
||||||
val colorizePref: Preference? = findPreference(getString(R.string.notification_colorize_key))
|
val colorizePref: Preference? = findPreference(getString(R.string.notification_colorize_key))
|
||||||
|
@ -1,22 +1,42 @@
|
|||||||
package org.schabi.newpipe.settings;
|
package org.schabi.newpipe.settings;
|
||||||
|
|
||||||
|
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.EditText;
|
||||||
|
|
||||||
|
import androidx.annotation.IdRes;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.ActionBar;
|
import androidx.appcompat.app.ActionBar;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.fragment.app.FragmentManager;
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.preference.PreferenceFragmentCompat;
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
|
|
||||||
|
import com.jakewharton.rxbinding4.widget.RxTextView;
|
||||||
|
|
||||||
|
import org.schabi.newpipe.App;
|
||||||
|
import org.schabi.newpipe.CheckForNewAppVersion;
|
||||||
|
import org.schabi.newpipe.MainActivity;
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
import org.schabi.newpipe.databinding.SettingsLayoutBinding;
|
import org.schabi.newpipe.databinding.SettingsLayoutBinding;
|
||||||
|
import org.schabi.newpipe.settings.preferencesearch.PreferenceSearchConfiguration;
|
||||||
|
import org.schabi.newpipe.settings.preferencesearch.PreferenceSearchFragment;
|
||||||
|
import org.schabi.newpipe.settings.preferencesearch.PreferenceSearchItem;
|
||||||
|
import org.schabi.newpipe.settings.preferencesearch.PreferenceSearchResultHighlighter;
|
||||||
|
import org.schabi.newpipe.settings.preferencesearch.PreferenceSearchResultListener;
|
||||||
import org.schabi.newpipe.util.DeviceUtils;
|
import org.schabi.newpipe.util.DeviceUtils;
|
||||||
|
import org.schabi.newpipe.util.KeyboardUtil;
|
||||||
import org.schabi.newpipe.util.ThemeHelper;
|
import org.schabi.newpipe.util.ThemeHelper;
|
||||||
import org.schabi.newpipe.views.FocusOverlayView;
|
import org.schabi.newpipe.views.FocusOverlayView;
|
||||||
|
|
||||||
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Created by Christian Schabesberger on 31.08.15.
|
* Created by Christian Schabesberger on 31.08.15.
|
||||||
@ -39,7 +59,23 @@ import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
public class SettingsActivity extends AppCompatActivity
|
public class SettingsActivity extends AppCompatActivity
|
||||||
implements BasePreferenceFragment.OnPreferenceStartFragmentCallback {
|
implements
|
||||||
|
BasePreferenceFragment.OnPreferenceStartFragmentCallback,
|
||||||
|
PreferenceSearchResultListener {
|
||||||
|
private static final String TAG = "SettingsActivity";
|
||||||
|
private static final boolean DEBUG = MainActivity.DEBUG;
|
||||||
|
|
||||||
|
@IdRes
|
||||||
|
private static final int FRAGMENT_HOLDER_ID = R.id.settings_fragment_holder;
|
||||||
|
|
||||||
|
private PreferenceSearchFragment searchFragment;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private MenuItem menuSearchItem;
|
||||||
|
|
||||||
|
private View searchContainer;
|
||||||
|
private EditText searchEditText;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(final Bundle savedInstanceBundle) {
|
protected void onCreate(final Bundle savedInstanceBundle) {
|
||||||
setTheme(ThemeHelper.getSettingsThemeStyle(this));
|
setTheme(ThemeHelper.getSettingsThemeStyle(this));
|
||||||
@ -49,6 +85,7 @@ public class SettingsActivity extends AppCompatActivity
|
|||||||
final SettingsLayoutBinding settingsLayoutBinding =
|
final SettingsLayoutBinding settingsLayoutBinding =
|
||||||
SettingsLayoutBinding.inflate(getLayoutInflater());
|
SettingsLayoutBinding.inflate(getLayoutInflater());
|
||||||
setContentView(settingsLayoutBinding.getRoot());
|
setContentView(settingsLayoutBinding.getRoot());
|
||||||
|
initSearch(settingsLayoutBinding);
|
||||||
|
|
||||||
setSupportActionBar(settingsLayoutBinding.settingsToolbarLayout.toolbar);
|
setSupportActionBar(settingsLayoutBinding.settingsToolbarLayout.toolbar);
|
||||||
|
|
||||||
@ -78,6 +115,12 @@ public class SettingsActivity extends AppCompatActivity
|
|||||||
public boolean onOptionsItemSelected(final MenuItem item) {
|
public boolean onOptionsItemSelected(final MenuItem item) {
|
||||||
final int id = item.getItemId();
|
final int id = item.getItemId();
|
||||||
if (id == android.R.id.home) {
|
if (id == android.R.id.home) {
|
||||||
|
// Check if the search is active and if so: Close it
|
||||||
|
if (isSearchActive()) {
|
||||||
|
setSearchActive(false);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
|
if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
|
||||||
finish();
|
finish();
|
||||||
} else {
|
} else {
|
||||||
@ -91,14 +134,165 @@ public class SettingsActivity extends AppCompatActivity
|
|||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceStartFragment(final PreferenceFragmentCompat caller,
|
public boolean onPreferenceStartFragment(final PreferenceFragmentCompat caller,
|
||||||
final Preference preference) {
|
final Preference preference) {
|
||||||
final Fragment fragment = Fragment
|
showSettingsFragment(instantiateFragment(preference.getFragment()));
|
||||||
.instantiate(this, preference.getFragment(), preference.getExtras());
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Fragment instantiateFragment(@NonNull final String className) {
|
||||||
|
return getSupportFragmentManager()
|
||||||
|
.getFragmentFactory()
|
||||||
|
.instantiate(this.getClassLoader(), className);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showSettingsFragment(final Fragment fragment) {
|
||||||
getSupportFragmentManager().beginTransaction()
|
getSupportFragmentManager().beginTransaction()
|
||||||
.setCustomAnimations(R.animator.custom_fade_in, R.animator.custom_fade_out,
|
.setCustomAnimations(R.animator.custom_fade_in, R.animator.custom_fade_out,
|
||||||
R.animator.custom_fade_in, R.animator.custom_fade_out)
|
R.animator.custom_fade_in, R.animator.custom_fade_out)
|
||||||
.replace(R.id.settings_fragment_holder, fragment)
|
.replace(FRAGMENT_HOLDER_ID, fragment)
|
||||||
.addToBackStack(null)
|
.addToBackStack(null)
|
||||||
.commit();
|
.commit();
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDestroy() {
|
||||||
|
setMenuSearchItem(null);
|
||||||
|
super.onDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
|
// Search
|
||||||
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
//region Search
|
||||||
|
|
||||||
|
private void initSearch(final SettingsLayoutBinding settingsLayoutBinding) {
|
||||||
|
searchContainer =
|
||||||
|
settingsLayoutBinding.settingsToolbarLayout.toolbar
|
||||||
|
.findViewById(R.id.toolbar_search_container);
|
||||||
|
|
||||||
|
// Configure input field for search
|
||||||
|
searchEditText = searchContainer.findViewById(R.id.toolbar_search_edit_text);
|
||||||
|
RxTextView.textChanges(searchEditText)
|
||||||
|
// Wait some time after the last input before actually searching
|
||||||
|
.debounce(200, TimeUnit.MILLISECONDS)
|
||||||
|
.subscribe(v -> runOnUiThread(() -> onSearchChanged()));
|
||||||
|
|
||||||
|
// Configure clear button
|
||||||
|
searchContainer.findViewById(R.id.toolbar_search_clear)
|
||||||
|
.setOnClickListener(ev -> resetSearchText());
|
||||||
|
|
||||||
|
// Build search configuration using SettingsResourceRegistry
|
||||||
|
prepareSearchConfig();
|
||||||
|
|
||||||
|
final PreferenceSearchConfiguration config = new PreferenceSearchConfiguration();
|
||||||
|
SettingsResourceRegistry.getInstance().getAllEntries().stream()
|
||||||
|
.filter(SettingsResourceRegistry.SettingRegistryEntry::isSearchable)
|
||||||
|
.map(SettingsResourceRegistry.SettingRegistryEntry::getPreferencesResId)
|
||||||
|
.forEach(config::index);
|
||||||
|
|
||||||
|
searchFragment = new PreferenceSearchFragment(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void prepareSearchConfig() {
|
||||||
|
// Check if the update settings should be available
|
||||||
|
if (!CheckForNewAppVersion.isReleaseApk(App.getApp())) {
|
||||||
|
SettingsResourceRegistry.getInstance()
|
||||||
|
.getEntryByPreferencesResId(R.xml.update_settings)
|
||||||
|
.setSearchable(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMenuSearchItem(final MenuItem menuSearchItem) {
|
||||||
|
this.menuSearchItem = menuSearchItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSearchActive(final boolean active) {
|
||||||
|
// Ignore if search is already in correct state
|
||||||
|
if (isSearchActive() == active) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.d(TAG, "setSearchActive called active=" + active);
|
||||||
|
}
|
||||||
|
|
||||||
|
searchContainer.setVisibility(active ? View.VISIBLE : View.GONE);
|
||||||
|
if (menuSearchItem != null) {
|
||||||
|
menuSearchItem.setVisible(!active);
|
||||||
|
}
|
||||||
|
|
||||||
|
final FragmentManager fm = getSupportFragmentManager();
|
||||||
|
if (active) {
|
||||||
|
fm.beginTransaction()
|
||||||
|
.add(FRAGMENT_HOLDER_ID, searchFragment, PreferenceSearchFragment.NAME)
|
||||||
|
.addToBackStack(PreferenceSearchFragment.NAME)
|
||||||
|
.commit();
|
||||||
|
} else if (searchFragment != null) {
|
||||||
|
fm.beginTransaction().remove(searchFragment).commit();
|
||||||
|
fm.popBackStack(
|
||||||
|
PreferenceSearchFragment.NAME,
|
||||||
|
FragmentManager.POP_BACK_STACK_INCLUSIVE);
|
||||||
|
|
||||||
|
KeyboardUtil.hideKeyboard(this, searchEditText);
|
||||||
|
}
|
||||||
|
|
||||||
|
resetSearchText();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void resetSearchText() {
|
||||||
|
searchEditText.setText("");
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isSearchActive() {
|
||||||
|
return searchContainer.getVisibility() == View.VISIBLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onSearchChanged() {
|
||||||
|
if (!isSearchActive()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchFragment != null) {
|
||||||
|
searchFragment.updateSearchResults(this.searchEditText.getText().toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSearchResultClicked(@NonNull final PreferenceSearchItem result) {
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.d(TAG, "onSearchResultClicked called result=" + result);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hide the search
|
||||||
|
setSearchActive(false);
|
||||||
|
|
||||||
|
// -- Highlight the result --
|
||||||
|
// Find out which fragment class we need
|
||||||
|
final Class<? extends Fragment> targetedFragmentClass =
|
||||||
|
SettingsResourceRegistry.getInstance()
|
||||||
|
.getFragmentClass(result.getSearchIndexItemResId());
|
||||||
|
|
||||||
|
if (targetedFragmentClass == null) {
|
||||||
|
// This should never happen
|
||||||
|
Log.w(TAG, "Unable to locate fragment class for resId="
|
||||||
|
+ result.getSearchIndexItemResId());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the currentFragment is the one which contains the result
|
||||||
|
Fragment currentFragment =
|
||||||
|
getSupportFragmentManager().findFragmentById(FRAGMENT_HOLDER_ID);
|
||||||
|
if (!targetedFragmentClass.equals(currentFragment.getClass())) {
|
||||||
|
// If it's not the correct one display the correct one
|
||||||
|
currentFragment = instantiateFragment(targetedFragmentClass.getName());
|
||||||
|
showSettingsFragment(currentFragment);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run the highlighting
|
||||||
|
if (currentFragment instanceof PreferenceFragmentCompat) {
|
||||||
|
PreferenceSearchResultHighlighter
|
||||||
|
.highlight(result, (PreferenceFragmentCompat) currentFragment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//endregion
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,151 @@
|
|||||||
|
package org.schabi.newpipe.settings;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.annotation.XmlRes;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
|
import org.schabi.newpipe.R;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A registry that contains information about SettingsFragments.
|
||||||
|
* <br/>
|
||||||
|
* includes:
|
||||||
|
* <ul>
|
||||||
|
* <li>Class of the SettingsFragment</li>
|
||||||
|
* <li>XML-Resource</li>
|
||||||
|
* <li>...</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* E.g. used by the preference search.
|
||||||
|
*/
|
||||||
|
public final class SettingsResourceRegistry {
|
||||||
|
|
||||||
|
private static final SettingsResourceRegistry INSTANCE = new SettingsResourceRegistry();
|
||||||
|
|
||||||
|
private final Set<SettingRegistryEntry> registeredEntries = new HashSet<>();
|
||||||
|
|
||||||
|
private SettingsResourceRegistry() {
|
||||||
|
add(MainSettingsFragment.class, R.xml.main_settings).setSearchable(false);
|
||||||
|
|
||||||
|
add(AppearanceSettingsFragment.class, R.xml.appearance_settings);
|
||||||
|
add(ContentSettingsFragment.class, R.xml.content_settings);
|
||||||
|
add(DownloadSettingsFragment.class, R.xml.download_settings);
|
||||||
|
add(HistorySettingsFragment.class, R.xml.history_settings);
|
||||||
|
add(NotificationSettingsFragment.class, R.xml.notification_settings);
|
||||||
|
add(UpdateSettingsFragment.class, R.xml.update_settings);
|
||||||
|
add(VideoAudioSettingsFragment.class, R.xml.video_audio_settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
private SettingRegistryEntry add(
|
||||||
|
@NonNull final Class<? extends Fragment> fragmentClass,
|
||||||
|
@XmlRes final int preferencesResId
|
||||||
|
) {
|
||||||
|
final SettingRegistryEntry entry =
|
||||||
|
new SettingRegistryEntry(fragmentClass, preferencesResId);
|
||||||
|
this.registeredEntries.add(entry);
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public SettingRegistryEntry getEntryByFragmentClass(
|
||||||
|
final Class<? extends Fragment> fragmentClass
|
||||||
|
) {
|
||||||
|
Objects.requireNonNull(fragmentClass);
|
||||||
|
return registeredEntries.stream()
|
||||||
|
.filter(e -> Objects.equals(e.getFragmentClass(), fragmentClass))
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public SettingRegistryEntry getEntryByPreferencesResId(@XmlRes final int preferencesResId) {
|
||||||
|
return registeredEntries.stream()
|
||||||
|
.filter(e -> Objects.equals(e.getPreferencesResId(), preferencesResId))
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPreferencesResId(@NonNull final Class<? extends Fragment> fragmentClass) {
|
||||||
|
final SettingRegistryEntry entry = getEntryByFragmentClass(fragmentClass);
|
||||||
|
if (entry == null) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return entry.getPreferencesResId();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public Class<? extends Fragment> getFragmentClass(@XmlRes final int preferencesResId) {
|
||||||
|
final SettingRegistryEntry entry = getEntryByPreferencesResId(preferencesResId);
|
||||||
|
if (entry == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return entry.getFragmentClass();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<SettingRegistryEntry> getAllEntries() {
|
||||||
|
return new HashSet<>(registeredEntries);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SettingsResourceRegistry getInstance() {
|
||||||
|
return INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static class SettingRegistryEntry {
|
||||||
|
@NonNull
|
||||||
|
private final Class<? extends Fragment> fragmentClass;
|
||||||
|
@XmlRes
|
||||||
|
private final int preferencesResId;
|
||||||
|
|
||||||
|
private boolean searchable = true;
|
||||||
|
|
||||||
|
public SettingRegistryEntry(
|
||||||
|
@NonNull final Class<? extends Fragment> fragmentClass,
|
||||||
|
@XmlRes final int preferencesResId
|
||||||
|
) {
|
||||||
|
this.fragmentClass = Objects.requireNonNull(fragmentClass);
|
||||||
|
this.preferencesResId = preferencesResId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("HiddenField")
|
||||||
|
public SettingRegistryEntry setSearchable(final boolean searchable) {
|
||||||
|
this.searchable = searchable;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class<? extends Fragment> getFragmentClass() {
|
||||||
|
return fragmentClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPreferencesResId() {
|
||||||
|
return preferencesResId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSearchable() {
|
||||||
|
return searchable;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(final Object o) {
|
||||||
|
if (this == o) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (o == null || getClass() != o.getClass()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
final SettingRegistryEntry that = (SettingRegistryEntry) o;
|
||||||
|
return getPreferencesResId() == that.getPreferencesResId()
|
||||||
|
&& getFragmentClass().equals(that.getFragmentClass());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(getFragmentClass(), getPreferencesResId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -38,7 +38,7 @@ public class UpdateSettingsFragment extends BasePreferenceFragment {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
|
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
|
||||||
addPreferencesFromResource(R.xml.update_settings);
|
addPreferencesFromResourceRegistry();
|
||||||
|
|
||||||
findPreference(getString(R.string.update_app_key))
|
findPreference(getString(R.string.update_app_key))
|
||||||
.setOnPreferenceChangeListener(updatePreferenceChange);
|
.setOnPreferenceChangeListener(updatePreferenceChange);
|
||||||
|
@ -23,7 +23,7 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
|
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
|
||||||
addPreferencesFromResource(R.xml.video_audio_settings);
|
addPreferencesFromResourceRegistry();
|
||||||
|
|
||||||
updateSeekOptions();
|
updateSeekOptions();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user