b/2234854 Fixed Bluetooth API return codes for requesting permission to enable bluetooth

Also added test app.
This commit is contained in:
Michael Chan
2009-11-05 18:25:55 -08:00
parent 4d004e9107
commit 834e5993e4
6 changed files with 244 additions and 29 deletions

View File

@@ -16,6 +16,11 @@
package com.android.settings.bluetooth; package com.android.settings.bluetooth;
import com.android.internal.app.AlertActivity;
import com.android.internal.app.AlertController;
import com.android.settings.R;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
@@ -29,10 +34,6 @@ import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import com.android.internal.app.AlertActivity;
import com.android.internal.app.AlertController;
import com.android.settings.R;
/** /**
* RequestPermissionActivity asks the user whether to enable discovery. This is * RequestPermissionActivity asks the user whether to enable discovery. This is
* usually started by an application wanted to start bluetooth and or discovery * usually started by an application wanted to start bluetooth and or discovery
@@ -47,12 +48,6 @@ public class RequestPermissionActivity extends AlertActivity implements
private static final int MAX_DISCOVERABLE_TIMEOUT = 300; private static final int MAX_DISCOVERABLE_TIMEOUT = 300;
// Result code: Error
public static final int RESULT_ERROR = -2;
// Result code: User rejected the request
public static final int RESULT_USER_DENIED = -1;
// Non-error return code: BT is starting or has started successfully. Used // Non-error return code: BT is starting or has started successfully. Used
// by this Activity and RequestPermissionHelperActivity // by this Activity and RequestPermissionHelperActivity
/* package */ static final int RESULT_BT_STARTING_OR_STARTED = -1000; /* package */ static final int RESULT_BT_STARTING_OR_STARTED = -1000;
@@ -180,7 +175,7 @@ public class RequestPermissionActivity extends AlertActivity implements
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != REQUEST_CODE_START_BT) { if (requestCode != REQUEST_CODE_START_BT) {
Log.e(TAG, "Unexpected onActivityResult " + requestCode + " " + resultCode); Log.e(TAG, "Unexpected onActivityResult " + requestCode + " " + resultCode);
setResult(RESULT_ERROR); setResult(Activity.RESULT_CANCELED);
finish(); finish();
return; return;
} }
@@ -208,7 +203,7 @@ public class RequestPermissionActivity extends AlertActivity implements
break; break;
case DialogInterface.BUTTON_NEGATIVE: case DialogInterface.BUTTON_NEGATIVE:
setResult(RESULT_USER_DENIED); setResult(Activity.RESULT_CANCELED);
break; break;
} }
} }
@@ -218,14 +213,18 @@ public class RequestPermissionActivity extends AlertActivity implements
if (mEnableOnly) { if (mEnableOnly) {
// BT enabled. Done // BT enabled. Done
returnCode = 0; returnCode = Activity.RESULT_OK;
} else if (mLocalManager.getBluetoothAdapter().setScanMode( } else if (mLocalManager.getBluetoothAdapter().setScanMode(
BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, mTimeout)) { BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, mTimeout)) {
// If already in discoverable mode, this will extend the timeout. // If already in discoverable mode, this will extend the timeout.
persistDiscoverableEndTimestamp(System.currentTimeMillis() + mTimeout * 1000); persistDiscoverableEndTimestamp(System.currentTimeMillis() + mTimeout * 1000);
returnCode = mTimeout; returnCode = mTimeout;
// Activity.RESULT_FIRST_USER should be 1
if (returnCode < Activity.RESULT_FIRST_USER) {
returnCode = Activity.RESULT_FIRST_USER;
}
} else { } else {
returnCode = RESULT_ERROR; returnCode = Activity.RESULT_CANCELED;
} }
setResult(returnCode); setResult(returnCode);
@@ -254,14 +253,14 @@ public class RequestPermissionActivity extends AlertActivity implements
Log.e(TAG, "Error: this activity may be started only with intent " Log.e(TAG, "Error: this activity may be started only with intent "
+ BluetoothAdapter.ACTION_REQUEST_ENABLE + " or " + BluetoothAdapter.ACTION_REQUEST_ENABLE + " or "
+ BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); + BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
setResult(RESULT_ERROR); setResult(Activity.RESULT_CANCELED);
return true; return true;
} }
mLocalManager = LocalBluetoothManager.getInstance(this); mLocalManager = LocalBluetoothManager.getInstance(this);
if (mLocalManager == null) { if (mLocalManager == null) {
Log.e(TAG, "Error: there's a problem starting bluetooth"); Log.e(TAG, "Error: there's a problem starting bluetooth");
setResult(RESULT_ERROR); setResult(Activity.RESULT_CANCELED);
return true; return true;
} }
@@ -284,7 +283,7 @@ public class RequestPermissionActivity extends AlertActivity implements
@Override @Override
public void onBackPressed() { public void onBackPressed() {
setResult(RequestPermissionActivity.RESULT_USER_DENIED); setResult(Activity.RESULT_CANCELED);
super.onBackPressed(); super.onBackPressed();
} }
} }

View File

