184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal/*
284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal * Copyright (c) 2017 The Android Open Source Project
384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal *
484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal * Licensed under the Apache License, Version 2.0 (the "License");
584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal * you may not use this file except in compliance with the License.
684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal * You may obtain a copy of the License at
784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal *
884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal *      http://www.apache.org/licenses/LICENSE-2.0
984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal *
1084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal * Unless required by applicable law or agreed to in writing, software
1184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal * distributed under the License is distributed on an "AS IS" BASIS,
1284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal * See the License for the specific language governing permissions and
1484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal * limitations under the License.
1584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal */
1684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
1784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal/*
1884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal * Defines the native inteface that is used by state machine/service to either or receive messages
1984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal * from the native stack. This file is registered for the native methods in corresponding CPP file.
2084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal */
2184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwalpackage com.android.bluetooth.hfpclient;
2284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
2384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwalimport android.bluetooth.BluetoothAdapter;
2484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwalimport android.bluetooth.BluetoothDevice;
2584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwalimport android.util.Log;
2684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
2784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwalclass NativeInterface {
281bd017d12cf16ecd52fb486722e300790bddeefcJack He    private static final String TAG = "NativeInterface";
291bd017d12cf16ecd52fb486722e300790bddeefcJack He    private static final boolean DBG = false;
3084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
3184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    NativeInterface() {}
3284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
3384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    // Native methods that call into the JNI interface
3484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    static native void classInitNative();
35c4fbd756e2645147470c486ae96f2253f5e13a52Jack He
3684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    static native void initializeNative();
37c4fbd756e2645147470c486ae96f2253f5e13a52Jack He
3884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    static native void cleanupNative();
39c4fbd756e2645147470c486ae96f2253f5e13a52Jack He
4084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    static native boolean connectNative(byte[] address);
41c4fbd756e2645147470c486ae96f2253f5e13a52Jack He
4284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    static native boolean disconnectNative(byte[] address);
43c4fbd756e2645147470c486ae96f2253f5e13a52Jack He
4484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    static native boolean connectAudioNative(byte[] address);
45c4fbd756e2645147470c486ae96f2253f5e13a52Jack He
4684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    static native boolean disconnectAudioNative(byte[] address);
47c4fbd756e2645147470c486ae96f2253f5e13a52Jack He
4884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    static native boolean startVoiceRecognitionNative(byte[] address);
49c4fbd756e2645147470c486ae96f2253f5e13a52Jack He
5084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    static native boolean stopVoiceRecognitionNative(byte[] address);
51c4fbd756e2645147470c486ae96f2253f5e13a52Jack He
5284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    static native boolean setVolumeNative(byte[] address, int volumeType, int volume);
53c4fbd756e2645147470c486ae96f2253f5e13a52Jack He
5484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    static native boolean dialNative(byte[] address, String number);
55c4fbd756e2645147470c486ae96f2253f5e13a52Jack He
5684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    static native boolean dialMemoryNative(byte[] address, int location);
57c4fbd756e2645147470c486ae96f2253f5e13a52Jack He
5884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    static native boolean handleCallActionNative(byte[] address, int action, int index);
59c4fbd756e2645147470c486ae96f2253f5e13a52Jack He
6084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    static native boolean queryCurrentCallsNative(byte[] address);
61c4fbd756e2645147470c486ae96f2253f5e13a52Jack He
6284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    static native boolean queryCurrentOperatorNameNative(byte[] address);
63c4fbd756e2645147470c486ae96f2253f5e13a52Jack He
6484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    static native boolean retrieveSubscriberInfoNative(byte[] address);
65c4fbd756e2645147470c486ae96f2253f5e13a52Jack He
6684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    static native boolean sendDtmfNative(byte[] address, byte code);
67c4fbd756e2645147470c486ae96f2253f5e13a52Jack He
6884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    static native boolean requestLastVoiceTagNumberNative(byte[] address);
69c4fbd756e2645147470c486ae96f2253f5e13a52Jack He
70c4fbd756e2645147470c486ae96f2253f5e13a52Jack He    static native boolean sendATCmdNative(byte[] address, int atCmd, int val1, int val2,
71c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            String arg);
7284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
7384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    private BluetoothDevice getDevice(byte[] address) {
7484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        return BluetoothAdapter.getDefaultAdapter().getRemoteDevice(address);
7584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
7684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
7784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    // Callbacks from the native back into the java framework. All callbacks are routed via the
7884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    // Service which will disambiguate which state machine the message should be routed through.
79b7461b17cad5476a7a528cbf2a0b9c9706c6faefJack He    private void onConnectionStateChanged(int state, int peerFeat, int chldFeat, byte[] address) {
8084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED);
8184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueInt = state;
82b7461b17cad5476a7a528cbf2a0b9c9706c6faefJack He        event.valueInt2 = peerFeat;
83b7461b17cad5476a7a528cbf2a0b9c9706c6faefJack He        event.valueInt3 = chldFeat;
8484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.device = getDevice(address);
85c4fbd756e2645147470c486ae96f2253f5e13a52Jack He        // BluetoothAdapter.getDefaultAdapter().getRemoteDevice(Utils.getAddressStringFromByte
86c4fbd756e2645147470c486ae96f2253f5e13a52Jack He        // (address));
8784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (DBG) {
88c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.d(TAG, "Device addr " + event.device.getAddress() + " State " + state);
8984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
9084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
9184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (service != null) {
9284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            service.messageFromNative(event);
9384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        } else {
9484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            Log.w(TAG, "Ignoring message because service not available: " + event);
9584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
9684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
9784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
9884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    private void onAudioStateChanged(int state, byte[] address) {
9984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_AUDIO_STATE_CHANGED);
10084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueInt = state;
10184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.device = getDevice(address);
10284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (DBG) {
103c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.d(TAG, "onAudioStateChanged: address " + address + " event " + event);
10484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
10584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
10684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (service != null) {
10784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            service.messageFromNative(event);
10884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        } else {
109c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.w(TAG, "onAudioStateChanged: Ignoring message because service not available: "
110c4fbd756e2645147470c486ae96f2253f5e13a52Jack He                    + event);
11184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
11284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
11384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
114a4cca006f948b1a2a3f36fd857f4ad837376b4eaJoseph Pirozzo    private void onVrStateChanged(int state, byte[] address) {
115a4cca006f948b1a2a3f36fd857f4ad837376b4eaJoseph Pirozzo        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_VR_STATE_CHANGED);
116a4cca006f948b1a2a3f36fd857f4ad837376b4eaJoseph Pirozzo        event.valueInt = state;
117a4cca006f948b1a2a3f36fd857f4ad837376b4eaJoseph Pirozzo        event.device = getDevice(address);
118a4cca006f948b1a2a3f36fd857f4ad837376b4eaJoseph Pirozzo        if (DBG) {
119a4cca006f948b1a2a3f36fd857f4ad837376b4eaJoseph Pirozzo            Log.d(TAG, "onVrStateChanged: address " + address + " event " + event);
120a4cca006f948b1a2a3f36fd857f4ad837376b4eaJoseph Pirozzo        }
121a4cca006f948b1a2a3f36fd857f4ad837376b4eaJoseph Pirozzo
122a4cca006f948b1a2a3f36fd857f4ad837376b4eaJoseph Pirozzo        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
123a4cca006f948b1a2a3f36fd857f4ad837376b4eaJoseph Pirozzo        if (service != null) {
124a4cca006f948b1a2a3f36fd857f4ad837376b4eaJoseph Pirozzo            service.messageFromNative(event);
125a4cca006f948b1a2a3f36fd857f4ad837376b4eaJoseph Pirozzo        } else {
126a4cca006f948b1a2a3f36fd857f4ad837376b4eaJoseph Pirozzo            Log.w(TAG,
127a4cca006f948b1a2a3f36fd857f4ad837376b4eaJoseph Pirozzo                    "onVrStateChanged: Ignoring message because service not available: " + event);
128a4cca006f948b1a2a3f36fd857f4ad837376b4eaJoseph Pirozzo        }
12984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
13084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
13184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    private void onNetworkState(int state, byte[] address) {
13284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_NETWORK_STATE);
13384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueInt = state;
13484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.device = getDevice(address);
13584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (DBG) {
136a4cca006f948b1a2a3f36fd857f4ad837376b4eaJoseph Pirozzo            Log.d(TAG, "onNetworkStateChanged: address " + address + " event " + event);
13784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
13884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
13984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
14084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (service != null) {
14184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            service.messageFromNative(event);
14284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        } else {
143c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.w(TAG,
144a4cca006f948b1a2a3f36fd857f4ad837376b4eaJoseph Pirozzo                    "onNetworkStateChanged: Ignoring message because service not available: "
145a4cca006f948b1a2a3f36fd857f4ad837376b4eaJoseph Pirozzo                            + event);
14684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
14784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
14884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
14984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    private void onNetworkRoaming(int state, byte[] address) {
15084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_ROAMING_STATE);
15184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueInt = state;
15284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.device = getDevice(address);
15384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (DBG) {
15484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            Log.d(TAG, "onNetworkRoaming: incoming: " + event);
15584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
15684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
15784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (service != null) {
15884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            service.messageFromNative(event);
15984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        } else {
160c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.w(TAG,
161c4fbd756e2645147470c486ae96f2253f5e13a52Jack He                    "onNetworkRoaming: Ignoring message because service not available: " + event);
16284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
16384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
16484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
16584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    private void onNetworkSignal(int signal, byte[] address) {
16684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_NETWORK_SIGNAL);
16784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueInt = signal;
16884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.device = getDevice(address);
16984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (DBG) {
170c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.d(TAG, "onNetworkSignal: address " + address + " event " + event);
17184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
17284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
17384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (service != null) {
17484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            service.messageFromNative(event);
17584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        } else {
17684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            Log.w(TAG, "onNetworkSignal: Ignoring message because service not available: " + event);
17784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
17884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
17984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
18084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    private void onBatteryLevel(int level, byte[] address) {
18184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_BATTERY_LEVEL);
18284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueInt = level;
18384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.device = getDevice(address);
18484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (DBG) {
185c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.d(TAG, "onBatteryLevel: address " + address + " event " + event);
18684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
18784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
18884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (service != null) {
18984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            service.messageFromNative(event);
19084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        } else {
19184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            Log.w(TAG, "onBatteryLevel: Ignoring message because service not available: " + event);
19284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
19384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
19484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
19584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    private void onCurrentOperator(String name, byte[] address) {
19684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_OPERATOR_NAME);
19784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueString = name;
19884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.device = getDevice(address);
19984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (DBG) {
200c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.d(TAG, "onCurrentOperator: address " + address + " event " + event);
20184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
20284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
20384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (service != null) {
20484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            service.messageFromNative(event);
20584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        } else {
206c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.w(TAG,
207c4fbd756e2645147470c486ae96f2253f5e13a52Jack He                    "onCurrentOperator: Ignoring message because service not available: " + event);
20884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
20984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
21084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
21184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    private void onCall(int call, byte[] address) {
21284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_CALL);
21384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueInt = call;
21484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.device = getDevice(address);
21584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (DBG) {
216c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.d(TAG, "onCall: address " + address + " event " + event);
21784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
21884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
21984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (service != null) {
22084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            service.messageFromNative(event);
22184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        } else {
22284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            Log.w(TAG, "onCall: Ignoring message because service not available: " + event);
22384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
22484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
22584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
22684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    /**
22784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal     * CIEV (Call indicators) notifying if call(s) are getting set up.
22884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal     *
22984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal     * Values include:
23084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal     * 0 - No current call is in setup
23184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal     * 1 - Incoming call process ongoing
23284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal     * 2 - Outgoing call process ongoing
23384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal     * 3 - Remote party being alerted for outgoing call
23484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal     */
23584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    private void onCallSetup(int callsetup, byte[] address) {
23684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_CALLSETUP);
23784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueInt = callsetup;
23884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.device = getDevice(address);
23984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (DBG) {
24084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            Log.d(TAG, "onCallSetup: addr " + address + " device" + event.device);
241c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.d(TAG, "onCallSetup: address " + address + " event " + event);
24284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
24384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
24484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (service != null) {
24584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            service.messageFromNative(event);
24684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        } else {
24784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            Log.w(TAG, "onCallSetup: Ignoring message because service not available: " + event);
24884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
24984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
25084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
25184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    /**
25284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal     * CIEV (Call indicators) notifying call held states.
25384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal     *
25484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal     * Values include:
25584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal     * 0 - No calls held
25684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal     * 1 - Call is placed on hold or active/held calls wapped (The AG has both an ACTIVE and HELD
25784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal     * call)
25884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal     * 2 - Call on hold, no active call
25984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal     */
26084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    private void onCallHeld(int callheld, byte[] address) {
26184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_CALLHELD);
26284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueInt = callheld;
26384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.device = getDevice(address);
26484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (DBG) {
265c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.d(TAG, "onCallHeld: address " + address + " event " + event);
26684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
26784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
26884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (service != null) {
26984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            service.messageFromNative(event);
27084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        } else {
27184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            Log.w(TAG, "onCallHeld: Ignoring message because service not available: " + event);
27284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
27384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
27484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
275b7461b17cad5476a7a528cbf2a0b9c9706c6faefJack He    private void onRespAndHold(int respAndHold, byte[] address) {
27684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_RESP_AND_HOLD);
277b7461b17cad5476a7a528cbf2a0b9c9706c6faefJack He        event.valueInt = respAndHold;
27884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.device = getDevice(address);
27984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (DBG) {
280c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.d(TAG, "onRespAndHold: address " + address + " event " + event);
28184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
28284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
28384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (service != null) {
28484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            service.messageFromNative(event);
28584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        } else {
28684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            Log.w(TAG, "onRespAndHold: Ignoring message because service not available: " + event);
28784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
28884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
28984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
29084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    private void onClip(String number, byte[] address) {
29184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_CLIP);
29284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueString = number;
29384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.device = getDevice(address);
29484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (DBG) {
295c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.d(TAG, "onClip: address " + address + " event " + event);
29684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
29784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
29884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (service != null) {
29984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            service.messageFromNative(event);
30084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        } else {
30184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            Log.w(TAG, "onClip: Ignoring message because service not available: " + event);
30284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
30384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
30484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
30584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    private void onCallWaiting(String number, byte[] address) {
30684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_CALL_WAITING);
30784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueString = number;
30884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.device = getDevice(address);
30984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (DBG) {
310c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.d(TAG, "onCallWaiting: address " + address + " event " + event);
31184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
31284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
31384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (service != null) {
31484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            service.messageFromNative(event);
31584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        } else {
31684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            Log.w(TAG, "onCallWaiting: Ignoring message because service not available: " + event);
31784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
31884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
31984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
320c4fbd756e2645147470c486ae96f2253f5e13a52Jack He    private void onCurrentCalls(int index, int dir, int state, int mparty, String number,
321c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            byte[] address) {
32284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_CURRENT_CALLS);
32384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueInt = index;
32484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueInt2 = dir;
32584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueInt3 = state;
32684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueInt4 = mparty;
32784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueString = number;
32884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.device = getDevice(address);
32984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (DBG) {
330c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.d(TAG, "onCurrentCalls: address " + address + " event " + event);
33184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
33284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
33384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (service != null) {
33484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            service.messageFromNative(event);
33584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        } else {
33684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            Log.w(TAG, "onCurrentCalls: Ignoring message because service not available: " + event);
33784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
33884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
33984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
34084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    private void onVolumeChange(int type, int volume, byte[] address) {
34184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_VOLUME_CHANGED);
34284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueInt = type;
34384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueInt2 = volume;
34484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.device = getDevice(address);
34584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (DBG) {
346c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.d(TAG, "onVolumeChange: address " + address + " event " + event);
34784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
34884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
34954d5aab5a8b6aaae4f561b2643e6b423aad165fdJoseph Pirozzo        if (service != null) {
35054d5aab5a8b6aaae4f561b2643e6b423aad165fdJoseph Pirozzo            service.messageFromNative(event);
35154d5aab5a8b6aaae4f561b2643e6b423aad165fdJoseph Pirozzo        } else {
35254d5aab5a8b6aaae4f561b2643e6b423aad165fdJoseph Pirozzo            Log.w(TAG, "onVolumeChange: Ignoring message because service not available: " + event);
35354d5aab5a8b6aaae4f561b2643e6b423aad165fdJoseph Pirozzo        }
35484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
35584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
35684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    private void onCmdResult(int type, int cme, byte[] address) {
35784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_CMD_RESULT);
35884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueInt = type;
35984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueInt2 = cme;
36084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.device = getDevice(address);
36184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (DBG) {
362c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.d(TAG, "onCmdResult: address " + address + " event " + event);
36384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
36484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
36584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (service != null) {
36684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            service.messageFromNative(event);
36784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        } else {
36884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            Log.w(TAG, "onCmdResult: Ignoring message because service not available: " + event);
36984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
37084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
37184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
37284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    private void onSubscriberInfo(String number, int type, byte[] address) {
37384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_SUBSCRIBER_INFO);
37484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueInt = type;
37584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.valueString = number;
37684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.device = getDevice(address);
37784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (DBG) {
378c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.d(TAG, "onSubscriberInfo: address " + address + " event " + event);
37984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
38084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
38184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (service != null) {
38284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            service.messageFromNative(event);
38384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        } else {
384c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.w(TAG,
385c4fbd756e2645147470c486ae96f2253f5e13a52Jack He                    "onSubscriberInfo: Ignoring message because service not available: " + event);
38684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
38784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
38884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
389b7461b17cad5476a7a528cbf2a0b9c9706c6faefJack He    private void onInBandRing(int inBand, byte[] address) {
3902ba7e903557e98517edcd51aaf2c0f971a317862Joseph Pirozzo        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_IN_BAND_RINGTONE);
3912ba7e903557e98517edcd51aaf2c0f971a317862Joseph Pirozzo        event.valueInt = inBand;
3922ba7e903557e98517edcd51aaf2c0f971a317862Joseph Pirozzo        event.device = getDevice(address);
3932ba7e903557e98517edcd51aaf2c0f971a317862Joseph Pirozzo        if (DBG) {
3942ba7e903557e98517edcd51aaf2c0f971a317862Joseph Pirozzo            Log.d(TAG, "onInBandRing: address " + address + " event " + event);
3952ba7e903557e98517edcd51aaf2c0f971a317862Joseph Pirozzo        }
3962ba7e903557e98517edcd51aaf2c0f971a317862Joseph Pirozzo        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
3972ba7e903557e98517edcd51aaf2c0f971a317862Joseph Pirozzo        if (service != null) {
3982ba7e903557e98517edcd51aaf2c0f971a317862Joseph Pirozzo            service.messageFromNative(event);
3992ba7e903557e98517edcd51aaf2c0f971a317862Joseph Pirozzo        } else {
4002ba7e903557e98517edcd51aaf2c0f971a317862Joseph Pirozzo            Log.w(TAG,
4012ba7e903557e98517edcd51aaf2c0f971a317862Joseph Pirozzo                    "onInBandRing: Ignoring message because service not available: " + event);
4022ba7e903557e98517edcd51aaf2c0f971a317862Joseph Pirozzo        }
40384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
40484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
40584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    private void onLastVoiceTagNumber(String number, byte[] address) {
40684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        Log.w(TAG, "onLastVoiceTagNumber not supported");
40784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
40884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal
40984f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    private void onRingIndication(byte[] address) {
41084f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_RING_INDICATION);
41184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        event.device = getDevice(address);
41284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (DBG) {
413c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.d(TAG, "onRingIndication: address " + address + " event " + event);
41484f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
41584f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
41684f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        if (service != null) {
41784f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal            service.messageFromNative(event);
41884f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        } else {
419c4fbd756e2645147470c486ae96f2253f5e13a52Jack He            Log.w(TAG,
420c4fbd756e2645147470c486ae96f2253f5e13a52Jack He                    "onRingIndication: Ignoring message because service not available: " + event);
42184f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal        }
42284f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal    }
42384f977c60b8d7feea9c9b20d60a7eb8e3e4869a9Sanket Agarwal}
424