From aa37f7bdce126ca7f8a2be55e64ee2de7f0dec41 Mon Sep 17 00:00:00 2001 From: Arjan Schrijver Date: Tue, 31 Mar 2026 13:14:52 +0200 Subject: [PATCH] Fossil Q: Move button config to device preferences --- .../qhybrid/QHybridConfigActivity.java | 251 +++--------------- .../qhybrid/QHybridSettingsCustomizer.java | 31 +++ .../devices/qhybrid/QHybridSupport.java | 3 +- .../adapter/fossil/FossilWatchAdapter.java | 26 +- .../res/layout/activity_qhybrid_settings.xml | 45 +--- app/src/main/res/values/arrays.xml | 25 ++ app/src/main/res/values/strings.xml | 3 + ...icesettings_fossilhybridhr_calibration.xml | 2 +- .../main/res/xml/devicesettings_qhybrid.xml | 33 ++- 9 files changed, 141 insertions(+), 278 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/QHybridConfigActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/QHybridConfigActivity.java index f005adfb76..803ccddf92 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/QHybridConfigActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/QHybridConfigActivity.java @@ -17,12 +17,8 @@ along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.devices.qhybrid; -import android.content.BroadcastReceiver; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; -import android.content.IntentFilter; -import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; @@ -32,11 +28,9 @@ import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageView; -import android.widget.LinearLayout; import android.widget.ListView; import android.widget.PopupMenu; import android.widget.RelativeLayout; @@ -45,14 +39,8 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.core.content.ContextCompat; import androidx.localbroadcastmanager.content.LocalBroadcastManager; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; - -import org.json.JSONArray; -import org.json.JSONException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -63,12 +51,8 @@ import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBActivity; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; -import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; -import nodomain.freeyourgadget.gadgetbridge.model.GenericItem; import nodomain.freeyourgadget.gadgetbridge.model.ItemWithDetails; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSupport; -import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter; -import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.buttonconfig.ConfigPayload; import nodomain.freeyourgadget.gadgetbridge.util.GB; import nodomain.freeyourgadget.gadgetbridge.util.NotificationUtils; @@ -82,9 +66,6 @@ public class QHybridConfigActivity extends AbstractGBActivity { final int REQUEST_CODE_ADD_APP = 0; private boolean hasControl = false; - - SharedPreferences prefs; - private GBDevice device; @Override @@ -101,14 +82,6 @@ public class QHybridConfigActivity extends AbstractGBActivity { setContentView(R.layout.activity_qhybrid_settings); -// findViewById(R.id.buttonOverwriteButtons).setOnClickListener(new View.OnClickListener() { -// @Override -// public void onClick(View view) { -// LocalBroadcastManager.getInstance(QHybridConfigActivity.this).sendBroadcast(new Intent(QHybridSupport.QHYBRID_COMMAND_OVERWRITE_BUTTONS)); -// } -// }); - - setTitle(R.string.preferences_qhybrid_settings); ListView appList = findViewById(R.id.qhybrid_appList); @@ -123,76 +96,58 @@ public class QHybridConfigActivity extends AbstractGBActivity { // null is added to indicate the plus button added handled in PackageAdapter#getView list.add(null); appList.setAdapter(adapter = new PackageAdapter(this, R.layout.qhybrid_package_settings_item, list)); - appList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { - @Override - public boolean onItemLongClick(final AdapterView adapterView, View view, final int i, long l) { - PopupMenu menu = new PopupMenu(QHybridConfigActivity.this, view); - menu.getMenu().add(0, 0, 0, "edit"); - menu.getMenu().add(0, 1, 1, "delete"); - menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem menuItem) { - switch (menuItem.getItemId()) { - case 0: { - TimePicker picker = new TimePicker(QHybridConfigActivity.this, (NotificationConfiguration) adapterView.getItemAtPosition(i)); - picker.finishListener = new TimePicker.OnFinishListener() { - @Override - public void onFinish(boolean success, NotificationConfiguration config) { - setControl(false, null); - if (success) { - try { - helper.saveNotificationConfiguration(config); - final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_NOTIFICATION_CONFIG_CHANGED); - intent.putExtra(GBDevice.EXTRA_DEVICE, device); - LocalBroadcastManager.getInstance(QHybridConfigActivity.this).sendBroadcast(intent); - } catch (Exception e) { - GB.toast("error saving notification", Toast.LENGTH_SHORT, GB.ERROR, e); - } - refreshList(); - } - } - }; - picker.handsListener = QHybridConfigActivity.this::setHands; - picker.vibrationListener = QHybridConfigActivity.this::vibrate; - setControl(true, picker.getSettings()); - break; - } - case 1: { + appList.setOnItemLongClickListener((adapterView, view, i, l) -> { + PopupMenu menu = new PopupMenu(QHybridConfigActivity.this, view); + menu.getMenu().add(0, 0, 0, "edit"); + menu.getMenu().add(0, 1, 1, "delete"); + menu.setOnMenuItemClickListener(menuItem -> { + switch (menuItem.getItemId()) { + case 0: { + TimePicker picker = new TimePicker(QHybridConfigActivity.this, (NotificationConfiguration) adapterView.getItemAtPosition(i)); + picker.finishListener = (success, config) -> { + setControl(false, null); + if (success) { try { - helper.deleteNotificationConfiguration((NotificationConfiguration) adapterView.getItemAtPosition(i)); + helper.saveNotificationConfiguration(config); final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_NOTIFICATION_CONFIG_CHANGED); intent.putExtra(GBDevice.EXTRA_DEVICE, device); LocalBroadcastManager.getInstance(QHybridConfigActivity.this).sendBroadcast(intent); } catch (Exception e) { - GB.toast("error deleting setting", Toast.LENGTH_SHORT, GB.ERROR, e); + GB.toast("error saving notification", Toast.LENGTH_SHORT, GB.ERROR, e); } refreshList(); - break; } - } - return true; + }; + picker.handsListener = QHybridConfigActivity.this::setHands; + picker.vibrationListener = QHybridConfigActivity.this::vibrate; + setControl(true, picker.getSettings()); + break; } - }); - menu.show(); + case 1: { + try { + helper.deleteNotificationConfiguration((NotificationConfiguration) adapterView.getItemAtPosition(i)); + final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_NOTIFICATION_CONFIG_CHANGED); + intent.putExtra(GBDevice.EXTRA_DEVICE, device); + LocalBroadcastManager.getInstance(QHybridConfigActivity.this).sendBroadcast(intent); + } catch (Exception e) { + GB.toast("error deleting setting", Toast.LENGTH_SHORT, GB.ERROR, e); + } + refreshList(); + break; + } + } return true; - } + }); + menu.show(); + return true; }); - appList.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - Intent notificationIntent = new Intent(QHybridSupport.QHYBRID_COMMAND_NOTIFICATION); - notificationIntent.putExtra(GBDevice.EXTRA_DEVICE, device); - notificationIntent.putExtra("CONFIG", (NotificationConfiguration) adapterView.getItemAtPosition(i)); - LocalBroadcastManager.getInstance(QHybridConfigActivity.this).sendBroadcast(notificationIntent); - } + appList.setOnItemClickListener((adapterView, view, i, l) -> { + Intent notificationIntent = new Intent(QHybridSupport.QHYBRID_COMMAND_NOTIFICATION); + notificationIntent.putExtra(GBDevice.EXTRA_DEVICE, device); + notificationIntent.putExtra("CONFIG", (NotificationConfiguration) adapterView.getItemAtPosition(i)); + LocalBroadcastManager.getInstance(QHybridConfigActivity.this).sendBroadcast(notificationIntent); }); - - if (device.getType() == DeviceType.FOSSILQHYBRID && device.isInitialized() && device.getFirmwareVersion().charAt(2) == '0') { - updateSettings(); - } else { - setSettingsError(getString(R.string.watch_not_connected)); - } } @NonNull @@ -201,86 +156,6 @@ public class QHybridConfigActivity extends AbstractGBActivity { return deviceInfo != null ? deviceInfo.getDetails() : ""; } - private void setSettingsEnabled(boolean enables) { - findViewById(R.id.settingsLayout).setAlpha(enables ? 1f : 0.2f); - } - - private void updateSettings() { - runOnUiThread(new Runnable() { - @Override - public void run() { - ItemWithDetails item = device.getDeviceInfo(FossilWatchAdapter.ITEM_BUTTONS); - String buttonJson = null; - if(item != null) { - buttonJson = item.getDetails(); - } - try { - JSONArray buttonConfig_; - if (buttonJson == null || buttonJson.isEmpty()) { - buttonConfig_ = new JSONArray(new String[]{"", "", ""}); - }else{ - buttonConfig_ = new JSONArray(buttonJson); - } - - final JSONArray buttonConfig = buttonConfig_; - - LinearLayout buttonLayout = findViewById(R.id.buttonConfigLayout); - buttonLayout.removeAllViews(); -// findViewById(R.id.buttonOverwriteButtons).setVisibility(View.GONE); - final ConfigPayload[] payloads = ConfigPayload.values(); - final String[] names = new String[payloads.length]; - for (int i = 0; i < payloads.length; i++) - names[i] = payloads[i].getDescription(); - for (int i = 0; i < buttonConfig.length(); i++) { - final int currentIndex = i; - String configName = buttonConfig.getString(i); - TextView buttonTextView = new TextView(QHybridConfigActivity.this); - buttonTextView.setTextSize(20); - try { - ConfigPayload payload = ConfigPayload.valueOf(configName); - buttonTextView.setText("Button " + (i + 1) + ": " + payload.getDescription()); - } catch (IllegalArgumentException e) { - buttonTextView.setText("Button " + (i + 1) + ": Unknown"); - } - - buttonTextView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - AlertDialog dialog = new MaterialAlertDialogBuilder(QHybridConfigActivity.this) - .setItems(names, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - ConfigPayload selected = payloads[which]; - - try { - buttonConfig.put(currentIndex, selected.toString()); - device.addDeviceInfo(new GenericItem(FossilWatchAdapter.ITEM_BUTTONS, buttonConfig.toString())); - updateSettings(); - Intent buttonIntent = new Intent(QHybridSupport.QHYBRID_COMMAND_OVERWRITE_BUTTONS); - buttonIntent.putExtra(GBDevice.EXTRA_DEVICE, device); - buttonIntent.putExtra(FossilWatchAdapter.ITEM_BUTTONS, buttonConfig.toString()); - LocalBroadcastManager.getInstance(QHybridConfigActivity.this).sendBroadcast(buttonIntent); - } catch (JSONException e) { - LOG.error("Failed to update button config", e); - } - } - }) - .setTitle("Button " + (currentIndex + 1)) - .create(); - dialog.show(); - } - }); - - buttonLayout.addView(buttonTextView); - } - } catch (JSONException e) { - GB.toast("error parsing button config", Toast.LENGTH_LONG, GB.ERROR, e); - } - } - }); - } - private void setControl(boolean control, NotificationConfiguration config) { if (hasControl == control) return; Intent intent = new Intent(control ? QHybridSupport.QHYBRID_COMMAND_CONTROL : QHybridSupport.QHYBRID_COMMAND_UNCONTROL); @@ -326,16 +201,6 @@ public class QHybridConfigActivity extends AbstractGBActivity { protected void onResume() { super.onResume(); refreshList(); - ContextCompat.registerReceiver(this, buttonReceiver, new IntentFilter(QHybridSupport.QHYBRID_EVENT_BUTTON_PRESS), ContextCompat.RECEIVER_NOT_EXPORTED); - LocalBroadcastManager.getInstance(this).registerReceiver(fileReceiver, new IntentFilter(QHybridSupport.QHYBRID_EVENT_FILE_UPLOADED)); - } - - @Override - protected void onPause() { - super.onPause(); - unregisterReceiver(buttonReceiver); - LocalBroadcastManager.getInstance(this).unregisterReceiver(settingsReceiver); - LocalBroadcastManager.getInstance(this).unregisterReceiver(fileReceiver); } @Override @@ -354,17 +219,6 @@ public class QHybridConfigActivity extends AbstractGBActivity { return super.onOptionsItemSelected(item); } - private void setSettingsError(final String error) { - runOnUiThread(new Runnable() { - @Override - public void run() { - setSettingsEnabled(false); - findViewById(R.id.settingsErrorText).setVisibility(View.VISIBLE); - ((TextView) findViewById(R.id.settingsErrorText)).setText(error); - } - }); - } - class PackageAdapter extends ArrayAdapter { PackageAdapter(@NonNull Context context, int resource, @NonNull List objects) { super(context, resource, objects); @@ -430,31 +284,4 @@ public class QHybridConfigActivity extends AbstractGBActivity { return view; } } - - BroadcastReceiver fileReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - boolean error = intent.getBooleanExtra("EXTRA_ERROR", false); - if (error) { - GB.toast(getString(R.string.qhybrid_buttons_overwrite_error), Toast.LENGTH_SHORT, GB.ERROR); - return; - } - GB.toast(getString(R.string.qhybrid_buttons_overwrite_success), Toast.LENGTH_SHORT, GB.INFO); - } - }; - - BroadcastReceiver buttonReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - GB.toast("Button " + intent.getIntExtra("BUTTON", -1) + " pressed", Toast.LENGTH_SHORT, GB.INFO); - } - }; - - BroadcastReceiver settingsReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - GB.toast("Setting updated", Toast.LENGTH_SHORT, GB.INFO); - updateSettings(); - } - }; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/QHybridSettingsCustomizer.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/QHybridSettingsCustomizer.java index 026a6e299d..a28e19e1bb 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/QHybridSettingsCustomizer.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/QHybridSettingsCustomizer.java @@ -10,6 +10,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import androidx.preference.ListPreference; import androidx.preference.Preference; import com.google.android.material.dialog.MaterialAlertDialogBuilder; @@ -48,6 +49,36 @@ public class QHybridSettingsCustomizer implements DeviceSpecificSettingsCustomiz }); } + final ListPreference upperButtonPref = handler.findPreference("top_button_function"); + if (upperButtonPref != null) { + upperButtonPref.setOnPreferenceChangeListener((preference, newValue) -> { + final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_OVERWRITE_BUTTONS); + intent.putExtra(GBDevice.EXTRA_DEVICE, handler.getDevice()); + LocalBroadcastManager.getInstance(handler.getContext()).sendBroadcast(intent); + return true; + }); + } + + final ListPreference middleButtonPref = handler.findPreference("middle_button_function"); + if (middleButtonPref != null) { + middleButtonPref.setOnPreferenceChangeListener((preference, newValue) -> { + final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_OVERWRITE_BUTTONS); + intent.putExtra(GBDevice.EXTRA_DEVICE, handler.getDevice()); + LocalBroadcastManager.getInstance(handler.getContext()).sendBroadcast(intent); + return true; + }); + } + + final ListPreference bottomButtonPref = handler.findPreference("bottom_button_function"); + if (bottomButtonPref != null) { + bottomButtonPref.setOnPreferenceChangeListener((preference, newValue) -> { + final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_OVERWRITE_BUTTONS); + intent.putExtra(GBDevice.EXTRA_DEVICE, handler.getDevice()); + LocalBroadcastManager.getInstance(handler.getContext()).sendBroadcast(intent); + return true; + }); + } + final Preference calibrationPref = handler.findPreference("pref_key_qhybrid_calibration"); if (calibrationPref != null) { calibrationPref.setOnPreferenceClickListener(preference -> { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/QHybridSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/QHybridSupport.java index 14ced2c569..8f5fa84c59 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/QHybridSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/QHybridSupport.java @@ -256,8 +256,7 @@ public class QHybridSupport extends QHybridBaseSupport { break; } case QHYBRID_COMMAND_OVERWRITE_BUTTONS: { - String buttonConfig = intent.getStringExtra(FossilWatchAdapter.ITEM_BUTTONS); - watchAdapter.overwriteButtons(buttonConfig); + watchAdapter.overwriteButtons(null); break; } case QHYBRID_COMMAND_NOTIFICATION_CONFIG_CHANGED: { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil/FossilWatchAdapter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil/FossilWatchAdapter.java index 9273bcb5a5..861917a7b4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil/FossilWatchAdapter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil/FossilWatchAdapter.java @@ -109,11 +109,9 @@ public class FossilWatchAdapter extends WatchAdapter { private int MTU = 23; private final String ITEM_MTU = "MTU: "; - static public final String ITEM_BUTTONS = "BUTTONS: "; private final String CONFIG_ITEM_VIBRATION_STRENGTH = "vibration_strength"; private final String CONFIG_ITEM_TIMEZONE_OFFSET = "timezone_offset"; - public final String CONFIG_ITEM_BUTTONS = "buttons"; private int lastButtonIndex = -1; protected boolean saveRawActivityFiles = false; @@ -227,9 +225,7 @@ public class FossilWatchAdapter extends WatchAdapter { } private void syncButtonSettings() { - String buttonConfig = getDeviceSpecificPreferences().getString(CONFIG_ITEM_BUTTONS, null); - getDeviceSupport().getDevice().addDeviceInfo(new GenericItem(ITEM_BUTTONS, buttonConfig)); - overwriteButtons(buttonConfig); + overwriteButtons(null); } @Override @@ -360,16 +356,16 @@ public class FossilWatchAdapter extends WatchAdapter { @Override public void overwriteButtons(String jsonConfigString) { try { - if (jsonConfigString == null) return; - getDeviceSpecificPreferences() - .edit() - .putString(CONFIG_ITEM_BUTTONS, jsonConfigString) - .apply(); - JSONArray buttonConfigJson = new JSONArray(jsonConfigString); - // JSONArray buttonConfigJson = new JSONArray(getDeviceSupport().getDevice().getDeviceInfo(ITEM_BUTTONS).getDetails()); + String upperButtonFunction = getDeviceSpecificPreferences().getString("top_button_function", ""); + String middleButtonFunction = getDeviceSpecificPreferences().getString("middle_button_function", ""); + String bottomButtonFunction = getDeviceSpecificPreferences().getString("bottom_button_function", ""); + JSONArray buttonConfigJson = new JSONArray(); + buttonConfigJson.put(upperButtonFunction); + buttonConfigJson.put(middleButtonFunction); + buttonConfigJson.put(bottomButtonFunction); + LOG.info("overwriteButtons: " + buttonConfigJson); ConfigPayload[] payloads = new ConfigPayload[buttonConfigJson.length()]; - for (int i = 0; i < buttonConfigJson.length(); i++) { try { payloads[i] = ConfigPayload.valueOf(buttonConfigJson.getString(i)); @@ -380,7 +376,7 @@ public class FossilWatchAdapter extends WatchAdapter { ConfigFileBuilder builder = new ConfigFileBuilder(payloads); - FilePutRequest fileUploadRequets = new FilePutRequest(FileHandle.SETTINGS_BUTTONS, builder.build(true), this) { + FilePutRequest fileUploadRequest = new FilePutRequest(FileHandle.SETTINGS_BUTTONS, builder.build(true), this) { @Override public void onFilePut(boolean success) { if (success) @@ -388,7 +384,7 @@ public class FossilWatchAdapter extends WatchAdapter { else LOG.error("error overwriting button settings"); } }; - queueWrite(fileUploadRequets); + queueWrite(fileUploadRequest); } catch (JSONException e) { LOG.error("error", e); } diff --git a/app/src/main/res/layout/activity_qhybrid_settings.xml b/app/src/main/res/layout/activity_qhybrid_settings.xml index d9bfef1249..c7cba55951 100644 --- a/app/src/main/res/layout/activity_qhybrid_settings.xml +++ b/app/src/main/res/layout/activity_qhybrid_settings.xml @@ -5,52 +5,9 @@ android:layout_height="match_parent" android:layout_margin="5dp"> - - - - - - - - - - - - - - - + android:layout_height="match_parent" /> \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 7ebe8f9867..8f6651d078 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -5438,4 +5438,29 @@ @string/health_connect_initial_sync_all + + Forward to phone + Forward to phone (multifunction) + Stopwatch + Date + Last notification + Second timezone + Volume up + Volume down + Step goal progress + + + + + FORWARD_TO_PHONE + FORWARD_TO_PHONE_MULTI + STOPWATCH + DATE + LAST_NOTIFICATION + SECOND_TIMEZONE + VOLUME_UP + VOLUME_DOWN + STEP_GOAL_COMPLETION + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6d88a496c1..ddcae88e0b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4711,4 +4711,7 @@ Sleep data from Gadgetbridge device: %1$s. Filesystem access is disabled in InfiniTime Performing action %d of %d\n%s %s + Top button function + Middle button function + Bottom button function diff --git a/app/src/main/res/xml/devicesettings_fossilhybridhr_calibration.xml b/app/src/main/res/xml/devicesettings_fossilhybridhr_calibration.xml index ebbf2ca43f..430a2e49fa 100644 --- a/app/src/main/res/xml/devicesettings_fossilhybridhr_calibration.xml +++ b/app/src/main/res/xml/devicesettings_fossilhybridhr_calibration.xml @@ -4,7 +4,7 @@ diff --git a/app/src/main/res/xml/devicesettings_qhybrid.xml b/app/src/main/res/xml/devicesettings_qhybrid.xml index 559bf02790..051e2d25d4 100644 --- a/app/src/main/res/xml/devicesettings_qhybrid.xml +++ b/app/src/main/res/xml/devicesettings_qhybrid.xml @@ -1,23 +1,48 @@ - + + + + + + + + android:icon="@drawable/ic_notifications" /> + android:icon="@drawable/ic_access_time" /> + android:icon="@drawable/ic_access_time" />