Modify settings for 2.1

Add incoming pairing dialog
Add DisplayPasskey handling of pairing keyboards with 2.1 devices.
Modify code path to show errors when bonding request fails.
Misc fixes like string changes.
This commit is contained in:
Jaikumar Ganesh
2009-09-11 09:45:11 -07:00
parent d6375e975e
commit 5f23cb39a1
27 changed files with 126 additions and 83 deletions

View File

@@ -27,6 +27,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import com.android.settings.R;
import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
/**
@@ -78,11 +79,7 @@ public class BluetoothEventRedirector {
mManager.getCachedDeviceManager().onBondingStateChanged(device, bondState);
if (bondState == BluetoothDevice.BOND_NONE) {
int reason = intent.getIntExtra(BluetoothDevice.EXTRA_REASON, BluetoothDevice.ERROR);
if (reason == BluetoothDevice.UNBOND_REASON_AUTH_REJECTED ||
reason == BluetoothDevice.UNBOND_REASON_AUTH_FAILED ||
reason == BluetoothDevice.UNBOND_REASON_REMOTE_DEVICE_DOWN) {
mManager.getCachedDeviceManager().onBondingError(device, reason);
}
mManager.getCachedDeviceManager().onBondingError(device, reason);
}
} else if (action.equals(BluetoothHeadset.ACTION_STATE_CHANGED)) {
@@ -110,6 +107,9 @@ public class BluetoothEventRedirector {
} else if (action.equals(BluetoothDevice.ACTION_CLASS_CHANGED)) {
mManager.getCachedDeviceManager().onBtClassChanged(device);
} else if (action.equals(BluetoothDevice.ACTION_PAIRING_CANCEL)) {
int errorMsg = R.string.bluetooth_pairing_error_message;
mManager.showError(device, R.string.bluetooth_error_title, errorMsg);
}
}
};
@@ -133,6 +133,7 @@ public class BluetoothEventRedirector {
// Pairing broadcasts
filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
filter.addAction(BluetoothDevice.ACTION_PAIRING_CANCEL);
// Fine-grained state broadcasts
filter.addAction(BluetoothA2dp.ACTION_SINK_STATE_CHANGED);

View File

@@ -51,23 +51,25 @@ public class BluetoothPairingDialog extends AlertActivity implements DialogInter
private LocalBluetoothManager mLocalManager;
private BluetoothDevice mDevice;
private int mType;
private String mConfirmationPasskey;
private String mPasskey;
private EditText mPairingView;
private Button mOkButton;
private static final String INSTANCE_KEY_PAIRING_CANCELED = "received_pairing_canceled";
private boolean mReceivedPairingCanceled;
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (!BluetoothDevice.ACTION_PAIRING_CANCEL.equals(intent.getAction())) {
return;
}
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device == null || device.equals(mDevice)) {
onReceivedPairingCanceled();
if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction())) {
int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
BluetoothDevice.ERROR);
if (bondState == BluetoothDevice.BOND_BONDED ||
bondState == BluetoothDevice.BOND_NONE) {
dismissDialog();
}
} else if(BluetoothDevice.ACTION_PAIRING_CANCEL.equals(intent.getAction())) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device == null || device.equals(mDevice)) {
dismissDialog();
}
}
}
};
@@ -92,15 +94,26 @@ public class BluetoothPairingDialog extends AlertActivity implements DialogInter
createUserEntryDialog();
} else if (mType == BluetoothDevice.PAIRING_VARIANT_PASSKEY) {
createUserEntryDialog();
} else if (mType == BluetoothDevice.PAIRING_VARIANT_CONFIRMATION){
} else if (mType == BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION){
int passkey =
intent.getIntExtra(BluetoothDevice.EXTRA_PASSKEY, BluetoothDevice.ERROR);
if (passkey == BluetoothDevice.ERROR) {
Log.e(TAG, "Invalid ConfirmationPasskey received, not showing any dialog");
return;
}
mConfirmationPasskey = String.format("%06d", passkey);
mPasskey = String.format("%06d", passkey);
createConfirmationDialog();
} else if (mType == BluetoothDevice.PAIRING_VARIANT_CONSENT) {
createConsentDialog();
} else if (mType == BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY) {
int passkey =
intent.getIntExtra(BluetoothDevice.EXTRA_PASSKEY, BluetoothDevice.ERROR);
if (passkey == BluetoothDevice.ERROR) {
Log.e(TAG, "Invalid ConfirmationPasskey received, not showing any dialog");
return;
}
mPasskey = String.format("%06d", passkey);
createDisplayPasskeyDialog();
} else {
Log.e(TAG, "Incorrect pairing type received, not showing any dialog");
}
@@ -110,12 +123,13 @@ public class BluetoothPairingDialog extends AlertActivity implements DialogInter
* finish the activity in the background if pairing is canceled.
*/
registerReceiver(mReceiver, new IntentFilter(BluetoothDevice.ACTION_PAIRING_CANCEL));
registerReceiver(mReceiver, new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED));
}
private void createUserEntryDialog() {
final AlertController.AlertParams p = mAlertParams;
p.mIconId = android.R.drawable.ic_dialog_info;
p.mTitle = getString(R.string.bluetooth_pin_entry);
p.mTitle = getString(R.string.bluetooth_pairing_request);
p.mView = createView();
p.mPositiveButtonText = getString(android.R.string.ok);
p.mPositiveButtonListener = this;
@@ -143,13 +157,22 @@ public class BluetoothPairingDialog extends AlertActivity implements DialogInter
} else if (mType == BluetoothDevice.PAIRING_VARIANT_PASSKEY){
messageView.setText(getString(R.string.bluetooth_enter_passkey_msg, name));
// Maximum of 6 digits for passkey
mPairingView.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED);
mPairingView.setInputType(InputType.TYPE_CLASS_NUMBER |
InputType.TYPE_NUMBER_FLAG_SIGNED);
mPairingView.setFilters(new InputFilter[] {
new LengthFilter(BLUETOOTH_PASSKEY_MAX_LENGTH)});
} else {
} else if (mType == BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION) {
mPairingView.setVisibility(View.GONE);
messageView.setText(getString(R.string.bluetooth_confirm_passkey_msg, name,
mConfirmationPasskey));
mPasskey));
} else if (mType == BluetoothDevice.PAIRING_VARIANT_CONSENT) {
mPairingView.setVisibility(View.GONE);
messageView.setText(getString(R.string.bluetooth_incoming_pairing_msg, name));
} else if (mType == BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY) {
mPairingView.setVisibility(View.GONE);
messageView.setText(getString(R.string.bluetooth_display_passkey_msg, name, mPasskey));
} else {
Log.e(TAG, "Incorrect pairing type received, not creating view");
}
return view;
}
@@ -157,7 +180,7 @@ public class BluetoothPairingDialog extends AlertActivity implements DialogInter
private void createConfirmationDialog() {
final AlertController.AlertParams p = mAlertParams;
p.mIconId = android.R.drawable.ic_dialog_info;
p.mTitle = getString(R.string.bluetooth_pin_entry);
p.mTitle = getString(R.string.bluetooth_pairing_request);
p.mView = createView();
p.mPositiveButtonText = getString(R.string.bluetooth_pairing_accept);
p.mPositiveButtonListener = this;
@@ -166,27 +189,35 @@ public class BluetoothPairingDialog extends AlertActivity implements DialogInter
setupAlert();
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mReceivedPairingCanceled = savedInstanceState.getBoolean(INSTANCE_KEY_PAIRING_CANCELED);
if (mReceivedPairingCanceled) {
onReceivedPairingCanceled();
}
private void createConsentDialog() {
final AlertController.AlertParams p = mAlertParams;
p.mIconId = android.R.drawable.ic_dialog_info;
p.mTitle = getString(R.string.bluetooth_pairing_request);
p.mView = createView();
p.mPositiveButtonText = getString(R.string.bluetooth_pairing_accept);
p.mPositiveButtonListener = this;
p.mNegativeButtonText = getString(R.string.bluetooth_pairing_decline);
p.mNegativeButtonListener = this;
setupAlert();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
private void createDisplayPasskeyDialog() {
final AlertController.AlertParams p = mAlertParams;
p.mIconId = android.R.drawable.ic_dialog_info;
p.mTitle = getString(R.string.bluetooth_pairing_request);
p.mView = createView();
p.mPositiveButtonText = getString(android.R.string.ok);
p.mPositiveButtonListener = this;
setupAlert();
outState.putBoolean(INSTANCE_KEY_PAIRING_CANCELED, mReceivedPairingCanceled);
// Since its only a notification, send an OK to the framework,
// indicating that the dialog has been displayed.
mDevice.setPairingConfirmation(true);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
}
@@ -196,21 +227,8 @@ public class BluetoothPairingDialog extends AlertActivity implements DialogInter
}
}
private void onReceivedPairingCanceled() {
mReceivedPairingCanceled = true;
TextView messageView = (TextView) findViewById(R.id.message);
messageView.setText(getString(R.string.bluetooth_pairing_error_message,
mDevice.getName()));
mPairingView.setVisibility(View.GONE);
mPairingView.clearFocus();
mPairingView.removeTextChangedListener(this);
mOkButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
mOkButton.setEnabled(true);
mOkButton.setText(android.R.string.ok);
mAlert.getButton(DialogInterface.BUTTON_NEGATIVE).setVisibility(View.GONE);
private void dismissDialog() {
this.dismiss();
}
private void onPair(String value) {
@@ -223,8 +241,14 @@ public class BluetoothPairingDialog extends AlertActivity implements DialogInter
} else if (mType == BluetoothDevice.PAIRING_VARIANT_PASSKEY) {
int passkey = Integer.parseInt(value);
mDevice.setPasskey(passkey);
} else {
} else if (mType == BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION) {
mDevice.setPairingConfirmation(true);
} else if (mType == BluetoothDevice.PAIRING_VARIANT_CONSENT) {
mDevice.setPairingConfirmation(true);
} else if (mType == BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY) {
// Do Nothing.
} else {
Log.e(TAG, "Incorrect pairing type received");
}
}

