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.BluetoothClass; 20436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothDevice; 21436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothInputDevice; 22436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothProfile; 23436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.content.Context; 24436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 25436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport com.android.settings.R; 26436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 27436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport java.util.List; 28436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 29436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby/** 30436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * HidProfile handles Bluetooth HID profile. 31436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby */ 32436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyfinal class HidProfile implements LocalBluetoothProfile { 33436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby private BluetoothInputDevice mService; 34436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby private boolean mProfileReady; 35436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 36436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby static final String NAME = "HID"; 37436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 38436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby // Order of this profile in device profiles list 39436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby private static final int ORDINAL = 3; 40436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 41436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby // These callbacks run on the main thread. 42436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby private final class InputDeviceServiceListener 43436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby implements BluetoothProfile.ServiceListener { 44436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 45436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public void onServiceConnected(int profile, BluetoothProfile proxy) { 46436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby mService = (BluetoothInputDevice) proxy; 47436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby mProfileReady = true; 48436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 49436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 50436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public void onServiceDisconnected(int profile) { 51436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby mProfileReady = false; 52436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby mService = null; 53436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 54436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 55436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 56436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby HidProfile(Context context, LocalBluetoothAdapter adapter) { 57436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby adapter.getProfileProxy(context, new InputDeviceServiceListener(), 58436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby BluetoothProfile.INPUT_DEVICE); 59436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 60436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 61436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean isConnectable() { 62436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return true; 63436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 64436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 65436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean isAutoConnectable() { 66436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return true; 67436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 68436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 69436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean connect(BluetoothDevice device) { 70436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return mService.connect(device); 71436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 72436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 73436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean disconnect(BluetoothDevice device) { 74436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return mService.disconnect(device); 75436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 76436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 77436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public int getConnectionStatus(BluetoothDevice device) { 78436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby List<BluetoothDevice> deviceList = mService.getConnectedDevices(); 79436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 80436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return !deviceList.isEmpty() && deviceList.get(0).equals(device) 81436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby ? mService.getConnectionState(device) 82436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby : BluetoothProfile.STATE_DISCONNECTED; 83436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 84436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 85436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean isPreferred(BluetoothDevice device) { 86436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return mService.getPriority(device) > BluetoothProfile.PRIORITY_OFF; 87436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 88436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 89436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public int getPreferred(BluetoothDevice device) { 90436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return mService.getPriority(device); 91436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 92436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 93436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public void setPreferred(BluetoothDevice device, boolean preferred) { 94436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby if (preferred) { 95436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby if (mService.getPriority(device) < BluetoothProfile.PRIORITY_ON) { 96436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby mService.setPriority(device, BluetoothProfile.PRIORITY_ON); 97436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 98436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } else { 99436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby mService.setPriority(device, BluetoothProfile.PRIORITY_OFF); 100436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 101436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 102436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 103436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean isProfileReady() { 104436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return mProfileReady; 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) { 11679be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby // TODO: distinguish between keyboard and mouse? 117436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return R.string.bluetooth_profile_hid; 118436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 119436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 120436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public int getSummaryResourceForDevice(BluetoothDevice device) { 121436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby int state = mService.getConnectionState(device); 122436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby switch (state) { 123436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby case BluetoothProfile.STATE_DISCONNECTED: 124436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return R.string.bluetooth_hid_profile_summary_use_for; 125436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 126436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby case BluetoothProfile.STATE_CONNECTED: 127436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return R.string.bluetooth_hid_profile_summary_connected; 128436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 129436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby default: 130436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return Utils.getConnectionStateSummary(state); 131436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 132436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 133436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 134436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public int getDrawableResource(BluetoothClass btClass) { 135436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby if (btClass == null) { 136436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return R.drawable.ic_bt_keyboard_hid; 137436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 138436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return getHidClassDrawable(btClass); 139436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 140436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 141436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby static int getHidClassDrawable(BluetoothClass btClass) { 142436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby switch (btClass.getDeviceClass()) { 143436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby case BluetoothClass.Device.PERIPHERAL_KEYBOARD: 144436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby case BluetoothClass.Device.PERIPHERAL_KEYBOARD_POINTING: 145436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return R.drawable.ic_bt_keyboard_hid; 146436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby case BluetoothClass.Device.PERIPHERAL_POINTING: 147436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return R.drawable.ic_bt_pointing_hid; 148436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby default: 149436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return R.drawable.ic_bt_misc_hid; 150436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 151436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 152436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby} 153