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