Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 54f5e30d authored by shihchienc's avatar shihchienc
Browse files

[HFP1.9] Add LC3 event and related JNI update

1. Add LC3 callback from stack to java layer
2. Add LC3 event related process function on java layer

Tag: #feature
Bug: 277338500
Test: manual
Test: atest BluetoothInstrumentationTests
Change-Id: Ide2c5c4f774c677e2d2ca3dd4429f88ff8738aaa
parent 0bbf394f
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ static jmethodID method_onDialCall;
static jmethodID method_onSendDtmf;
static jmethodID method_onNoiseReductionEnable;
static jmethodID method_onWBS;
static jmethodID method_onSWB;
static jmethodID method_onAtChld;
static jmethodID method_onAtCnum;
static jmethodID method_onAtCind;
@@ -236,6 +237,19 @@ class JniHeadsetCallbacks : bluetooth::headset::Callbacks {
                                 addr.get());
  }

  void SwbCallback(bluetooth::headset::bthf_swb_config_t swb_config,
                   RawAddress* bd_addr) override {
    std::shared_lock<std::shared_timed_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid() || !mCallbacksObj) return;

    ScopedLocalRef<jbyteArray> addr(sCallbackEnv.get(), marshall_bda(bd_addr));
    if (addr.get() == nullptr) return;

    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onSWB, swb_config,
                                 addr.get());
  }

  void AtChldCallback(bluetooth::headset::bthf_chld_type_t chld,
                      RawAddress* bd_addr) override {
    std::shared_lock<std::shared_timed_mutex> lock(callbacks_mutex);
@@ -414,6 +428,7 @@ static void classInitNative(JNIEnv* env, jclass clazz) {
  method_onNoiseReductionEnable =
      env->GetMethodID(clazz, "onNoiseReductionEnable", "(Z[B)V");
  method_onWBS = env->GetMethodID(clazz, "onWBS", "(I[B)V");
  method_onSWB = env->GetMethodID(clazz, "onSWB", "(I[B)V");
  method_onAtChld = env->GetMethodID(clazz, "onAtChld", "(I[B)V");
  method_onAtCnum = env->GetMethodID(clazz, "onAtCnum", "([B)V");
  method_onAtCind = env->GetMethodID(clazz, "onAtCind", "([B)V");
+5 −0
Original line number Diff line number Diff line
@@ -74,4 +74,9 @@ public final class HeadsetHalConstants {
    static final int BTHF_WBS_NONE = 0;
    static final int BTHF_WBS_NO = 1;
    static final int BTHF_WBS_YES = 2;

    // match up with bthf_swb_config_t of bt_hf.h
    static final int BTHF_SWB_NONE = 0;
    static final int BTHF_SWB_NO = 1;
    static final int BTHF_SWB_YES = 2;
}
+6 −0
Original line number Diff line number Diff line
@@ -150,6 +150,12 @@ public class HeadsetNativeInterface {
        sendMessageToService(event);
    }

    private void onSWB(int codec, byte[] address) {
        HeadsetStackEvent event =
                new HeadsetStackEvent(HeadsetStackEvent.EVENT_TYPE_SWB, codec, getDevice(address));
        sendMessageToService(event);
    }

    private void onAtChld(int chld, byte[] address) {
        HeadsetStackEvent event = new HeadsetStackEvent(HeadsetStackEvent.EVENT_TYPE_AT_CHLD, chld,
                getDevice(address));
+3 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ public class HeadsetStackEvent extends HeadsetMessageObject {
    public static final int EVENT_TYPE_BIND = 18;
    public static final int EVENT_TYPE_BIEV = 19;
    public static final int EVENT_TYPE_BIA = 20;
    public static final int EVENT_TYPE_SWB = 21;

    public final int type;
    public final int valueInt;
@@ -177,6 +178,8 @@ public class HeadsetStackEvent extends HeadsetMessageObject {
                return "EVENT_TYPE_BIEV";
            case EVENT_TYPE_BIA:
                return "EVENT_TYPE_BIA";
            case EVENT_TYPE_SWB:
                return "EVENT_TYPE_SWB";
            default:
                return "UNKNOWN";
        }
+31 −0
Original line number Diff line number Diff line
@@ -150,6 +150,7 @@ public class HeadsetStateMachine extends StateMachine {
    // Audio Parameters
    private boolean mHasNrecEnabled = false;
    private boolean mHasWbsEnabled = false;
    private boolean mHasSwbEnabled = false;
    // AT Phone book keeps a group of states used by AT+CPBR commands
    @VisibleForTesting
    final AtPhonebook mPhonebook;
@@ -250,6 +251,7 @@ public class HeadsetStateMachine extends StateMachine {
        }
        mHasWbsEnabled = false;
        mHasNrecEnabled = false;
        mHasSwbEnabled = false;
    }

    public void dump(StringBuilder sb) {
@@ -343,6 +345,7 @@ public class HeadsetStateMachine extends StateMachine {
        // Should not be called from enter() method
        void broadcastAudioState(BluetoothDevice device, int fromState, int toState) {
            stateLogD("broadcastAudioState: " + device + ": " + fromState + "->" + toState);
            // TODO(b/278520111): add metrics for SWB
            BluetoothStatsLog.write(BluetoothStatsLog.BLUETOOTH_SCO_CONNECTION_STATE_CHANGED,
                    mAdapterService.obfuscateAddress(device),
                    getConnectionStateFromAudioState(toState),
@@ -480,6 +483,7 @@ public class HeadsetStateMachine extends StateMachine {
            updateAgIndicatorEnableState(null);
            mNeedDialingOutReply = false;
            mHasWbsEnabled = false;
            mHasSwbEnabled = false;
            mHasNrecEnabled = false;
            broadcastStateTransitions();
            // Remove the state machine for unbonded devices
@@ -644,6 +648,9 @@ public class HeadsetStateMachine extends StateMachine {
                        case HeadsetStackEvent.EVENT_TYPE_WBS:
                            processWBSEvent(event.valueInt);
                            break;
                        case HeadsetStackEvent.EVENT_TYPE_SWB:
                            processSWBEvent(event.valueInt);
                            break;
                        case HeadsetStackEvent.EVENT_TYPE_BIND:
                            processAtBind(event.valueString, event.device);
                            break;
@@ -982,6 +989,9 @@ public class HeadsetStateMachine extends StateMachine {
                        case HeadsetStackEvent.EVENT_TYPE_WBS:
                            processWBSEvent(event.valueInt);
                            break;
                        case HeadsetStackEvent.EVENT_TYPE_SWB:
                            processSWBEvent(event.valueInt);
                            break;
                        case HeadsetStackEvent.EVENT_TYPE_AT_CHLD:
                            processAtChld(event.valueInt, event.device);
                            break;
@@ -1359,6 +1369,9 @@ public class HeadsetStateMachine extends StateMachine {
                        case HeadsetStackEvent.EVENT_TYPE_WBS:
                            stateLogE("Cannot change WBS state when audio is connected: " + event);
                            break;
                        case HeadsetStackEvent.EVENT_TYPE_SWB:
                            stateLogE("Cannot change SWB state when audio is connected: " + event);
                            break;
                        default:
                            super.processMessage(message);
                            break;
@@ -1567,6 +1580,7 @@ public class HeadsetStateMachine extends StateMachine {
                + " Name=" + getCurrentDeviceName()
                + " hasNrecEnabled=" + mHasNrecEnabled
                + " hasWbsEnabled=" + mHasWbsEnabled);
        am.setParameters("bt_swb=" + (mHasSwbEnabled ? "on" : "off"));
        am.setBluetoothHeadsetProperties(getCurrentDeviceName(), mHasNrecEnabled, mHasWbsEnabled);
    }

@@ -1723,6 +1737,23 @@ public class HeadsetStateMachine extends StateMachine {
        log("processWBSEvent: " + prevWbs + " -> " + mHasWbsEnabled);
    }

    private void processSWBEvent(int swbConfig) {
        boolean prev_swb = mHasSwbEnabled;
        switch (swbConfig) {
            case HeadsetHalConstants.BTHF_SWB_YES:
                mHasSwbEnabled = true;
                break;
            case HeadsetHalConstants.BTHF_SWB_NO:
            case HeadsetHalConstants.BTHF_SWB_NONE:
                mHasSwbEnabled = false;
                break;
            default:
                Log.e(TAG, "processSWBEvent: unknown swb_config");
                return;
        }
        log("processSWBEvent: " + prev_swb + " -> " + mHasSwbEnabled);
    }

    @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
    @VisibleForTesting
    void processAtChld(int chld, BluetoothDevice device) {
Loading