1dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie/* 2dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * Copyright (C) 2011 The Android Open Source Project 3dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * 4dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * Licensed under the Apache License, Version 2.0 (the "License"); 5dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * you may not use this file except in compliance with the License. 6dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * You may obtain a copy of the License at 7dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * 8dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * http://www.apache.org/licenses/LICENSE-2.0 9dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * 10dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * Unless required by applicable law or agreed to in writing, software 11dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * distributed under the License is distributed on an "AS IS" BASIS, 12dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * See the License for the specific language governing permissions and 14dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * limitations under the License. 15dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie */ 16dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 17dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xiepackage com.android.settings.bluetooth; 18dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 19dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.bluetooth.BluetoothDevice; 20dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.content.BroadcastReceiver; 21dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.content.Context; 22dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.content.DialogInterface; 23dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.content.Intent; 24dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.content.IntentFilter; 25dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.os.Bundle; 2639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference; 27dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.util.Log; 28dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.view.View; 29dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.widget.Button; 3039b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.widget.TextView; 31dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 32dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport com.android.internal.app.AlertActivity; 33dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport com.android.internal.app.AlertController; 34dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport com.android.settings.R; 35f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monkimport com.android.settingslib.bluetooth.CachedBluetoothDevice; 36f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monkimport com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; 37f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monkimport com.android.settingslib.bluetooth.LocalBluetoothManager; 38dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 39dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie/** 40dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * BluetoothPermissionActivity shows a dialog for accepting incoming 41dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * profile connection request from untrusted devices. 42dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * It is also used to show a dialogue for accepting incoming phonebook 43dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * read request. The request could be initiated by PBAP PCE or by HF AT+CPBR. 44dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie */ 45dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xiepublic class BluetoothPermissionActivity extends AlertActivity implements 46dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie DialogInterface.OnClickListener, Preference.OnPreferenceChangeListener { 47dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private static final String TAG = "BluetoothPermissionActivity"; 48dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private static final boolean DEBUG = Utils.D; 49dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 50dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private View mView; 51dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private TextView messageView; 52dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private Button mOkButton; 53dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private BluetoothDevice mDevice; 54dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private String mReturnPackage = null; 55dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private String mReturnClass = null; 56dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 575b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie private int mRequestType = 0; 58dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private BroadcastReceiver mReceiver = new BroadcastReceiver() { 59dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie @Override 60dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie public void onReceive(Context context, Intent intent) { 61dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie String action = intent.getAction(); 62dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie if (action.equals(BluetoothDevice.ACTION_CONNECTION_ACCESS_CANCEL)) { 635d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz int requestType = intent.getIntExtra(BluetoothDevice.EXTRA_ACCESS_REQUEST_TYPE, 64ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS); 655d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz if (requestType != mRequestType) return; 66dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 67dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie if (mDevice.equals(device)) dismissDialog(); 68dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 69dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 70dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie }; 71b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie private boolean mReceiverRegistered = false; 72dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 73dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private void dismissDialog() { 74dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie this.dismiss(); 75dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 76dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 77dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie @Override 78dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie protected void onCreate(Bundle savedInstanceState) { 79dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie super.onCreate(savedInstanceState); 80dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 81dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie Intent i = getIntent(); 82dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie String action = i.getAction(); 83b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie if (!action.equals(BluetoothDevice.ACTION_CONNECTION_ACCESS_REQUEST)) { 84b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie Log.e(TAG, "Error: this activity may be started only with intent " 85b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie + "ACTION_CONNECTION_ACCESS_REQUEST"); 86b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie finish(); 87b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie return; 88b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie } 89b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie 90dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie mDevice = i.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 91dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie mReturnPackage = i.getStringExtra(BluetoothDevice.EXTRA_PACKAGE_NAME); 92dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie mReturnClass = i.getStringExtra(BluetoothDevice.EXTRA_CLASS_NAME); 935b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie mRequestType = i.getIntExtra(BluetoothDevice.EXTRA_ACCESS_REQUEST_TYPE, 94b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS); 95dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 965d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz if(DEBUG) Log.i(TAG, "onCreate() Request type: " + mRequestType); 975d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz 985b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie if (mRequestType == BluetoothDevice.REQUEST_TYPE_PROFILE_CONNECTION) { 995b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie showDialog(getString(R.string.bluetooth_connection_permission_request), mRequestType); 1005b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie } else if (mRequestType == BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS) { 1015b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie showDialog(getString(R.string.bluetooth_phonebook_request), mRequestType); 1025b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie } else if (mRequestType == BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS) { 1035b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie showDialog(getString(R.string.bluetooth_map_request), mRequestType); 104faadcd60e7ab8fa6eb9b5be7be907129bd3f8575Casper Bonde } else if (mRequestType == BluetoothDevice.REQUEST_TYPE_SIM_ACCESS) { 105faadcd60e7ab8fa6eb9b5be7be907129bd3f8575Casper Bonde showDialog(getString(R.string.bluetooth_sap_request), mRequestType); 1065b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie } 1075b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie else { 1085b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie Log.e(TAG, "Error: bad request type: " + mRequestType); 109dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie finish(); 110b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie return; 111dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 112dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie registerReceiver(mReceiver, 113dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie new IntentFilter(BluetoothDevice.ACTION_CONNECTION_ACCESS_CANCEL)); 114b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie mReceiverRegistered = true; 115dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 116dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 1175b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie 1185b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie private void showDialog(String title, int requestType) 1195b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie { 120dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie final AlertController.AlertParams p = mAlertParams; 1215b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie p.mTitle = title; 1225d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz if(DEBUG) Log.i(TAG, "showDialog() Request type: " + mRequestType + " this: " + this); 1235b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie switch(requestType) 1245b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie { 1255b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie case BluetoothDevice.REQUEST_TYPE_PROFILE_CONNECTION: 1265b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie p.mView = createConnectionDialogView(); 1275b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie break; 1285b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie case BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS: 1295b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie p.mView = createPhonebookDialogView(); 1305b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie break; 1315b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie case BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS: 1325b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie p.mView = createMapDialogView(); 1335b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie break; 134faadcd60e7ab8fa6eb9b5be7be907129bd3f8575Casper Bonde case BluetoothDevice.REQUEST_TYPE_SIM_ACCESS: 135faadcd60e7ab8fa6eb9b5be7be907129bd3f8575Casper Bonde p.mView = createSapDialogView(); 136faadcd60e7ab8fa6eb9b5be7be907129bd3f8575Casper Bonde break; 1375b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie } 138dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie p.mPositiveButtonText = getString(R.string.yes); 139dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie p.mPositiveButtonListener = this; 140dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie p.mNegativeButtonText = getString(R.string.no); 141dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie p.mNegativeButtonListener = this; 142dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie mOkButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE); 143dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie setupAlert(); 144dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 145dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 1465d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz @Override 1475d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz public void onBackPressed() { 1485d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz /*we need an answer so ignore back button presses during auth */ 1495d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz if(DEBUG) Log.i(TAG, "Back button pressed! ignoring"); 1505d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz return; 151dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 1525b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie private String createRemoteName() 1535b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie { 1542036ebd8896bbabbbe04db34c9e7d8a1be6fe32aMatthew Xie String mRemoteName = mDevice != null ? mDevice.getAliasName() : null; 1555d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz 156dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie if (mRemoteName == null) mRemoteName = getString(R.string.unknown); 1575b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie return mRemoteName; 158dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 159dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 16046c746551f5e3df58f12ce43bb0da3dd611b5944Edward Jee // TODO(edjee): createConnectionDialogView, createPhonebookDialogView and createMapDialogView 16146c746551f5e3df58f12ce43bb0da3dd611b5944Edward Jee // are similar. Refactor them into one method. 16246c746551f5e3df58f12ce43bb0da3dd611b5944Edward Jee // Also, the string resources bluetooth_remember_choice and bluetooth_pb_remember_choice should 16346c746551f5e3df58f12ce43bb0da3dd611b5944Edward Jee // be removed. 164dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private View createConnectionDialogView() { 1655b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie String mRemoteName = createRemoteName(); 16646c746551f5e3df58f12ce43bb0da3dd611b5944Edward Jee mView = getLayoutInflater().inflate(R.layout.bluetooth_access, null); 167dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie messageView = (TextView)mView.findViewById(R.id.message); 1685d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz messageView.setText(getString(R.string.bluetooth_connection_dialog_text, 1695d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz mRemoteName)); 170dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie return mView; 171dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 172dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 1735b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie private View createPhonebookDialogView() { 1745b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie String mRemoteName = createRemoteName(); 1755b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie mView = getLayoutInflater().inflate(R.layout.bluetooth_access, null); 1765b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie messageView = (TextView)mView.findViewById(R.id.message); 1775d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz messageView.setText(getString(R.string.bluetooth_pb_acceptance_dialog_text, 1785d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz mRemoteName, mRemoteName)); 1795b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie return mView; 1805b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie } 18146c746551f5e3df58f12ce43bb0da3dd611b5944Edward Jee 1825b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie private View createMapDialogView() { 1835b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie String mRemoteName = createRemoteName(); 1845b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie mView = getLayoutInflater().inflate(R.layout.bluetooth_access, null); 1855b5b1e39ddd28af55cf5dd4a9ca9bf29828a66a6Matthew Xie messageView = (TextView)mView.findViewById(R.id.message); 1865d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz messageView.setText(getString(R.string.bluetooth_map_acceptance_dialog_text, 1875d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz mRemoteName, mRemoteName)); 188dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie return mView; 189dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 190dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 191faadcd60e7ab8fa6eb9b5be7be907129bd3f8575Casper Bonde private View createSapDialogView() { 192faadcd60e7ab8fa6eb9b5be7be907129bd3f8575Casper Bonde String mRemoteName = createRemoteName(); 193faadcd60e7ab8fa6eb9b5be7be907129bd3f8575Casper Bonde mView = getLayoutInflater().inflate(R.layout.bluetooth_access, null); 194faadcd60e7ab8fa6eb9b5be7be907129bd3f8575Casper Bonde messageView = (TextView)mView.findViewById(R.id.message); 195faadcd60e7ab8fa6eb9b5be7be907129bd3f8575Casper Bonde messageView.setText(getString(R.string.bluetooth_sap_acceptance_dialog_text, 196faadcd60e7ab8fa6eb9b5be7be907129bd3f8575Casper Bonde mRemoteName, mRemoteName)); 197faadcd60e7ab8fa6eb9b5be7be907129bd3f8575Casper Bonde return mView; 198faadcd60e7ab8fa6eb9b5be7be907129bd3f8575Casper Bonde } 199faadcd60e7ab8fa6eb9b5be7be907129bd3f8575Casper Bonde 200dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private void onPositive() { 20146c746551f5e3df58f12ce43bb0da3dd611b5944Edward Jee if (DEBUG) Log.d(TAG, "onPositive"); 202ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee sendReplyIntentToReceiver(true, true); 203dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie finish(); 204dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 205dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 206dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private void onNegative() { 20746c746551f5e3df58f12ce43bb0da3dd611b5944Edward Jee if (DEBUG) Log.d(TAG, "onNegative"); 208ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee 209ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee boolean always = true; 210ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee if (mRequestType == BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS) { 211f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk LocalBluetoothManager bluetoothManager = Utils.getLocalBtManager(this); 212ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee CachedBluetoothDeviceManager cachedDeviceManager = 213ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee bluetoothManager.getCachedDeviceManager(); 214ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee CachedBluetoothDevice cachedDevice = cachedDeviceManager.findDevice(mDevice); 215ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee if (cachedDevice == null) { 216ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee cachedDevice = cachedDeviceManager.addDevice(bluetoothManager.getBluetoothAdapter(), 217ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee bluetoothManager.getProfileManager(), 218ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee mDevice); 219ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee } 220ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee always = cachedDevice.checkAndIncreaseMessageRejectionCount(); 221ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee } 222ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee 223ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee sendReplyIntentToReceiver(false, always); 224dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 225dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 226ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee private void sendReplyIntentToReceiver(final boolean allowed, final boolean always) { 227ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee Intent intent = new Intent(BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY); 228dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 229dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie if (mReturnPackage != null && mReturnClass != null) { 230dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie intent.setClassName(mReturnPackage, mReturnClass); 231dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 232ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee if (DEBUG) Log.i(TAG, "sendReplyIntentToReceiver() Request type: " + mRequestType + 2335d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz " mReturnPackage" + mReturnPackage + " mReturnClass" + mReturnClass); 234dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 235dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie intent.putExtra(BluetoothDevice.EXTRA_CONNECTION_ACCESS_RESULT, 236ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee allowed ? BluetoothDevice.CONNECTION_ACCESS_YES 237ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee : BluetoothDevice.CONNECTION_ACCESS_NO); 238ac8b5b7fd6b6774d22d39bb9a4becca1908915c7Edward Jee intent.putExtra(BluetoothDevice.EXTRA_ALWAYS_ALLOWED, always); 239dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie intent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice); 2405d2595f05182910c1dd0ed1302bf59071b55ae79Kim Schulz intent.putExtra(BluetoothDevice.EXTRA_ACCESS_REQUEST_TYPE, mRequestType); 241dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie sendBroadcast(intent, android.Manifest.permission.BLUETOOTH_ADMIN); 242dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 243dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 244dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie public void onClick(DialogInterface dialog, int which) { 245dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie switch (which) { 246dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie case DialogInterface.BUTTON_POSITIVE: 247dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie onPositive(); 248dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie break; 249dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 250dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie case DialogInterface.BUTTON_NEGATIVE: 251dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie onNegative(); 252dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie break; 253dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie default: 254dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie break; 255dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 256dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 257dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 258dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie @Override 259dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie protected void onDestroy() { 260dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie super.onDestroy(); 261b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie if (mReceiverRegistered) { 262b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie unregisterReceiver(mReceiver); 263b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie mReceiverRegistered = false; 264b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie } 265dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 266dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 267dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie public boolean onPreferenceChange(Preference preference, Object newValue) { 268dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie return true; 269dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 270dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie} 271