109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly/* 209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * Copyright (c) 2008-2009, Motorola, Inc. 309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * 409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * All rights reserved. 509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * 609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * Redistribution and use in source and binary forms, with or without 709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * modification, are permitted provided that the following conditions are met: 809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * 909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * - Redistributions of source code must retain the above copyright notice, 1009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * this list of conditions and the following disclaimer. 1109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * 1209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * - Redistributions in binary form must reproduce the above copyright notice, 1309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * this list of conditions and the following disclaimer in the documentation 1409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * and/or other materials provided with the distribution. 1509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * 1609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * - Neither the name of the Motorola, Inc. nor the names of its contributors 1709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * may be used to endorse or promote products derived from this software 1809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * without specific prior written permission. 1909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * 2009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 2109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 2409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * POSSIBILITY OF SUCH DAMAGE. 3109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly */ 3209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 3309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellypackage com.android.bluetooth.opp; 3409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 356769b59d715ea98bd72eafcfea9acd2714a887daTao Liejunimport com.android.bluetooth.R; 36dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yueimport com.android.internal.app.AlertActivity; 37dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yueimport com.android.internal.app.AlertController; 386769b59d715ea98bd72eafcfea9acd2714a887daTao Liejun 39dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yueimport android.bluetooth.BluetoothAdapter; 40dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yueimport android.content.BroadcastReceiver; 41dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yueimport android.content.Context; 42dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yueimport android.content.Intent; 43dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yueimport android.content.IntentFilter; 4409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.os.Bundle; 45dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yueimport android.os.Handler; 46dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yueimport android.os.Message; 4709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.util.Log; 48dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yueimport android.view.KeyEvent; 4909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.view.View; 5009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.widget.TextView; 5109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 5209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly/** 53dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue * This class is designed to show BT enabling progress. 5409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly */ 5509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellypublic class BluetoothOppBtEnablingActivity extends AlertActivity { 5609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private static final String TAG = "BluetoothOppEnablingActivity"; 57dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue 58ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly private static final boolean D = Constants.DEBUG; 59dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue 60ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly private static final boolean V = Constants.VERBOSE; 61ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly 62dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue private static final int BT_ENABLING_TIMEOUT = 0; 63dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue 64dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue private static final int BT_ENABLING_TIMEOUT_VALUE = 20000; 6509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 666861c09108700815891920147247f2cf48261ee4Jaikumar Ganesh private boolean mRegistered = false; 676861c09108700815891920147247f2cf48261ee4Jaikumar Ganesh 6809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly @Override 6909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly protected void onCreate(Bundle savedInstanceState) { 7009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly super.onCreate(savedInstanceState); 7109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 726861c09108700815891920147247f2cf48261ee4Jaikumar Ganesh // If BT is already enabled jus return. 736861c09108700815891920147247f2cf48261ee4Jaikumar Ganesh BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 746861c09108700815891920147247f2cf48261ee4Jaikumar Ganesh if (adapter.isEnabled()) { 756861c09108700815891920147247f2cf48261ee4Jaikumar Ganesh finish(); 766861c09108700815891920147247f2cf48261ee4Jaikumar Ganesh return; 776861c09108700815891920147247f2cf48261ee4Jaikumar Ganesh } 786861c09108700815891920147247f2cf48261ee4Jaikumar Ganesh 79dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); 80dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue registerReceiver(mBluetoothReceiver, filter); 816861c09108700815891920147247f2cf48261ee4Jaikumar Ganesh mRegistered = true; 82dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue 8309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly // Set up the "dialog" 8409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly final AlertController.AlertParams p = mAlertParams; 8509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly p.mTitle = getString(R.string.enabling_progress_title); 8609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly p.mView = createView(); 8709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly setupAlert(); 88dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue 89dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue // Add timeout for enabling progress 90dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue mTimeoutHandler.sendMessageDelayed(mTimeoutHandler.obtainMessage(BT_ENABLING_TIMEOUT), 91dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue BT_ENABLING_TIMEOUT_VALUE); 9209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 9309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 9409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private View createView() { 9509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly View view = getLayoutInflater().inflate(R.layout.bt_enabling_progress, null); 9609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly TextView contentView = (TextView)view.findViewById(R.id.progress_info); 9709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly contentView.setText(getString(R.string.enabling_progress_content)); 9809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 9909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly return view; 10009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 10109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 102dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue @Override 103dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue public boolean onKeyDown(int keyCode, KeyEvent event) { 104dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue if (keyCode == KeyEvent.KEYCODE_BACK) { 105dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue if (D) Log.d(TAG, "onKeyDown() called; Key: back key"); 106dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue mTimeoutHandler.removeMessages(BT_ENABLING_TIMEOUT); 107dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue cancelSendingProgress(); 108dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue } 109dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue return true; 110dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue } 11109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 11209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly @Override 113dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue protected void onDestroy() { 114dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue super.onDestroy(); 1156861c09108700815891920147247f2cf48261ee4Jaikumar Ganesh if (mRegistered) { 1166861c09108700815891920147247f2cf48261ee4Jaikumar Ganesh unregisterReceiver(mBluetoothReceiver); 1176861c09108700815891920147247f2cf48261ee4Jaikumar Ganesh } 118dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue } 11909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 120dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue private final Handler mTimeoutHandler = new Handler() { 121dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue @Override 122dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue public void handleMessage(Message msg) { 123dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue switch (msg.what) { 124dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue case BT_ENABLING_TIMEOUT: 125dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue if (V) Log.v(TAG, "Received BT_ENABLING_TIMEOUT msg."); 126dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue cancelSendingProgress(); 127dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue break; 128dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue default: 129dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue break; 130dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue } 131dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue } 132dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue }; 13309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 134dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue private final BroadcastReceiver mBluetoothReceiver = new BroadcastReceiver() { 135dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue @Override 136dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue public void onReceive(Context context, Intent intent) { 137dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue String action = intent.getAction(); 138dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue if (V) Log.v(TAG, "Received intent: " + action) ; 139dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { 140dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue switch (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)) { 141dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue case BluetoothAdapter.STATE_ON: 142dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue mTimeoutHandler.removeMessages(BT_ENABLING_TIMEOUT); 143dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue finish(); 144dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue break; 145dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue default: 146dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue break; 147dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue } 148dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue } 149dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue } 150dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue }; 151dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue 152dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue private void cancelSendingProgress() { 153dc3bacd6eb626a93f2c3c4c62b3ef6aa9e575d92Lixin Yue BluetoothOppManager mOppManager = BluetoothOppManager.getInstance(this); 15409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (mOppManager.mSendingFlag) { 15509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly mOppManager.mSendingFlag = false; 15609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 15709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly finish(); 15809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 15909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly} 160