11bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal/*
21bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * Copyright (C) 2015 The Android Open Source Project
31bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal *
41bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * Licensed under the Apache License, Version 2.0 (the "License");
51bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * you may not use this file except in compliance with the License.
61bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * You may obtain a copy of the License at
71bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal *
81bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal *      http://www.apache.org/licenses/LICENSE-2.0
91bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal *
101bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * Unless required by applicable law or agreed to in writing, software
111bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * distributed under the License is distributed on an "AS IS" BASIS,
121bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * See the License for the specific language governing permissions and
141bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * limitations under the License.
151bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal */
161bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
171bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalpackage com.android.settingslib.bluetooth;
181bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
191bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.bluetooth.BluetoothA2dpSink;
201bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.bluetooth.BluetoothAdapter;
211bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.bluetooth.BluetoothClass;
221bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.bluetooth.BluetoothDevice;
231bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.bluetooth.BluetoothProfile;
241bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.bluetooth.BluetoothUuid;
251bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.content.Context;
261bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.os.ParcelUuid;
271bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.util.Log;
281bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
291bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport com.android.settingslib.R;
301bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
311bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport java.util.ArrayList;
321bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport java.util.List;
331bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
341bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalfinal class A2dpSinkProfile implements LocalBluetoothProfile {
351bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    private static final String TAG = "A2dpSinkProfile";
361bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    private static boolean V = true;
371bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
381bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    private BluetoothA2dpSink mService;
391bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    private boolean mIsProfileReady;
401bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
411bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    private final LocalBluetoothAdapter mLocalAdapter;
421bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    private final CachedBluetoothDeviceManager mDeviceManager;
431bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
441bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    static final ParcelUuid[] SRC_UUIDS = {
451bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        BluetoothUuid.AudioSource,
461bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        BluetoothUuid.AdvAudioDist,
471bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    };
481bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
491bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    static final String NAME = "A2DPSink";
501bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    private final LocalBluetoothProfileManager mProfileManager;
511bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
521bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    // Order of this profile in device profiles list
531bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    private static final int ORDINAL = 5;
541bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
551bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    // These callbacks run on the main thread.
561bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    private final class A2dpSinkServiceListener
571bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            implements BluetoothProfile.ServiceListener {
581bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
591bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        public void onServiceConnected(int profile, BluetoothProfile proxy) {
601bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            if (V) Log.d(TAG,"Bluetooth service connected");
611bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            mService = (BluetoothA2dpSink) proxy;
621bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            // We just bound to the service, so refresh the UI for any connected A2DP devices.
631bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            List<BluetoothDevice> deviceList = mService.getConnectedDevices();
641bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            while (!deviceList.isEmpty()) {
651bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                BluetoothDevice nextDevice = deviceList.remove(0);
661bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                CachedBluetoothDevice device = mDeviceManager.findDevice(nextDevice);
671bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                // we may add a new device here, but generally this should not happen
681bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                if (device == null) {
691bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                    Log.w(TAG, "A2dpSinkProfile found new device: " + nextDevice);
701bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                    device = mDeviceManager.addDevice(mLocalAdapter, mProfileManager, nextDevice);
711bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                }
721bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                device.onProfileStateChanged(A2dpSinkProfile.this, BluetoothProfile.STATE_CONNECTED);
731bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                device.refresh();
741bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            }
751bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            mIsProfileReady=true;
761bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        }
771bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
781bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        public void onServiceDisconnected(int profile) {
791bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            if (V) Log.d(TAG,"Bluetooth service disconnected");
801bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            mIsProfileReady=false;
811bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        }
821bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
831bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
841bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public boolean isProfileReady() {
851bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        return mIsProfileReady;
861bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
871bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
881bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    A2dpSinkProfile(Context context, LocalBluetoothAdapter adapter,
891bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            CachedBluetoothDeviceManager deviceManager,
901bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            LocalBluetoothProfileManager profileManager) {
911bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        mLocalAdapter = adapter;
921bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        mDeviceManager = deviceManager;
931bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        mProfileManager = profileManager;
941bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        mLocalAdapter.getProfileProxy(context, new A2dpSinkServiceListener(),
951bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                BluetoothProfile.A2DP_SINK);
961bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
971bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
981bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public boolean isConnectable() {
991bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        return true;
1001bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1011bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1021bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public boolean isAutoConnectable() {
1031bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        return true;
1041bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1051bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1061bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public List<BluetoothDevice> getConnectedDevices() {
1071bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        if (mService == null) return new ArrayList<BluetoothDevice>(0);
1081bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        return mService.getDevicesMatchingConnectionStates(
1091bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal              new int[] {BluetoothProfile.STATE_CONNECTED,
1101bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                         BluetoothProfile.STATE_CONNECTING,
1111bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                         BluetoothProfile.STATE_DISCONNECTING});
1121bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1131bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1141bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public boolean connect(BluetoothDevice device) {
1151bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        if (mService == null) return false;
1161bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        List<BluetoothDevice> srcs = getConnectedDevices();
1171bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        if (srcs != null) {
1181bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            for (BluetoothDevice src : srcs) {
1191bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                if (src.equals(device)) {
1201bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                    // Connect to same device, Ignore it
1211bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                    Log.d(TAG,"Ignoring Connect");
1221bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                    return true;
1231bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                }
1241bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            }
1251bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            for (BluetoothDevice src : srcs) {
1261bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                mService.disconnect(src);
1271bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            }
1281bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        }
1291bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        return mService.connect(device);
1301bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1311bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1321bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public boolean disconnect(BluetoothDevice device) {
1331bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        if (mService == null) return false;
1341bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        // Downgrade priority as user is disconnecting the headset.
1351bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        if (mService.getPriority(device) > BluetoothProfile.PRIORITY_ON){
1361bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            mService.setPriority(device, BluetoothProfile.PRIORITY_ON);
1371bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        }
1381bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        return mService.disconnect(device);
1391bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1401bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1411bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public int getConnectionStatus(BluetoothDevice device) {
1421bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        if (mService == null) {
1431bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            return BluetoothProfile.STATE_DISCONNECTED;
1441bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        }
1451bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        return mService.getConnectionState(device);
1461bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1471bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1481bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public boolean isPreferred(BluetoothDevice device) {
1491bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        if (mService == null) return false;
1501bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        return mService.getPriority(device) > BluetoothProfile.PRIORITY_OFF;
1511bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1521bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1531bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public int getPreferred(BluetoothDevice device) {
1541bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        if (mService == null) return BluetoothProfile.PRIORITY_OFF;
1551bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        return mService.getPriority(device);
1561bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1571bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1581bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public void setPreferred(BluetoothDevice device, boolean preferred) {
1591bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        if (mService == null) return;
1601bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        if (preferred) {
1611bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            if (mService.getPriority(device) < BluetoothProfile.PRIORITY_ON) {
1621bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                mService.setPriority(device, BluetoothProfile.PRIORITY_ON);
1631bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            }
1641bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        } else {
1651bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            mService.setPriority(device, BluetoothProfile.PRIORITY_OFF);
1661bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        }
1671bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1681bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1691bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    boolean isA2dpPlaying() {
1701bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        if (mService == null) return false;
1711bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        List<BluetoothDevice> srcs = mService.getConnectedDevices();
1721bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        if (!srcs.isEmpty()) {
1731bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            if (mService.isA2dpPlaying(srcs.get(0))) {
1741bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                return true;
1751bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            }
1761bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        }
1771bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        return false;
1781bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1791bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1801bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public String toString() {
1811bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        return NAME;
1821bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1831bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1841bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public int getOrdinal() {
1851bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        return ORDINAL;
1861bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1871bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1881bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public int getNameResource(BluetoothDevice device) {
1891bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        // we need to have same string in UI for even SINK Media Audio.
1901bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        return R.string.bluetooth_profile_a2dp;
1911bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1921bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1931bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public int getSummaryResourceForDevice(BluetoothDevice device) {
1941bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        int state = getConnectionStatus(device);
1951bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        switch (state) {
1961bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            case BluetoothProfile.STATE_DISCONNECTED:
1971bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                return R.string.bluetooth_a2dp_profile_summary_use_for;
1981bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1991bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            case BluetoothProfile.STATE_CONNECTED:
2001bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                return R.string.bluetooth_a2dp_profile_summary_connected;
2011bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
2021bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            default:
2031bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                return Utils.getConnectionStateSummary(state);
2041bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        }
2051bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
2061bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
2071bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public int getDrawableResource(BluetoothClass btClass) {
2081bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        return R.drawable.ic_bt_headphones_a2dp;
2091bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
2101bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
2111bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    protected void finalize() {
2121bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        if (V) Log.d(TAG, "finalize()");
2131bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        if (mService != null) {
2141bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            try {
2151bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                BluetoothAdapter.getDefaultAdapter().closeProfileProxy(BluetoothProfile.A2DP_SINK,
2161bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                                                                       mService);
2171bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                mService = null;
2181bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            }catch (Throwable t) {
2191bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal                Log.w(TAG, "Error cleaning up A2DP proxy", t);
2201bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            }
2211bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        }
2221bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
2231bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal}
224