diff --git a/README.md b/README.md index 3fcb05b36c..275fe6ee85 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ vendor's servers. * Files in app/src/main/java/com/android/nQuant are taken from the [nQuant.android](https://github.com/mcychan/nQuant.android/) project, licensed under the Apache license by Miller Cy Chan * Files in app/src/main/java/org/concentus are taken from the [Concentus](https://github.com/lostromb/concentus) project, licensed under the BSD-3 license by various holding parties * Files in GBDaoGenerator/src/de/greenrobot are taken from the [greenDAO](https://codeberg.org/Freeyourgadget/greenDAO) project (Gadgetbridge's fork), licensed under the GPLv3 by Markus Junginger, greenrobot +* File app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/SearchPreferenceHighlighter.java is licensed under the MIT license by ByteHamster ## Download diff --git a/app/build.gradle b/app/build.gradle index c668d52cc6..1d9dbf6586 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -270,6 +270,7 @@ dependencies { implementation 'com.google.protobuf:protobuf-javalite:4.31.1' implementation 'com.android.volley:volley:1.2.1' implementation 'org.msgpack:msgpack-core:0.9.10' + implementation 'com.github.ByteHamster:SearchPreference:2.7.3' implementation 'com.github.mapsforge.mapsforge:mapsforge-core:0.25.0' implementation 'com.github.mapsforge.mapsforge:mapsforge-map:0.25.0' diff --git a/app/src/main/assets/licenses/bytehamster.txt b/app/src/main/assets/licenses/bytehamster.txt new file mode 100644 index 0000000000..2e1603517d --- /dev/null +++ b/app/src/main/assets/licenses/bytehamster.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 ByteHamster + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/app/src/main/assets/licenses/licenses.json b/app/src/main/assets/licenses/licenses.json index 012d515009..5c544da2a8 100644 --- a/app/src/main/assets/licenses/licenses.json +++ b/app/src/main/assets/licenses/licenses.json @@ -235,5 +235,12 @@ "type": "MIT", "url": "https://github.com/jhy/jsoup", "path": "licenses/jsoup.txt" + }, + { + "name": "SearchPreference", + "owner": "ByteHamster", + "type": "MIT", + "url": "https://github.com/ByteHamster/SearchPreference", + "path": "licenses/bytehamster.txt" } ] diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AboutUserPreferencesActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AboutUserPreferencesActivity.java index 60a6b4f6db..b3d41fbdbe 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AboutUserPreferencesActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AboutUserPreferencesActivity.java @@ -44,19 +44,12 @@ import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.devices.DeviceManager; public class AboutUserPreferencesActivity extends AbstractSettingsActivityV2 { - @Override - protected String fragmentTag() { - return AboutUserPreferencesFragment.FRAGMENT_TAG; - } - @Override protected PreferenceFragmentCompat newFragment() { return new AboutUserPreferencesFragment(); } public static class AboutUserPreferencesFragment extends AbstractPreferenceFragment { - static final String FRAGMENT_TAG = "ABOUT_USER_PREFERENCES_FRAGMENT"; - @Override public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { setPreferencesFromResource(R.xml.about_user, rootKey); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractPreferenceFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractPreferenceFragment.java index bc4283cc63..eb85bf56c9 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractPreferenceFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractPreferenceFragment.java @@ -20,9 +20,18 @@ import android.content.SharedPreferences; import android.os.Bundle; import android.text.InputType; import android.text.TextUtils; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.XmlRes; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.view.MenuProvider; import androidx.fragment.app.DialogFragment; +import androidx.lifecycle.Lifecycle; import androidx.preference.EditTextPreference; import androidx.preference.ListPreference; import androidx.preference.MultiSelectListPreference; @@ -34,6 +43,8 @@ import androidx.preference.PreferenceScreen; import androidx.preference.SeekBarPreference; import androidx.preference.SwitchPreferenceCompat; +import com.bytehamster.lib.preferencesearch.SearchConfiguration; +import com.bytehamster.lib.preferencesearch.SearchPreference; import com.mobeta.android.dslv.DragSortListPreference; import com.mobeta.android.dslv.DragSortListPreferenceFragment; @@ -56,11 +67,56 @@ import nodomain.freeyourgadget.gadgetbridge.util.dialogs.MaterialListPreferenceD import nodomain.freeyourgadget.gadgetbridge.util.dialogs.MaterialMultiSelectListPreferenceDialogFragment; import nodomain.freeyourgadget.gadgetbridge.util.preferences.MinMaxTextWatcher; -public abstract class AbstractPreferenceFragment extends PreferenceFragmentCompat { +public abstract class AbstractPreferenceFragment extends PreferenceFragmentCompat implements MenuProvider { protected static final Logger LOG = LoggerFactory.getLogger(AbstractPreferenceFragment.class); private final SharedPreferencesChangeHandler sharedPreferencesChangeHandler = new SharedPreferencesChangeHandler(); + public static final String FRAGMENT_TAG = "preference_fragment"; + + private SearchConfiguration mSearchConfiguration; + + @Override + public void onCreate(@Nullable final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + final SearchPreference searchPreference = findPreference("searchPreference"); + if (searchPreference != null) { + mSearchConfiguration = searchPreference.getSearchConfiguration(); + mSearchConfiguration.setActivity((AppCompatActivity) requireActivity()); + mSearchConfiguration.setHistoryId(requireActivity().getClass().getName()); + } + } + + @Override + public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + requireActivity().addMenuProvider(this, getViewLifecycleOwner(), Lifecycle.State.RESUMED); + } + + @Override + public void onCreateMenu(@NonNull final Menu menu, @NonNull final MenuInflater inflater) { + menu.clear(); + if (mSearchConfiguration != null) { + inflater.inflate(R.menu.menu_preferences, menu); + } + } + + @Override + public boolean onMenuItemSelected(@NonNull final MenuItem item) { + final int itemId = item.getItemId(); + if (itemId == R.id.preferences_search) { + final SearchPreference searchPreference = findPreference("searchPreference"); + if (searchPreference != null) { + //searchPreference.setVisible(true); + mSearchConfiguration.showSearchFragment(); + return true; + } + } + + return false; + } + @Override public void onStart() { super.onStart(); @@ -155,6 +211,29 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragmentCompa } } + protected void index(@XmlRes final int preferencesResId) { + index(preferencesResId, 0); + } + + protected void index(@XmlRes final int preferencesResId, final int breadcrumb) { + if (mSearchConfiguration == null) { + final SearchPreference searchPreference = findPreference("searchPreference"); + if (searchPreference != null) { + mSearchConfiguration = searchPreference.getSearchConfiguration(); + mSearchConfiguration.setActivity((AppCompatActivity) requireActivity()); + mSearchConfiguration.setHistoryId(requireActivity().getClass().getName()); + mSearchConfiguration.setBreadcrumbsEnabled(true); + } + } + + if (mSearchConfiguration != null) { + final SearchConfiguration.SearchIndexItem indexItem = mSearchConfiguration.index(preferencesResId); + if (breadcrumb != 0) { + indexItem.addBreadcrumb(breadcrumb); + } + } + } + /** * Reload the preferences in the current screen. This is needed when the user enters or exists a PreferenceScreen, * otherwise the settings won't be reloaded by the {@link SharedPreferencesChangeHandler}, as the preferences return diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractSettingsActivityV2.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractSettingsActivityV2.java index 5ea4b9d42a..da7b78416f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractSettingsActivityV2.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractSettingsActivityV2.java @@ -16,41 +16,67 @@ along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.activities; +import android.content.Intent; import android.os.Bundle; import android.view.MenuItem; import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceScreen; +import com.bytehamster.lib.preferencesearch.SearchPreferenceFragment; +import com.bytehamster.lib.preferencesearch.SearchPreferenceResult; +import com.bytehamster.lib.preferencesearch.SearchPreferenceResultListener; + import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.util.SearchPreferenceHighlighter; public abstract class AbstractSettingsActivityV2 extends AbstractGBActivity implements - PreferenceFragmentCompat.OnPreferenceStartScreenCallback { + PreferenceFragmentCompat.OnPreferenceStartScreenCallback, + SearchPreferenceResultListener { + public static final String EXTRA_PREF_SCREEN = "preferenceScreen"; + public static final String EXTRA_PREF_HIGHLIGHT = "preferenceToHighlight"; - protected abstract String fragmentTag(); protected abstract PreferenceFragmentCompat newFragment(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_device_settings); + setContentView(R.layout.activity_settings); if (savedInstanceState == null) { - Fragment fragment = getSupportFragmentManager().findFragmentByTag(fragmentTag()); + PreferenceFragmentCompat fragment = (PreferenceFragmentCompat) getSupportFragmentManager().findFragmentByTag(AbstractPreferenceFragment.FRAGMENT_TAG); if (fragment == null) { fragment = newFragment(); } + final String prefScreen = getIntent().getStringExtra(EXTRA_PREF_SCREEN); + if (prefScreen != null) { + final Bundle args; + if (fragment.getArguments() != null) { + args = fragment.getArguments(); + } else { + args = new Bundle(); + fragment.setArguments(args); + } + args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, prefScreen); + } getSupportFragmentManager() .beginTransaction() - .replace(R.id.settings_container, fragment, fragmentTag()) + .replace(R.id.settings_container, fragment, AbstractPreferenceFragment.FRAGMENT_TAG) .commit(); + final String highlightKey = getIntent().getStringExtra(EXTRA_PREF_HIGHLIGHT); + if (highlightKey != null) { + SearchPreferenceHighlighter.highlight(fragment, highlightKey); + } } } @Override - public boolean onPreferenceStartScreen(final PreferenceFragmentCompat caller, final PreferenceScreen preferenceScreen) { + public boolean onPreferenceStartScreen(@NonNull final PreferenceFragmentCompat caller, + @NonNull final PreferenceScreen preferenceScreen) { final PreferenceFragmentCompat fragment = newFragment(); final Bundle args; if (fragment.getArguments() != null) { @@ -83,6 +109,57 @@ public abstract class AbstractSettingsActivityV2 extends AbstractGBActivity impl return super.onOptionsItemSelected(item); } + @Override + public void onSearchResultClicked(final SearchPreferenceResult result) { + final FragmentManager fragmentManager = getSupportFragmentManager(); + + result.closeSearchPage(this); + // FIXME: Not sure why we need this, but otherwise we need to go back twice when switching preference screens + fragmentManager.popBackStack(SearchPreferenceFragment.TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE); + + final Fragment currentFragment = fragmentManager.findFragmentByTag(AbstractPreferenceFragment.FRAGMENT_TAG); + if (currentFragment == null) { + return; + } + + if (!(currentFragment instanceof PreferenceFragmentCompat currentPreferenceFragment)) { + return; + } + + final String currentScreen = currentPreferenceFragment.getPreferenceScreen().getKey(); + + if (result.getScreen() != null && !result.getScreen().equals(currentScreen)) { + final PreferenceFragmentCompat newFragmentForScreen = newFragment(); + final Bundle args; + if (newFragmentForScreen.getArguments() != null) { + args = newFragmentForScreen.getArguments(); + } else { + args = new Bundle(); + } + args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, result.getScreen()); + newFragmentForScreen.setArguments(args); + + fragmentManager.beginTransaction() + .replace(R.id.settings_container, newFragmentForScreen) + .addToBackStack("search_goto_" + result.getScreen()) + .commit(); + result.highlight(newFragmentForScreen); + } else { + final Preference preference = currentPreferenceFragment.findPreference(result.getKey()); + if (preference != null) { + result.highlight(currentPreferenceFragment); + } + } + } + + protected void open(final Class clazz, + final SearchPreferenceResult result) { + final Intent intent = new Intent(this, clazz); + intent.putExtra(EXTRA_PREF_SCREEN, result.getScreen()); + intent.putExtra(EXTRA_PREF_HIGHLIGHT, result.getKey()); + startActivity(intent); + } + public void setActionBarTitle(final CharSequence title) { final ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DashboardPreferencesActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DashboardPreferencesActivity.java index 1e5e72054c..58812bb871 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DashboardPreferencesActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DashboardPreferencesActivity.java @@ -34,19 +34,17 @@ import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; public class DashboardPreferencesActivity extends AbstractSettingsActivityV2 { - @Override - protected String fragmentTag() { - return DashboardPreferencesFragment.FRAGMENT_TAG; - } - @Override protected PreferenceFragmentCompat newFragment() { return new DashboardPreferencesFragment(); } - public static class DashboardPreferencesFragment extends AbstractPreferenceFragment { - static final String FRAGMENT_TAG = "DASHBOARD_PREFERENCES_FRAGMENT"; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + public static class DashboardPreferencesFragment extends AbstractPreferenceFragment { @Override public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { setPreferencesFromResource(R.xml.dashboard_preferences, rootKey); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/NotificationManagementActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/NotificationManagementActivity.java index fd04ebd45b..0f1dd93827 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/NotificationManagementActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/NotificationManagementActivity.java @@ -38,11 +38,6 @@ public class NotificationManagementActivity extends AbstractSettingsActivityV2 { private static final int RINGTONE_REQUEST_CODE = 4712; private static final String DEFAULT_RINGTONE_URI = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE).toString(); - @Override - protected String fragmentTag() { - return NotificationPreferencesFragment.FRAGMENT_TAG; - } - @Override protected PreferenceFragmentCompat newFragment() { return new NotificationPreferencesFragment(); @@ -51,8 +46,6 @@ public class NotificationManagementActivity extends AbstractSettingsActivityV2 { public static class NotificationPreferencesFragment extends AbstractPreferenceFragment { private static final Logger LOG = LoggerFactory.getLogger(NotificationPreferencesFragment.class); - static final String FRAGMENT_TAG = "NOTIFICATION_PREFERENCES_FRAGMENT"; - @Override protected void onSharedPreferenceChanged(final Preference preference) { if (GBPrefs.PING_TONE.equals(preference.getKey())) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java index 563735ddc6..f1bf6b463a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java @@ -48,6 +48,7 @@ import androidx.preference.ListPreference; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; +import com.bytehamster.lib.preferencesearch.SearchPreferenceResult; import com.google.android.material.color.DynamicColors; import com.google.android.material.dialog.MaterialAlertDialogBuilder; @@ -79,21 +80,35 @@ import nodomain.freeyourgadget.gadgetbridge.util.Prefs; public class SettingsActivity extends AbstractSettingsActivityV2 { public static final String PREF_MEASUREMENT_SYSTEM = "measurement_system"; - @Override - protected String fragmentTag() { - return SettingsFragment.FRAGMENT_TAG; - } - @Override protected PreferenceFragmentCompat newFragment() { return new SettingsFragment(); } + @Override + public void onSearchResultClicked(final SearchPreferenceResult result) { + if (result.getResourceFile() == R.xml.dashboard_preferences) { + open(DashboardPreferencesActivity.class, result); + } else if (result.getResourceFile() == R.xml.about_user) { + open(AboutUserPreferencesActivity.class, result); + } else if (result.getResourceFile() == R.xml.charts_preferences) { + open(ChartsPreferencesActivity.class, result); + } else if (result.getResourceFile() == R.xml.sleepasandroid_preferences) { + open(SleepAsAndroidPreferencesActivity.class, result); + } else if (result.getResourceFile() == R.xml.discovery_pairing_preferences) { + open(DiscoveryPairingPreferenceActivity.class, result); + } else if (result.getResourceFile() == R.xml.notifications_preferences) { + open(NotificationManagementActivity.class, result); + } else if (result.getResourceFile() == R.xml.map_settings) { + open(MapsSettingsActivity.class, result); + } else { + super.onSearchResultClicked(result); + } + } + public static class SettingsFragment extends AbstractPreferenceFragment { private static final Logger LOG = LoggerFactory.getLogger(SettingsActivity.class); - static final String FRAGMENT_TAG = "SETTINGS_FRAGMENT"; - private static final int EXPORT_LOCATION_FILE_REQUEST_CODE = 4711; private EditText fitnessAppEditText = null; private int fitnessAppSelectionListSpinnerFirstRun = 0; @@ -101,6 +116,14 @@ public class SettingsActivity extends AbstractSettingsActivityV2 { @Override public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { setPreferencesFromResource(R.xml.preferences, rootKey); + index(R.xml.preferences); + index(R.xml.dashboard_preferences, R.string.bottom_nav_dashboard); + index(R.xml.about_user, R.string.activity_prefs_about_you); + index(R.xml.charts_preferences, R.string.activity_prefs_charts); + index(R.xml.sleepasandroid_preferences, R.string.sleepasandroid_settings); + index(R.xml.discovery_pairing_preferences, R.string.activity_prefs_discovery_pairing); + index(R.xml.notifications_preferences, R.string.pref_header_notifications); + index(R.xml.map_settings, R.string.maps_settings); setInputTypeFor("rtl_max_line_length", InputType.TYPE_CLASS_NUMBER); setInputTypeFor("location_latitude", InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SleepAsAndroidPreferencesActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SleepAsAndroidPreferencesActivity.java index 438f9181d0..6a3a4c4057 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SleepAsAndroidPreferencesActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SleepAsAndroidPreferencesActivity.java @@ -22,19 +22,12 @@ import nodomain.freeyourgadget.gadgetbridge.util.GB; import nodomain.freeyourgadget.gadgetbridge.devices.SleepAsAndroidFeature; public class SleepAsAndroidPreferencesActivity extends AbstractSettingsActivityV2 { - @Override - protected String fragmentTag() { - return SleepAsAndroidPreferencesFragment.FRAGMENT_TAG; - } - @Override protected PreferenceFragmentCompat newFragment() { return new SleepAsAndroidPreferencesFragment(); } public static class SleepAsAndroidPreferencesFragment extends AbstractPreferenceFragment { - static final String FRAGMENT_TAG = "SLEEPASANDROID_PREFERENCES_FRAGMENT"; - @Override public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) { setPreferencesFromResource(R.xml.sleepasandroid_preferences, rootKey); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ChartsPreferencesActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ChartsPreferencesActivity.java index 9addbe1514..28b336e93c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ChartsPreferencesActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ChartsPreferencesActivity.java @@ -20,30 +20,19 @@ import android.content.Intent; import android.os.Bundle; import android.text.InputType; -import androidx.annotation.NonNull; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; -import com.mobeta.android.dslv.DragSortListPreference; - -import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.activities.AboutUserPreferencesActivity; import nodomain.freeyourgadget.gadgetbridge.activities.AbstractPreferenceFragment; import nodomain.freeyourgadget.gadgetbridge.activities.AbstractSettingsActivityV2; -import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.util.GBPrefs; -import nodomain.freeyourgadget.gadgetbridge.util.preferences.DevicePrefs; public class ChartsPreferencesActivity extends AbstractSettingsActivityV2 { private GBDevice device; - @Override - protected String fragmentTag() { - return ChartsPreferencesFragment.FRAGMENT_TAG; - } - @Override protected PreferenceFragmentCompat newFragment() { return ChartsPreferencesFragment.newInstance(device); @@ -57,8 +46,6 @@ public class ChartsPreferencesActivity extends AbstractSettingsActivityV2 { } public static class ChartsPreferencesFragment extends AbstractPreferenceFragment { - static final String FRAGMENT_TAG = "CHARTS_PREFERENCES_FRAGMENT"; - private GBDevice device; static ChartsPreferencesFragment newInstance(final GBDevice device) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsActivity.java index 49fe217dae..56af4b0ef6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsActivity.java @@ -16,9 +16,14 @@ along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.activities.devicesettings; +import android.content.Intent; + import androidx.preference.PreferenceFragmentCompat; +import com.bytehamster.lib.preferencesearch.SearchPreferenceResult; + import nodomain.freeyourgadget.gadgetbridge.activities.AbstractSettingsActivityV2; +import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; public class DeviceSettingsActivity extends AbstractSettingsActivityV2 { @@ -30,11 +35,6 @@ public class DeviceSettingsActivity extends AbstractSettingsActivityV2 { APPLICATION_SETTINGS } - @Override - protected String fragmentTag() { - return DeviceSpecificSettingsFragment.FRAGMENT_TAG; - } - @Override protected PreferenceFragmentCompat newFragment() { final GBDevice device = getIntent().getParcelableExtra(GBDevice.EXTRA_DEVICE); @@ -42,4 +42,20 @@ public class DeviceSettingsActivity extends AbstractSettingsActivityV2 { return DeviceSpecificSettingsFragment.newInstance(device, menu_entry); } + + @Override + public void onSearchResultClicked(final SearchPreferenceResult result) { + final GBDevice device = getIntent().getParcelableExtra(GBDevice.EXTRA_DEVICE); + DeviceCoordinator coordinator = device.getDeviceCoordinator(); + DeviceSpecificSettings deviceSpecificSettings = coordinator.getDeviceSpecificSettings(device); + + String rootScreenForSubScreen = deviceSpecificSettings.getRootScreenForSubScreen(result.getResourceFile()); + + if (rootScreenForSubScreen != null) { + final Intent intent = getIntent(); // FIXME new Intent(this, DeviceSettingsActivity.class); + intent.putExtra(EXTRA_PREF_SCREEN, rootScreenForSubScreen); + intent.putExtra(EXTRA_PREF_HIGHLIGHT, result.getKey()); + startActivity(intent); + } + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettings.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettings.java index f42f19d7d2..e4c0a18e51 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettings.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettings.java @@ -122,6 +122,18 @@ public class DeviceSpecificSettings implements Parcelable { connectedPreferences.addAll(deviceSpecificSettings.connectedPreferences); } + public String getRootScreenForSubScreen(final int subScreen) { + for (final Map.Entry> e : subScreens.entrySet()) { + for (final Integer ss : e.getValue()) { + if (ss == subScreen) { + return e.getKey(); + } + } + } + + return null; + } + public List getRootScreens() { return rootScreens; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java index 833274c853..187980279d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java @@ -101,8 +101,6 @@ public class DeviceSpecificSettingsFragment extends AbstractPreferenceFragment i private static final Logger LOG = LoggerFactory.getLogger(DeviceSpecificSettingsFragment.class); - static final String FRAGMENT_TAG = "DEVICE_SPECIFIC_SETTINGS_FRAGMENT"; - private DeviceSpecificSettings deviceSpecificSettings; private DeviceSpecificSettingsCustomizer deviceSpecificSettingsCustomizer; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsScreen.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsScreen.java index 09ad624c83..d3d24df346 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsScreen.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsScreen.java @@ -59,4 +59,14 @@ public enum DeviceSpecificSettingsScreen { public int getXml() { return xml; } + + public static DeviceSpecificSettingsScreen fromXml(final int xml) { + for (final DeviceSpecificSettingsScreen screen : DeviceSpecificSettingsScreen.values()) { + if (screen.xml == xml) { + return screen; + } + } + + return null; + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/discovery/DiscoveryPairingPreferenceActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/discovery/DiscoveryPairingPreferenceActivity.java index 11c933f91c..dc4cacf36c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/discovery/DiscoveryPairingPreferenceActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/discovery/DiscoveryPairingPreferenceActivity.java @@ -28,19 +28,12 @@ import nodomain.freeyourgadget.gadgetbridge.activities.AbstractSettingsActivityV import nodomain.freeyourgadget.gadgetbridge.util.GB; public class DiscoveryPairingPreferenceActivity extends AbstractSettingsActivityV2 { - @Override - protected String fragmentTag() { - return DiscoveryPairingPreferenceFragment.FRAGMENT_TAG; - } - @Override protected PreferenceFragmentCompat newFragment() { return new DiscoveryPairingPreferenceFragment(); } public static class DiscoveryPairingPreferenceFragment extends AbstractPreferenceFragment { - static final String FRAGMENT_TAG = "DISCOVERY_PAIRING_PREFERENCES_FRAGMENT"; - @Override public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { setPreferencesFromResource(R.xml.discovery_pairing_preferences, rootKey); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/loyaltycards/LoyaltyCardsSettingsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/loyaltycards/LoyaltyCardsSettingsActivity.java index 4b84a450d7..77602b0265 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/loyaltycards/LoyaltyCardsSettingsActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/loyaltycards/LoyaltyCardsSettingsActivity.java @@ -18,17 +18,13 @@ package nodomain.freeyourgadget.gadgetbridge.activities.loyaltycards; import android.content.pm.PackageManager; import android.os.Bundle; -import android.view.MenuItem; import androidx.annotation.NonNull; import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.preference.PreferenceFragmentCompat; -import androidx.preference.PreferenceScreen; -import nodomain.freeyourgadget.gadgetbridge.R; -import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBActivity; import nodomain.freeyourgadget.gadgetbridge.activities.AbstractSettingsActivityV2; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; @@ -41,11 +37,6 @@ public class LoyaltyCardsSettingsActivity extends AbstractSettingsActivityV2 imp private GBDevice device; - @Override - protected String fragmentTag() { - return LoyaltyCardsSettingsFragment.FRAGMENT_TAG; - } - @Override protected PreferenceFragmentCompat newFragment() { return LoyaltyCardsSettingsFragment.newInstance(device); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/loyaltycards/LoyaltyCardsSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/loyaltycards/LoyaltyCardsSettingsFragment.java index 145b3d6aa8..33f0bbaa03 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/loyaltycards/LoyaltyCardsSettingsFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/loyaltycards/LoyaltyCardsSettingsFragment.java @@ -61,8 +61,6 @@ import nodomain.freeyourgadget.gadgetbridge.util.StringUtils; public class LoyaltyCardsSettingsFragment extends AbstractPreferenceFragment { private static final Logger LOG = LoggerFactory.getLogger(LoyaltyCardsSettingsFragment.class); - static final String FRAGMENT_TAG = "LOYALTY_CARDS_SETTINGS_FRAGMENT"; - private GBDevice device; private void setSettingsFileSuffix(final String settingsFileSuffix) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/maps/MapsSettingsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/maps/MapsSettingsActivity.java index 5c2ec45a6d..cfb636efae 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/maps/MapsSettingsActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/maps/MapsSettingsActivity.java @@ -21,11 +21,6 @@ import androidx.preference.PreferenceFragmentCompat; import nodomain.freeyourgadget.gadgetbridge.activities.AbstractSettingsActivityV2; public class MapsSettingsActivity extends AbstractSettingsActivityV2 { - @Override - protected String fragmentTag() { - return MapsSettingsFragment.FRAGMENT_TAG; - } - @Override protected PreferenceFragmentCompat newFragment() { return new MapsSettingsFragment(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/maps/MapsSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/maps/MapsSettingsFragment.java index 84d1f0f101..d58da6bf8b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/maps/MapsSettingsFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/maps/MapsSettingsFragment.java @@ -34,8 +34,6 @@ import nodomain.freeyourgadget.gadgetbridge.activities.AbstractPreferenceFragmen import nodomain.freeyourgadget.gadgetbridge.util.maps.MapsManager; public class MapsSettingsFragment extends AbstractPreferenceFragment { - static final String FRAGMENT_TAG = "MAP_SETTINGS_FRAGMENT"; - public static final String ACTION_SETTING_CHANGE = "nodomain.freeyourgadget.gadgetbridge.maps.setting_change"; public static final String EXTRA_SETTING_KEY = "nodomain.freeyourgadget.gadgetbridge.maps_setting_key"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/garmin/GarminRealtimeSettingsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/garmin/GarminRealtimeSettingsActivity.java index eb8c041eb9..a534453a8f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/garmin/GarminRealtimeSettingsActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/garmin/GarminRealtimeSettingsActivity.java @@ -26,11 +26,6 @@ public class GarminRealtimeSettingsActivity extends AbstractSettingsActivityV2 { public static final String EXTRA_SCREEN_ID = "screenId"; - @Override - protected String fragmentTag() { - return GarminRealtimeSettingsFragment.FRAGMENT_TAG; - } - @Override protected PreferenceFragmentCompat newFragment() { return GarminRealtimeSettingsFragment.newInstance(device, screenId); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/garmin/GarminRealtimeSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/garmin/GarminRealtimeSettingsFragment.java index 15009ba5e3..780d886ecc 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/garmin/GarminRealtimeSettingsFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/garmin/GarminRealtimeSettingsFragment.java @@ -75,8 +75,6 @@ public class GarminRealtimeSettingsFragment extends AbstractPreferenceFragment { public static final int ROOT_SCREEN_ID = 36352; - static final String FRAGMENT_TAG = "GARMIN_REALTIME_SETTINGS_FRAGMENT"; - private GBDevice device; private int screenId = ROOT_SCREEN_ID; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/ui/HuaweiStressCalibrationActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/ui/HuaweiStressCalibrationActivity.java index 16836ae24e..83c6c661cb 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/ui/HuaweiStressCalibrationActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/ui/HuaweiStressCalibrationActivity.java @@ -47,7 +47,7 @@ public class HuaweiStressCalibrationActivity extends AbstractGBActivity { super.onCreate(savedInstanceState); device = getIntent().getParcelableExtra(GBDevice.EXTRA_DEVICE); - setContentView(R.layout.activity_device_settings); + setContentView(R.layout.activity_settings); if (device == null || !device.isInitialized()) { GB.toast(getString(R.string.watch_not_connected), Toast.LENGTH_SHORT, GB.INFO); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceSettingsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceSettingsActivity.java index 65b096f4b3..684871460d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceSettingsActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceSettingsActivity.java @@ -35,11 +35,6 @@ import nodomain.freeyourgadget.gadgetbridge.activities.AbstractSettingsActivityV public class HybridHRWatchfaceSettingsActivity extends AbstractSettingsActivityV2 { static HybridHRWatchfaceSettings settings; - @Override - protected String fragmentTag() { - return HybridHRWatchfaceSettingsFragment.FRAGMENT_TAG; - } - @Override protected PreferenceFragmentCompat newFragment() { return new HybridHRWatchfaceSettingsFragment(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceWidgetActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceWidgetActivity.java index 6fcdf5f4a7..487c338223 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceWidgetActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceWidgetActivity.java @@ -49,11 +49,6 @@ public class HybridHRWatchfaceWidgetActivity extends AbstractSettingsActivityV2 private static final Boolean WIDGET_CUSTOM_DEFAULT_HIDE_TEXT = true; private static final Boolean WIDGET_CUSTOM_DEFAULT_SHOW_CIRCLE = true; - @Override - protected String fragmentTag() { - return HybridHRWatchfaceWidgetFragment.FRAGMENT_TAG; - } - @Override protected PreferenceFragmentCompat newFragment() { return new HybridHRWatchfaceWidgetFragment(); @@ -99,8 +94,6 @@ public class HybridHRWatchfaceWidgetActivity extends AbstractSettingsActivityV2 } public static class HybridHRWatchfaceWidgetFragment extends AbstractPreferenceFragment implements Preference.OnPreferenceChangeListener { - static final String FRAGMENT_TAG = "HYBRID_HR_WATCHFACE_WIDGET_FRAGMENT"; - @Override public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { setPreferencesFromResource(R.xml.fossil_hr_widget_settings, rootKey); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/SearchPreferenceHighlighter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/SearchPreferenceHighlighter.java new file mode 100644 index 0000000000..a23b0a688a --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/SearchPreferenceHighlighter.java @@ -0,0 +1,85 @@ +package nodomain.freeyourgadget.gadgetbridge.util; + +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.PorterDuff; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.util.Log; +import android.util.TypedValue; + +import androidx.appcompat.content.res.AppCompatResources; +import androidx.preference.Preference; +import androidx.preference.PreferenceFragmentCompat; +import androidx.preference.PreferenceGroup; +import androidx.recyclerview.widget.RecyclerView; + +/** + * Copied as-is from SearchPreferenceResult, since the constructor is protected, and + * we need a way to highlight preferences in a different activity due to the way Gadgetbridge is built. + */ +public class SearchPreferenceHighlighter { + public static void highlight(final PreferenceFragmentCompat prefsFragment, final String key) { + new Handler().post(() -> doHighlight(prefsFragment, key)); + } + + private static void doHighlight(final PreferenceFragmentCompat prefsFragment, final String key) { + final Preference prefResult = prefsFragment.findPreference(key); + + if (prefResult == null) { + Log.e("doHighlight", "Preference not found on given screen"); + return; + } + final RecyclerView recyclerView = prefsFragment.getListView(); + final RecyclerView.Adapter adapter = recyclerView.getAdapter(); + if (adapter instanceof PreferenceGroup.PreferencePositionCallback) { + PreferenceGroup.PreferencePositionCallback callback = (PreferenceGroup.PreferencePositionCallback) adapter; + final int position = callback.getPreferenceAdapterPosition(prefResult); + if (position != RecyclerView.NO_POSITION) { + recyclerView.scrollToPosition(position); + recyclerView.postDelayed(() -> { + RecyclerView.ViewHolder holder = recyclerView.findViewHolderForAdapterPosition(position); + if (holder != null) { + Drawable oldBackground = holder.itemView.getBackground(); + int color = getColorFromAttr(prefsFragment.getContext(), android.R.attr.textColorPrimary); + holder.itemView.setBackgroundColor(color & 0xffffff | 0x33000000); + new Handler().postDelayed(() -> holder.itemView.setBackgroundDrawable(oldBackground), 1000); + return; + } + highlightFallback(prefsFragment, prefResult); + }, 200); + return; + } + } + highlightFallback(prefsFragment, prefResult); + } + + /** + * Alternative highlight method if accessing the view did not work + */ + private static void highlightFallback(PreferenceFragmentCompat prefsFragment, final Preference prefResult) { + final Drawable oldIcon = prefResult.getIcon(); + final boolean oldSpaceReserved = prefResult.isIconSpaceReserved(); + Drawable arrow = AppCompatResources.getDrawable(prefsFragment.getContext(), com.bytehamster.lib.preferencesearch.R.drawable.searchpreference_ic_arrow_right); + int color = getColorFromAttr(prefsFragment.getContext(), android.R.attr.textColorPrimary); + arrow.setColorFilter(color, PorterDuff.Mode.SRC_IN); + prefResult.setIcon(arrow); + prefsFragment.scrollToPreference(prefResult); + new Handler().postDelayed(() -> { + prefResult.setIcon(oldIcon); + prefResult.setIconSpaceReserved(oldSpaceReserved); + }, 1000); + } + + private static int getColorFromAttr(Context context, int attr) { + TypedValue typedValue = new TypedValue(); + Resources.Theme theme = context.getTheme(); + theme.resolveAttribute(attr, typedValue, true); + TypedArray arr = context.obtainStyledAttributes(typedValue.data, new int[]{ + android.R.attr.textColorPrimary}); + int color = arr.getColor(0, 0xff3F51B5); + arr.recycle(); + return color; + } +} diff --git a/app/src/main/res/layout/activity_device_settings.xml b/app/src/main/res/layout/activity_settings.xml similarity index 95% rename from app/src/main/res/layout/activity_device_settings.xml rename to app/src/main/res/layout/activity_settings.xml index c2e4426cd6..46e4c40f52 100644 --- a/app/src/main/res/layout/activity_device_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -4,8 +4,10 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="10dp"> + - \ No newline at end of file + + diff --git a/app/src/main/res/menu/menu_preferences.xml b/app/src/main/res/menu/menu_preferences.xml new file mode 100644 index 0000000000..c67fd1adf4 --- /dev/null +++ b/app/src/main/res/menu/menu_preferences.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/xml/about_user.xml b/app/src/main/res/xml/about_user.xml index 28f47bc021..497029d752 100644 --- a/app/src/main/res/xml/about_user.xml +++ b/app/src/main/res/xml/about_user.xml @@ -24,8 +24,8 @@ android:entries="@array/gender" android:entryValues="@array/gender_values" android:key="activity_user_gender" - android:summary="%s" - android:title="@string/activity_prefs_gender" /> + android:title="@string/activity_prefs_gender" + app:useSimpleSummaryProvider="true" /> - + + android:title="@string/lefun_prefs_interface_language_title" + app:useSimpleSummaryProvider="true" /> diff --git a/app/src/main/res/xml/devicesettings_search.xml b/app/src/main/res/xml/devicesettings_search.xml new file mode 100644 index 0000000000..34db7faaef --- /dev/null +++ b/app/src/main/res/xml/devicesettings_search.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/xml/loyalty_cards.xml b/app/src/main/res/xml/loyalty_cards.xml index 715553ba8d..032b2c1aa4 100644 --- a/app/src/main/res/xml/loyalty_cards.xml +++ b/app/src/main/res/xml/loyalty_cards.xml @@ -1,5 +1,6 @@ - + @@ -9,8 +10,8 @@ android:entries="@array/pref_huami2021_empty_array" android:entryValues="@array/pref_huami2021_empty_array" android:key="loyalty_cards_catima_package" - android:summary="%s" - android:title="@string/loyalty_cards_catima_package" /> + android:title="@string/loyalty_cards_catima_package" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> \ No newline at end of file diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 67d8ad26fa..46894cb3ea 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -3,6 +3,10 @@ xmlns:app="http://schemas.android.com/apk/res-auto" app:iconSpaceReserved="false"> + + + android:icon="@drawable/ic_translate" + app:useSimpleSummaryProvider="true" /> + android:icon="@drawable/ic_straighten" + app:useSimpleSummaryProvider="true" /> + android:title="@string/pref_title_theme" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" />