1563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo/*
2563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * Copyright (C) 2016 The Android Open Source Project
3563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo *
4563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * Licensed under the Apache License, Version 2.0 (the "License");
5563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * you may not use this file except in compliance with the License.
6563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * You may obtain a copy of the License at
7563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo *
8563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo *      http://www.apache.org/licenses/LICENSE-2.0
9563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo *
10563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * Unless required by applicable law or agreed to in writing, software
11563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * distributed under the License is distributed on an "AS IS" BASIS,
12563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * See the License for the specific language governing permissions and
14563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * limitations under the License.
15563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo */
16563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
17563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzopackage com.android.settingslib.bluetooth;
18563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
19563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport android.bluetooth.BluetoothPbapClient;
20563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport android.bluetooth.BluetoothAdapter;
21563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport android.bluetooth.BluetoothClass;
22563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport android.bluetooth.BluetoothDevice;
23563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport android.bluetooth.BluetoothProfile;
24563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport android.bluetooth.BluetoothUuid;
25563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport android.content.Context;
26563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport android.os.ParcelUuid;
27563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport android.util.Log;
28563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
29563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport com.android.settingslib.R;
30563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
31563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport java.util.ArrayList;
32563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport java.util.Collection;
33563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport java.util.List;
34563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
357af55fd10e222b0d10fd15692d7db139f707b27broger xuepublic final class PbapClientProfile implements LocalBluetoothProfile {
36563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    private static final String TAG = "PbapClientProfile";
37563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    private static boolean V = false;
38563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
39563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    private BluetoothPbapClient mService;
40563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    private boolean mIsProfileReady;
41563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
42563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    private final LocalBluetoothAdapter mLocalAdapter;
43563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    private final CachedBluetoothDeviceManager mDeviceManager;
44563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
45563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    static final ParcelUuid[] SRC_UUIDS = {
46563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        BluetoothUuid.PBAP_PSE,
47563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    };
48563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
49563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    static final String NAME = "PbapClient";
50563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    private final LocalBluetoothProfileManager mProfileManager;
51563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
52563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    // Order of this profile in device profiles list
53563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    private static final int ORDINAL = 6;
54563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
55563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    // These callbacks run on the main thread.
56563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    private final class PbapClientServiceListener
57563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            implements BluetoothProfile.ServiceListener {
58563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
59563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        public void onServiceConnected(int profile, BluetoothProfile proxy) {
60563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            if (V) {
61563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                Log.d(TAG,"Bluetooth service connected");
62563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            }
63563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            mService = (BluetoothPbapClient) proxy;
64563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            // We just bound to the service, so refresh the UI for any connected PBAP devices.
65563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            List<BluetoothDevice> deviceList = mService.getConnectedDevices();
66563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            while (!deviceList.isEmpty()) {
67563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                BluetoothDevice nextDevice = deviceList.remove(0);
68563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                CachedBluetoothDevice device = mDeviceManager.findDevice(nextDevice);
69563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                // we may add a new device here, but generally this should not happen
70563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                if (device == null) {
71563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                    Log.w(TAG, "PbapClientProfile found new device: " + nextDevice);
72563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                    device = mDeviceManager.addDevice(mLocalAdapter, mProfileManager, nextDevice);
73563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                }
74563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                device.onProfileStateChanged(PbapClientProfile.this, BluetoothProfile.STATE_CONNECTED);
75563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                device.refresh();
76563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            }
77563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            mIsProfileReady = true;
78563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        }
79563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
80563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        public void onServiceDisconnected(int profile) {
81563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            if (V) {
82563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                Log.d(TAG,"Bluetooth service disconnected");
83563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            }
84563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            mIsProfileReady = false;
85563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        }
86563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
87563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
88563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    private void refreshProfiles() {
89563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        Collection<CachedBluetoothDevice> cachedDevices = mDeviceManager.getCachedDevicesCopy();
90563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        for (CachedBluetoothDevice device : cachedDevices) {
91563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            device.onUuidChanged();
92563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        }
93563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
94563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
95563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    public boolean pbapClientExists() {
96563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        return (mService != null);
97563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
98563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
99563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    public boolean isProfileReady() {
100563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        return mIsProfileReady;
101563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
102563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
10344de3a076d8903078c96e6b38564a16832996310ryanywlin    @Override
10444de3a076d8903078c96e6b38564a16832996310ryanywlin    public int getProfileId() {
10544de3a076d8903078c96e6b38564a16832996310ryanywlin        return BluetoothProfile.PBAP_CLIENT;
10644de3a076d8903078c96e6b38564a16832996310ryanywlin    }
10744de3a076d8903078c96e6b38564a16832996310ryanywlin
108563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    PbapClientProfile(Context context, LocalBluetoothAdapter adapter,
109563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            CachedBluetoothDeviceManager deviceManager,
110563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            LocalBluetoothProfileManager profileManager) {
111563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        mLocalAdapter = adapter;
112563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        mDeviceManager = deviceManager;
113563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        mProfileManager = profileManager;
114563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        mLocalAdapter.getProfileProxy(context, new PbapClientServiceListener(),
115563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                BluetoothProfile.PBAP_CLIENT);
116563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
117563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
118563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    public boolean isConnectable() {
119563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        return true;
120563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
121563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
122563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    public boolean isAutoConnectable() {
123563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        return true;
124563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
125563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
126563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    public List<BluetoothDevice> getConnectedDevices() {
127563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        if (mService == null) {
128563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            return new ArrayList<BluetoothDevice>(0);
129563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        }
130563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        return mService.getDevicesMatchingConnectionStates(
131563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo              new int[] {BluetoothProfile.STATE_CONNECTED,
132563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                         BluetoothProfile.STATE_CONNECTING,
133563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                         BluetoothProfile.STATE_DISCONNECTING});
134563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
135563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
136563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    public boolean connect(BluetoothDevice device) {
137563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        if (V) {
138563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            Log.d(TAG,"PBAPClientProfile got connect request");
139563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        }
140563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        if (mService == null) {
141563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            return false;
142563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        }
143563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        List<BluetoothDevice> srcs = getConnectedDevices();
144563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        if (srcs != null) {
145563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            for (BluetoothDevice src : srcs) {
146563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                if (src.equals(device)) {
147563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                    // Connect to same device, Ignore it
148563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                    Log.d(TAG,"Ignoring Connect");
149563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                    return true;
150563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                }
151563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            }
152563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        }
153563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        Log.d(TAG,"PBAPClientProfile attempting to connect to " + device.getAddress());
154563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
155563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        return mService.connect(device);
156563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
157563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
158563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    public boolean disconnect(BluetoothDevice device) {
159563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        if (V) {
160563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            Log.d(TAG,"PBAPClientProfile got disconnect request");
161563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        }
162563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        if (mService == null) {
163563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            return false;
164563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        }
165563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        return mService.disconnect(device);
166563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
167563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
168563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    public int getConnectionStatus(BluetoothDevice device) {
169563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        if (mService == null) {
170563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            return BluetoothProfile.STATE_DISCONNECTED;
171563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        }
172563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        return mService.getConnectionState(device);
173563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
174563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
175563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    public boolean isPreferred(BluetoothDevice device) {
176563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        if (mService == null) {
177563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            return false;
178563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        }
179563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        return mService.getPriority(device) > BluetoothProfile.PRIORITY_OFF;
180563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
181563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
182563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    public int getPreferred(BluetoothDevice device) {
183563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        if (mService == null) {
184563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            return BluetoothProfile.PRIORITY_OFF;
185563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        }
186563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        return mService.getPriority(device);
187563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
188563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
189563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    public void setPreferred(BluetoothDevice device, boolean preferred) {
190563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        if (mService == null) {
191563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            return;
192563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        }
193563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        if (preferred) {
194563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            if (mService.getPriority(device) < BluetoothProfile.PRIORITY_ON) {
195563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                mService.setPriority(device, BluetoothProfile.PRIORITY_ON);
196563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            }
197563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        } else {
198563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            mService.setPriority(device, BluetoothProfile.PRIORITY_OFF);
199563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        }
200563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
201563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
202563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    public String toString() {
203563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        return NAME;
204563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
205563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
206563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    public int getOrdinal() {
207563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        return ORDINAL;
208563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
209563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
210563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    public int getNameResource(BluetoothDevice device) {
211563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        // we need to have same string in UI as the server side.
212563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        return R.string.bluetooth_profile_pbap;
213563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
214563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
215563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    public int getSummaryResourceForDevice(BluetoothDevice device) {
216563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        return R.string.bluetooth_profile_pbap_summary;
217563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
218563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
219563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    public int getDrawableResource(BluetoothClass btClass) {
220563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        return R.drawable.ic_bt_cellphone;
221563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
222563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo
223563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    protected void finalize() {
224563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        if (V) {
225563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            Log.d(TAG, "finalize()");
226563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        }
227563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        if (mService != null) {
228563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            try {
229563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                BluetoothAdapter.getDefaultAdapter().closeProfileProxy(
230563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                    BluetoothProfile.PBAP_CLIENT,mService);
231563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                mService = null;
232563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            } catch (Throwable t) {
233563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo                Log.w(TAG, "Error cleaning up PBAP Client proxy", t);
234563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo            }
235563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo        }
236563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo    }
237563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo}
238