12748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby/*
22748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby * Copyright (C) 2011 The Android Open Source Project
32748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby *
42748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby * Licensed under the Apache License, Version 2.0 (the "License");
52748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby * you may not use this file except in compliance with the License.
62748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby * You may obtain a copy of the License at
72748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby *
82748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby *      http://www.apache.org/licenses/LICENSE-2.0
92748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby *
102748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby * Unless required by applicable law or agreed to in writing, software
112748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby * distributed under the License is distributed on an "AS IS" BASIS,
122748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby * See the License for the specific language governing permissions and
142748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby * limitations under the License.
152748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby */
162748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby
172748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hambypackage com.android.settings.bluetooth;
182748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby
1911b69bf86d7b3d8203e24473d4d91424a87bbdc1Maggie Benthallimport static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
2011b69bf86d7b3d8203e24473d4d91424a87bbdc1Maggie Benthall
212748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hambyimport android.bluetooth.BluetoothAdapter;
222748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hambyimport android.bluetooth.BluetoothDevice;
232748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hambyimport android.bluetooth.BluetoothDevicePicker;
2411b69bf86d7b3d8203e24473d4d91424a87bbdc1Maggie Benthallimport android.content.Context;
252748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hambyimport android.content.Intent;
26436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.os.Bundle;
2711b69bf86d7b3d8203e24473d4d91424a87bbdc1Maggie Benthallimport android.os.UserManager;
282748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby
292748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hambyimport com.android.settings.R;
302748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby
312748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby/**
322748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby * BluetoothSettings is the Settings screen for Bluetooth configuration and
332748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby * connection management.
342748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby */
35436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambypublic final class DevicePickerFragment extends DeviceListPreferenceFragment {
362748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby
372748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby    private boolean mNeedAuth;
382748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby    private String mLaunchPackage;
392748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby    private String mLaunchClass;
40de53b46b165ca65a464ecc6f062da55e11050389Jake Hamby    private boolean mStartScanOnResume;
412748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby
42436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    @Override
43436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    void addPreferencesForActivity() {
44436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        addPreferencesFromResource(R.xml.device_picker);
45436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
46436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        Intent intent = getActivity().getIntent();
472748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby        mNeedAuth = intent.getBooleanExtra(BluetoothDevicePicker.EXTRA_NEED_AUTH, false);
48436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        setFilter(intent.getIntExtra(BluetoothDevicePicker.EXTRA_FILTER_TYPE,
49436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                BluetoothDevicePicker.FILTER_TYPE_ALL));
502748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby        mLaunchPackage = intent.getStringExtra(BluetoothDevicePicker.EXTRA_LAUNCH_PACKAGE);
512748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby        mLaunchClass = intent.getStringExtra(BluetoothDevicePicker.EXTRA_LAUNCH_CLASS);
52436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
532748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby
54436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    @Override
55436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    public void onCreate(Bundle savedInstanceState) {
56436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        super.onCreate(savedInstanceState);
57436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        getActivity().setTitle(getString(R.string.device_picker));
5811b69bf86d7b3d8203e24473d4d91424a87bbdc1Maggie Benthall        UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
5911b69bf86d7b3d8203e24473d4d91424a87bbdc1Maggie Benthall        mStartScanOnResume = !um.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)
6011b69bf86d7b3d8203e24473d4d91424a87bbdc1Maggie Benthall                && (savedInstanceState == null);  // don't start scan after rotation
612748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby    }
622748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby
632748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby    @Override
642748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby    public void onResume() {
652748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby        super.onResume();
664346cda76c6faa69d7341eb5e4e5bf21c2210e7fGilles Debunne        addCachedDevices();
67de53b46b165ca65a464ecc6f062da55e11050389Jake Hamby        if (mStartScanOnResume) {
68de53b46b165ca65a464ecc6f062da55e11050389Jake Hamby            mLocalAdapter.startScanning(true);
69de53b46b165ca65a464ecc6f062da55e11050389Jake Hamby            mStartScanOnResume = false;
70de53b46b165ca65a464ecc6f062da55e11050389Jake Hamby        }
712748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby    }
722748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby
73436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    @Override
742748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby    void onDevicePreferenceClick(BluetoothDevicePreference btPreference) {
75436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        mLocalAdapter.stopScanning();
76436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        LocalBluetoothPreferences.persistSelectedDeviceInPicker(
77436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                getActivity(), mSelectedDevice.getAddress());
782748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby        if ((btPreference.getCachedDevice().getBondState() ==
792748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby                BluetoothDevice.BOND_BONDED) || !mNeedAuth) {
802748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby            sendDevicePickedIntent(mSelectedDevice);
812748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby            finish();
822748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby        } else {
832748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby            super.onDevicePreferenceClick(btPreference);
842748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby        }
852748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby    }
862748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby
872748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby    public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice,
882748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby            int bondState) {
892748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby        if (bondState == BluetoothDevice.BOND_BONDED) {
902748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby            BluetoothDevice device = cachedDevice.getDevice();
912748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby            if (device.equals(mSelectedDevice)) {
922748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby                sendDevicePickedIntent(device);
932748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby                finish();
942748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby            }
952748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby        }
962748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby    }
972748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby
98436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    @Override
99436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    public void onBluetoothStateChanged(int bluetoothState) {
1002748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby        super.onBluetoothStateChanged(bluetoothState);
1012748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby
1022748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby        if (bluetoothState == BluetoothAdapter.STATE_ON) {
103e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            mLocalAdapter.startScanning(false);
1042748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby        }
1052748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby    }
1062748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby
107436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    private void sendDevicePickedIntent(BluetoothDevice device) {
1082748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby        Intent intent = new Intent(BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
1092748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
1102748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby        if (mLaunchPackage != null && mLaunchClass != null) {
1112748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby            intent.setClassName(mLaunchPackage, mLaunchClass);
1122748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby        }
1132748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby        getActivity().sendBroadcast(intent);
1142748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby    }
1152748fc24cfeef9a79fc5e29c02a71737def35e6aJake Hamby}
116