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; 26dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.preference.Preference; 27dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.util.Log; 28dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.view.View; 29dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.widget.CheckBox; 30dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.widget.CompoundButton; 31dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.widget.EditText; 32dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.widget.TextView; 33dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.widget.Button; 34dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport android.widget.CompoundButton.OnCheckedChangeListener; 35dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 36dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport com.android.internal.app.AlertActivity; 37dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport com.android.internal.app.AlertController; 38dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 39dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xieimport com.android.settings.R; 40dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 41dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie/** 42dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * BluetoothPermissionActivity shows a dialog for accepting incoming 43dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * profile connection request from untrusted devices. 44dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * It is also used to show a dialogue for accepting incoming phonebook 45dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie * read request. The request could be initiated by PBAP PCE or by HF AT+CPBR. 46dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie */ 47dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xiepublic class BluetoothPermissionActivity extends AlertActivity implements 48dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie DialogInterface.OnClickListener, Preference.OnPreferenceChangeListener { 49dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private static final String TAG = "BluetoothPermissionActivity"; 50dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private static final boolean DEBUG = Utils.D; 51dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 52dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private View mView; 53dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private TextView messageView; 54dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private Button mOkButton; 55dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private BluetoothDevice mDevice; 56dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private String mReturnPackage = null; 57dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private String mReturnClass = null; 58dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 59b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie private CheckBox mRememberChoice; 60b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie private boolean mRememberChoiceValue = false; 61b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie 62dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private BroadcastReceiver mReceiver = new BroadcastReceiver() { 63dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie @Override 64dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie public void onReceive(Context context, Intent intent) { 65dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie String action = intent.getAction(); 66dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie if (action.equals(BluetoothDevice.ACTION_CONNECTION_ACCESS_CANCEL)) { 67dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 68dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie if (mDevice.equals(device)) dismissDialog(); 69dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 70dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 71dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie }; 72b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie private boolean mReceiverRegistered = false; 73dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 74dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private void dismissDialog() { 75dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie this.dismiss(); 76dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 77dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 78dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie @Override 79dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie protected void onCreate(Bundle savedInstanceState) { 80dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie super.onCreate(savedInstanceState); 81dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 82dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie Intent i = getIntent(); 83dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie String action = i.getAction(); 84b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie if (!action.equals(BluetoothDevice.ACTION_CONNECTION_ACCESS_REQUEST)) { 85b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie Log.e(TAG, "Error: this activity may be started only with intent " 86b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie + "ACTION_CONNECTION_ACCESS_REQUEST"); 87b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie finish(); 88b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie return; 89b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie } 90b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie 91dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie mDevice = i.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 92dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie mReturnPackage = i.getStringExtra(BluetoothDevice.EXTRA_PACKAGE_NAME); 93dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie mReturnClass = i.getStringExtra(BluetoothDevice.EXTRA_CLASS_NAME); 94b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie int requestType = i.getIntExtra(BluetoothDevice.EXTRA_ACCESS_REQUEST_TYPE, 95b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS); 96dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 97b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie if (requestType == BluetoothDevice.REQUEST_TYPE_PROFILE_CONNECTION) { 98b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie showConnectionDialog(); 99b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie } else if (requestType == BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS) { 100b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie showPhonebookDialog(); 101dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } else { 102b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie Log.e(TAG, "Error: bad request type: " + requestType); 103dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie finish(); 104b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie return; 105dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 106dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie registerReceiver(mReceiver, 107dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie new IntentFilter(BluetoothDevice.ACTION_CONNECTION_ACCESS_CANCEL)); 108b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie mReceiverRegistered = true; 109dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 110dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 111dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private void showConnectionDialog() { 112dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie final AlertController.AlertParams p = mAlertParams; 113dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie p.mIconId = android.R.drawable.ic_dialog_info; 114dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie p.mTitle = getString(R.string.bluetooth_connection_permission_request); 115dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie p.mView = createConnectionDialogView(); 116dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie p.mPositiveButtonText = getString(R.string.yes); 117dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie p.mPositiveButtonListener = this; 118dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie p.mNegativeButtonText = getString(R.string.no); 119dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie p.mNegativeButtonListener = this; 120dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie mOkButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE); 121dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie setupAlert(); 122dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 123dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 124b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie private void showPhonebookDialog() { 125dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie final AlertController.AlertParams p = mAlertParams; 126dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie p.mIconId = android.R.drawable.ic_dialog_info; 127dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie p.mTitle = getString(R.string.bluetooth_phonebook_request); 128b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie p.mView = createPhonebookDialogView(); 129dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie p.mPositiveButtonText = getString(android.R.string.yes); 130dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie p.mPositiveButtonListener = this; 131dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie p.mNegativeButtonText = getString(android.R.string.no); 132dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie p.mNegativeButtonListener = this; 133dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie mOkButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE); 134dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie setupAlert(); 135dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 136dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 137dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private String createConnectionDisplayText() { 1382036ebd8896bbabbbe04db34c9e7d8a1be6fe32aMatthew Xie String mRemoteName = mDevice != null ? mDevice.getAliasName() : null; 139dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 140dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie if (mRemoteName == null) mRemoteName = getString(R.string.unknown); 141dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie String mMessage1 = getString(R.string.bluetooth_connection_dialog_text, 142dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie mRemoteName); 143dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie return mMessage1; 144dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 145dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 146b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie private String createPhonebookDisplayText() { 1472036ebd8896bbabbbe04db34c9e7d8a1be6fe32aMatthew Xie String mRemoteName = mDevice != null ? mDevice.getAliasName() : null; 148dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 149dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie if (mRemoteName == null) mRemoteName = getString(R.string.unknown); 150dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie String mMessage1 = getString(R.string.bluetooth_pb_acceptance_dialog_text, 151dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie mRemoteName, mRemoteName); 152dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie return mMessage1; 153dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 154dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 155dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private View createConnectionDialogView() { 156dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie mView = getLayoutInflater().inflate(R.layout.bluetooth_connection_access, null); 157dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie messageView = (TextView)mView.findViewById(R.id.message); 158dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie messageView.setText(createConnectionDisplayText()); 159dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie return mView; 160dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 161dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 162b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie private View createPhonebookDialogView() { 163dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie mView = getLayoutInflater().inflate(R.layout.bluetooth_pb_access, null); 164dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie messageView = (TextView)mView.findViewById(R.id.message); 165b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie messageView.setText(createPhonebookDisplayText()); 166b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie mRememberChoice = (CheckBox)mView.findViewById(R.id.bluetooth_pb_remember_choice); 167b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie mRememberChoice.setChecked(false); 168b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie mRememberChoice.setOnCheckedChangeListener(new OnCheckedChangeListener() { 169dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 170dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie if (isChecked) { 171b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie mRememberChoiceValue = true; 172dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } else { 173b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie mRememberChoiceValue = false; 174dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 175dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 176dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie }); 177dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie return mView; 178dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 179dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 180dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private void onPositive() { 181b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie if (DEBUG) Log.d(TAG, "onPositive mRememberChoiceValue: " + mRememberChoiceValue); 182b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie 183b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie if (mRememberChoiceValue) { 184b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie savePhonebookPermissionChoice(CachedBluetoothDevice.PHONEBOOK_ACCESS_ALLOWED); 185b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie } 186dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie sendIntentToReceiver(BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY, true, 187b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie BluetoothDevice.EXTRA_ALWAYS_ALLOWED, mRememberChoiceValue); 188dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie finish(); 189dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 190dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 191dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private void onNegative() { 192b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie if (DEBUG) Log.d(TAG, "onNegative mRememberChoiceValue: " + mRememberChoiceValue); 193b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie 194b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie if (mRememberChoiceValue) { 195b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie savePhonebookPermissionChoice(CachedBluetoothDevice.PHONEBOOK_ACCESS_REJECTED); 196b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie } 197dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie sendIntentToReceiver(BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY, false, 198dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie null, false // dummy value, no effect since last param is null 199dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie ); 200dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie finish(); 201dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 202dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 203dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie private void sendIntentToReceiver(final String intentName, final boolean allowed, 204dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie final String extraName, final boolean extraValue) { 205dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie Intent intent = new Intent(intentName); 206dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 207dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie if (mReturnPackage != null && mReturnClass != null) { 208dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie intent.setClassName(mReturnPackage, mReturnClass); 209dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 210dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 211dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie intent.putExtra(BluetoothDevice.EXTRA_CONNECTION_ACCESS_RESULT, 212dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie allowed ? BluetoothDevice.CONNECTION_ACCESS_YES : 213dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie BluetoothDevice.CONNECTION_ACCESS_NO); 214dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 215dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie if (extraName != null) { 216dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie intent.putExtra(extraName, extraValue); 217dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 218dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie intent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice); 219dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie sendBroadcast(intent, android.Manifest.permission.BLUETOOTH_ADMIN); 220dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 221dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 222dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie public void onClick(DialogInterface dialog, int which) { 223dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie switch (which) { 224dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie case DialogInterface.BUTTON_POSITIVE: 225dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie onPositive(); 226dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie break; 227dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 228dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie case DialogInterface.BUTTON_NEGATIVE: 229dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie onNegative(); 230dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie break; 231dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie default: 232dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie break; 233dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 234dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 235dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 236dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie @Override 237dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie protected void onDestroy() { 238dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie super.onDestroy(); 239b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie if (mReceiverRegistered) { 240b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie unregisterReceiver(mReceiver); 241b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie mReceiverRegistered = false; 242b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie } 243dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 244dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie 245dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie public boolean onPreferenceChange(Preference preference, Object newValue) { 246dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie return true; 247dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie } 248b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie 249b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie private void savePhonebookPermissionChoice(int permissionChoice) { 250b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie LocalBluetoothManager bluetoothManager = LocalBluetoothManager.getInstance(this); 251b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie CachedBluetoothDeviceManager cachedDeviceManager = 252b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie bluetoothManager.getCachedDeviceManager(); 253b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie CachedBluetoothDevice cachedDevice = cachedDeviceManager.findDevice(mDevice); 254b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie cachedDevice.setPhonebookPermissionChoice(permissionChoice); 255b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie } 256dbed12020c87d686ddcdbdbb8fba8f7b43a4e8d3Matthew Xie} 257