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