diff options
author | Jaikumar Ganesh <jaikumar@google.com> | 2009-07-16 18:41:58 -0700 |
---|---|---|
committer | Jaikumar Ganesh <jaikumar@google.com> | 2009-07-20 10:38:02 -0700 |
commit | 3a76bcaa83c15f96832f934e67e6f0190e72a3dc (patch) | |
tree | 00b74818ddefba839a4a1f37cc3f8fbc208b026b | |
parent | c33a279239bdc0a6cc413c49777530103bbd8d09 (diff) | |
download | packages_apps_Settings-3a76bcaa83c15f96832f934e67e6f0190e72a3dc.zip packages_apps_Settings-3a76bcaa83c15f96832f934e67e6f0190e72a3dc.tar.gz packages_apps_Settings-3a76bcaa83c15f96832f934e67e6f0190e72a3dc.tar.bz2 |
Initial 2.1 bluetooth support.
Need to work with Strings and UI person to fix and later test everything.
-rw-r--r-- | AndroidManifest.xml | 4 | ||||
-rw-r--r-- | res/values/strings.xml | 11 | ||||
-rw-r--r-- | src/com/android/settings/bluetooth/BluetoothPairingDialog.java (renamed from src/com/android/settings/bluetooth/BluetoothPinDialog.java) | 160 | ||||
-rw-r--r-- | src/com/android/settings/bluetooth/BluetoothPairingRequest.java (renamed from src/com/android/settings/bluetooth/BluetoothPinRequest.java) | 63 |
4 files changed, 154 insertions, 84 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 1500d8b..d5eec4a 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -424,7 +424,7 @@ <activity android:name=".bluetooth.ConnectSpecificProfilesActivity" android:label="@string/bluetooth_connect_specific_profiles_title" /> - <activity android:name=".bluetooth.BluetoothPinDialog" + <activity android:name=".bluetooth.BluetoothPairingDialog" android:label="@string/bluetooth_pin_entry" android:theme="@*android:style/Theme.Dialog.Alert"> <intent-filter> @@ -433,7 +433,7 @@ </intent-filter> </activity> - <receiver android:name=".bluetooth.BluetoothPinRequest"> + <receiver android:name=".bluetooth.BluetoothPairingRequest"> <intent-filter> <action android:name="android.bluetooth.intent.action.PAIRING_REQUEST" /> <action android:name="android.bluetooth.intent.action.PAIRING_CANCEL" /> diff --git a/res/values/strings.xml b/res/values/strings.xml index c71cab9..70e8375 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -508,15 +508,20 @@ <string name="bluetooth_pin_entry">Bluetooth pairing request</string> <!-- Title for the bluetooth device info screen. --> <string name="bluetooth_device_info">Bluetooth device info</string> - <!-- Message when bluetooth dialog for pin entry is shwoing --> + <!-- Message when bluetooth dialog for pin entry is showing --> <string name="bluetooth_enter_pin_msg"><xliff:g id="device_name">%1$s</xliff:g>\n\nType PIN to pair.\n(Try 0000 or 1234.)</string> + <!-- Message when bluetooth dialog for passkey entry is showing --> + <string name="bluetooth_enter_passkey_msg"><xliff:g id="device_name">%1$s</xliff:g>\n\nType passkey to pair.\n</string> + <!-- Message when bluetooth dialog for confirmation of passkey is showing --> + <string name="bluetooth_confirm_passkey_msg">\n Passkey: <xliff:g id="passkey">%2$d</xliff:g>\n\nIs the same passkey displayed on: <xliff:g id="device_name">%1$s</xliff:g> ?\n</string> <!-- Title for BT error dialogs. --> <string name="bluetooth_error_title">Attention</string> <!-- Message for the error dialog when BT pairing fails generically. --> <string name="bluetooth_pairing_error_message">There was a problem pairing with <xliff:g id="device_name">%1$s</xliff:g>.</string> - <!-- Message for the error dialog when BT pairing fails because the PIN entered is incorrect. --> - <string name="bluetooth_pairing_pin_error_message">There was a problem pairing with <xliff:g id="device_name">%1$s</xliff:g> because the typed PIN is incorrect.</string> + <!-- Message for the error dialog when BT pairing fails because the PIN / + Passkey entered is incorrect. --> + <string name="bluetooth_pairing_pin_error_message">There was a problem pairing with <xliff:g id="device_name">%1$s</xliff:g> because the typed PIN or Passkey is incorrect.</string> <!-- Message for the error dialog when BT pairing fails because the other device is down. --> <string name="bluetooth_pairing_device_down_error_message">Cannot establish communication with <xliff:g id="device_name">%1$s</xliff:g>.</string> <!-- Message for the error dialog when BT pairing fails because the other device rejected the pairing. --> diff --git a/src/com/android/settings/bluetooth/BluetoothPinDialog.java b/src/com/android/settings/bluetooth/BluetoothPairingDialog.java index 087fbb2..bbe094f 100644 --- a/src/com/android/settings/bluetooth/BluetoothPinDialog.java +++ b/src/com/android/settings/bluetooth/BluetoothPairingDialog.java @@ -16,6 +16,7 @@ package com.android.settings.bluetooth; +import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothIntent; import android.content.BroadcastReceiver; @@ -26,6 +27,7 @@ import android.content.IntentFilter; import android.os.Bundle; import android.text.Editable; import android.text.InputFilter; +import android.text.InputType; import android.text.TextWatcher; import android.text.InputFilter.LengthFilter; import android.util.Log; @@ -39,36 +41,39 @@ import com.android.internal.app.AlertController; import com.android.settings.R; /** - * BluetoothPinDialog asks the user to enter a PIN for pairing with a remote - * Bluetooth device. It is an activity that appears as a dialog. + * BluetoothPairingDialog asks the user to enter a PIN / Passkey / simple confirmation + * for pairing with a remote Bluetooth device. It is an activity that appears as a dialog. */ -public class BluetoothPinDialog extends AlertActivity implements DialogInterface.OnClickListener, +public class BluetoothPairingDialog extends AlertActivity implements DialogInterface.OnClickListener, TextWatcher { - private static final String TAG = "BluetoothPinDialog"; + private static final String TAG = "BluetoothPairingDialog"; private final int BLUETOOTH_PIN_MAX_LENGTH = 16; + private final int BLUETOOTH_PASSKEY_MAX_LENGTH = 6; private LocalBluetoothManager mLocalManager; private String mAddress; - private EditText mPinView; + private int mType; + private int mConfirmationPasskey; + 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 (!BluetoothIntent.PAIRING_CANCEL_ACTION.equals(intent.getAction())) { return; } - + String address = intent.getStringExtra(BluetoothIntent.ADDRESS); if (address == null || address.equals(mAddress)) { onReceivedPairingCanceled(); } } }; - + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -81,11 +86,34 @@ public class BluetoothPinDialog extends AlertActivity implements DialogInterface BluetoothIntent.PAIRING_REQUEST_ACTION); finish(); } - + mLocalManager = LocalBluetoothManager.getInstance(this); mAddress = intent.getStringExtra(BluetoothIntent.ADDRESS); - - // Set up the "dialog" + mType = intent.getIntExtra(BluetoothIntent.PAIRING_VARIANT, BluetoothClass.ERROR); + if (mType == BluetoothDevice.PAIRING_VARIANT_PIN) { + createUserEntryDialog(); + } else if (mType == BluetoothDevice.PAIRING_VARIANT_PASSKEY) { + createUserEntryDialog(); + } else if (mType == BluetoothDevice.PAIRING_VARIANT_CONFIRMATION){ + mConfirmationPasskey = + intent.getIntExtra(BluetoothIntent.PASSKEY, BluetoothClass.ERROR); + if (mConfirmationPasskey == BluetoothClass.ERROR) { + Log.e(TAG, "Invalid ConfirmationPasskey received, not showing any dialog"); + return; + } + createConfirmationDialog(); + } else { + Log.e(TAG, "Incorrect pairing type received, not showing any dialog"); + } + + /* + * Leave this registered through pause/resume since we still want to + * finish the activity in the background if pairing is canceled. + */ + registerReceiver(mReceiver, new IntentFilter(BluetoothIntent.PAIRING_CANCEL_ACTION)); + } + + private void createUserEntryDialog() { final AlertController.AlertParams p = mAlertParams; p.mIconId = android.R.drawable.ic_dialog_info; p.mTitle = getString(R.string.bluetooth_pin_entry); @@ -95,21 +123,54 @@ public class BluetoothPinDialog extends AlertActivity implements DialogInterface p.mNegativeButtonText = getString(android.R.string.cancel); p.mNegativeButtonListener = this; setupAlert(); - + mOkButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE); mOkButton.setEnabled(false); + } - /* - * Leave this registered through pause/resume since we still want to - * finish the activity in the background if pairing is canceled. - */ - registerReceiver(mReceiver, new IntentFilter(BluetoothIntent.PAIRING_CANCEL_ACTION)); + private View createView() { + View view = getLayoutInflater().inflate(R.layout.bluetooth_pin_entry, null); + + String name = mLocalManager.getLocalDeviceManager().getName(mAddress); + TextView messageView = (TextView) view.findViewById(R.id.message); + mPairingView = (EditText) view.findViewById(R.id.text); + mPairingView.addTextChangedListener(this); + + if (mType == BluetoothDevice.PAIRING_VARIANT_PIN) { + messageView.setText(getString(R.string.bluetooth_enter_pin_msg, name)); + // Maximum of 16 characters in a PIN adb sync + mPairingView.setFilters(new InputFilter[] { + new LengthFilter(BLUETOOTH_PIN_MAX_LENGTH) }); + } 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.setFilters(new InputFilter[] { + new LengthFilter(BLUETOOTH_PASSKEY_MAX_LENGTH)}); + } else { + mPairingView.setVisibility(View.GONE); + messageView.setText(getString(R.string.bluetooth_confirm_passkey_msg, name, + mConfirmationPasskey)); + } + return view; + } + + 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.mView = createView(); + p.mPositiveButtonText = getString(android.R.string.yes); + p.mPositiveButtonListener = this; + p.mNegativeButtonText = getString(android.R.string.no); + p.mNegativeButtonListener = this; + setupAlert(); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); - + mReceivedPairingCanceled = savedInstanceState.getBoolean(INSTANCE_KEY_PAIRING_CANCELED); if (mReceivedPairingCanceled) { onReceivedPairingCanceled(); @@ -119,31 +180,18 @@ public class BluetoothPinDialog extends AlertActivity implements DialogInterface @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - + outState.putBoolean(INSTANCE_KEY_PAIRING_CANCELED, mReceivedPairingCanceled); } @Override protected void onDestroy() { super.onDestroy(); - + unregisterReceiver(mReceiver); } - private View createView() { - View view = getLayoutInflater().inflate(R.layout.bluetooth_pin_entry, null); - - String name = mLocalManager.getLocalDeviceManager().getName(mAddress); - TextView messageView = (TextView) view.findViewById(R.id.message); - messageView.setText(getString(R.string.bluetooth_enter_pin_msg, name)); - - mPinView = (EditText) view.findViewById(R.id.text); - mPinView.addTextChangedListener(this); - // Maximum of 16 characters in a PIN - mPinView.setFilters(new InputFilter[] { new LengthFilter(BLUETOOTH_PIN_MAX_LENGTH) }); - - return view; - } + public void afterTextChanged(Editable s) { if (s.length() > 0) { @@ -153,39 +201,49 @@ public class BluetoothPinDialog extends AlertActivity implements DialogInterface private void onReceivedPairingCanceled() { mReceivedPairingCanceled = true; - + TextView messageView = (TextView) findViewById(R.id.message); messageView.setText(getString(R.string.bluetooth_pairing_error_message, mLocalManager.getLocalDeviceManager().getName(mAddress))); - - mPinView.setVisibility(View.GONE); - mPinView.clearFocus(); - mPinView.removeTextChangedListener(this); + mPairingView.setVisibility(View.GONE); + mPairingView.clearFocus(); + mPairingView.removeTextChangedListener(this); + + mOkButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE); mOkButton.setEnabled(true); mAlert.getButton(DialogInterface.BUTTON_NEGATIVE).setVisibility(View.GONE); } - - private void onPair(String pin) { - byte[] pinBytes = BluetoothDevice.convertPinToBytes(pin); - - if (pinBytes == null) { - return; + + private void onPair(String value) { + if (mType == BluetoothDevice.PAIRING_VARIANT_PIN) { + byte[] pinBytes = BluetoothDevice.convertPinToBytes(value); + if (pinBytes == null) { + return; + } + mLocalManager.getBluetoothManager().setPin(mAddress, pinBytes); + } else if (mType == BluetoothDevice.PAIRING_VARIANT_PASSKEY) { + int passkey = Integer.getInteger(value); + mLocalManager.getBluetoothManager().setPasskey(mAddress, passkey); + } else { + mLocalManager.getBluetoothManager().setPairingConfirmation(mAddress, true); } - - mLocalManager.getBluetoothManager().setPin(mAddress, pinBytes); } private void onCancel() { - mLocalManager.getBluetoothManager().cancelBondProcess(mAddress); + if (mType == BluetoothDevice.PAIRING_VARIANT_CONFIRMATION) { + mLocalManager.getBluetoothManager().setPairingConfirmation(mAddress, false); + } else { + mLocalManager.getBluetoothManager().cancelBondProcess(mAddress); + } } - + public void onClick(DialogInterface dialog, int which) { switch (which) { case DialogInterface.BUTTON_POSITIVE: - onPair(mPinView.getText().toString()); + onPair(mPairingView.getText().toString()); break; - + case DialogInterface.BUTTON_NEGATIVE: onCancel(); break; diff --git a/src/com/android/settings/bluetooth/BluetoothPinRequest.java b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java index 619052d..d57628a 100644 --- a/src/com/android/settings/bluetooth/BluetoothPinRequest.java +++ b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java @@ -21,6 +21,7 @@ import com.android.settings.R; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; +import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothIntent; import android.content.BroadcastReceiver; @@ -30,35 +31,41 @@ import android.content.res.Resources; import android.text.TextUtils; /** - * BluetoothPinRequest is a receiver for any Bluetooth pairing PIN request. It - * checks if the Bluetooth Settings is currently visible and brings up the PIN - * entry dialog. Otherwise it puts a Notification in the status bar, which can - * be clicked to bring up the PIN entry dialog. + * BluetoothPairingRequest is a receiver for any Bluetooth pairing request. It + * checks if the Bluetooth Settings is currently visible and brings up the PIN, the passkey or a + * confirmation entry dialog. Otherwise it puts a Notification in the status bar, which can + * be clicked to bring up the Pairing entry dialog. */ -public class BluetoothPinRequest extends BroadcastReceiver { +public class BluetoothPairingRequest extends BroadcastReceiver { public static final int NOTIFICATION_ID = android.R.drawable.stat_sys_data_bluetooth; - + @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(BluetoothIntent.PAIRING_REQUEST_ACTION)) { - LocalBluetoothManager localManager = LocalBluetoothManager.getInstance(context); - + LocalBluetoothManager localManager = LocalBluetoothManager.getInstance(context); + String address = intent.getStringExtra(BluetoothIntent.ADDRESS); - Intent pinIntent = new Intent(); - pinIntent.setClass(context, BluetoothPinDialog.class); - pinIntent.putExtra(BluetoothIntent.ADDRESS, address); - pinIntent.setAction(BluetoothIntent.PAIRING_REQUEST_ACTION); - pinIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - + int type = intent.getIntExtra(BluetoothIntent.PAIRING_VARIANT, BluetoothClass.ERROR); + Intent pairingIntent = new Intent(); + pairingIntent.setClass(context, BluetoothPairingDialog.class); + pairingIntent.putExtra(BluetoothIntent.ADDRESS, address); + pairingIntent.putExtra(BluetoothIntent.PAIRING_VARIANT, type); + if (type == BluetoothDevice.PAIRING_VARIANT_CONFIRMATION) { + int passkey = intent.getIntExtra(BluetoothIntent.PASSKEY, BluetoothClass.ERROR); + pairingIntent.putExtra(BluetoothIntent.PASSKEY, passkey); + } + pairingIntent.setAction(BluetoothIntent.PAIRING_REQUEST_ACTION); + pairingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (localManager.getForegroundActivity() != null) { // Since the BT-related activity is in the foreground, just open the dialog - context.startActivity(pinIntent); - + context.startActivity(pairingIntent); + } else { - + // Put up a notification that leads to the dialog Resources res = context.getResources(); Notification notification = new Notification( @@ -66,27 +73,27 @@ public class BluetoothPinRequest extends BroadcastReceiver { res.getString(R.string.bluetooth_notif_ticker), System.currentTimeMillis()); - PendingIntent pending = PendingIntent.getActivity(context, 0, - pinIntent, PendingIntent.FLAG_ONE_SHOT); - + PendingIntent pending = PendingIntent.getActivity(context, 0, + pairingIntent, PendingIntent.FLAG_ONE_SHOT); + String name = intent.getStringExtra(BluetoothIntent.NAME); if (TextUtils.isEmpty(name)) { name = localManager.getLocalDeviceManager().getName(address); } - - notification.setLatestEventInfo(context, - res.getString(R.string.bluetooth_notif_title), - res.getString(R.string.bluetooth_notif_message) + name, + + notification.setLatestEventInfo(context, + res.getString(R.string.bluetooth_notif_title), + res.getString(R.string.bluetooth_notif_message) + name, pending); notification.flags |= Notification.FLAG_AUTO_CANCEL; - - NotificationManager manager = (NotificationManager) + + NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); manager.notify(NOTIFICATION_ID, notification); } - + } else if (action.equals(BluetoothIntent.PAIRING_CANCEL_ACTION)) { - + // Remove the notification NotificationManager manager = (NotificationManager) context .getSystemService(Context.NOTIFICATION_SERVICE); |