Home | History | Annotate | Download | only in bluetooth
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.settings.bluetooth;
     18 
     19 import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
     20 
     21 import android.bluetooth.BluetoothAdapter;
     22 import android.bluetooth.BluetoothDevice;
     23 import android.bluetooth.BluetoothDevicePicker;
     24 import android.content.Context;
     25 import android.content.Intent;
     26 import android.os.Bundle;
     27 import android.os.UserManager;
     28 
     29 import com.android.settings.R;
     30 
     31 /**
     32  * BluetoothSettings is the Settings screen for Bluetooth configuration and
     33  * connection management.
     34  */
     35 public final class DevicePickerFragment extends DeviceListPreferenceFragment {
     36 
     37     public DevicePickerFragment() {
     38         super(null /* Not tied to any user restrictions. */);
     39     }
     40 
     41     private boolean mNeedAuth;
     42     private String mLaunchPackage;
     43     private String mLaunchClass;
     44     private boolean mStartScanOnResume;
     45 
     46     @Override
     47     void addPreferencesForActivity() {
     48         addPreferencesFromResource(R.xml.device_picker);
     49 
     50         Intent intent = getActivity().getIntent();
     51         mNeedAuth = intent.getBooleanExtra(BluetoothDevicePicker.EXTRA_NEED_AUTH, false);
     52         setFilter(intent.getIntExtra(BluetoothDevicePicker.EXTRA_FILTER_TYPE,
     53                 BluetoothDevicePicker.FILTER_TYPE_ALL));
     54         mLaunchPackage = intent.getStringExtra(BluetoothDevicePicker.EXTRA_LAUNCH_PACKAGE);
     55         mLaunchClass = intent.getStringExtra(BluetoothDevicePicker.EXTRA_LAUNCH_CLASS);
     56     }
     57 
     58     @Override
     59     public void onCreate(Bundle savedInstanceState) {
     60         super.onCreate(savedInstanceState);
     61         getActivity().setTitle(getString(R.string.device_picker));
     62         UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
     63         mStartScanOnResume = !um.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)
     64                 && (savedInstanceState == null);  // don't start scan after rotation
     65     }
     66 
     67     @Override
     68     public void onResume() {
     69         super.onResume();
     70         addCachedDevices();
     71         if (mStartScanOnResume) {
     72             mLocalAdapter.startScanning(true);
     73             mStartScanOnResume = false;
     74         }
     75     }
     76 
     77     @Override
     78     void onDevicePreferenceClick(BluetoothDevicePreference btPreference) {
     79         mLocalAdapter.stopScanning();
     80         LocalBluetoothPreferences.persistSelectedDeviceInPicker(
     81                 getActivity(), mSelectedDevice.getAddress());
     82         if ((btPreference.getCachedDevice().getBondState() ==
     83                 BluetoothDevice.BOND_BONDED) || !mNeedAuth) {
     84             sendDevicePickedIntent(mSelectedDevice);
     85             finish();
     86         } else {
     87             super.onDevicePreferenceClick(btPreference);
     88         }
     89     }
     90 
     91     public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice,
     92             int bondState) {
     93         if (bondState == BluetoothDevice.BOND_BONDED) {
     94             BluetoothDevice device = cachedDevice.getDevice();
     95             if (device.equals(mSelectedDevice)) {
     96                 sendDevicePickedIntent(device);
     97                 finish();
     98             }
     99         }
    100     }
    101 
    102     @Override
    103     public void onBluetoothStateChanged(int bluetoothState) {
    104         super.onBluetoothStateChanged(bluetoothState);
    105 
    106         if (bluetoothState == BluetoothAdapter.STATE_ON) {
    107             mLocalAdapter.startScanning(false);
    108         }
    109     }
    110 
    111     private void sendDevicePickedIntent(BluetoothDevice device) {
    112         Intent intent = new Intent(BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
    113         intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
    114         if (mLaunchPackage != null && mLaunchClass != null) {
    115             intent.setClassName(mLaunchPackage, mLaunchClass);
    116         }
    117         getActivity().sendBroadcast(intent);
    118     }
    119 }
    120