From 3a76bcaa83c15f96832f934e67e6f0190e72a3dc Mon Sep 17 00:00:00 2001 From: Jaikumar Ganesh Date: Thu, 16 Jul 2009 18:41:58 -0700 Subject: Initial 2.1 bluetooth support. Need to work with Strings and UI person to fix and later test everything. --- AndroidManifest.xml | 4 +- res/values/strings.xml | 11 +- .../settings/bluetooth/BluetoothPairingDialog.java | 261 +++++++++++++++++++++ .../bluetooth/BluetoothPairingRequest.java | 103 ++++++++ .../settings/bluetooth/BluetoothPinDialog.java | 203 ---------------- .../settings/bluetooth/BluetoothPinRequest.java | 96 -------- 6 files changed, 374 insertions(+), 304 deletions(-) create mode 100644 src/com/android/settings/bluetooth/BluetoothPairingDialog.java create mode 100644 src/com/android/settings/bluetooth/BluetoothPairingRequest.java delete mode 100644 src/com/android/settings/bluetooth/BluetoothPinDialog.java delete mode 100644 src/com/android/settings/bluetooth/BluetoothPinRequest.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 1500d8b..d5eec4a 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -424,7 +424,7 @@ - @@ -433,7 +433,7 @@ - + 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 @@ Bluetooth pairing request Bluetooth device info - + %1$s\n\nType PIN to pair.\n(Try 0000 or 1234.) + + %1$s\n\nType passkey to pair.\n + + \n Passkey: %2$d\n\nIs the same passkey displayed on: %1$s ?\n Attention There was a problem pairing with %1$s. - - There was a problem pairing with %1$s because the typed PIN is incorrect. + + There was a problem pairing with %1$s because the typed PIN or Passkey is incorrect. Cannot establish communication with %1$s. diff --git a/src/com/android/settings/bluetooth/BluetoothPairingDialog.java b/src/com/android/settings/bluetooth/BluetoothPairingDialog.java new file mode 100644 index 0000000..bbe094f --- /dev/null +++ b/src/com/android/settings/bluetooth/BluetoothPairingDialog.java @@ -0,0 +1,261 @@ +/* + * Copyright (C) 2008 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.bluetooth; + +import android.bluetooth.BluetoothClass; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +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; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; + +import com.android.internal.app.AlertActivity; +import com.android.internal.app.AlertController; +import com.android.settings.R; + +/** + * 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 BluetoothPairingDialog extends AlertActivity implements DialogInterface.OnClickListener, + TextWatcher { + 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 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); + + Intent intent = getIntent(); + if (!intent.getAction().equals(BluetoothIntent.PAIRING_REQUEST_ACTION)) + { + Log.e(TAG, + "Error: this activity may be started only with intent " + + BluetoothIntent.PAIRING_REQUEST_ACTION); + finish(); + } + + mLocalManager = LocalBluetoothManager.getInstance(this); + mAddress = intent.getStringExtra(BluetoothIntent.ADDRESS); + 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); + p.mView = createView(); + p.mPositiveButtonText = getString(android.R.string.ok); + p.mPositiveButtonListener = this; + p.mNegativeButtonText = getString(android.R.string.cancel); + p.mNegativeButtonListener = this; + setupAlert(); + + mOkButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE); + mOkButton.setEnabled(false); + } + + 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(); + } + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + outState.putBoolean(INSTANCE_KEY_PAIRING_CANCELED, mReceivedPairingCanceled); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + + unregisterReceiver(mReceiver); + } + + + + public void afterTextChanged(Editable s) { + if (s.length() > 0) { + mOkButton.setEnabled(true); + } + } + + 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))); + + 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 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); + } + } + + private void onCancel() { + 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(mPairingView.getText().toString()); + break; + + case DialogInterface.BUTTON_NEGATIVE: + onCancel(); + break; + } + } + + /* Not used */ + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + /* Not used */ + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + +} diff --git a/src/com/android/settings/bluetooth/BluetoothPairingRequest.java b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java new file mode 100644 index 0000000..d57628a --- /dev/null +++ b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2008 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.bluetooth; + +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; +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.text.TextUtils; + +/** + * 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 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); + + String address = intent.getStringExtra(BluetoothIntent.ADDRESS); + 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(pairingIntent); + + } else { + + // Put up a notification that leads to the dialog + Resources res = context.getResources(); + Notification notification = new Notification( + android.R.drawable.stat_sys_data_bluetooth, + res.getString(R.string.bluetooth_notif_ticker), + System.currentTimeMillis()); + + 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, + pending); + notification.flags |= Notification.FLAG_AUTO_CANCEL; + + 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); + manager.cancel(NOTIFICATION_ID); + } + } +} diff --git a/src/com/android/settings/bluetooth/BluetoothPinDialog.java b/src/com/android/settings/bluetooth/BluetoothPinDialog.java deleted file mode 100644 index 087fbb2..0000000 --- a/src/com/android/settings/bluetooth/BluetoothPinDialog.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (C) 2008 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.bluetooth; - -import android.bluetooth.BluetoothDevice; -import android.bluetooth.BluetoothIntent; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.IntentFilter; -import android.os.Bundle; -import android.text.Editable; -import android.text.InputFilter; -import android.text.TextWatcher; -import android.text.InputFilter.LengthFilter; -import android.util.Log; -import android.view.View; -import android.widget.Button; -import android.widget.EditText; -import android.widget.TextView; - -import com.android.internal.app.AlertActivity; -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. - */ -public class BluetoothPinDialog extends AlertActivity implements DialogInterface.OnClickListener, - TextWatcher { - private static final String TAG = "BluetoothPinDialog"; - - private final int BLUETOOTH_PIN_MAX_LENGTH = 16; - private LocalBluetoothManager mLocalManager; - private String mAddress; - private EditText mPinView; - 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); - - Intent intent = getIntent(); - if (!intent.getAction().equals(BluetoothIntent.PAIRING_REQUEST_ACTION)) - { - Log.e(TAG, - "Error: this activity may be started only with intent " + - BluetoothIntent.PAIRING_REQUEST_ACTION); - finish(); - } - - mLocalManager = LocalBluetoothManager.getInstance(this); - mAddress = intent.getStringExtra(BluetoothIntent.ADDRESS); - - // Set up the "dialog" - 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.ok); - p.mPositiveButtonListener = this; - 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)); - } - - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) { - super.onRestoreInstanceState(savedInstanceState); - - mReceivedPairingCanceled = savedInstanceState.getBoolean(INSTANCE_KEY_PAIRING_CANCELED); - if (mReceivedPairingCanceled) { - onReceivedPairingCanceled(); - } - } - - @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) { - mOkButton.setEnabled(true); - } - } - - 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); - - 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; - } - - mLocalManager.getBluetoothManager().setPin(mAddress, pinBytes); - } - - private void onCancel() { - mLocalManager.getBluetoothManager().cancelBondProcess(mAddress); - } - - public void onClick(DialogInterface dialog, int which) { - switch (which) { - case DialogInterface.BUTTON_POSITIVE: - onPair(mPinView.getText().toString()); - break; - - case DialogInterface.BUTTON_NEGATIVE: - onCancel(); - break; - } - } - - /* Not used */ - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - /* Not used */ - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - -} diff --git a/src/com/android/settings/bluetooth/BluetoothPinRequest.java b/src/com/android/settings/bluetooth/BluetoothPinRequest.java deleted file mode 100644 index 619052d..0000000 --- a/src/com/android/settings/bluetooth/BluetoothPinRequest.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) 2008 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.bluetooth; - -import com.android.settings.R; - -import android.app.Notification; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.bluetooth.BluetoothDevice; -import android.bluetooth.BluetoothIntent; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -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. - */ -public class BluetoothPinRequest 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); - - 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); - - if (localManager.getForegroundActivity() != null) { - // Since the BT-related activity is in the foreground, just open the dialog - context.startActivity(pinIntent); - - } else { - - // Put up a notification that leads to the dialog - Resources res = context.getResources(); - Notification notification = new Notification( - android.R.drawable.stat_sys_data_bluetooth, - res.getString(R.string.bluetooth_notif_ticker), - System.currentTimeMillis()); - - PendingIntent pending = PendingIntent.getActivity(context, 0, - pinIntent, 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, - pending); - notification.flags |= Notification.FLAG_AUTO_CANCEL; - - 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); - manager.cancel(NOTIFICATION_ID); - } - } -} -- cgit v1.1