Adds support for headphones Redmi Buds 3 Pro

This commit is contained in:
Lars Berning
2025-03-15 18:21:24 +00:00
committed by José Rebelo
parent 1dc14551a6
commit d5af0da3f9
9 changed files with 303 additions and 0 deletions
@@ -0,0 +1,44 @@
package nodomain.freeyourgadget.gadgetbridge.devices.xiaomi.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.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.service.DeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.redmibuds.RedmiBuds3ProDeviceSupport;
public class RedmiBuds3ProCoordinator extends AbstractRedmiBudsCoordinator {
@Override
public int getDeviceNameResource() {
return R.string.devicetype_redmi_buds_3_pro;
}
@Override
protected Pattern getSupportedDeviceName() {
return Pattern.compile("Redmi Buds 3 Pro");
}
@NonNull
@Override
public Class<? extends DeviceSupport> getDeviceSupportClass() {
return RedmiBuds3ProDeviceSupport.class;
}
@Override
public DeviceSpecificSettings getDeviceSpecificSettings(final GBDevice device) {
final DeviceSpecificSettings deviceSpecificSettings = new DeviceSpecificSettings();
deviceSpecificSettings.addRootScreen(R.xml.devicesettings_redmibuds3pro_headphones);
deviceSpecificSettings.addRootScreen(R.xml.devicesettings_redmibuds3pro_sound);
deviceSpecificSettings.addRootScreen(R.xml.devicesettings_redmibuds3pro_gestures);
return deviceSpecificSettings;
}
@Override
public DeviceSpecificSettingsCustomizer getDeviceSpecificSettingsCustomizer(final GBDevice device) {
return new RedmiBudsSettingsCustomizer(device);
}
}
@@ -298,6 +298,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.xiaomi.miband9active.MiBand9
import nodomain.freeyourgadget.gadgetbridge.devices.xiaomi.miband9pro.MiBand9ProCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.xiaomi.miwatch.MiWatchLiteCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.xiaomi.miwatchcolorsport.MiWatchColorSportCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.xiaomi.redmibuds.RedmiBuds3ProCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.xiaomi.redmibuds.RedmiBuds4ActiveCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.xiaomi.redmibuds.RedmiBuds5ProCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.xiaomi.redmibuds.RedmiBuds6ActiveCoordinator;
@@ -376,6 +377,7 @@ public enum DeviceType {
MIBAND9PRO(MiBand9ProCoordinator.class),
MIWATCHLITE(MiWatchLiteCoordinator.class),
MIWATCHCOLORSPORT(MiWatchColorSportCoordinator.class),
REDMIBUDS3PRO(RedmiBuds3ProCoordinator.class),
REDMIBUDS4ACTIVE(RedmiBuds4ActiveCoordinator.class),
REDMIBUDS5PRO(RedmiBuds5ProCoordinator.class),
REDMIBUDS6ACTIVE(RedmiBuds6ActiveCoordinator.class),
@@ -0,0 +1,18 @@
package nodomain.freeyourgadget.gadgetbridge.service.devices.redmibuds;
import nodomain.freeyourgadget.gadgetbridge.service.serial.GBDeviceIoThread;
import nodomain.freeyourgadget.gadgetbridge.service.serial.GBDeviceProtocol;
public class RedmiBuds3ProDeviceSupport extends RedmiBudsDeviceSupport {
@Override
protected GBDeviceProtocol createDeviceProtocol() {
return new RedmiBuds3ProProtocol(getDevice());
}
@Override
protected GBDeviceIoThread createDeviceIOThread() {
return new RedmiBudsIOThread(getDevice(), getContext(),
(RedmiBuds3ProProtocol) getDeviceProtocol(),
RedmiBuds3ProDeviceSupport.this, getBluetoothAdapter());
}
}
@@ -0,0 +1,43 @@
package nodomain.freeyourgadget.gadgetbridge.service.devices.redmibuds;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_CONTROL_DOUBLE_TAP_LEFT;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_CONTROL_DOUBLE_TAP_RIGHT;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_CONTROL_LONG_TAP_MODE_LEFT;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_CONTROL_LONG_TAP_MODE_RIGHT;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_CONTROL_TRIPLE_TAP_LEFT;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_CONTROL_TRIPLE_TAP_RIGHT;
import android.content.SharedPreferences;
import nodomain.freeyourgadget.gadgetbridge.devices.xiaomi.redmibuds.prefs.Configuration;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
public class RedmiBuds3ProProtocol extends RedmiBudsProtocol {
protected RedmiBuds3ProProtocol(GBDevice device) {
super(device);
}
@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]);
if (config == Configuration.Config.GESTURES) {
editor.putString(PREF_REDMI_BUDS_5_PRO_CONTROL_DOUBLE_TAP_LEFT, Integer.toString(configPayload[4]));
editor.putString(PREF_REDMI_BUDS_5_PRO_CONTROL_DOUBLE_TAP_RIGHT, Integer.toString(configPayload[5]));
editor.putString(PREF_REDMI_BUDS_5_PRO_CONTROL_TRIPLE_TAP_LEFT, Integer.toString(configPayload[7]));
editor.putString(PREF_REDMI_BUDS_5_PRO_CONTROL_TRIPLE_TAP_RIGHT, Integer.toString(configPayload[8]));
editor.putString(PREF_REDMI_BUDS_5_PRO_CONTROL_LONG_TAP_MODE_LEFT, Integer.toString(configPayload[10]));
editor.putString(PREF_REDMI_BUDS_5_PRO_CONTROL_LONG_TAP_MODE_RIGHT, Integer.toString(configPayload[11]));
editor.apply();
} else {
super.decodeGetConfig(configPayload);
}
}
}
+38
View File
@@ -3397,6 +3397,44 @@
<item>3</item>
</string-array>
<string-array name="redmi_buds_3_pro_equalizer_presets_names">
<item>@string/redmi_buds_5_pro_equalizer_preset_standard</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>
</string-array>
<string-array name="redmi_buds_3_pro_equalizer_presets_values">
<item>0</item>
<item>6</item>
<item>5</item>
<item>1</item>
</string-array>
<string-array name="redmi_buds_3_pro_noise_cancelling_strength_names">
<item>@string/redmi_buds_5_pro_anc_balanced</item>
<item>@string/redmi_buds_5_pro_anc_light</item>
<item>@string/redmi_buds_5_pro_anc_deep</item>
<item>@string/pref_adaptive_noise_cancelling_title</item>
</string-array>
<string-array name="redmi_buds_3_pro_noise_cancelling_strength_values">
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
</string-array>
<string-array name="redmi_buds_3_pro_transparency_strength_names">
<item>@string/redmi_buds_5_pro_transparency_regular</item>
<item>@string/redmi_buds_5_pro_transparency_voice</item>
</string-array>
<string-array name="redmi_buds_3_pro_transparency_strength_values">
<item>0</item>
<item>1</item>
</string-array>
<string-array name="redmi_buds_5_pro_ambient_sound_control_names">
<item>@string/sony_ambient_sound_off</item>
<item>@string/sony_ambient_sound_noise_cancelling</item>
+1
View File
@@ -1941,6 +1941,7 @@
<string name="devicetype_xiaomi_watch_lite">Xiaomi Watch Lite</string>
<string name="devicetype_redmiwatch3active">Redmi Watch 3 Active</string>
<string name="devicetype_redmiwatch3">Redmi Watch 3</string>
<string name="devicetype_redmi_buds_3_pro">Redmi Buds 3 Pro</string>
<string name="devicetype_redmi_buds_4_active">Redmi Buds 4 Active</string>
<string name="devicetype_redmi_buds_5_pro">Redmi Buds 5 Pro</string>
<string name="devicetype_redmi_buds_6_active">Redmi Buds 6 Active</string>
@@ -0,0 +1,105 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:key="pref_key_header_redmibuds5pro_system"
android:title="@string/pref_header_system">
<PreferenceScreen
android:icon="@drawable/ic_touch"
android:key="pref_screen_redmibuds5pro_touch_options"
android:persistent="false"
android:title="@string/prefs_galaxy_touch_options">
<PreferenceCategory android:title="@string/double_tap">
<ListPreference
android:entries="@array/redmi_buds_5_pro_button_function_names"
android:entryValues="@array/redmi_buds_5_pro_button_function_values"
android:icon="@drawable/ic_filter_2"
android:defaultValue="1"
android:key="pref_redmi_buds_5_pro_control_double_tap_left"
android:summary="%s"
android:title="@string/prefs_left" />
<ListPreference
android:entries="@array/redmi_buds_5_pro_button_function_names"
android:entryValues="@array/redmi_buds_5_pro_button_function_values"
android:defaultValue="1"
android:key="pref_redmi_buds_5_pro_control_double_tap_right"
android:summary="%s"
android:title="@string/prefs_right" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/triple_tap">
<ListPreference
android:entries="@array/redmi_buds_5_pro_button_function_names"
android:entryValues="@array/redmi_buds_5_pro_button_function_values"
android:icon="@drawable/ic_filter_3"
android:defaultValue="2"
android:key="pref_redmi_buds_5_pro_control_triple_tap_left"
android:summary="%s"
android:title="@string/prefs_left" />
<ListPreference
android:entries="@array/redmi_buds_5_pro_button_function_names"
android:entryValues="@array/redmi_buds_5_pro_button_function_values"
android:defaultValue="3"
android:key="pref_redmi_buds_5_pro_control_triple_tap_right"
android:summary="%s"
android:title="@string/prefs_right" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/long_press">
<ListPreference
android:entries="@array/redmi_buds_5_pro_long_button_mode_names"
android:entryValues="@array/redmi_buds_5_pro_long_button_mode_values"
android:icon="@drawable/ic_touch"
android:defaultValue="6"
android:key="pref_redmi_buds_5_pro_control_long_tap_mode_left"
android:summary="%s"
android:title="@string/sony_button_mode_left" />
<ListPreference
android:entries="@array/redmi_buds_5_pro_long_button_settings_names"
android:entryValues="@array/redmi_buds_5_pro_long_button_settings_values"
android:defaultValue="7"
android:key="pref_redmi_buds_5_pro_control_long_tap_settings_left"
android:summary="%s"
android:title="@string/sony_ambient_sound_control_button_modes" />
<ListPreference
android:entries="@array/redmi_buds_5_pro_long_button_mode_names"
android:entryValues="@array/redmi_buds_5_pro_long_button_mode_values"
android:icon="@drawable/ic_touch"
android:defaultValue="6"
android:key="pref_redmi_buds_5_pro_control_long_tap_mode_right"
android:summary="%s"
android:title="@string/sony_button_mode_right" />
<ListPreference
android:entries="@array/redmi_buds_5_pro_long_button_settings_names"
android:entryValues="@array/redmi_buds_5_pro_long_button_settings_values"
android:defaultValue="7"
android:key="pref_redmi_buds_5_pro_control_long_tap_settings_right"
android:summary="%s"
android:title="@string/sony_ambient_sound_control_button_modes" />
</PreferenceCategory>
</PreferenceScreen>
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="pref_redmi_buds_5_pro_wearing_detection"
android:layout="@layout/preference_checkbox"
android:icon="@drawable/ic_pause"
android:summary="@string/nothing_prefs_inear_summary"
android:title="@string/nothing_prefs_inear_title"/>
<SwitchPreferenceCompat
android:defaultValue="false"
android:icon="@drawable/ic_phone"
android:key="pref_redmi_buds_5_pro_auto_reply_phonecall"
android:summary="@string/pref_auto_reply_calls_summary"
android:title="@string/pref_auto_reply_calls_title"/>
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="pref_redmi_buds_5_pro_double_connection"
android:summary="@string/redmi_buds_5_pro_double_connection_description"
android:title="@string/redmi_buds_5_pro_double_connection"/>
</PreferenceCategory>
</androidx.preference.PreferenceScreen>
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:key="pref_key_header_redmibuds5pro_ambient_sound_control"
android:title="@string/pref_header_sony_ambient_sound_control">
<ListPreference
android:defaultValue="0"
android:entries="@array/redmi_buds_5_pro_ambient_sound_control_names"
android:entryValues="@array/redmi_buds_5_pro_ambient_sound_control_values"
android:icon="@drawable/ic_hearing"
android:key="pref_redmi_buds_5_pro_ambient_sound_control"
android:summary="%s"
android:title="@string/sony_ambient_sound" />
<ListPreference
android:defaultValue="0"
android:entries="@array/redmi_buds_3_pro_noise_cancelling_strength_names"
android:entryValues="@array/redmi_buds_3_pro_noise_cancelling_strength_values"
android:key="pref_redmi_buds_5_pro_noise_cancelling_strength"
android:summary="%s"
android:title="@string/prefs_active_noise_cancelling_level" />
<ListPreference
android:defaultValue="0"
android:entries="@array/redmi_buds_3_pro_transparency_strength_names"
android:entryValues="@array/redmi_buds_3_pro_transparency_strength_values"
android:key="pref_redmi_buds_5_pro_transparency_strength"
android:summary="%s"
android:title="@string/redmi_buds_5_pro_transparency_strength" />
</PreferenceCategory>
</androidx.preference.PreferenceScreen>
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:key="pref_key_header_redmibuds5pro_sound"
android:title="@string/pref_header_equalizer">
<ListPreference
android:defaultValue="0"
android:entries="@array/redmi_buds_3_pro_equalizer_presets_names"
android:entryValues="@array/redmi_buds_3_pro_equalizer_presets_values"
android:icon="@drawable/ic_graphic_eq"
android:key="pref_redmi_buds_5_pro_equalizer_preset"
android:summary="%s"
android:title="@string/prefs_equalizer_preset" />
</PreferenceCategory>
</androidx.preference.PreferenceScreen>