BluetoothA2dp.java revision b16c4f7dd92dabf0cc27438a5d3d9ebd203a38b3
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.bluetooth; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant.SdkConstantType; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.server.BluetoothA2dpService; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport java.util.Arrays; 29bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport java.util.Collections; 30bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport java.util.Set; 31bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport java.util.HashSet; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Public API for controlling the Bluetooth A2DP Profile Service. 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * BluetoothA2dp is a proxy object for controlling the Bluetooth A2DP 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Service via IPC. 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creating a BluetoothA2dp object will initiate a binding with the 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * BluetoothHeadset service. Users of this object should call close() when they 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are finished, so that this proxy object can unbind from the service. 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Currently the BluetoothA2dp service runs in the system server and this 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * proxy object will be immediately bound to the service on construction. 45721361f1a74b876c42cc0533c9c19320e8c09927Jaikumar Ganesh * 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Currently this class provides methods to connect to A2DP audio sinks. 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 50bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellypublic final class BluetoothA2dp { 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "BluetoothA2dp"; 52f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project private static final boolean DBG = false; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** int extra for ACTION_SINK_STATE_CHANGED */ 55005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String EXTRA_SINK_STATE = 56005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.a2dp.extra.SINK_STATE"; 57005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** int extra for ACTION_SINK_STATE_CHANGED */ 58005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String EXTRA_PREVIOUS_SINK_STATE = 59005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.a2dp.extra.PREVIOUS_SINK_STATE"; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Indicates the state of an A2DP audio sink has changed. 62005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * This intent will always contain EXTRA_SINK_STATE, 63005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * EXTRA_PREVIOUS_SINK_STATE and BluetoothDevice.EXTRA_DEVICE 64005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * extras. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 67005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_SINK_STATE_CHANGED = 68005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.a2dp.action.SINK_STATE_CHANGED"; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATE_DISCONNECTED = 0; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATE_CONNECTING = 1; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATE_CONNECTED = 2; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATE_DISCONNECTING = 3; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Playing implies connected */ 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATE_PLAYING = 4; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 77721361f1a74b876c42cc0533c9c19320e8c09927Jaikumar Ganesh /** Default priority for a2dp devices that we try to auto-connect 78721361f1a74b876c42cc0533c9c19320e8c09927Jaikumar Ganesh * and allow incoming connections */ 79721361f1a74b876c42cc0533c9c19320e8c09927Jaikumar Ganesh public static final int PRIORITY_AUTO_CONNECT = 1000; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Default priority for a2dp devices that should allow incoming 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connections */ 82721361f1a74b876c42cc0533c9c19320e8c09927Jaikumar Ganesh public static final int PRIORITY_ON = 100; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Default priority for a2dp devices that should not allow incoming 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connections */ 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PRIORITY_OFF = 0; 86bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final IBluetoothA2dp mService; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a BluetoothA2dp proxy object for interacting with the local 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Bluetooth A2DP service. 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c Context 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BluetoothA2dp(Context c) { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = c; 97bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder b = ServiceManager.getService(BluetoothA2dpService.BLUETOOTH_A2DP_SERVICE); 99081f58abb7ceb702fdb0b65ff0e0ff70dd265a30Michael Chan if (b != null) { 100081f58abb7ceb702fdb0b65ff0e0ff70dd265a30Michael Chan mService = IBluetoothA2dp.Stub.asInterface(b); 101081f58abb7ceb702fdb0b65ff0e0ff70dd265a30Michael Chan } else { 102081f58abb7ceb702fdb0b65ff0e0ff70dd265a30Michael Chan Log.w(TAG, "Bluetooth A2DP service not available!"); 103081f58abb7ceb702fdb0b65ff0e0ff70dd265a30Michael Chan 104081f58abb7ceb702fdb0b65ff0e0ff70dd265a30Michael Chan // Instead of throwing an exception which prevents people from going 105081f58abb7ceb702fdb0b65ff0e0ff70dd265a30Michael Chan // into Wireless settings in the emulator. Let it crash later when it is actually used. 106081f58abb7ceb702fdb0b65ff0e0ff70dd265a30Michael Chan mService = null; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Initiate a connection to an A2DP sink. 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Listen for SINK_STATE_CHANGED_ACTION to find out when the 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connection is completed. 113bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @param device Remote BT device. 114b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly * @return false on immediate error, true otherwise 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 117b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly public boolean connectSink(BluetoothDevice device) { 118bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (DBG) log("connectSink(" + device + ")"); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 120bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mService.connectSink(device); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 122b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly Log.e(TAG, "", e); 123b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly return false; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Initiate disconnect from an A2DP sink. 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Listen for SINK_STATE_CHANGED_ACTION to find out when 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disconnect is completed. 130bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @param device Remote BT device. 131b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly * @return false on immediate error, true otherwise 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 134b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly public boolean disconnectSink(BluetoothDevice device) { 135bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (DBG) log("disconnectSink(" + device + ")"); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 137bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mService.disconnectSink(device); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 139b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly Log.e(TAG, "", e); 140b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly return false; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 144f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan /** Initiate suspend from an A2DP sink. 145f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * Listen for SINK_STATE_CHANGED_ACTION to find out when 146f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * suspend is completed. 147f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * @param device Remote BT device. 148f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * @return false on immediate error, true otherwise 149f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * @hide 150f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan */ 151e766eae93890b09db67d2c6a599c25fdae103f20Nick Pelly public boolean suspendSink(BluetoothDevice device) { 152f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan try { 153f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan return mService.suspendSink(device); 154f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan } catch (RemoteException e) { 155f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan Log.e(TAG, "", e); 156f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan return false; 157f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan } 158f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan } 159f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan 160f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan /** Initiate resume from an suspended A2DP sink. 161f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * Listen for SINK_STATE_CHANGED_ACTION to find out when 162f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * resume is completed. 163f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * @param device Remote BT device. 164f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * @return false on immediate error, true otherwise 165f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * @hide 166f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan */ 167e766eae93890b09db67d2c6a599c25fdae103f20Nick Pelly public boolean resumeSink(BluetoothDevice device) { 168f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan try { 169f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan return mService.resumeSink(device); 170f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan } catch (RemoteException e) { 171f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan Log.e(TAG, "", e); 172f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan return false; 173f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan } 174f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan } 175f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Check if a specified A2DP sink is connected. 177bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @param device Remote BT device. 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if connected (or playing), false otherwise and on error. 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 181bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean isSinkConnected(BluetoothDevice device) { 182bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (DBG) log("isSinkConnected(" + device + ")"); 183bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly int state = getSinkState(device); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return state == STATE_CONNECTED || state == STATE_PLAYING; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Check if any A2DP sink is connected. 188bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @return a unmodifiable set of connected A2DP sinks, or null on error. 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 191bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public Set<BluetoothDevice> getConnectedSinks() { 192bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (DBG) log("getConnectedSinks()"); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 194bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return Collections.unmodifiableSet( 195bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly new HashSet<BluetoothDevice>(Arrays.asList(mService.getConnectedSinks()))); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 197b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly Log.e(TAG, "", e); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 202b16c4f7dd92dabf0cc27438a5d3d9ebd203a38b3Jaikumar Ganesh /** Check if any A2DP sink is in Non Disconnected state 203b16c4f7dd92dabf0cc27438a5d3d9ebd203a38b3Jaikumar Ganesh * i.e playing, connected, connecting, disconnecting. 204b16c4f7dd92dabf0cc27438a5d3d9ebd203a38b3Jaikumar Ganesh * @return a unmodifiable set of connected A2DP sinks, or null on error. 205b16c4f7dd92dabf0cc27438a5d3d9ebd203a38b3Jaikumar Ganesh * @hide 206b16c4f7dd92dabf0cc27438a5d3d9ebd203a38b3Jaikumar Ganesh */ 207b16c4f7dd92dabf0cc27438a5d3d9ebd203a38b3Jaikumar Ganesh public Set<BluetoothDevice> getNonDisconnectedSinks() { 208b16c4f7dd92dabf0cc27438a5d3d9ebd203a38b3Jaikumar Ganesh if (DBG) log("getNonDisconnectedSinks()"); 209b16c4f7dd92dabf0cc27438a5d3d9ebd203a38b3Jaikumar Ganesh try { 210b16c4f7dd92dabf0cc27438a5d3d9ebd203a38b3Jaikumar Ganesh return Collections.unmodifiableSet( 211b16c4f7dd92dabf0cc27438a5d3d9ebd203a38b3Jaikumar Ganesh new HashSet<BluetoothDevice>(Arrays.asList(mService.getNonDisconnectedSinks()))); 212b16c4f7dd92dabf0cc27438a5d3d9ebd203a38b3Jaikumar Ganesh } catch (RemoteException e) { 213b16c4f7dd92dabf0cc27438a5d3d9ebd203a38b3Jaikumar Ganesh Log.e(TAG, "", e); 214b16c4f7dd92dabf0cc27438a5d3d9ebd203a38b3Jaikumar Ganesh return null; 215b16c4f7dd92dabf0cc27438a5d3d9ebd203a38b3Jaikumar Ganesh } 216b16c4f7dd92dabf0cc27438a5d3d9ebd203a38b3Jaikumar Ganesh } 217b16c4f7dd92dabf0cc27438a5d3d9ebd203a38b3Jaikumar Ganesh 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Get the state of an A2DP sink 219bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @param device Remote BT device. 220b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly * @return State code, one of STATE_ 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 223bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public int getSinkState(BluetoothDevice device) { 224bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (DBG) log("getSinkState(" + device + ")"); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 226bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mService.getSinkState(device); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 228b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly Log.e(TAG, "", e); 229b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly return BluetoothA2dp.STATE_DISCONNECTED; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set priority of a2dp sink. 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Priority is a non-negative integer. By default paired sinks will have 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a priority of PRIORITY_AUTO, and unpaired headset PRIORITY_NONE (0). 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sinks with priority greater than zero will accept incoming connections 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (if no sink is currently connected). 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Priority for unpaired sink must be PRIORITY_NONE. 240bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @param device Paired sink 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param priority Integer priority, for example PRIORITY_AUTO or 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * PRIORITY_NONE 243b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly * @return true if priority is set, false on error 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 245b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly public boolean setSinkPriority(BluetoothDevice device, int priority) { 246bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (DBG) log("setSinkPriority(" + device + ", " + priority + ")"); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 248bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mService.setSinkPriority(device, priority); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 250b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly Log.e(TAG, "", e); 251b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly return false; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get priority of a2dp sink. 257bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @param device Sink 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return non-negative priority, or negative error code on error. 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 260bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public int getSinkPriority(BluetoothDevice device) { 261bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (DBG) log("getSinkPriority(" + device + ")"); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 263bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mService.getSinkPriority(device); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 265b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly Log.e(TAG, "", e); 266b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly return PRIORITY_OFF; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Helper for converting a state to a string. 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For debug use only - strings are not internationalized. 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static String stateToString(int state) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (state) { 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATE_DISCONNECTED: 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "disconnected"; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATE_CONNECTING: 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "connecting"; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATE_CONNECTED: 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "connected"; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATE_DISCONNECTING: 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "disconnecting"; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATE_PLAYING: 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "playing"; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "<unknown state " + state + ">"; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 290f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project 291f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project private static void log(String msg) { 292f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project Log.d(TAG, msg); 293f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project } 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 295