103800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu/* 203800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu * Copyright (C) 2014 The Android Open Source Project 303800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu * 403800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu * Licensed under the Apache License, Version 2.0 (the "License"); 503800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu * you may not use this file except in compliance with the License. 603800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu * You may obtain a copy of the License at 703800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu * 803800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu * http://www.apache.org/licenses/LICENSE-2.0 903800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu * 1003800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu * Unless required by applicable law or agreed to in writing, software 1103800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu * distributed under the License is distributed on an "AS IS" BASIS, 1203800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1303800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu * See the License for the specific language governing permissions and 1403800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu * limitations under the License. 1503800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu */ 1603800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhupackage android.bluetooth; 1703800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu 1803800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhuimport android.app.Activity; 1903800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhuimport android.app.Instrumentation; 2003800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhuimport android.content.Context; 2103800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhuimport android.os.Bundle; 2203800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu 23946f207d3d7e8e6d467782b549aa80073a68fae8Guang Zhuimport junit.framework.Assert; 24946f207d3d7e8e6d467782b549aa80073a68fae8Guang Zhu 25d22b2413b9b79374a6a8e2176de577c8eac0d1b7Guang Zhuimport java.util.Set; 26d22b2413b9b79374a6a8e2176de577c8eac0d1b7Guang Zhu 2703800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhupublic class BluetoothInstrumentation extends Instrumentation { 2803800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu 2903800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu private BluetoothTestUtils mUtils = null; 3003800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu private BluetoothAdapter mAdapter = null; 3103800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu private Bundle mArgs = null; 32e47ebbeec672ece19e260ccd7f4b83a297bce61eGuang Zhu private Bundle mSuccessResult = null; 3303800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu 3403800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu private BluetoothTestUtils getBluetoothTestUtils() { 3503800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu if (mUtils == null) { 3603800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu mUtils = new BluetoothTestUtils(getContext(), 3703800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu BluetoothInstrumentation.class.getSimpleName()); 3803800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu } 3903800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu return mUtils; 4003800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu } 4103800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu 4203800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu private BluetoothAdapter getBluetoothAdapter() { 4303800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu if (mAdapter == null) { 4403800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu mAdapter = ((BluetoothManager)getContext().getSystemService( 4503800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu Context.BLUETOOTH_SERVICE)).getAdapter(); 4603800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu } 4703800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu return mAdapter; 4803800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu } 4903800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu 5003800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu @Override 5103800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu public void onCreate(Bundle arguments) { 5203800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu super.onCreate(arguments); 5303800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu mArgs = arguments; 54e47ebbeec672ece19e260ccd7f4b83a297bce61eGuang Zhu // create the default result response, but only use it in success code path 55e47ebbeec672ece19e260ccd7f4b83a297bce61eGuang Zhu mSuccessResult = new Bundle(); 56e47ebbeec672ece19e260ccd7f4b83a297bce61eGuang Zhu mSuccessResult.putString("result", "SUCCESS"); 5703800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu start(); 5803800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu } 5903800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu 6003800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu @Override 6103800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu public void onStart() { 6203800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu String command = mArgs.getString("command"); 6303800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu if ("enable".equals(command)) { 6403800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu enable(); 6503800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu } else if ("disable".equals(command)) { 6603800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu disable(); 6703800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu } else if ("unpairAll".equals(command)) { 6803800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu unpairAll(); 6903800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu } else if ("getName".equals(command)) { 7003800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu getName(); 71fa9dc683f18e68cc1170c149a40c33a191444af1Guang Zhu } else if ("getAddress".equals(command)) { 72fa9dc683f18e68cc1170c149a40c33a191444af1Guang Zhu getAddress(); 73d22b2413b9b79374a6a8e2176de577c8eac0d1b7Guang Zhu } else if ("getBondedDevices".equals(command)) { 74d22b2413b9b79374a6a8e2176de577c8eac0d1b7Guang Zhu getBondedDevices(); 75946f207d3d7e8e6d467782b549aa80073a68fae8Guang Zhu } else if ("enableBtSnoop".equals(command)) { 76946f207d3d7e8e6d467782b549aa80073a68fae8Guang Zhu enableBtSnoop(); 7703800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu } else { 7803800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu finish(null); 7903800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu } 8003800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu } 8103800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu 8203800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu public void enable() { 8303800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu getBluetoothTestUtils().enable(getBluetoothAdapter()); 84e47ebbeec672ece19e260ccd7f4b83a297bce61eGuang Zhu finish(mSuccessResult); 8503800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu } 8603800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu 8703800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu public void disable() { 8803800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu getBluetoothTestUtils().disable(getBluetoothAdapter()); 89e47ebbeec672ece19e260ccd7f4b83a297bce61eGuang Zhu finish(mSuccessResult); 9003800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu } 9103800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu 9203800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu public void unpairAll() { 9303800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu getBluetoothTestUtils().unpairAll(getBluetoothAdapter()); 94e47ebbeec672ece19e260ccd7f4b83a297bce61eGuang Zhu finish(mSuccessResult); 9503800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu } 9603800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu 9703800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu public void getName() { 9803800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu String name = getBluetoothAdapter().getName(); 99e47ebbeec672ece19e260ccd7f4b83a297bce61eGuang Zhu mSuccessResult.putString("name", name); 100e47ebbeec672ece19e260ccd7f4b83a297bce61eGuang Zhu finish(mSuccessResult); 10103800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu } 10203800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu 103fa9dc683f18e68cc1170c149a40c33a191444af1Guang Zhu public void getAddress() { 104fa9dc683f18e68cc1170c149a40c33a191444af1Guang Zhu String name = getBluetoothAdapter().getAddress(); 105fa9dc683f18e68cc1170c149a40c33a191444af1Guang Zhu mSuccessResult.putString("address", name); 106fa9dc683f18e68cc1170c149a40c33a191444af1Guang Zhu finish(mSuccessResult); 107fa9dc683f18e68cc1170c149a40c33a191444af1Guang Zhu } 108fa9dc683f18e68cc1170c149a40c33a191444af1Guang Zhu 109d22b2413b9b79374a6a8e2176de577c8eac0d1b7Guang Zhu public void getBondedDevices() { 110d22b2413b9b79374a6a8e2176de577c8eac0d1b7Guang Zhu Set<BluetoothDevice> devices = getBluetoothAdapter().getBondedDevices(); 111d22b2413b9b79374a6a8e2176de577c8eac0d1b7Guang Zhu int i = 0; 112d22b2413b9b79374a6a8e2176de577c8eac0d1b7Guang Zhu for (BluetoothDevice device : devices) { 113d22b2413b9b79374a6a8e2176de577c8eac0d1b7Guang Zhu mSuccessResult.putString(String.format("device-%02d", i), device.getAddress()); 114d22b2413b9b79374a6a8e2176de577c8eac0d1b7Guang Zhu i++; 115d22b2413b9b79374a6a8e2176de577c8eac0d1b7Guang Zhu } 116d22b2413b9b79374a6a8e2176de577c8eac0d1b7Guang Zhu finish(mSuccessResult); 117d22b2413b9b79374a6a8e2176de577c8eac0d1b7Guang Zhu } 118d22b2413b9b79374a6a8e2176de577c8eac0d1b7Guang Zhu 119946f207d3d7e8e6d467782b549aa80073a68fae8Guang Zhu public void enableBtSnoop() { 120946f207d3d7e8e6d467782b549aa80073a68fae8Guang Zhu Assert.assertTrue("failed to enable snoop log", 121946f207d3d7e8e6d467782b549aa80073a68fae8Guang Zhu getBluetoothAdapter().configHciSnoopLog(true)); 122946f207d3d7e8e6d467782b549aa80073a68fae8Guang Zhu finish(mSuccessResult); 123946f207d3d7e8e6d467782b549aa80073a68fae8Guang Zhu } 124946f207d3d7e8e6d467782b549aa80073a68fae8Guang Zhu 12503800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu public void finish(Bundle result) { 12603800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu if (result == null) { 12703800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu result = new Bundle(); 12803800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu } 12903800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu finish(Activity.RESULT_OK, result); 13003800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu } 13103800b8873f70223dcfcf396a3762775dfc1a8abGuang Zhu} 132