@@ -16,6 +16,11 @@
package com.android.settings.bluetooth; package com.android.settings.bluetooth;
import com.android.internal.app.AlertActivity;
import com.android.internal.app.AlertController;
import com.android.settings.R;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
@@ -24,10 +29,6 @@ import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import com.android.internal.app.AlertActivity;
import com.android.internal.app.AlertController;
import com.android.settings.R;
/** /**
* RequestPermissionHelperActivity asks the user whether to enable discovery. * RequestPermissionHelperActivity asks the user whether to enable discovery.
* This is usually started by RequestPermissionActivity. * This is usually started by RequestPermissionActivity.
@@ -107,12 +108,12 @@ public class RequestPermissionHelperActivity extends AlertActivity implements
|| mLocalManager.getBluetoothAdapter().enable()) { || mLocalManager.getBluetoothAdapter().enable()) {
returnCode = RequestPermissionActivity.RESULT_BT_STARTING_OR_STARTED; returnCode = RequestPermissionActivity.RESULT_BT_STARTING_OR_STARTED;
} else { } else {
returnCode = RequestPermissionActivity.RESULT_ERROR; returnCode = Activity.RESULT_CANCELED;
} }
break; break;
case DialogInterface.BUTTON_NEGATIVE: case DialogInterface.BUTTON_NEGATIVE:
returnCode = RequestPermissionActivity.RESULT_USER_DENIED; returnCode = Activity.RESULT_CANCELED;
break; break;
default: default:
return; return;
@@ -131,14 +132,14 @@ public class RequestPermissionHelperActivity extends AlertActivity implements
mTimeout = intent.getIntExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, mTimeout = intent.getIntExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,
BluetoothDiscoverableEnabler.DEFAULT_DISCOVERABLE_TIMEOUT); BluetoothDiscoverableEnabler.DEFAULT_DISCOVERABLE_TIMEOUT);
} else { } else {
setResult(RequestPermissionActivity.RESULT_ERROR); setResult(Activity.RESULT_CANCELED);
return true; return true;
} }
mLocalManager = LocalBluetoothManager.getInstance(this); mLocalManager = LocalBluetoothManager.getInstance(this);
if (mLocalManager == null) { if (mLocalManager == null) {
Log.e(TAG, "Error: there's a problem starting bluetooth"); Log.e(TAG, "Error: there's a problem starting bluetooth");
setResult(RequestPermissionActivity.RESULT_ERROR); setResult(Activity.RESULT_CANCELED);
return true; return true;
} }
@@ -147,7 +148,7 @@ public class RequestPermissionHelperActivity extends AlertActivity implements
@Override @Override
public void onBackPressed() { public void onBackPressed() {
setResult(RequestPermissionActivity.RESULT_USER_DENIED); setResult(Activity.RESULT_CANCELED);
super.onBackPressed(); super.onBackPressed();
} }
} }

View File

@@ -17,8 +17,18 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.settings.tests"> package="com.android.settings.tests">
<uses-permission android:name="android.permission.BLUETOOTH" />
<application> <application>
<uses-library android:name="android.test.runner" /> <uses-library android:name="android.test.runner" />
<activity android:name="BluetoothRequestPermissionTest"
android:label="Bluetooth Perm Test" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </application>
<instrumentation android:name="SettingsLaunchPerformance" <instrumentation android:name="SettingsLaunchPerformance"

View File

@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2009 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView android:id="@+id/msg_container"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:transcriptMode="normal"/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="@android:style/ButtonBar">
<Button android:id="@+id/enable"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/enable" />
<Button android:id="@+id/discover"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/discoverable" />
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2009 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Test only. Do not translate. -->
<!-- Test only. Do not translate. -->
<!-- Test only. Do not translate. -->
<string name="enable">Enable</string>
<string name="discoverable">Discoverable</string>
</resources>

View File

@@ -0,0 +1,136 @@
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.tests;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
public class BluetoothRequestPermissionTest extends Activity {
private static final String TAG = "BluetoothRequestPermissionTest";
private ArrayAdapter<String> mMsgAdapter;
private class BtOnClickListener implements OnClickListener {
final boolean mEnableOnly; // enable or enable + discoverable
public BtOnClickListener(boolean enableOnly) {
mEnableOnly = enableOnly;
}
public void onClick(View v) {
requestPermission(mEnableOnly);
}
}
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.bluetooth_request_permission_test);
Button enable = (Button) findViewById(R.id.enable);
enable.setOnClickListener(new BtOnClickListener(true /* enable */));
Button discover = (Button) findViewById(R.id.discover);
discover.setOnClickListener(new BtOnClickListener(false /* enable & discoverable */));
mMsgAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
ListView listView = (ListView) findViewById(R.id.msg_container);
listView.setAdapter(mMsgAdapter);
registerReceiver(mReceiver, new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
addMsg("Initialized");
}
void requestPermission(boolean enableOnly) {
Intent i = new Intent();
if (enableOnly) {
addMsg("Starting activity to enable bt");
i.setAction(BluetoothAdapter.ACTION_REQUEST_ENABLE);
} else {
addMsg("Starting activity to enable bt + discovery");
i.setAction(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
i.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 20);
}
startActivityForResult(i, 1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != 1) {
Log.e(TAG, "Unexpected onActivityResult " + requestCode + " " + resultCode);
return;
}
if (resultCode == Activity.RESULT_CANCELED) {
addMsg("Result = RESULT_CANCELED");
} else if (resultCode == Activity.RESULT_OK) {
addMsg("Result = RESULT_OK (not expected for discovery)");
} else {
addMsg("Result = " + resultCode);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
}
private void addMsg(String msg) {
mMsgAdapter.add(msg);
Log.d(TAG, "msg");
}
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent == null)
return;
if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(intent.getAction())) {
String stateStr = "???";
switch (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothDevice.ERROR)) {
case BluetoothAdapter.STATE_OFF:
stateStr = "off";
break;
case BluetoothAdapter.STATE_TURNING_ON:
stateStr = "turning on";
break;
case BluetoothAdapter.STATE_ON:
stateStr = "on";
break;
case BluetoothAdapter.STATE_TURNING_OFF:
stateStr = "turning off";
break;
}
addMsg("Bluetooth status = " + stateStr);
}
}
};
}