/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.bluetooth; import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.provider.Settings; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.Toast; import com.android.settings.R; import com.android.settings.WirelessSettings; /** * BluetoothEnabler is a helper to manage the Bluetooth on/off checkbox * preference. It turns on/off Bluetooth and ensures the summary of the * preference reflects the current state. */ public final class BluetoothEnabler implements CompoundButton.OnCheckedChangeListener { private final Context mContext; private Switch mSwitch; private final LocalBluetoothAdapter mLocalAdapter; private final IntentFilter mIntentFilter; private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); handleStateChanged(state); } }; public BluetoothEnabler(Context context, Switch switch_) { mContext = context; mSwitch = switch_; LocalBluetoothManager manager = LocalBluetoothManager.getInstance(context); if (manager == null) { // Bluetooth is not supported mLocalAdapter = null; mSwitch.setEnabled(false); } else { mLocalAdapter = manager.getBluetoothAdapter(); } mIntentFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); } public void resume() { if (mLocalAdapter == null) { mSwitch.setEnabled(false); return; } // Bluetooth state is not sticky, so set it manually handleStateChanged(mLocalAdapter.getBluetoothState()); mContext.registerReceiver(mReceiver, mIntentFilter); mSwitch.setOnCheckedChangeListener(this); } public void pause() { if (mLocalAdapter == null) { return; } mContext.unregisterReceiver(mReceiver); mSwitch.setOnCheckedChangeListener(null); } public void setSwitch(Switch switch_) { if (mSwitch == switch_) return; mSwitch.setOnCheckedChangeListener(null); mSwitch = switch_; mSwitch.setOnCheckedChangeListener(this); int bluetoothState = BluetoothAdapter.STATE_OFF; if (mLocalAdapter != null) bluetoothState = mLocalAdapter.getBluetoothState(); boolean isOn = bluetoothState == BluetoothAdapter.STATE_ON; boolean isOff = bluetoothState == BluetoothAdapter.STATE_OFF; mSwitch.setChecked(isOn); mSwitch.setEnabled(isOn || isOff); } public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // Show toast message if Bluetooth is not allowed in airplane mode if (isChecked && !WirelessSettings.isRadioAllowed(mContext, Settings.System.RADIO_BLUETOOTH)) { Toast.makeText(mContext, R.string.wifi_in_airplane_mode, Toast.LENGTH_SHORT).show(); // Reset switch to off buttonView.setChecked(false); } if (mLocalAdapter != null) { mLocalAdapter.setBluetoothEnabled(isChecked); } mSwitch.setEnabled(false); } void handleStateChanged(int state) { switch (state) { case BluetoothAdapter.STATE_TURNING_ON: mSwitch.setEnabled(false); break; case BluetoothAdapter.STATE_ON: mSwitch.setChecked(true); mSwitch.setEnabled(true); break; case BluetoothAdapter.STATE_TURNING_OFF: mSwitch.setEnabled(false); break; case BluetoothAdapter.STATE_OFF: mSwitch.setChecked(false); mSwitch.setEnabled(true); break; default: mSwitch.setChecked(false); mSwitch.setEnabled(true); } } }