From a3abd2516ea74a23b4de5474ac0a6d61d29834ef Mon Sep 17 00:00:00 2001 From: Mathias Micheel Date: Fri, 19 Jun 2026 14:02:27 +0200 Subject: [PATCH] Single toggle action, persist state, updated strings Combine start/stop into single toggle action persist state via GBDeviceEventUpdatePreferences added subdivisions as translatable strings changed start/stop strings to generic ones --- .../soundbrenner/SoundbrennerCoordinator.java | 47 +++++++------------ .../soundbrenner/SoundbrennerSupport.java | 34 +++++--------- app/src/main/res/values/arrays.xml | 10 ++-- app/src/main/res/values/strings.xml | 6 ++- 4 files changed, 39 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/soundbrenner/SoundbrennerCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/soundbrenner/SoundbrennerCoordinator.java index 37ed6fce44..7e19975079 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/soundbrenner/SoundbrennerCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/soundbrenner/SoundbrennerCoordinator.java @@ -5,7 +5,7 @@ import androidx.annotation.NonNull; import android.content.Context; import java.util.regex.Pattern; -import java.util.Arrays; +import java.util.Collections; import java.util.List; import nodomain.freeyourgadget.gadgetbridge.GBApplication; @@ -69,26 +69,32 @@ public class SoundbrennerCoordinator extends AbstractBLEDeviceCoordinator { public DeviceSpecificSettingsCustomizer getDeviceSpecificSettingsCustomizer(@NonNull final GBDevice device) { return new SoundbrennerSettingsCustomizer(); } + // ------------------------------------------------------------------------- - // Start/Stop buttons in gadget card + // Start/Stop button in gadget card // ------------------------------------------------------------------------- + // + // The running state is mirrored into the device-specific SharedPreferences + // by SoundbrennerSupport (see persistMetronomeRunning()), so a single + // action can read it and flip its icon/label accordingly instead of + // exposing two separate Start/Stop buttons. @Override public List getCustomActions() { - return Arrays.asList( - - // START + return Collections.singletonList( new DeviceCardAction() { @Override public int getIcon(@NonNull final GBDevice device) { - return R.drawable.ic_play; + return isMetronomeRunning(device) ? R.drawable.ic_stop : R.drawable.ic_play; } @NonNull @Override public String getDescription(@NonNull final GBDevice device, @NonNull final Context context) { - return context.getString(R.string.soundbrenner_action_start); + return isMetronomeRunning(device) + ? context.getString(R.string.stop) + : context.getString(R.string.start); } @Override @@ -96,30 +102,13 @@ public class SoundbrennerCoordinator extends AbstractBLEDeviceCoordinator { @NonNull final Context context) { GBApplication.deviceService(device) .onSendConfiguration( - SoundbrennerConstants.PREF_METRONOME_RUNNING + "_start"); - } - }, - - // STOP - new DeviceCardAction() { - @Override - public int getIcon(@NonNull final GBDevice device) { - return R.drawable.ic_stop; + SoundbrennerConstants.PREF_METRONOME_RUNNING + "_toggle"); } - @NonNull - @Override - public String getDescription(@NonNull final GBDevice device, - @NonNull final Context context) { - return context.getString(R.string.soundbrenner_action_stop); - } - - @Override - public void onClick(@NonNull final GBDevice device, - @NonNull final Context context) { - GBApplication.deviceService(device) - .onSendConfiguration( - SoundbrennerConstants.PREF_METRONOME_RUNNING + "_stop"); + private boolean isMetronomeRunning(@NonNull final GBDevice device) { + return GBApplication + .getDeviceSpecificSharedPrefs(device.getAddress()) + .getBoolean(SoundbrennerConstants.PREF_METRONOME_RUNNING, false); } } ); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/soundbrenner/SoundbrennerSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/soundbrenner/SoundbrennerSupport.java index 5a64ef0fa0..9c042c5c21 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/soundbrenner/SoundbrennerSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/soundbrenner/SoundbrennerSupport.java @@ -15,6 +15,7 @@ import java.nio.ByteOrder; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.devices.soundbrenner.SoundbrennerConstants; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo; +import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventUpdatePreferences; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.BatteryState; import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLESingleDeviceSupport; @@ -159,23 +160,6 @@ public class SoundbrennerSupport extends AbstractBTLESingleDeviceSupport { toggleMetronome(); return; } - // Device-card Start/Stop buttons - if ((SoundbrennerConstants.PREF_METRONOME_RUNNING + "_start").equals(key)) { - try { - startMetronome(); - } catch (IOException e) { - LOG.error("Failed to start metronome", e); - } - return; - } - if ((SoundbrennerConstants.PREF_METRONOME_RUNNING + "_stop").equals(key)) { - try { - stopMetronome(); - } catch (IOException e) { - LOG.error("Failed to stop metronome", e); - } - return; - } boolean isSoundbrennerPref = key.startsWith(SoundbrennerConstants.PREF_SOUNDBRENNER_PREFIX) || key.startsWith(SoundbrennerConstants.PREF_BEAT_ACCENT_PREFIX); @@ -505,11 +489,17 @@ public class SoundbrennerSupport extends AbstractBTLESingleDeviceSupport { } } - /** Persist the running flag so it survives reconnects. */ + /** + * Persist the running flag so it survives reconnects. Goes through + * GBDeviceEventUpdatePreferences (instead of writing SharedPreferences + * directly) so that other listeners relying on this event are notified. + */ private void persistMetronomeRunning(boolean running) { - GBApplication.getDeviceSpecificSharedPrefs(getDevice().getAddress()) - .edit() - .putBoolean(SoundbrennerConstants.PREF_METRONOME_RUNNING, running) - .apply(); + GBDeviceEventUpdatePreferences eventUpdatePreferences = new GBDeviceEventUpdatePreferences(); + eventUpdatePreferences.withPreference( + SoundbrennerConstants.PREF_METRONOME_RUNNING, + running + ); + evaluateGBDeviceEvent(eventUpdatePreferences); } } diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index ccac089e9b..5625c3eae0 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -4563,7 +4563,7 @@ anc_mode__anc_off anc_mode__transparency_off - + 4/4 2/4 @@ -4595,10 +4595,10 @@ - Quarter notes - Eighth notes - Triplets - Sixteenth notes + @string/soundbrenner_pref_subdivision_quarter + @string/soundbrenner_pref_subdivision_eighth + @string/soundbrenner_pref_subdivision_triplet + @string/soundbrenner_pref_subdivision_sixteenth diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4deace22ec..2e413e5704 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3540,8 +3540,6 @@ Control Start/Stop Start or stop metronome - Start - Stop Tempo Time Signature Subdivision @@ -3566,6 +3564,10 @@ Beat 14 Accent Beat 15 Accent Beat 16 Accent + Quarter notes + Eighth notes + Sixteenth notes + Triplets Voice Prompts Button Brightness Low