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

Commit 9aa4ca7a authored by Gaurav Asati's avatar Gaurav Asati Committed by Linux Build Service Account
Browse files

Bluetooth: Disconnect SCO for In-Band Ringtone.

 -Disconnect SCO when remote sends RING indication
  even after disabling in-band ringtone.

Change-Id: I6955de8a7dd192aea492b768dd80343a32ca1cc0
CRs-Fixed: 751075

Bluetooth : Stop the ring when HS disconnects.

This change makes sure that Ring is stopped
when HF is disconnected.

Change-Id: I3e150089ad799133101f9466f5c7aa042a1e600e
CRs-Fixed: 748283

Bluetooth: Abandon Audio Focus.

 - After call is rejected by user abandon
   audio focus.
 - When audio focus abandonment is delayed
   A2dp sink cannot resume.

Change-Id: I5a02b639427e711ac695f551469261549a62797e

Add support for AT+CGMI and AT+CGMM

Added support for AT+CGMI and AT+CGMM commands. AT+CGMI gets
the AG manufacturer identifacation. AT+CGMM gets the AG
manufacturer model. The information is broadcasted as strings.

CRs-fixed: 844824
Change-Id: I9d53e378f6651ee0afd94b5525189c17cfeffa76
parent 6d58ab27
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -56,6 +56,8 @@ static jmethodID method_onSubscriberInfo;
static jmethodID method_onInBandRing;
static jmethodID method_onLastVoiceTagNumber;
static jmethodID method_onRingIndication;
static jmethodID method_onCgmi;
static jmethodID method_onCgmm;

static bool checkCallbackThread() {
    // Always fetch the latest callbackEnv from AdapterService.
@@ -251,6 +253,28 @@ static void ring_indication_cb () {
    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
}

static void cgmi_cb (const char *str) {
    jstring js_manf_id;

    CHECK_CALLBACK_ENV

    js_manf_id = sCallbackEnv->NewStringUTF(str);
    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onCgmi, js_manf_id);
    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
    sCallbackEnv->DeleteLocalRef(js_manf_id);
}

static void cgmm_cb (const char *str) {
    jstring js_manf_model;

    CHECK_CALLBACK_ENV

    js_manf_model = sCallbackEnv->NewStringUTF(str);
    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onCgmm, js_manf_model);
    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
    sCallbackEnv->DeleteLocalRef(js_manf_model);
}

