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" />