1/*
2 * Copyright (c) 2008-2009, Motorola, Inc.
3 *
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 *
9 * - Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 *
12 * - Redistributions in binary form must reproduce the above copyright notice,
13 * this list of conditions and the following disclaimer in the documentation
14 * and/or other materials provided with the distribution.
15 *
16 * - Neither the name of the Motorola, Inc. nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32
33package com.android.bluetooth.opp;
34
35import com.android.bluetooth.R;
36import com.android.internal.app.AlertActivity;
37import com.android.internal.app.AlertController;
38
39import android.bluetooth.BluetoothAdapter;
40import android.content.BroadcastReceiver;
41import android.content.Context;
42import android.content.Intent;
43import android.content.IntentFilter;
44import android.os.Bundle;
45import android.os.Handler;
46import android.os.Message;
47import android.util.Log;
48import android.view.KeyEvent;
49import android.view.View;
50import android.widget.TextView;
51
52/**
53 * This class is designed to show BT enabling progress.
54 */
55public class BluetoothOppBtEnablingActivity extends AlertActivity {
56    private static final String TAG = "BluetoothOppEnablingActivity";
57
58    private static final boolean D = Constants.DEBUG;
59
60    private static final boolean V = Constants.VERBOSE;
61
62    private static final int BT_ENABLING_TIMEOUT = 0;
63
64    private static final int BT_ENABLING_TIMEOUT_VALUE = 20000;
65
66    private boolean mRegistered = false;
67
68    @Override
69    protected void onCreate(Bundle savedInstanceState) {
70        super.onCreate(savedInstanceState);
71
72        // If BT is already enabled jus return.
73        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
74        if (adapter.isEnabled()) {
75            finish();
76            return;
77        }
78
79        IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
80        registerReceiver(mBluetoothReceiver, filter);
81        mRegistered = true;
82
83        // Set up the "dialog"
84        final AlertController.AlertParams p = mAlertParams;
85        p.mTitle = getString(R.string.enabling_progress_title);
86        p.mView = createView();
87        setupAlert();
88
89        // Add timeout for enabling progress
90        mTimeoutHandler.sendMessageDelayed(mTimeoutHandler.obtainMessage(BT_ENABLING_TIMEOUT),
91                BT_ENABLING_TIMEOUT_VALUE);
92    }
93
94    private View createView() {
95        View view = getLayoutInflater().inflate(R.layout.bt_enabling_progress, null);
96        TextView contentView = (TextView)view.findViewById(R.id.progress_info);
97        contentView.setText(getString(R.string.enabling_progress_content));
98
99        return view;
100    }
101
102    @Override
103    public boolean onKeyDown(int keyCode, KeyEvent event) {
104        if (keyCode == KeyEvent.KEYCODE_BACK) {
105            if (D) Log.d(TAG, "onKeyDown() called; Key: back key");
106            mTimeoutHandler.removeMessages(BT_ENABLING_TIMEOUT);
107            cancelSendingProgress();
108        }
109        return true;
110    }
111
112    @Override
113    protected void onDestroy() {
114        super.onDestroy();
115        if (mRegistered) {
116            unregisterReceiver(mBluetoothReceiver);
117        }
118    }
119
120    private final Handler mTimeoutHandler = new Handler() {
121        @Override
122        public void handleMessage(Message msg) {
123            switch (msg.what) {
124                case BT_ENABLING_TIMEOUT:
125                    if (V) Log.v(TAG, "Received BT_ENABLING_TIMEOUT msg.");
126                    cancelSendingProgress();
127                    break;
128                default:
129                    break;
130            }
131        }
132    };
133
134    private final BroadcastReceiver mBluetoothReceiver = new BroadcastReceiver() {
135        @Override
136        public void onReceive(Context context, Intent intent) {
137            String action = intent.getAction();
138            if (V) Log.v(TAG, "Received intent: " + action) ;
139            if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
140                switch (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)) {
141                    case BluetoothAdapter.STATE_ON:
142                        mTimeoutHandler.removeMessages(BT_ENABLING_TIMEOUT);
143                        finish();
144                        break;
145                    default:
146                        break;
147                }
148            }
149        }
150    };
151
152    private void cancelSendingProgress() {
153        BluetoothOppManager mOppManager = BluetoothOppManager.getInstance(this);
154        if (mOppManager.mSendingFlag) {
155            mOppManager.mSendingFlag = false;
156        }
157        finish();
158    }
159}
160