1834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan/*
2834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan * Copyright (C) 2009 The Android Open Source Project
3834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan *
4834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan * Licensed under the Apache License, Version 2.0 (the "License");
5834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan * you may not use this file except in compliance with the License.
6834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan * You may obtain a copy of the License at
7834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan *
8834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan *      http://www.apache.org/licenses/LICENSE-2.0
9834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan *
10834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan * Unless required by applicable law or agreed to in writing, software
11834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan * distributed under the License is distributed on an "AS IS" BASIS,
12834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan * See the License for the specific language governing permissions and
14834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan * limitations under the License.
15834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan */
16834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan
17834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chanpackage com.android.settings.tests;
18834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan
19834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chanimport android.app.Activity;
20834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chanimport android.bluetooth.BluetoothAdapter;
21834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chanimport android.bluetooth.BluetoothDevice;
22834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chanimport android.content.BroadcastReceiver;
23834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chanimport android.content.Context;
24834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chanimport android.content.Intent;
25834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chanimport android.content.IntentFilter;
26834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chanimport android.os.Bundle;
27834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chanimport android.util.Log;
28834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chanimport android.view.View;
29834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chanimport android.view.View.OnClickListener;
30834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chanimport android.widget.ArrayAdapter;
31834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chanimport android.widget.Button;
32834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chanimport android.widget.ListView;
33834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan
34834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chanpublic class BluetoothRequestPermissionTest extends Activity {
35834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    private static final String TAG = "BluetoothRequestPermissionTest";
3676098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan    BluetoothAdapter mAdapter;
37834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    private ArrayAdapter<String> mMsgAdapter;
38834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan
3995c1003f1c6ea957065fa752d89c9f64b599461cJake Hamby    // Discoverable button alternates between 20 second timeout and no timeout.
4095c1003f1c6ea957065fa752d89c9f64b599461cJake Hamby    private boolean mDiscoveryWithTimeout = true;
4195c1003f1c6ea957065fa752d89c9f64b599461cJake Hamby
42834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    private class BtOnClickListener implements OnClickListener {
43834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        final boolean mEnableOnly; // enable or enable + discoverable
44834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan
45834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        public BtOnClickListener(boolean enableOnly) {
46834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan            mEnableOnly = enableOnly;
47834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        }
48834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan
49834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        public void onClick(View v) {
50834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan            requestPermission(mEnableOnly);
51834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        }
52834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    }
53834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan
5476098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan    private class BtScanOnClickListener implements OnClickListener {
5576098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan        public void onClick(View v) {
5676098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan            Button scanButton = (Button) v;
5776098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan            if (mAdapter.isDiscovering()) {
5876098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan                mAdapter.cancelDiscovery();
5976098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan                scanButton.setText(R.string.start_scan);
6076098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan            } else {
6176098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan                mAdapter.startDiscovery();
6276098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan                scanButton.setText(R.string.stop_scan);
6376098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan            }
6476098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan        }
6576098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan    }
6676098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan
67834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    @Override
68834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    public void onCreate(Bundle icicle) {
69834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        super.onCreate(icicle);
70834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        setContentView(R.layout.bluetooth_request_permission_test);
7176098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan        mAdapter = BluetoothAdapter.getDefaultAdapter();
72834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan
73834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        Button enable = (Button) findViewById(R.id.enable);
74834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        enable.setOnClickListener(new BtOnClickListener(true /* enable */));
75834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan
7676098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan        Button discoverable = (Button) findViewById(R.id.discoverable);
7776098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan        discoverable.setOnClickListener(new BtOnClickListener(false /* enable & discoverable */));
7876098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan
7976098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan        Button scanButton = (Button) findViewById(R.id.scan);
8076098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan        scanButton.setOnClickListener(new BtScanOnClickListener());
8176098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan        if (mAdapter.isDiscovering()) {
8276098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan            scanButton.setText(R.string.stop_scan);
8376098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan        } else {
8476098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan            scanButton.setText(R.string.start_scan);
8576098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan        }
86834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan
87834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        mMsgAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
88834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan
89834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        ListView listView = (ListView) findViewById(R.id.msg_container);
90834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        listView.setAdapter(mMsgAdapter);
91834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan
9276098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan        IntentFilter filter = new IntentFilter();
9376098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
9476098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
9576098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan        filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
9676098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan        filter.addAction(BluetoothDevice.ACTION_FOUND);
9776098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan        registerReceiver(mReceiver, filter);
98834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        addMsg("Initialized");
99834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    }
100834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan
101834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    void requestPermission(boolean enableOnly) {
102834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        Intent i = new Intent();
103834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        if (enableOnly) {
104834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan            addMsg("Starting activity to enable bt");
105834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan            i.setAction(BluetoothAdapter.ACTION_REQUEST_ENABLE);
106834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        } else {
107834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan            addMsg("Starting activity to enable bt + discovery");
108834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan            i.setAction(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
10995c1003f1c6ea957065fa752d89c9f64b599461cJake Hamby            // Discoverability duration toggles between 20 seconds and no timeout.
11095c1003f1c6ea957065fa752d89c9f64b599461cJake Hamby            int timeout = (mDiscoveryWithTimeout ? 20 : 0);
11195c1003f1c6ea957065fa752d89c9f64b599461cJake Hamby            i.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, timeout);
11295c1003f1c6ea957065fa752d89c9f64b599461cJake Hamby            mDiscoveryWithTimeout = !mDiscoveryWithTimeout;
113834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        }
114834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        startActivityForResult(i, 1);
115834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    }
116834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan
117834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    @Override
118834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
119834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        if (requestCode != 1) {
120834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan            Log.e(TAG, "Unexpected onActivityResult " + requestCode + " " + resultCode);
121834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan            return;
122834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        }
123834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan
124834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        if (resultCode == Activity.RESULT_CANCELED) {
125834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan            addMsg("Result = RESULT_CANCELED");
126834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        } else if (resultCode == Activity.RESULT_OK) {
127834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan            addMsg("Result = RESULT_OK (not expected for discovery)");
128834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        } else {
129834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan            addMsg("Result = " + resultCode);
130834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        }
131834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    }
132834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan
133834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    @Override
134834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    protected void onDestroy() {
135834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        super.onDestroy();
136834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        unregisterReceiver(mReceiver);
137834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    }
138834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan
139834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    private void addMsg(String msg) {
140834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        mMsgAdapter.add(msg);
141834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        Log.d(TAG, "msg");
142834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    }
143834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan
144834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
145834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        @Override
146834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        public void onReceive(Context context, Intent intent) {
147834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan            if (intent == null)
148834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan                return;
14976098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan            String action = intent.getAction();
15076098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan            if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
151834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan                String stateStr = "???";
152834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan                switch (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothDevice.ERROR)) {
153834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan                    case BluetoothAdapter.STATE_OFF:
154834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan                        stateStr = "off";
155834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan                        break;
156834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan                    case BluetoothAdapter.STATE_TURNING_ON:
157834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan                        stateStr = "turning on";
158834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan                        break;
159834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan                    case BluetoothAdapter.STATE_ON:
160834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan                        stateStr = "on";
161834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan                        break;
162834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan                    case BluetoothAdapter.STATE_TURNING_OFF:
163834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan                        stateStr = "turning off";
164834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan                        break;
165834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan                }
166834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan                addMsg("Bluetooth status = " + stateStr);
16776098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan            } else if (action.equals(BluetoothDevice.ACTION_FOUND)) {
16876098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan                String name = intent.getStringExtra(BluetoothDevice.EXTRA_NAME);
16976098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan                addMsg("Found: " + name);
17076098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan            } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_STARTED)) {
17176098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan                addMsg("Scan started...");
17276098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan            } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
17376098b7f7ac4f19af776fcad8413b582904bfdc2Michael Chan                addMsg("Scan ended");
174834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan            }
175834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan        }
176834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan    };
177834e5993e4f2f34d5aceb3196601b30231d00b07Michael Chan}
178