A2dpProfile.java revision 436b29e68e6608bed9e8e7d54385b8f62d89208e
1436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby/* 2436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * Copyright (C) 2011 The Android Open Source Project 3436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * 4436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * Licensed under the Apache License, Version 2.0 (the "License"); 5436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * you may not use this file except in compliance with the License. 6436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * You may obtain a copy of the License at 7436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * 8436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * http://www.apache.org/licenses/LICENSE-2.0 9436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * 10436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * Unless required by applicable law or agreed to in writing, software 11436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * distributed under the License is distributed on an "AS IS" BASIS, 12436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * See the License for the specific language governing permissions and 14436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * limitations under the License. 15436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby */ 16436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 17436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambypackage com.android.settings.bluetooth; 18436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 19436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothA2dp; 20436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothAdapter; 21436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothClass; 22436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothDevice; 23436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothProfile; 24436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothUuid; 25436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.content.Context; 26436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.os.ParcelUuid; 27436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 28436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport com.android.settings.R; 29436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 30436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport java.util.List; 31436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 32436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby/** 33436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * A2dpProfile handles Bluetooth A2DP. 34436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * TODO: add null checks around calls to mService object. 35436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby */ 36436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyfinal class A2dpProfile implements LocalBluetoothProfile { 37436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby private BluetoothA2dp mService; 38436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 39436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby static final ParcelUuid[] SINK_UUIDS = { 40436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby BluetoothUuid.AudioSink, 41436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby BluetoothUuid.AdvAudioDist, 42436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby }; 43436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 44436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby static final String NAME = "A2DP"; 45436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 46436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby // Order of this profile in device profiles list 47436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby private static final int ORDINAL = 1; 48436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 49436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby // These callbacks run on the main thread. 50436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby private final class A2dpServiceListener 51436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby implements BluetoothProfile.ServiceListener { 52436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 53436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public void onServiceConnected(int profile, BluetoothProfile proxy) { 54436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby mService = (BluetoothA2dp) proxy; 55436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 56436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 57436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public void onServiceDisconnected(int profile) { 58436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby mService = null; 59436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 60436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 61436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 62436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby A2dpProfile(Context context) { 63436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 64436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby adapter.getProfileProxy(context, new A2dpServiceListener(), 65436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby BluetoothProfile.A2DP); 66436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 67436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 68436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean isConnectable() { 69436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return true; 70436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 71436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 72436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean isAutoConnectable() { 73436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return true; 74436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 75436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 76436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby private List<BluetoothDevice> getConnectedDevices() { 77436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return mService.getDevicesMatchingConnectionStates( 78436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby new int[] {BluetoothProfile.STATE_CONNECTED, 79436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby BluetoothProfile.STATE_CONNECTING, 80436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby BluetoothProfile.STATE_DISCONNECTING}); 81436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 82436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 83436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean connect(BluetoothDevice device) { 84436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby List<BluetoothDevice> sinks = getConnectedDevices(); 85436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby if (sinks != null) { 86436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby for (BluetoothDevice sink : sinks) { 87436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby mService.disconnect(sink); 88436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 89436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 90436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return mService.connect(device); 91436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 92436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 93436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean disconnect(BluetoothDevice device) { 94436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return mService.disconnect(device); 95436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 96436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 97436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public int getConnectionStatus(BluetoothDevice device) { 98436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return mService.getConnectionState(device); 99436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 100436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 101436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean isPreferred(BluetoothDevice device) { 102436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return mService.getPriority(device) > BluetoothProfile.PRIORITY_OFF; 103436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 104436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 105436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public int getPreferred(BluetoothDevice device) { 106436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return mService.getPriority(device); 107436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 108436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 109436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public void setPreferred(BluetoothDevice device, boolean preferred) { 110436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby if (preferred) { 111436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby if (mService.getPriority(device) < BluetoothProfile.PRIORITY_ON) { 112436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby mService.setPriority(device, BluetoothProfile.PRIORITY_ON); 113436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 114436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } else { 115436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby mService.setPriority(device, BluetoothProfile.PRIORITY_OFF); 116436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 117436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 118436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 119436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby boolean isA2dpPlaying() { 120436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby List<BluetoothDevice> sinks = mService.getConnectedDevices(); 121436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby if (!sinks.isEmpty()) { 122436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby if (mService.isA2dpPlaying(sinks.get(0))) { 123436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return true; 124436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 125436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 126436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return false; 127436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 128436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 129436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean isProfileReady() { 130436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return mService != null; 131436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 132436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 133436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public String toString() { 134436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return NAME; 135436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 136436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 137436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public int getOrdinal() { 138436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return ORDINAL; 139436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 140436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 141436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public int getNameResource() { 142436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return R.string.bluetooth_profile_a2dp; 143436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 144436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 145436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public int getDisconnectResource() { 146436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return R.string.bluetooth_disconnect_a2dp_profile; 147436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 148436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 149436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public int getSummaryResourceForDevice(BluetoothDevice device) { 150436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby int state = mService.getConnectionState(device); 151436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby switch (state) { 152436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby case BluetoothProfile.STATE_DISCONNECTED: 153436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return R.string.bluetooth_a2dp_profile_summary_use_for; 154436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 155436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby case BluetoothProfile.STATE_CONNECTED: 156436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return R.string.bluetooth_a2dp_profile_summary_connected; 157436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 158436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby default: 159436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return Utils.getConnectionStateSummary(state); 160436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 161436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 162436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 163436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public int getDrawableResource(BluetoothClass btClass) { 164436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return R.drawable.ic_bt_headphones_a2dp; 165436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 166436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby} 167