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