static bthf_client_callbacks_t sBluetoothHfpClientCallbacks = {
    sizeof(sBluetoothHfpClientCallbacks),
    connection_state_cb,
@@ -274,6 +298,8 @@ static bthf_client_callbacks_t sBluetoothHfpClientCallbacks = {
    in_band_ring_cb,
    last_voice_tag_number_cb,
    ring_indication_cb,
    cgmi_cb,
    cgmm_cb,
};

static void classInitNative(JNIEnv* env, jclass clazz) {
@@ -299,6 +325,8 @@ static void classInitNative(JNIEnv* env, jclass clazz) {
    method_onLastVoiceTagNumber = env->GetMethodID(clazz, "onLastVoiceTagNumber",
        "(Ljava/lang/String;)V");
    method_onRingIndication = env->GetMethodID(clazz, "onRingIndication","()V");
    method_onCgmi = env->GetMethodID(clazz, "onCgmi","(Ljava/lang/String;)V");
    method_onCgmm = env->GetMethodID(clazz, "onCgmm","(Ljava/lang/String;)V");

    ALOGI("%s succeeds", __FUNCTION__);
}
+109 −0
Original line number Diff line number Diff line
@@ -449,6 +449,13 @@ final class HeadsetClientStateMachine extends StateMachine {
        if (mRingtone != null && mRingtone.isPlaying()) {
            Log.d(TAG,"stopping ring after no response");
            mRingtone.stop();
            if (mAudioManager.getMode() == AudioManager.MODE_RINGTONE) {
                mAudioManager.setMode(AudioManager.MODE_NORMAL);
            }
            //abandon audio focus
            Log.d(TAG, "abandonAudioFocus");
            // abandon audio focus after the mode has been set back to normal
            mAudioManager.abandonAudioFocusForCall();
        }

        if (waitForIndicators(-1, callsetup, -1)) {
@@ -1003,6 +1010,13 @@ final class HeadsetClientStateMachine extends StateMachine {
        if ( mRingtone != null && mRingtone.isPlaying()) {
            Log.d(TAG,"stopping ring after call reject");
            mRingtone.stop();
            if (mAudioManager.getMode() == AudioManager.MODE_RINGTONE) {
                mAudioManager.setMode(AudioManager.MODE_NORMAL);
            }
            //abandon audio focus
            Log.d(TAG, "abandonAudioFocus");
            // abandon audio focus after the mode has been set back to normal
            mAudioManager.abandonAudioFocusForCall();
        }

        BluetoothHeadsetClientCall c =
@@ -1464,6 +1478,8 @@ final class HeadsetClientStateMachine extends StateMachine {
                        case EVENT_TYPE_SUBSCRIBER_INFO:
                        case EVENT_TYPE_CURRENT_CALLS:
                        case EVENT_TYPE_OPERATOR_NAME:
                        case EVENT_TYPE_CGMI:
                        case EVENT_TYPE_CGMM:
                        default:
                            Log.e(TAG, "Connecting: ignoring stack event: " + event.type);
                            break;
@@ -1996,6 +2012,24 @@ final class HeadsetClientStateMachine extends StateMachine {
                                mRingtone.play();
                            }
                            break;
                        case EVENT_TYPE_CGMI:
                            Log.d(TAG, "cgmi:" + event.valueString);
                            // broadcast intent with the string
                            intent = new Intent(BluetoothHeadsetClient.ACTION_AG_EVENT);
                            intent.putExtra(BluetoothHeadsetClient.EXTRA_MANF_ID,
                                     event.valueString);
                            intent.putExtra(BluetoothDevice.EXTRA_DEVICE, event.device);
                            mService.sendBroadcast(intent, ProfileService.BLUETOOTH_PERM);
                            break;
                        case EVENT_TYPE_CGMM:
                            Log.d(TAG, "cgmm:" + event.valueString);
                            // broadcast intent with the string
                            intent = new Intent(BluetoothHeadsetClient.ACTION_AG_EVENT);
                            intent.putExtra(BluetoothHeadsetClient.EXTRA_MANF_MODEL,
                                     event.valueString);
                            intent.putExtra(BluetoothDevice.EXTRA_DEVICE, event.device);
                            mService.sendBroadcast(intent, ProfileService.BLUETOOTH_PERM);
                            break;
                        default:
                            Log.e(TAG, "Unknown stack event: " + event.type);
                            break;
@@ -2022,6 +2056,18 @@ final class HeadsetClientStateMachine extends StateMachine {
        private void processConnectionEvent(int state, BluetoothDevice device) {
            switch (state) {
                case HeadsetClientHalConstants.CONNECTION_STATE_DISCONNECTED:
                    if (mRingtone != null && mRingtone.isPlaying()) {
                        mRingtone.stop();
                    if (mAudioManager.getMode() ==
                            AudioManager.MODE_RINGTONE) {
                        mAudioManager.setMode(AudioManager.MODE_NORMAL);
                    }
                    //abandon audio focus
                    Log.d(TAG, "abandonAudioFocus");
                    /* abandon audio focus after the mode has
                     been set back to normal*/
                    mAudioManager.abandonAudioFocusForCall();
                    }
                    Log.d(TAG, "Connected disconnects.");
                    // AG disconnects
                    if (mCurrentDevice.equals(device)) {
@@ -2161,6 +2207,7 @@ final class HeadsetClientStateMachine extends StateMachine {
                    }
                    break;
                case STACK_EVENT:
                    Intent intent = null;
                    StackEvent event = (StackEvent) message.obj;
                    if (DBG) {
                        Log.d(TAG, "AudioOn: event type: " + event.type);
@@ -2176,6 +2223,50 @@ final class HeadsetClientStateMachine extends StateMachine {
                                    + event.valueInt);
                            processAudioEvent(event.valueInt, event.device);
                            break;
                        case EVENT_TYPE_RING_INDICATION:
                            /* PTS test case TC_HF_ICA_BV_05_I creates SCO even
                             * after disabling in-band ringtone, disconnect SCO
                             * if inband ringtone is disabled */
                            Log.i(TAG,"Ring Indication in Audio connected state " +
                                    "mInBandRingtone " + mInBandRingtone);
                            if (mInBandRingtone !=
                                    HeadsetClientHalConstants.IN_BAND_RING_NOT_PROVIDED) {
                                break;
                            }
                            if (disconnectAudioNative(getByteAddress(mCurrentDevice))) {
                                mAudioState = BluetoothHeadsetClient.STATE_AUDIO_DISCONNECTED;
                                //abandon audio focus
                                if (mAudioManager.getMode() != AudioManager.MODE_NORMAL) {
                                    mAudioManager.setMode(AudioManager.MODE_NORMAL);
                                    Log.d(TAG, "abandonAudioFocus");
                                    //abandon audio focus after the mode has been set back to normal
                                    mAudioManager.abandonAudioFocusForCall();
                                }
                                Log.d(TAG,"hfp_enable=false");
                                mAudioManager.setParameters("hfp_enable=false");
                                broadcastAudioState(mCurrentDevice,
                                        BluetoothHeadsetClient.STATE_AUDIO_DISCONNECTED,
                                        BluetoothHeadsetClient.STATE_AUDIO_CONNECTED);
                            }
                            break;
                        case EVENT_TYPE_CGMI:
                            Log.d(TAG, "cgmi:" + event.valueString);
                            // broadcast intent with the string
                            intent = new Intent(BluetoothHeadsetClient.ACTION_AG_EVENT);
                            intent.putExtra(BluetoothHeadsetClient.EXTRA_MANF_ID,
                                     event.valueString);
                            intent.putExtra(BluetoothDevice.EXTRA_DEVICE, event.device);
                            mService.sendBroadcast(intent, ProfileService.BLUETOOTH_PERM);
                            break;
                        case EVENT_TYPE_CGMM:
                            Log.d(TAG, "cgmm:" + event.valueString);
                            // broadcast intent with the string
                            intent = new Intent(BluetoothHeadsetClient.ACTION_AG_EVENT);
                            intent.putExtra(BluetoothHeadsetClient.EXTRA_MANF_MODEL,
                                     event.valueString);
                            intent.putExtra(BluetoothDevice.EXTRA_DEVICE, event.device);
                            mService.sendBroadcast(intent, ProfileService.BLUETOOTH_PERM);
                            break;
                        default:
                            return NOT_HANDLED;
                    }
@@ -2579,6 +2670,20 @@ final class HeadsetClientStateMachine extends StateMachine {
        sendMessage(STACK_EVENT, event);
    }

    private void onCgmi(String manf_id) {
        StackEvent event = new StackEvent(EVENT_TYPE_CGMI);
        event.valueString = manf_id;
        Log.d(TAG, "incoming" + event);
        sendMessage(STACK_EVENT, event);
    }

    private void onCgmm(String manf_model) {
        StackEvent event = new StackEvent(EVENT_TYPE_CGMM);
        event.valueString = manf_model;
        Log.d(TAG, "incoming" + event);
        sendMessage(STACK_EVENT, event);
    }

    private String getCurrentDeviceName() {
        String defaultName = "<unknown>";
        if (mCurrentDevice == null) {
@@ -2618,6 +2723,8 @@ final class HeadsetClientStateMachine extends StateMachine {
    final private static int EVENT_TYPE_IN_BAND_RING = 19;
    final private static int EVENT_TYPE_LAST_VOICE_TAG_NUMBER = 20;
    final private static int EVENT_TYPE_RING_INDICATION= 21;
    final private static int EVENT_TYPE_CGMI= 22;
    final private static int EVENT_TYPE_CGMM= 23;

    // for debugging only
    private final String EVENT_TYPE_NAMES[] =
@@ -2644,6 +2751,8 @@ final class HeadsetClientStateMachine extends StateMachine {
            "EVENT_TYPE_IN_BAND_RING",
            "EVENT_TYPE_LAST_VOICE_TAG_NUMBER",
            "EVENT_TYPE_RING_INDICATION",
            "EVENT_TYPE_CGMI",
            "EVENT_TYPE_CGMM",
    };

    private class StackEvent {