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.BluetoothAdapter; 20436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothClass; 21436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothDevice; 22436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothPan; 23436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothProfile; 24436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.content.Context; 25436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 26436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport com.android.settings.R; 27436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 28c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hambyimport java.util.HashMap; 29436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport java.util.List; 30436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 31436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby/** 32c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby * PanProfile handles Bluetooth PAN profile (NAP and PANU). 33436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby */ 34436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyfinal class PanProfile implements LocalBluetoothProfile { 35436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby private BluetoothPan mService; 36436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 37c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby // Tethering direction for each device 38c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby private final HashMap<BluetoothDevice, Integer> mDeviceRoleMap = 39c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby new HashMap<BluetoothDevice, Integer>(); 40c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby 41436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby static final String NAME = "PAN"; 42436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 43436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby // Order of this profile in device profiles list 44436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby private static final int ORDINAL = 4; 45436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 46436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby // These callbacks run on the main thread. 47436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby private final class PanServiceListener 48436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby implements BluetoothProfile.ServiceListener { 49436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 50436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public void onServiceConnected(int profile, BluetoothProfile proxy) { 51436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby mService = (BluetoothPan) proxy; 52436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 53436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 54436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public void onServiceDisconnected(int profile) { 55436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby mService = null; 56436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 57436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 58436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 59436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby PanProfile(Context context) { 60436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 61436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby adapter.getProfileProxy(context, new PanServiceListener(), 62436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby BluetoothProfile.PAN); 63436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 64436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 65436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean isConnectable() { 66436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return true; 67436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 68436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 69436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean isAutoConnectable() { 70436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return false; 71436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 72436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 73436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean connect(BluetoothDevice device) { 74436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby List<BluetoothDevice> sinks = mService.getConnectedDevices(); 75436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby if (sinks != null) { 76436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby for (BluetoothDevice sink : sinks) { 77436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby mService.disconnect(sink); 78436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 79436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 80436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return mService.connect(device); 81436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 82436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 83436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean disconnect(BluetoothDevice device) { 84436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return mService.disconnect(device); 85436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 86436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 87436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public int getConnectionStatus(BluetoothDevice device) { 88436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return mService.getConnectionState(device); 89436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 90436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 91436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean isPreferred(BluetoothDevice device) { 92436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return true; 93436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 94436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 95436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public int getPreferred(BluetoothDevice device) { 96436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return -1; 97436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 98436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 99436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public void setPreferred(BluetoothDevice device, boolean preferred) { 100436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby // ignore: isPreferred is always true for PAN 101436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 102436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 103436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean isProfileReady() { 104436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return true; 105436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 106436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 107436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public String toString() { 108436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return NAME; 109436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 110436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 111436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public int getOrdinal() { 112436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return ORDINAL; 113436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 114436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 11579be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby public int getNameResource(BluetoothDevice device) { 116c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby if (isLocalRoleNap(device)) { 11779be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby return R.string.bluetooth_profile_pan_nap; 118c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby } else { 11979be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby return R.string.bluetooth_profile_pan; 120c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby } 121436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 122436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 123436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public int getSummaryResourceForDevice(BluetoothDevice device) { 124436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby int state = mService.getConnectionState(device); 125436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby switch (state) { 126436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby case BluetoothProfile.STATE_DISCONNECTED: 127436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return R.string.bluetooth_pan_profile_summary_use_for; 128436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 129436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby case BluetoothProfile.STATE_CONNECTED: 130c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby if (isLocalRoleNap(device)) { 131c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby return R.string.bluetooth_pan_nap_profile_summary_connected; 132c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby } else { 133c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby return R.string.bluetooth_pan_user_profile_summary_connected; 134c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby } 135436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 136436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby default: 137436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return Utils.getConnectionStateSummary(state); 138436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 139436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 140436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 141436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public int getDrawableResource(BluetoothClass btClass) { 142436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return R.drawable.ic_bt_network_pan; 143436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 144c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby 145c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby // Tethering direction determines UI strings. 146c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby void setLocalRole(BluetoothDevice device, int role) { 147c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby mDeviceRoleMap.put(device, role); 148c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby } 149c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby 150c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby boolean isLocalRoleNap(BluetoothDevice device) { 151c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby if (mDeviceRoleMap.containsKey(device)) { 152c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby return mDeviceRoleMap.get(device) == BluetoothPan.LOCAL_NAP_ROLE; 153c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby } else { 154c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby return false; 155c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby } 156c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby } 157436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby} 158