From bac1d354797aba1f6474b77a3ed709c6048a16f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Tue, 25 Jul 2023 19:52:12 +0100 Subject: [PATCH] Upgrade notification settings to androidx --- .../AboutUserPreferencesActivity.java | 1 - .../AbstractPreferenceFragment.java | 2 +- .../DiscoveryPairingPreferenceActivity.java | 1 - .../NotificationManagementActivity.java | 191 ++++++++---------- .../charts/ChartsPreferencesActivity.java | 1 + .../DeviceSpecificSettingsFragment.java | 2 +- .../res/xml/notifications_preferences.xml | 100 ++++++--- 7 files changed, 157 insertions(+), 141 deletions(-) rename app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/{charts => }/AbstractPreferenceFragment.java (99%) 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 7c24f760a..046146b4b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AboutUserPreferencesActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AboutUserPreferencesActivity.java @@ -42,7 +42,6 @@ import androidx.preference.Preference; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; -import nodomain.freeyourgadget.gadgetbridge.activities.charts.AbstractPreferenceFragment; import nodomain.freeyourgadget.gadgetbridge.devices.DeviceManager; public class AboutUserPreferencesActivity extends AbstractGBActivity { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractPreferenceFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractPreferenceFragment.java similarity index 99% rename from app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractPreferenceFragment.java rename to app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractPreferenceFragment.java index 08aa41ff0..02eeb644e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractPreferenceFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractPreferenceFragment.java @@ -14,7 +14,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package nodomain.freeyourgadget.gadgetbridge.activities.charts; +package nodomain.freeyourgadget.gadgetbridge.activities; import android.content.SharedPreferences; import android.os.Bundle; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryPairingPreferenceActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryPairingPreferenceActivity.java index 6bbf27205..1b28f8091 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryPairingPreferenceActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryPairingPreferenceActivity.java @@ -22,7 +22,6 @@ import android.os.Bundle; import androidx.fragment.app.Fragment; import nodomain.freeyourgadget.gadgetbridge.R; -import nodomain.freeyourgadget.gadgetbridge.activities.charts.AbstractPreferenceFragment; public class DiscoveryPairingPreferenceActivity extends AbstractGBActivity { @Override 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 16c7037d2..fe891ba04 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/NotificationManagementActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/NotificationManagementActivity.java @@ -1,22 +1,5 @@ -/* Copyright (C) 2015-2020 Andreas Shimokawa, Carsten Pfeiffer, Lem Dulfo, - vanous - - This file is part of Gadgetbridge. - - Gadgetbridge is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Gadgetbridge is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . */ -/* Copyright (C) 2015-2020 Andreas Shimokawa, Carsten Pfeiffer, Lem Dulfo, - vanous +/* Copyright (C) 2015-2023 Andreas Shimokawa, Carsten Pfeiffer, Lem Dulfo, + vanous, José Rebelo This file is part of Gadgetbridge. @@ -35,18 +18,14 @@ package nodomain.freeyourgadget.gadgetbridge.activities; import android.content.Intent; -import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; import android.os.Bundle; -import android.preference.EditTextPreference; -import android.preference.Preference; -import android.preference.PreferenceCategory; -import android.preference.PreferenceManager; import android.provider.Settings; -import android.widget.EditText; -import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,7 +35,7 @@ import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.util.GBPrefs; import nodomain.freeyourgadget.gadgetbridge.util.Prefs; -public class NotificationManagementActivity extends AbstractSettingsActivity { +public class NotificationManagementActivity extends AbstractGBActivity { private static final Logger LOG = LoggerFactory.getLogger(NotificationManagementActivity.class); private static final int RINGTONE_REQUEST_CODE = 4712; private static final String DEFAULT_RINGTONE_URI = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE).toString(); @@ -64,112 +43,114 @@ public class NotificationManagementActivity extends AbstractSettingsActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.notifications_preferences); + setContentView(R.layout.activity_device_settings); + + if (savedInstanceState == null) { + Fragment fragment = getSupportFragmentManager().findFragmentByTag(NotificationPreferencesFragment.FRAGMENT_TAG); + if (fragment == null) { + fragment = new NotificationPreferencesFragment(); + } + getSupportFragmentManager() + .beginTransaction() + .replace(R.id.settings_container, fragment, NotificationPreferencesFragment.FRAGMENT_TAG) + .commit(); + } } - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); + public static class NotificationPreferencesFragment extends AbstractPreferenceFragment { + static final String FRAGMENT_TAG = "NOTIFICATION_PREFERENCES_FRAGMENT"; - Prefs prefs = GBApplication.getPrefs(); - Preference pref = findPreference("notifications_generic"); - pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - public boolean onPreferenceClick(Preference preference) { - Intent enableIntent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); + @Override + protected void onSharedPreferenceChanged(final Preference preference) { + if (GBPrefs.PING_TONE.equals(preference.getKey())) { + try { + final Prefs prefs = GBApplication.getPrefs(); + // This fails on some ROMs. The actual implementation falls-back to an internal ping tone + preference.setSummary(RingtoneManager.getRingtone(requireContext(), Uri.parse(prefs.getString(GBPrefs.PING_TONE, DEFAULT_RINGTONE_URI))).getTitle(requireContext())); + } catch (final Exception e) { + LOG.error("Failed to find the configured ping ringtone", e); + preference.setSummary("-"); + } + } + } + + @Override + public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { + addPreferencesFromResource(R.xml.notifications_preferences); + + Preference pref = findPreference("notifications_generic"); + pref.setOnPreferenceClickListener(preference -> { + final Intent enableIntent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); startActivity(enableIntent); return true; - } - }); + }); - - pref = findPreference(GBPrefs.PING_TONE); - pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); + pref = findPreference(GBPrefs.PING_TONE); + pref.setOnPreferenceClickListener(preference -> { + final Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Set Ping tone"); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_ALL); startActivityForResult(intent, RINGTONE_REQUEST_CODE); return true; - } - }); + }); - try { - // This fails on some ROMs. The actual implementation falls-back to an internal ping tone - pref.setSummary(RingtoneManager.getRingtone(this, Uri.parse(prefs.getString(GBPrefs.PING_TONE, DEFAULT_RINGTONE_URI))).getTitle(this)); - } catch (final Exception e) { - LOG.error("Failed to find the configured ping ringtone"); - pref.setSummary("-"); - } - - pref = findPreference("pref_key_blacklist"); - pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - public boolean onPreferenceClick(Preference preference) { - Intent enableIntent = new Intent(NotificationManagementActivity.this, AppBlacklistActivity.class); + pref = findPreference("pref_key_blacklist"); + pref.setOnPreferenceClickListener(preference -> { + final Intent enableIntent = new Intent(requireContext(), AppBlacklistActivity.class); startActivity(enableIntent); return true; - } - }); + }); - if (!GBApplication.isRunningMarshmallowOrLater()) { - pref = findPreference("notification_filter"); - PreferenceCategory category = (PreferenceCategory) findPreference("pref_key_notifications"); - category.removePreference(pref); - } + pref = findPreference("notifications_settings"); + pref.setOnPreferenceClickListener(preference -> { + if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) { + LOG.warn("This preference should not be displayed in Android < O"); + return true; + } - pref = findPreference("notifications_settings"); - pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - public boolean onPreferenceClick(Preference preference) { - Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS); + final Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName()); + intent.putExtra(Settings.EXTRA_APP_PACKAGE, requireActivity().getPackageName()); //This could open notification channel settings, if needed...: //Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS); //intent.putExtra(Settings.EXTRA_CHANNEL_ID, GB.NOTIFICATION_CHANNEL_ID_TRANSFER); startActivity(intent); return true; + }); + + final PreferenceCategory notificationsCategory = findPreference("pref_key_notifications"); + + if (!GBApplication.isRunningMarshmallowOrLater()) { + pref = findPreference("notification_filter"); + notificationsCategory.removePreference(pref); } - }); - if (GBApplication.isRunningTenOrLater()) { - pref = findPreference("minimize_priority"); - PreferenceCategory category = (PreferenceCategory) findPreference("pref_key_notifications"); - category.removePreference(pref); + if (GBApplication.isRunningTenOrLater()) { + pref = findPreference("minimize_priority"); + notificationsCategory.removePreference(pref); + } + + if (!GBApplication.isRunningOreoOrLater()) { + pref = findPreference("notifications_settings"); + notificationsCategory.removePreference(pref); + } } - if (!GBApplication.isRunningOreoOrLater()) { - pref = findPreference("notifications_settings"); - PreferenceCategory category = (PreferenceCategory) findPreference("pref_key_notifications"); - category.removePreference(pref); - } - } - - - @Override - protected String[] getPreferenceKeysWithSummary() { - return new String[]{ - }; - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent intent) { - if (requestCode == RINGTONE_REQUEST_CODE && intent != null) { - if (intent.getExtras().getParcelable(RingtoneManager.EXTRA_RINGTONE_PICKED_URI) != null) { - Uri uri = intent.getExtras().getParcelable(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); - Ringtone r = RingtoneManager.getRingtone(this, uri); - findPreference(GBPrefs.PING_TONE).setSummary(r.toString()); - - PreferenceManager - .getDefaultSharedPreferences(this) - .edit() - .putString(GBPrefs.PING_TONE, uri.toString()) - .apply(); - findPreference(GBPrefs.PING_TONE).setSummary(r.getTitle(this)); + // TODO: Migrate this to ActivityResultContract + @Override + public void onActivityResult(final int requestCode, final int resultCode, final Intent intent) { + if (requestCode == RINGTONE_REQUEST_CODE && intent != null) { + if (intent.getExtras().getParcelable(RingtoneManager.EXTRA_RINGTONE_PICKED_URI) != null) { + final Uri uri = intent.getExtras().getParcelable(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); + GBApplication.getPrefs() + .getPreferences() + .edit() + .putString(GBPrefs.PING_TONE, uri.toString()) + .apply(); + } } } } - - } 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 6e2a893a7..a1d61e298 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 @@ -27,6 +27,7 @@ import androidx.preference.Preference; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.activities.AboutUserPreferencesActivity; import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBActivity; +import nodomain.freeyourgadget.gadgetbridge.activities.AbstractPreferenceFragment; import nodomain.freeyourgadget.gadgetbridge.util.GBPrefs; public class ChartsPreferencesActivity extends AbstractGBActivity { 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 a991acb6b..944d7b0d1 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 @@ -40,7 +40,7 @@ import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.activities.CalBlacklistActivity; import nodomain.freeyourgadget.gadgetbridge.activities.ConfigureContacts; import nodomain.freeyourgadget.gadgetbridge.activities.ConfigureWorldClocks; -import nodomain.freeyourgadget.gadgetbridge.activities.charts.AbstractPreferenceFragment; +import nodomain.freeyourgadget.gadgetbridge.activities.AbstractPreferenceFragment; import nodomain.freeyourgadget.gadgetbridge.activities.loyaltycards.LoyaltyCardsSettingsActivity; import nodomain.freeyourgadget.gadgetbridge.activities.loyaltycards.LoyaltyCardsSettingsConst; import nodomain.freeyourgadget.gadgetbridge.capabilities.HeartRateCapability; diff --git a/app/src/main/res/xml/notifications_preferences.xml b/app/src/main/res/xml/notifications_preferences.xml index 4f965068a..81a621750 100644 --- a/app/src/main/res/xml/notifications_preferences.xml +++ b/app/src/main/res/xml/notifications_preferences.xml @@ -1,76 +1,92 @@ - + + android:title="@string/pref_header_notifications" + app:iconSpaceReserved="false"> + android:title="@string/pref_title_notifications_generic_settings" + app:iconSpaceReserved="false" /> + android:title="@string/pref_title_notifications_generic" + app:iconSpaceReserved="false" /> - + android:title="@string/pref_title_whenscreenon" + app:iconSpaceReserved="false" /> - + app:iconSpaceReserved="false" /> - + app:iconSpaceReserved="false" /> - + app:iconSpaceReserved="false" /> - + android:title="@string/pref_title_minimize_priority" + app:iconSpaceReserved="false" /> + - + + + android:title="@string/pref_title_support_voip_calls" + app:iconSpaceReserved="false" /> + + app:iconSpaceReserved="false" /> + android:title="@string/pref_title_notifications_sms" + app:iconSpaceReserved="false" /> + android:title="@string/pref_title_notifications_pebblemsg" + app:iconSpaceReserved="false" /> + android:title="@string/pref_title_notifications_timeout" + app:iconSpaceReserved="false" /> - + android:title="@string/pref_title_notification_filter" + app:iconSpaceReserved="false" /> - + + + - + + + android:title="@string/pref_title_notification_media_ignores_application_list" + app:iconSpaceReserved="false" /> + + android:title="@string/pref_applications_settings" + app:iconSpaceReserved="false" /> - + + + + android:title="@string/pref_title_call_privacy_mode" + app:iconSpaceReserved="false" /> + + android:title="@string/pref_title_message_privacy_mode" + app:iconSpaceReserved="false" /> \ No newline at end of file