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