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