View File

@@ -54,7 +54,8 @@ public class BluetoothPairingRequest extends BroadcastReceiver {
pairingIntent.setClass(context, BluetoothPairingDialog.class);
pairingIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, type);
if (type == BluetoothDevice.PAIRING_VARIANT_CONFIRMATION) {
if (type == BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION ||
type == BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY) {
int passkey = intent.getIntExtra(BluetoothDevice.EXTRA_PASSKEY, BluetoothDevice.ERROR);
pairingIntent.putExtra(BluetoothDevice.EXTRA_PASSKEY, passkey);
}

View File

@@ -85,7 +85,6 @@ public class CachedBluetoothDeviceManager {
mCachedDevices.add(cachedDevice);
deviceAdded = true;
}
cachedDevice.setRssi(rssi);
cachedDevice.setBtClass(btClass);
cachedDevice.setName(name);
@@ -193,17 +192,26 @@ public class CachedBluetoothDeviceManager {
switch(reason) {
case BluetoothDevice.UNBOND_REASON_AUTH_FAILED:
errorMsg = R.string.bluetooth_pairing_pin_error_message;
mLocalManager.showError(device, R.string.bluetooth_error_title, errorMsg);
break;
case BluetoothDevice.UNBOND_REASON_AUTH_REJECTED:
errorMsg = R.string.bluetooth_pairing_rejected_error_message;
mLocalManager.showError(device, R.string.bluetooth_error_title, errorMsg);
break;
case BluetoothDevice.UNBOND_REASON_REMOTE_DEVICE_DOWN:
errorMsg = R.string.bluetooth_pairing_device_down_error_message;
mLocalManager.showError(device, R.string.bluetooth_error_title, errorMsg);
break;
case BluetoothDevice.UNBOND_REASON_DISCOVERY_IN_PROGRESS:
case BluetoothDevice.UNBOND_REASON_AUTH_TIMEOUT:
case BluetoothDevice.UNBOND_REASON_REPEATED_ATTEMPTS:
errorMsg = R.string.bluetooth_pairing_error_message;
mLocalManager.showError(device, R.string.bluetooth_error_title, errorMsg);
break;
default:
errorMsg = R.string.bluetooth_pairing_error_message;
Log.w(TAG, "onBondingError: Not displaying any error message for reason:" + reason);
break;
}
mLocalManager.showError(device, R.string.bluetooth_error_title, errorMsg);
}
public synchronized void onProfileStateChanged(BluetoothDevice device, Profile profile,

View File

@@ -254,9 +254,12 @@ public class LocalBluetoothManager {
public void showError(BluetoothDevice device, int titleResId, int messageResId) {
CachedBluetoothDevice cachedDevice = mCachedDeviceManager.findDevice(device);
if (cachedDevice == null) return;
String name = cachedDevice.getName();
String name = null;
if (cachedDevice == null) {
name = mContext.getString(R.string.bluetooth_remote_device);
} else {
name = cachedDevice.getName();
}
String message = mContext.getString(messageResId, name);
if (mForegroundActivity != null) {
@@ -269,7 +272,7 @@ public class LocalBluetoothManager {
.show();
} else {
// Fallback on a toast
Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
Toast.makeText(mContext, message, Toast.LENGTH_LONG).show();
}
}