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