BluetoothA2dp.java revision f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57
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. 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 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 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Default priority for a2dp devices that should allow incoming 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connections */ 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PRIORITY_AUTO = 100; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Default priority for a2dp devices that should not allow incoming 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connections */ 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PRIORITY_OFF = 0; 83bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final IBluetoothA2dp mService; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a BluetoothA2dp proxy object for interacting with the local 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Bluetooth A2DP service. 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c Context 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BluetoothA2dp(Context c) { 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = c; 94bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder b = ServiceManager.getService(BluetoothA2dpService.BLUETOOTH_A2DP_SERVICE); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (b == null) { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Bluetooth A2DP service not available!"); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = IBluetoothA2dp.Stub.asInterface(b); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Initiate a connection to an A2DP sink. 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Listen for SINK_STATE_CHANGED_ACTION to find out when the 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connection is completed. 105bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @param device Remote BT device. 106b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly * @return false on immediate error, true otherwise 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 109b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly public boolean connectSink(BluetoothDevice device) { 110bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (DBG) log("connectSink(" + device + ")"); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 112bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mService.connectSink(device); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 114b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly Log.e(TAG, "", e); 115b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly return false; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Initiate disconnect from an A2DP sink. 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Listen for SINK_STATE_CHANGED_ACTION to find out when 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disconnect is completed. 122bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @param device Remote BT device. 123b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly * @return false on immediate error, true otherwise 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 126b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly public boolean disconnectSink(BluetoothDevice device) { 127bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (DBG) log("disconnectSink(" + device + ")"); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 129bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mService.disconnectSink(device); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 131b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly Log.e(TAG, "", e); 132b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly return false; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 136f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan /** Initiate suspend from an A2DP sink. 137f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * Listen for SINK_STATE_CHANGED_ACTION to find out when 138f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * suspend is completed. 139f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * @param device Remote BT device. 140f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * @return false on immediate error, true otherwise 141f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * @hide 142f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan */ 143f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan public int suspendSink(BluetoothDevice device) { 144f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan try { 145f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan return mService.suspendSink(device); 146f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan } catch (RemoteException e) { 147f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan Log.e(TAG, "", e); 148f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan return false; 149f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan } 150f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan } 151f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan 152f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan /** Initiate resume from an suspended A2DP sink. 153f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * Listen for SINK_STATE_CHANGED_ACTION to find out when 154f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * resume is completed. 155f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * @param device Remote BT device. 156f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * @return false on immediate error, true otherwise 157f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan * @hide 158f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan */ 159f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan public int resumeSink(BluetoothDevice device) { 160f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan try { 161f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan return mService.resumeSink(device); 162f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan } catch (RemoteException e) { 163f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan Log.e(TAG, "", e); 164f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan return false; 165f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan } 166f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan } 167f9bbe1e71a502fe7bd1f4a23ba5bbe4dde0d9d57Zhu Lan 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Check if a specified A2DP sink is connected. 169bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @param device Remote BT device. 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if connected (or playing), false otherwise and on error. 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 173bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean isSinkConnected(BluetoothDevice device) { 174bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (DBG) log("isSinkConnected(" + device + ")"); 175bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly int state = getSinkState(device); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return state == STATE_CONNECTED || state == STATE_PLAYING; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Check if any A2DP sink is connected. 180bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @return a unmodifiable set of connected A2DP sinks, or null on error. 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 183bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public Set<BluetoothDevice> getConnectedSinks() { 184bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (DBG) log("getConnectedSinks()"); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 186bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return Collections.unmodifiableSet( 187bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly new HashSet<BluetoothDevice>(Arrays.asList(mService.getConnectedSinks()))); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 189b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly Log.e(TAG, "", e); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Get the state of an A2DP sink 195bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @param device Remote BT device. 196b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly * @return State code, one of STATE_ 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 199bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public int getSinkState(BluetoothDevice device) { 200bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (DBG) log("getSinkState(" + device + ")"); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 202bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mService.getSinkState(device); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 204b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly Log.e(TAG, "", e); 205b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly return BluetoothA2dp.STATE_DISCONNECTED; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set priority of a2dp sink. 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Priority is a non-negative integer. By default paired sinks will have 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a priority of PRIORITY_AUTO, and unpaired headset PRIORITY_NONE (0). 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sinks with priority greater than zero will accept incoming connections 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (if no sink is currently connected). 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Priority for unpaired sink must be PRIORITY_NONE. 216bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @param device Paired sink 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param priority Integer priority, for example PRIORITY_AUTO or 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * PRIORITY_NONE 219b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly * @return true if priority is set, false on error 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 221b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly public boolean setSinkPriority(BluetoothDevice device, int priority) { 222bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (DBG) log("setSinkPriority(" + device + ", " + priority + ")"); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 224bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mService.setSinkPriority(device, priority); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 226b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly Log.e(TAG, "", e); 227b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly return false; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get priority of a2dp sink. 233bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @param device Sink 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return non-negative priority, or negative error code on error. 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 236bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public int getSinkPriority(BluetoothDevice device) { 237bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (DBG) log("getSinkPriority(" + device + ")"); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 239bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mService.getSinkPriority(device); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 241b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly Log.e(TAG, "", e); 242b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly return PRIORITY_OFF; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Helper for converting a state to a string. 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For debug use only - strings are not internationalized. 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static String stateToString(int state) { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (state) { 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATE_DISCONNECTED: 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "disconnected"; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATE_CONNECTING: 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "connecting"; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATE_CONNECTED: 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "connected"; 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATE_DISCONNECTING: 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "disconnecting"; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATE_PLAYING: 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "playing"; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "<unknown state " + state + ">"; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 266f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project 267f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project private static void log(String msg) { 268f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project Log.d(TAG, msg); 269f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project } 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 271