| /* | |
| * Copyright (C) 2009 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.DialogInterface; | |
| import android.content.Intent; | |
| import android.os.Bundle; | |
| import android.util.Log; | |
| import com.android.internal.app.AlertActivity; | |
| import com.android.internal.app.AlertController; | |
| import com.android.settings.R; | |
| import com.android.settingslib.bluetooth.LocalBluetoothAdapter; | |
| import com.android.settingslib.bluetooth.LocalBluetoothManager; | |
| /** | |
| * RequestPermissionHelperActivity asks the user whether to enable discovery. | |
| * This is usually started by RequestPermissionActivity. | |
| */ | |
| public class RequestPermissionHelperActivity extends AlertActivity implements | |
| DialogInterface.OnClickListener { | |
| private static final String TAG = "RequestPermissionHelperActivity"; | |
| public static final String ACTION_INTERNAL_REQUEST_BT_ON = | |
| "com.android.settings.bluetooth.ACTION_INTERNAL_REQUEST_BT_ON"; | |
| public static final String ACTION_INTERNAL_REQUEST_BT_ON_AND_DISCOVERABLE = | |
| "com.android.settings.bluetooth.ACTION_INTERNAL_REQUEST_BT_ON_AND_DISCOVERABLE"; | |
| private LocalBluetoothAdapter mLocalAdapter; | |
| private int mTimeout; | |
| // True if requesting BT to be turned on | |
| // False if requesting BT to be turned on + discoverable mode | |
| private boolean mEnableOnly; | |
| @Override | |
| protected void onCreate(Bundle savedInstanceState) { | |
| super.onCreate(savedInstanceState); | |
| // Note: initializes mLocalAdapter and returns true on error | |
| if (parseIntent()) { | |
| finish(); | |
| return; | |
| } | |
| createDialog(); | |
| if (getResources().getBoolean(R.bool.auto_confirm_bluetooth_activation_dialog) == true) { | |
| // dismiss dialog immediately if settings say so | |
| onClick(null, BUTTON_POSITIVE); | |
| dismiss(); | |
| } | |
| } | |
| void createDialog() { | |
| final AlertController.AlertParams p = mAlertParams; | |
| if (mEnableOnly) { | |
| p.mMessage = getString(R.string.bluetooth_ask_enablement); | |
| } else { | |
| if (mTimeout == BluetoothDiscoverableEnabler.DISCOVERABLE_TIMEOUT_NEVER) { | |
| p.mMessage = getString(R.string.bluetooth_ask_enablement_and_lasting_discovery); | |
| } else { | |
| p.mMessage = getString(R.string.bluetooth_ask_enablement_and_discovery, mTimeout); | |
| } | |
| } | |
| p.mPositiveButtonText = getString(R.string.allow); | |
| p.mPositiveButtonListener = this; | |
| p.mNegativeButtonText = getString(R.string.deny); | |
| p.mNegativeButtonListener = this; | |
| setupAlert(); | |
| } | |
| public void onClick(DialogInterface dialog, int which) { | |
| int returnCode; | |
| // FIXME: fix this ugly switch logic! | |
| switch (which) { | |
| case BUTTON_POSITIVE: | |
| int btState = 0; | |
| try { | |
| // TODO There's a better way. | |
| int retryCount = 30; | |
| do { | |
| btState = mLocalAdapter.getBluetoothState(); | |
| Thread.sleep(100); | |
| } while (btState == BluetoothAdapter.STATE_TURNING_OFF && --retryCount > 0); | |
| } catch (InterruptedException ignored) { | |
| // don't care | |
| } | |
| if (btState == BluetoothAdapter.STATE_TURNING_ON | |
| || btState == BluetoothAdapter.STATE_ON | |
| || mLocalAdapter.enable()) { | |
| returnCode = RequestPermissionActivity.RESULT_BT_STARTING_OR_STARTED; | |
| } else { | |
| returnCode = RESULT_CANCELED; | |
| } | |
| break; | |
| case BUTTON_NEGATIVE: | |
| returnCode = RESULT_CANCELED; | |
| break; | |
| default: | |
| return; | |
| } | |
| setResult(returnCode); | |
| } | |
| /** | |
| * Parse the received Intent and initialize mLocalBluetoothAdapter. | |
| * @return true if an error occurred; false otherwise | |
| */ | |
| private boolean parseIntent() { | |
| Intent intent = getIntent(); | |
| if (intent != null && intent.getAction().equals(ACTION_INTERNAL_REQUEST_BT_ON)) { | |
| mEnableOnly = true; | |
| } else if (intent != null | |
| && intent.getAction().equals(ACTION_INTERNAL_REQUEST_BT_ON_AND_DISCOVERABLE)) { | |
| mEnableOnly = false; | |
| // Value used for display purposes. Not range checking. | |
| mTimeout = intent.getIntExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, | |
| BluetoothDiscoverableEnabler.DEFAULT_DISCOVERABLE_TIMEOUT); | |
| } else { | |
| setResult(RESULT_CANCELED); | |
| return true; | |
| } | |
| LocalBluetoothManager manager = Utils.getLocalBtManager(this); | |
| if (manager == null) { | |
| Log.e(TAG, "Error: there's a problem starting Bluetooth"); | |
| setResult(RESULT_CANCELED); | |
| return true; | |
| } | |
| mLocalAdapter = manager.getBluetoothAdapter(); | |
| return false; | |
| } | |
| @Override | |
| public void onBackPressed() { | |
| setResult(RESULT_CANCELED); | |
| super.onBackPressed(); | |
| } | |
| } |