BluetoothOppIncomingFileConfirmActivity.java revision 9c031dab027f0e0e5400437fa4ce8be9491a34e7
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;
36
37import android.content.BroadcastReceiver;
38import android.content.ContentValues;
39import android.content.Context;
40import android.content.DialogInterface;
41import android.content.Intent;
42import android.content.IntentFilter;
43import android.net.Uri;
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;
51import android.widget.Toast;
52import android.text.format.Formatter;
53
54import com.android.internal.app.AlertActivity;
55import com.android.internal.app.AlertController;
56
57/**
58 * This class is designed to ask user to confirm if accept incoming file;
59 */
60public class BluetoothOppIncomingFileConfirmActivity extends AlertActivity implements
61        DialogInterface.OnClickListener {
62    private static final String TAG = "BluetoothIncomingFileConfirmActivity";
63    private static final boolean D = Constants.DEBUG;
64    private static final boolean V = Constants.VERBOSE;
65
66    private static final int DISMISS_TIMEOUT_DIALOG = 0;
67
68    private static final int DISMISS_TIMEOUT_DIALOG_VALUE = 2000;
69
70    private static final String PREFERENCE_USER_TIMEOUT = "user_timeout";
71
72    private BluetoothOppTransferInfo mTransInfo;
73
74    private Uri mUri;
75
76    private ContentValues mUpdateValues;
77
78    private boolean mTimeout = false;
79
80    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
81        @Override
82        public void onReceive(Context context, Intent intent) {
83            if (!BluetoothShare.USER_CONFIRMATION_TIMEOUT_ACTION.equals(intent.getAction())) {
84                return;
85            }
86            onTimeout();
87        }
88    };
89
90    @Override
91    protected void onCreate(Bundle savedInstanceState) {
92        setTheme(R.style.Theme_Material_Settings_Floating);
93        if (V) Log.d(TAG, "onCreate(): action = " + getIntent().getAction());
94        super.onCreate(savedInstanceState);
95
96        Intent intent = getIntent();
97        mUri = intent.getData();
98        mTransInfo = new BluetoothOppTransferInfo();
99        mTransInfo = BluetoothOppUtility.queryRecord(this, mUri);
100        if (mTransInfo == null) {
101            if (V) Log.e(TAG, "Error: Can not get data from db");
102            finish();
103            return;
104        }
105
106        // Set up the "dialog"
107        final AlertController.AlertParams p = mAlertParams;
108        p.mTitle = getString(R.string.incoming_file_confirm_content);
109        p.mView = createView();
110        p.mPositiveButtonText = getString(R.string.incoming_file_confirm_ok);
111        p.mPositiveButtonListener = this;
112        p.mNegativeButtonText = getString(R.string.incoming_file_confirm_cancel);
113        p.mNegativeButtonListener = this;
114        setupAlert();
115        if (V) Log.v(TAG, "mTimeout: " + mTimeout);
116        if (mTimeout) {
117            onTimeout();
118        }
119
120        if (V) Log.v(TAG, "BluetoothIncomingFileConfirmActivity: Got uri:" + mUri);
121
122        registerReceiver(mReceiver, new IntentFilter(
123                BluetoothShare.USER_CONFIRMATION_TIMEOUT_ACTION));
124    }
125
126    private View createView() {
127        View view = getLayoutInflater().inflate(R.layout.incoming_dialog, null);
128
129        ((TextView)view.findViewById(R.id.from_content)).setText(mTransInfo.mDeviceName);
130        ((TextView)view.findViewById(R.id.filename_content)).setText(mTransInfo.mFileName);
131        ((TextView)view.findViewById(R.id.size_content)).setText(
132                Formatter.formatFileSize(this, mTransInfo.mTotalBytes));
133
134        return view;
135    }
136
137    public void onClick(DialogInterface dialog, int which) {
138        switch (which) {
139            case DialogInterface.BUTTON_POSITIVE:
140                if (!mTimeout) {
141                    // Update database
142                    mUpdateValues = new ContentValues();
143                    mUpdateValues.put(BluetoothShare.USER_CONFIRMATION,
144                            BluetoothShare.USER_CONFIRMATION_CONFIRMED);
145                    this.getContentResolver().update(mUri, mUpdateValues, null, null);
146
147                    Toast.makeText(this, getString(R.string.bt_toast_1), Toast.LENGTH_SHORT).show();
148                }
149                break;
150
151            case DialogInterface.BUTTON_NEGATIVE:
152                // Update database
153                mUpdateValues = new ContentValues();
154                mUpdateValues.put(BluetoothShare.USER_CONFIRMATION,
155                        BluetoothShare.USER_CONFIRMATION_DENIED);
156                this.getContentResolver().update(mUri, mUpdateValues, null, null);
157                break;
158        }
159    }
160
161    @Override
162    public boolean onKeyDown(int keyCode, KeyEvent event) {
163        if (keyCode == KeyEvent.KEYCODE_BACK) {
164            if (D) Log.d(TAG, "onKeyDown() called; Key: back key");
165            mUpdateValues = new ContentValues();
166            mUpdateValues.put(BluetoothShare.VISIBILITY, BluetoothShare.VISIBILITY_HIDDEN);
167            this.getContentResolver().update(mUri, mUpdateValues, null, null);
168
169            Toast.makeText(this, getString(R.string.bt_toast_2), Toast.LENGTH_SHORT).show();
170            finish();
171            return true;
172        }
173        return false;
174    }
175
176    @Override
177    protected void onDestroy() {
178        super.onDestroy();
179        unregisterReceiver(mReceiver);
180    }
181
182    @Override
183    protected void onRestoreInstanceState(Bundle savedInstanceState) {
184        super.onRestoreInstanceState(savedInstanceState);
185        mTimeout = savedInstanceState.getBoolean(PREFERENCE_USER_TIMEOUT);
186        if (V) Log.v(TAG, "onRestoreInstanceState() mTimeout: " + mTimeout);
187        if (mTimeout) {
188            onTimeout();
189        }
190    }
191
192    @Override
193    protected void onSaveInstanceState(Bundle outState) {
194        super.onSaveInstanceState(outState);
195        if (V) Log.v(TAG, "onSaveInstanceState() mTimeout: " + mTimeout);
196        outState.putBoolean(PREFERENCE_USER_TIMEOUT, mTimeout);
197    }
198
199    private void onTimeout() {
200        mTimeout = true;
201        mAlert.setTitle(getString(R.string.incoming_file_confirm_timeout_content,
202                mTransInfo.mDeviceName));
203        mAlert.getButton(DialogInterface.BUTTON_NEGATIVE).setVisibility(View.GONE);
204        mAlert.getButton(DialogInterface.BUTTON_POSITIVE).setText(
205                getString(R.string.incoming_file_confirm_timeout_ok));
206
207        mTimeoutHandler.sendMessageDelayed(mTimeoutHandler.obtainMessage(DISMISS_TIMEOUT_DIALOG),
208                DISMISS_TIMEOUT_DIALOG_VALUE);
209    }
210
211    private final Handler mTimeoutHandler = new Handler() {
212        @Override
213        public void handleMessage(Message msg) {
214            switch (msg.what) {
215                case DISMISS_TIMEOUT_DIALOG:
216                    if (V) Log.v(TAG, "Received DISMISS_TIMEOUT_DIALOG msg.");
217                    finish();
218                    break;
219                default:
220                    break;
221            }
222        }
223    };
224}
225