1f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal/*
2f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * Copyright (C) 2016 The Android Open Source Project
3f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal *
4f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * Licensed under the Apache License, Version 2.0 (the "License");
5f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * you may not use this file except in compliance with the License.
6f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * You may obtain a copy of the License at
7f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal *
8f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal *      http://www.apache.org/licenses/LICENSE-2.0
9f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal *
10f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * Unless required by applicable law or agreed to in writing, software
11f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * distributed under the License is distributed on an "AS IS" BASIS,
12f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * See the License for the specific language governing permissions and
14f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * limitations under the License.
15f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal */
16f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
17f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalpackage com.android.settingslib.bluetooth;
18f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
19f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport android.bluetooth.BluetoothHeadsetClient;
20f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport android.bluetooth.BluetoothAdapter;
21f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport android.bluetooth.BluetoothClass;
22f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport android.bluetooth.BluetoothDevice;
23f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport android.bluetooth.BluetoothProfile;
24f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport android.bluetooth.BluetoothUuid;
25f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport android.content.Context;
26f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport android.os.ParcelUuid;
27f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport android.util.Log;
28f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
29f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport com.android.settingslib.R;
30f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
31f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport java.util.ArrayList;
32f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport java.util.List;
33f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
34f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal/**
35f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * Handles the Handsfree HF role.
36f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal */
37f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalfinal class HfpClientProfile implements LocalBluetoothProfile {
38f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    private static final String TAG = "HfpClientProfile";
39f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    private static boolean V = false;
40f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
41f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    private BluetoothHeadsetClient mService;
42f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    private boolean mIsProfileReady;
43f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
44f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    private final LocalBluetoothAdapter mLocalAdapter;
45f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    private final CachedBluetoothDeviceManager mDeviceManager;
46f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
47f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    static final ParcelUuid[] SRC_UUIDS = {
48f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        BluetoothUuid.HSP_AG,
49f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        BluetoothUuid.Handsfree_AG,
50f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    };
51f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
52f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    static final String NAME = "HEADSET_CLIENT";
53f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    private final LocalBluetoothProfileManager mProfileManager;
54f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
55f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    // Order of this profile in device profiles list
56f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    private static final int ORDINAL = 0;
57f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
58f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    // These callbacks run on the main thread.
59f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    private final class HfpClientServiceListener
60f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            implements BluetoothProfile.ServiceListener {
61f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
62f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        @Override
63f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        public void onServiceConnected(int profile, BluetoothProfile proxy) {
64f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            if (V) Log.d(TAG,"Bluetooth service connected");
65f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            mService = (BluetoothHeadsetClient) proxy;
66f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            // We just bound to the service, so refresh the UI for any connected HFP devices.
67f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            List<BluetoothDevice> deviceList = mService.getConnectedDevices();
68f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            while (!deviceList.isEmpty()) {
69f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                BluetoothDevice nextDevice = deviceList.remove(0);
70f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                CachedBluetoothDevice device = mDeviceManager.findDevice(nextDevice);
71f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                // we may add a new device here, but generally this should not happen
72f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                if (device == null) {
73f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                    Log.w(TAG, "HfpClient profile found new device: " + nextDevice);
74f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                    device = mDeviceManager.addDevice(mLocalAdapter, mProfileManager, nextDevice);
75f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                }
76f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                device.onProfileStateChanged(
77f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                    HfpClientProfile.this, BluetoothProfile.STATE_CONNECTED);
78f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                device.refresh();
79f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            }
80f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            mIsProfileReady=true;
81f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        }
82f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
83f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        @Override
84f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        public void onServiceDisconnected(int profile) {
85f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            if (V) Log.d(TAG,"Bluetooth service disconnected");
86f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            mIsProfileReady=false;
87f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        }
88f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    }
89f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
90f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    @Override
91f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    public boolean isProfileReady() {
92f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        return mIsProfileReady;
93f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    }
94f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
95f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    HfpClientProfile(Context context, LocalBluetoothAdapter adapter,
96f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            CachedBluetoothDeviceManager deviceManager,
97f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            LocalBluetoothProfileManager profileManager) {
98f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        mLocalAdapter = adapter;
99f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        mDeviceManager = deviceManager;
100f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        mProfileManager = profileManager;
101f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        mLocalAdapter.getProfileProxy(context, new HfpClientServiceListener(),
102f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                BluetoothProfile.HEADSET_CLIENT);
103f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    }
104f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
105f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    @Override
106f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    public boolean isConnectable() {
107f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        return true;
108f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    }
109f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
110f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    @Override
111f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    public boolean isAutoConnectable() {
112f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        return true;
113f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    }
114f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
115f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    public List<BluetoothDevice> getConnectedDevices() {
116f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        if (mService == null) return new ArrayList<BluetoothDevice>(0);
117f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        return mService.getDevicesMatchingConnectionStates(
118f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal              new int[] {BluetoothProfile.STATE_CONNECTED,
119f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                         BluetoothProfile.STATE_CONNECTING,
120f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                         BluetoothProfile.STATE_DISCONNECTING});
121f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    }
122f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
123f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    @Override
124f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    public boolean connect(BluetoothDevice device) {
125f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        if (mService == null) return false;
126f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        List<BluetoothDevice> srcs = getConnectedDevices();
127f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        if (srcs != null) {
128f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            for (BluetoothDevice src : srcs) {
129f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                if (src.equals(device)) {
130f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                    // Connect to same device, Ignore it
131f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                    Log.d(TAG,"Ignoring Connect");
132f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                    return true;
133f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                }
134f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            }
135f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        }
136f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        return mService.connect(device);
137f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    }
138f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
139f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    @Override
140f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    public boolean disconnect(BluetoothDevice device) {
141f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        if (mService == null) return false;
142f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        // Downgrade priority as user is disconnecting the headset.
143f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        if (mService.getPriority(device) > BluetoothProfile.PRIORITY_ON){
144f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            mService.setPriority(device, BluetoothProfile.PRIORITY_ON);
145f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        }
146f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        return mService.disconnect(device);
147f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    }
148f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
149f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    @Override
150f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    public int getConnectionStatus(BluetoothDevice device) {
151f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        if (mService == null) {
152f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            return BluetoothProfile.STATE_DISCONNECTED;
153f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        }
154f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        return mService.getConnectionState(device);
155f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    }
156f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
157f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    @Override
158f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    public boolean isPreferred(BluetoothDevice device) {
159f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        if (mService == null) return false;
160f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        return mService.getPriority(device) > BluetoothProfile.PRIORITY_OFF;
161f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    }
162f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
163f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    @Override
164f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    public int getPreferred(BluetoothDevice device) {
165f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        if (mService == null) return BluetoothProfile.PRIORITY_OFF;
166f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        return mService.getPriority(device);
167f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    }
168f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
169f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    @Override
170f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    public void setPreferred(BluetoothDevice device, boolean preferred) {
171f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        if (mService == null) return;
172f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        if (preferred) {
173f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            if (mService.getPriority(device) < BluetoothProfile.PRIORITY_ON) {
174f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                mService.setPriority(device, BluetoothProfile.PRIORITY_ON);
175f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            }
176f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        } else {
177f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            mService.setPriority(device, BluetoothProfile.PRIORITY_OFF);
178f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        }
179f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    }
180f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
181f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    @Override
182f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    public String toString() {
183f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        return NAME;
184f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    }
185f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
186f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    @Override
187f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    public int getOrdinal() {
188f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        return ORDINAL;
189f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    }
190f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
191f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    @Override
192f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    public int getNameResource(BluetoothDevice device) {
193f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        return R.string.bluetooth_profile_headset;
194f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    }
195f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
196f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    @Override
197f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    public int getSummaryResourceForDevice(BluetoothDevice device) {
198f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        int state = getConnectionStatus(device);
199f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        switch (state) {
200f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            case BluetoothProfile.STATE_DISCONNECTED:
201f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                return R.string.bluetooth_headset_profile_summary_use_for;
202f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
203f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            case BluetoothProfile.STATE_CONNECTED:
204f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                return R.string.bluetooth_headset_profile_summary_connected;
205f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
206f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            default:
207f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                return Utils.getConnectionStateSummary(state);
208f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        }
209f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    }
210f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
211f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    @Override
212f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    public int getDrawableResource(BluetoothClass btClass) {
213f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        return R.drawable.ic_bt_headset_hfp;
214f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    }
215f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal
216f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    protected void finalize() {
217f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        if (V) Log.d(TAG, "finalize()");
218f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        if (mService != null) {
219f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            try {
220f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                BluetoothAdapter.getDefaultAdapter().closeProfileProxy(
221f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                    BluetoothProfile.HEADSET_CLIENT, mService);
222f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                mService = null;
223f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            } catch (Throwable t) {
224f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal                Log.w(TAG, "Error cleaning up HfpClient proxy", t);
225f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal            }
226f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal        }
227f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal    }
228f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal}
229