Redmi Buds 6 Active: add (almost all) the missing features

This commit is contained in:
iNeedADoctor
2026-03-24 00:56:37 +01:00
parent 36e23fe08c
commit 2ac3556310
9 changed files with 327 additions and 0 deletions
@@ -466,6 +466,16 @@ public class DeviceSettingsPreferenceConst {
public static final String PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_16k="pref_redmi_buds_5_pro_equalizer_band_16k";
public static final String PREF_REDMI_BUDS_5_PRO_ADAPTIVE_SOUND="pref_redmi_buds_5_pro_adaptive_sound";
public static final String PREF_REDMI_BUDS_6_ACTIVE_CONTROL_SINGLE_TAP_LEFT="pref_redmi_buds_6_active_control_single_tap_left";
public static final String PREF_REDMI_BUDS_6_ACTIVE_CONTROL_SINGLE_TAP_RIGHT="pref_redmi_buds_6_active_control_single_tap_right";
public static final String PREF_REDMI_BUDS_6_ACTIVE_CONTROL_DOUBLE_TAP_LEFT="pref_redmi_buds_6_active_control_double_tap_left";
public static final String PREF_REDMI_BUDS_6_ACTIVE_CONTROL_DOUBLE_TAP_RIGHT="pref_redmi_buds_6_active_control_double_tap_right";
public static final String PREF_REDMI_BUDS_6_ACTIVE_CONTROL_TRIPLE_TAP_LEFT="pref_redmi_buds_6_active_control_triple_tap_left";
public static final String PREF_REDMI_BUDS_6_ACTIVE_CONTROL_TRIPLE_TAP_RIGHT="pref_redmi_buds_6_active_control_triple_tap_right";
public static final String PREF_REDMI_BUDS_6_ACTIVE_CONTROL_LONG_TAP_MODE_LEFT="pref_redmi_buds_6_active_control_long_tap_mode_left";
public static final String PREF_REDMI_BUDS_6_ACTIVE_CONTROL_LONG_TAP_MODE_RIGHT="pref_redmi_buds_6_active_control_long_tap_mode_right";
public static final String PREF_REDMI_BUDS_6_ACTIVE_EQUALIZER_PRESET="pref_redmi_buds_6_active_equalizer_preset";
public static final String PREF_SONY_AUDIO_CODEC = "pref_sony_audio_codec";
public static final String PREF_SONY_PROTOCOL_VERSION = "pref_protocol_version";
public static final String PREF_SONY_ACTUAL_PROTOCOL_VERSION = "pref_actual_protocol_version";
@@ -812,6 +812,16 @@ public class DeviceSpecificSettingsFragment extends AbstractPreferenceFragment i
addPreferenceHandlerFor(PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_12k);
addPreferenceHandlerFor(PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_16k);
addPreferenceHandlerFor(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_SINGLE_TAP_LEFT);
addPreferenceHandlerFor(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_SINGLE_TAP_RIGHT);
addPreferenceHandlerFor(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_DOUBLE_TAP_LEFT);
addPreferenceHandlerFor(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_DOUBLE_TAP_RIGHT);
addPreferenceHandlerFor(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_TRIPLE_TAP_LEFT);
addPreferenceHandlerFor(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_TRIPLE_TAP_RIGHT);
addPreferenceHandlerFor(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_LONG_TAP_MODE_LEFT );
addPreferenceHandlerFor(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_LONG_TAP_MODE_RIGHT );
addPreferenceHandlerFor(PREF_REDMI_BUDS_6_ACTIVE_EQUALIZER_PRESET);
addPreferenceHandlerFor(PREF_SONY_AMBIENT_SOUND_CONTROL);
addPreferenceHandlerFor(PREF_SONY_AMBIENT_SOUND_CONTROL_BUTTON_MODE);
addPreferenceHandlerFor(PREF_SONY_FOCUS_VOICE);
@@ -1,8 +1,16 @@
package nodomain.freeyourgadget.gadgetbridge.devices.redmibuds;
import androidx.annotation.NonNull;
import java.util.regex.Pattern;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSpecificSettings;
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSpecificSettingsCustomizer;
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSpecificSettingsScreen;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.service.DeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.redmibuds.RedmiBuds6ActiveDeviceSupport;
public class RedmiBuds6ActiveCoordinator extends AbstractRedmiBudsCoordinator {
@@ -15,4 +23,24 @@ public class RedmiBuds6ActiveCoordinator extends AbstractRedmiBudsCoordinator {
protected Pattern getSupportedDeviceName() {
return Pattern.compile("Redmi Buds 6 Active");
}
@NonNull
@Override
public Class<? extends DeviceSupport> getDeviceSupportClass(final GBDevice device) {
return RedmiBuds6ActiveDeviceSupport.class;
}
@Override
public DeviceSpecificSettings getDeviceSpecificSettings(final GBDevice device) {
final DeviceSpecificSettings deviceSpecificSettings = new DeviceSpecificSettings();
deviceSpecificSettings.addRootScreen(R.xml.devicesettings_redmibuds6active_sound);
deviceSpecificSettings.addRootScreen(R.xml.devicesettings_redmibuds6active_gestures);
deviceSpecificSettings.addSubScreen(DeviceSpecificSettingsScreen.CALLS_AND_NOTIFICATIONS);
return deviceSpecificSettings;
}
@Override
public DeviceSpecificSettingsCustomizer getDeviceSpecificSettingsCustomizer(final GBDevice device) {
return new RedmiBudsSettingsCustomizer(device);
}
}
@@ -0,0 +1,10 @@
package nodomain.freeyourgadget.gadgetbridge.service.devices.redmibuds;
import nodomain.freeyourgadget.gadgetbridge.service.serial.GBDeviceIoThread;
public class RedmiBuds6ActiveDeviceSupport extends RedmiBudsDeviceSupport {
@Override
protected RedmiBuds6ActiveProtocol createDeviceProtocol() {
return new RedmiBuds6ActiveProtocol(getDevice());
}
}
@@ -0,0 +1,102 @@
package nodomain.freeyourgadget.gadgetbridge.service.devices.redmibuds;
// EQ
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_6_ACTIVE_EQUALIZER_PRESET;
// SINGLE_TAP
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_6_ACTIVE_CONTROL_SINGLE_TAP_LEFT;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_6_ACTIVE_CONTROL_SINGLE_TAP_RIGHT;
// DOUBLE_TAP
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_6_ACTIVE_CONTROL_DOUBLE_TAP_LEFT;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_6_ACTIVE_CONTROL_DOUBLE_TAP_RIGHT;
// TRIPLE_TAP
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_6_ACTIVE_CONTROL_TRIPLE_TAP_LEFT;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_6_ACTIVE_CONTROL_TRIPLE_TAP_RIGHT;
// LONG_TAP
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_6_ACTIVE_CONTROL_LONG_TAP_MODE_LEFT;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_6_ACTIVE_CONTROL_LONG_TAP_MODE_RIGHT;
import static nodomain.freeyourgadget.gadgetbridge.util.GB.hexdump;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import nodomain.freeyourgadget.gadgetbridge.devices.redmibuds.prefs.Configuration;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.devices.redmibuds.prefs.Gestures.InteractionType;
import nodomain.freeyourgadget.gadgetbridge.devices.redmibuds.prefs.Gestures.Position;
import nodomain.freeyourgadget.gadgetbridge.devices.redmibuds.prefs.Configuration.Config;
public class RedmiBuds6ActiveProtocol extends RedmiBudsProtocol {
private static final Logger LOG = LoggerFactory.getLogger(RedmiBuds6ActiveProtocol.class);
protected RedmiBuds6ActiveProtocol(GBDevice device) {
super(device);
}
@Override
public byte[] encodeSendConfiguration(String config) {
switch (config) {
case PREF_REDMI_BUDS_6_ACTIVE_CONTROL_SINGLE_TAP_LEFT:
return encodeSetGesture(config, InteractionType.SINGLE, Position.LEFT);
case PREF_REDMI_BUDS_6_ACTIVE_CONTROL_SINGLE_TAP_RIGHT:
return encodeSetGesture(config, InteractionType.SINGLE, Position.RIGHT);
case PREF_REDMI_BUDS_6_ACTIVE_CONTROL_DOUBLE_TAP_LEFT:
return encodeSetGesture(config, InteractionType.DOUBLE, Position.LEFT);
case PREF_REDMI_BUDS_6_ACTIVE_CONTROL_DOUBLE_TAP_RIGHT:
return encodeSetGesture(config, InteractionType.DOUBLE, Position.RIGHT);
case PREF_REDMI_BUDS_6_ACTIVE_CONTROL_TRIPLE_TAP_LEFT:
return encodeSetGesture(config, InteractionType.TRIPLE, Position.LEFT);
case PREF_REDMI_BUDS_6_ACTIVE_CONTROL_TRIPLE_TAP_RIGHT:
return encodeSetGesture(config, InteractionType.TRIPLE, Position.RIGHT);
case PREF_REDMI_BUDS_6_ACTIVE_CONTROL_LONG_TAP_MODE_LEFT:
return encodeSetGesture(config, InteractionType.LONG, Position.LEFT);
case PREF_REDMI_BUDS_6_ACTIVE_CONTROL_LONG_TAP_MODE_RIGHT:
return encodeSetGesture(config, InteractionType.LONG, Position.RIGHT);
case PREF_REDMI_BUDS_6_ACTIVE_EQUALIZER_PRESET:
return encodeSetIntegerConfig(config, Config.EQ_PRESET);
default:
LOG.debug("Unsupported config: {}", config);
return null;
}
}
@Override
public void decodeGetConfig(byte[] configPayload) {
if (configPayload.length < 3)
return;
SharedPreferences preferences = getDevicePrefs().getPreferences();
SharedPreferences.Editor editor = preferences.edit();
Configuration.Config config = Configuration.Config.fromCode(configPayload[2]);
switch (config) {
case GESTURES:
// SINGLE_TAP
editor.putString(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_SINGLE_TAP_LEFT, Integer.toString(configPayload[4]));
editor.putString(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_SINGLE_TAP_RIGHT, Integer.toString(configPayload[5]));
// DOUBLE_TAP
editor.putString(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_DOUBLE_TAP_LEFT, Integer.toString(configPayload[7]));
editor.putString(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_DOUBLE_TAP_RIGHT, Integer.toString(configPayload[8]));
// TRIPLE_TAP
editor.putString(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_TRIPLE_TAP_LEFT, Integer.toString(configPayload[10]));
editor.putString(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_TRIPLE_TAP_RIGHT, Integer.toString(configPayload[11]));
// LONG_TAP
editor.putString(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_LONG_TAP_MODE_LEFT, Integer.toString(configPayload[13]));
editor.putString(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_LONG_TAP_MODE_RIGHT, Integer.toString(configPayload[14]));
break;
case EQ_PRESET:
editor.putString(PREF_REDMI_BUDS_6_ACTIVE_EQUALIZER_PRESET, Integer.toString(configPayload[3]));
break;
default:
LOG.debug("Unhandled device update: {}", hexdump(configPayload));
}
editor.apply();
}
}
+58
View File
@@ -3956,6 +3956,64 @@
<item>6</item>
</string-array>
<string-array name="redmi_buds_6_active_single_button_function_names">
<item>@string/none</item>
<item>@string/pref_media_playpause</item>
<item>@string/pref_media_previous</item>
<item>@string/pref_media_next</item>
<item>@string/pref_media_volumeup</item>
<item>@string/pref_media_volumedown</item>
</string-array>
<string-array name="redmi_buds_6_active_single_button_function_values">
<item>8</item>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
</string-array>
<string-array name="redmi_buds_6_active_button_function_names">
<item>@string/pref_media_playpause</item>
<item>@string/pref_media_previous</item>
<item>@string/pref_media_next</item>
<item>@string/pref_media_volumeup</item>
<item>@string/pref_media_volumedown</item>
</string-array>
<string-array name="redmi_buds_6_active_button_function_values">
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
</string-array>
<string-array name="redmi_buds_6_active_long_button_mode_names">
<item>@string/pref_title_touch_voice_assistant</item>
</string-array>
<string-array name="redmi_buds_6_active_long_button_mode_values">
<item>0</item>
</string-array>
<string-array name="redmi_buds_6_active_equalizer_presets_names">
<item>@string/redmi_buds_5_pro_anc_balanced</item>
<item>@string/redmi_buds_5_pro_equalizer_preset_treble</item>
<item>@string/redmi_buds_5_pro_equalizer_preset_bass</item>
<item>@string/redmi_buds_5_pro_equalizer_preset_voice</item>
<item>@string/redmi_buds_6_active_equalizer_preset_volume</item>
</string-array>
<string-array name="redmi_buds_6_active_equalizer_presets_values">
<item>0</item>
<item>6</item>
<item>5</item>
<item>1</item>
<item>7</item>
</string-array>
<string-array name="earfun_ambient_sound_control_names">
<item>@string/sony_ambient_sound_off</item>
<item>@string/sony_ambient_sound_noise_cancelling</item>
+1
View File
@@ -3282,6 +3282,7 @@
<string name="redmi_buds_5_pro_equalizer_4">4 dB</string>
<string name="redmi_buds_5_pro_equalizer_5">5 dB</string>
<string name="redmi_buds_5_pro_equalizer_6">6 dB</string>
<string name="redmi_buds_6_active_equalizer_preset_volume">Boost Volume</string>
<string name="sony_ambient_sound">Mode</string>
<string name="sony_ambient_sound_off">Off</string>
<string name="sony_ambient_sound_noise_cancelling">Noise Cancelling</string>
@@ -0,0 +1,89 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory
android:key="pref_key_header_redmibuds6active_system"
android:title="@string/pref_header_system">
<PreferenceScreen
android:icon="@drawable/ic_touch"
android:key="pref_screen_redmibuds6active_touch_options"
android:persistent="false"
android:title="@string/prefs_galaxy_touch_options">
<PreferenceCategory android:title="@string/single_tap">
<ListPreference
android:entries="@array/redmi_buds_6_active_single_button_function_names"
android:entryValues="@array/redmi_buds_6_active_single_button_function_values"
android:icon="@drawable/ic_filter_1"
android:defaultValue="8"
android:key="pref_redmi_buds_6_active_control_single_tap_left"
app:useSimpleSummaryProvider="true"
android:title="@string/prefs_left" />
<ListPreference
android:entries="@array/redmi_buds_6_active_single_button_function_names"
android:entryValues="@array/redmi_buds_6_active_single_button_function_values"
android:defaultValue="8"
android:key="pref_redmi_buds_6_active_control_single_tap_right"
app:useSimpleSummaryProvider="true"
android:title="@string/prefs_right" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/double_tap">
<ListPreference
android:entries="@array/redmi_buds_6_active_button_function_names"
android:entryValues="@array/redmi_buds_6_active_button_function_values"
android:icon="@drawable/ic_filter_2"
android:defaultValue="1"
android:key="pref_redmi_buds_6_active_control_double_tap_left"
app:useSimpleSummaryProvider="true"
android:title="@string/prefs_left" />
<ListPreference
android:entries="@array/redmi_buds_6_active_button_function_names"
android:entryValues="@array/redmi_buds_6_active_button_function_values"
android:defaultValue="1"
android:key="pref_redmi_buds_6_active_control_double_tap_right"
app:useSimpleSummaryProvider="true"
android:title="@string/prefs_right" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/triple_tap">
<ListPreference
android:entries="@array/redmi_buds_6_active_button_function_names"
android:entryValues="@array/redmi_buds_6_active_button_function_values"
android:icon="@drawable/ic_filter_3"
android:defaultValue="2"
android:key="pref_redmi_buds_6_active_control_triple_tap_left"
app:useSimpleSummaryProvider="true"
android:title="@string/prefs_left" />
<ListPreference
android:entries="@array/redmi_buds_6_active_button_function_names"
android:entryValues="@array/redmi_buds_6_active_button_function_values"
android:defaultValue="3"
android:key="pref_redmi_buds_6_active_control_triple_tap_right"
app:useSimpleSummaryProvider="true"
android:title="@string/prefs_right" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/long_press">
<ListPreference
android:entries="@array/redmi_buds_6_active_long_button_mode_names"
android:entryValues="@array/redmi_buds_6_active_long_button_mode_values"
android:icon="@drawable/ic_touch"
android:defaultValue="6"
android:key="pref_redmi_buds_6_active_control_long_tap_mode_left"
app:useSimpleSummaryProvider="true"
android:title="@string/sony_button_mode_left" />
<ListPreference
android:entries="@array/redmi_buds_6_active_long_button_mode_names"
android:entryValues="@array/redmi_buds_6_active_long_button_mode_values"
android:icon="@drawable/ic_touch"
android:defaultValue="6"
android:key="pref_redmi_buds_6_active_control_long_tap_mode_right"
app:useSimpleSummaryProvider="true"
android:title="@string/sony_button_mode_right" />
</PreferenceCategory>
</PreferenceScreen>
</PreferenceCategory>
</androidx.preference.PreferenceScreen>
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory
android:key="pref_key_header_redmibuds6active_sound"
android:title="@string/pref_header_equalizer">
<ListPreference
android:defaultValue="0"
android:entries="@array/redmi_buds_6_active_equalizer_presets_names"
android:entryValues="@array/redmi_buds_6_active_equalizer_presets_values"
android:icon="@drawable/ic_graphic_eq"
android:key="pref_redmi_buds_6_active_equalizer_preset"
app:useSimpleSummaryProvider="true"
android:title="@string/prefs_equalizer_preset" />
</PreferenceCategory>
</androidx.preference.PreferenceScreen>