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;
366769b59d715ea98bd72eafcfea9acd2714a887daTao Liejun
37b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yueimport android.content.BroadcastReceiver;
3809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.content.ContentValues;
39b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yueimport android.content.Context;
4009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.content.DialogInterface;
4109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.content.Intent;
42b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yueimport android.content.IntentFilter;
4309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.net.Uri;
4409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.os.Bundle;
45b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yueimport android.os.Handler;
46b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yueimport android.os.Message;
4709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.util.Log;
48b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yueimport android.view.KeyEvent;
4909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.view.View;
5009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.widget.TextView;
5109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.widget.Toast;
5209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.text.format.Formatter;
5309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
5409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport com.android.internal.app.AlertActivity;
5509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport com.android.internal.app.AlertController;
5609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
5709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly/**
5809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * This class is designed to ask user to confirm if accept incoming file;
5909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly */
6009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellypublic class BluetoothOppIncomingFileConfirmActivity extends AlertActivity implements
6109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        DialogInterface.OnClickListener {
6209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    private static final String TAG = "BluetoothIncomingFileConfirmActivity";
63ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly    private static final boolean D = Constants.DEBUG;
64ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly    private static final boolean V = Constants.VERBOSE;
6509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
66b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    private static final int DISMISS_TIMEOUT_DIALOG = 0;
67b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
68b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    private static final int DISMISS_TIMEOUT_DIALOG_VALUE = 2000;
69b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
70b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    private static final String PREFERENCE_USER_TIMEOUT = "user_timeout";
71b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
7209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    private BluetoothOppTransferInfo mTransInfo;
7309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
7409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    private Uri mUri;
7509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
7609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    private ContentValues mUpdateValues;
7709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
78b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    private TextView mContentView;
79b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
80b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    private boolean mTimeout = false;
81b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
82b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
83b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        @Override
84b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        public void onReceive(Context context, Intent intent) {
85b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            if (!BluetoothShare.USER_CONFIRMATION_TIMEOUT_ACTION.equals(intent.getAction())) {
86b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                return;
87b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            }
88b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            onTimeout();
89b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        }
90b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    };
9109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
9209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    @Override
9309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    protected void onCreate(Bundle savedInstanceState) {
9409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        super.onCreate(savedInstanceState);
9509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
9609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        Intent intent = getIntent();
9709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        mUri = intent.getData();
9809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        mTransInfo = new BluetoothOppTransferInfo();
9909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        mTransInfo = BluetoothOppUtility.queryRecord(this, mUri);
10009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        if (mTransInfo == null) {
101ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly            if (V) Log.e(TAG, "Error: Can not get data from db");
10209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            finish();
10309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            return;
10409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
10509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
10609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        // Set up the "dialog"
10709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        final AlertController.AlertParams p = mAlertParams;
108464d9d216ab1a6cf192e3e526596073c7e35e4a7L.X.YUE        p.mIconId = android.R.drawable.ic_dialog_info;
10909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        p.mTitle = getString(R.string.incoming_file_confirm_title);
11009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        p.mView = createView();
11109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        p.mPositiveButtonText = getString(R.string.incoming_file_confirm_ok);
11209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        p.mPositiveButtonListener = this;
11309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        p.mNegativeButtonText = getString(R.string.incoming_file_confirm_cancel);
11409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        p.mNegativeButtonListener = this;
11509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        setupAlert();
116b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        if (V) Log.v(TAG, "mTimeout: " + mTimeout);
117b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        if (mTimeout) {
118b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            onTimeout();
119b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        }
12009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
121ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly        if (V) Log.v(TAG, "BluetoothIncomingFileConfirmActivity: Got uri:" + mUri);
122b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
123b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        registerReceiver(mReceiver, new IntentFilter(
124b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                BluetoothShare.USER_CONFIRMATION_TIMEOUT_ACTION));
12509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
12609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
12709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    private View createView() {
12809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        View view = getLayoutInflater().inflate(R.layout.confirm_dialog, null);
12909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
130b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        mContentView = (TextView)view.findViewById(R.id.content);
13109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
132239bc526513429995c61c4148c105725c395b1a9Jackson Fan        String text = getString(R.string.incoming_file_confirm_content, mTransInfo.mDeviceName,
133239bc526513429995c61c4148c105725c395b1a9Jackson Fan                mTransInfo.mFileName, Formatter.formatFileSize(this, mTransInfo.mTotalBytes));
13409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
135b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        mContentView.setText(text);
13609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
13709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        return view;
13809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
13909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
14009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    public void onClick(DialogInterface dialog, int which) {
14109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        switch (which) {
14209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            case DialogInterface.BUTTON_POSITIVE:
143b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                if (!mTimeout) {
144b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                    // Update database
145b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                    mUpdateValues = new ContentValues();
146b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                    mUpdateValues.put(BluetoothShare.USER_CONFIRMATION,
147b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                            BluetoothShare.USER_CONFIRMATION_CONFIRMED);
148b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                    this.getContentResolver().update(mUri, mUpdateValues, null, null);
149b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
150b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                    Toast.makeText(this, getString(R.string.bt_toast_1), Toast.LENGTH_SHORT).show();
151b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                }
15209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                break;
15309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
15409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            case DialogInterface.BUTTON_NEGATIVE:
15509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                // Update database
15609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                mUpdateValues = new ContentValues();
15709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                mUpdateValues.put(BluetoothShare.USER_CONFIRMATION,
15809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                        BluetoothShare.USER_CONFIRMATION_DENIED);
15909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                this.getContentResolver().update(mUri, mUpdateValues, null, null);
16009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                break;
16109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
162b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    }
163b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
164b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    @Override
165b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    public boolean onKeyDown(int keyCode, KeyEvent event) {
166b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        if (keyCode == KeyEvent.KEYCODE_BACK) {
167b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            if (D) Log.d(TAG, "onKeyDown() called; Key: back key");
168b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            mUpdateValues = new ContentValues();
169b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            mUpdateValues.put(BluetoothShare.VISIBILITY, BluetoothShare.VISIBILITY_HIDDEN);
170b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            this.getContentResolver().update(mUri, mUpdateValues, null, null);
171b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
172b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            Toast.makeText(this, getString(R.string.bt_toast_2), Toast.LENGTH_SHORT).show();
173b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            finish();
174453050fdaf7dcd488f399d3549ce257e7b9e7e79Wojciech Jowsa            return true;
175b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        }
176453050fdaf7dcd488f399d3549ce257e7b9e7e79Wojciech Jowsa        return false;
17709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
17809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
17909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    @Override
18009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    protected void onDestroy() {
18109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        super.onDestroy();
182b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        unregisterReceiver(mReceiver);
183b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    }
184b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
185b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    @Override
186b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    protected void onRestoreInstanceState(Bundle savedInstanceState) {
187b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        super.onRestoreInstanceState(savedInstanceState);
188b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        mTimeout = savedInstanceState.getBoolean(PREFERENCE_USER_TIMEOUT);
189b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        if (V) Log.v(TAG, "onRestoreInstanceState() mTimeout: " + mTimeout);
190b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        if (mTimeout) {
191b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            onTimeout();
19209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
19309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
194b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
195b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    @Override
196b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    protected void onSaveInstanceState(Bundle outState) {
197b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        super.onSaveInstanceState(outState);
198b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        if (V) Log.v(TAG, "onSaveInstanceState() mTimeout: " + mTimeout);
199b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        outState.putBoolean(PREFERENCE_USER_TIMEOUT, mTimeout);
200b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    }
201b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
202b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    private void onTimeout() {
203b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        mTimeout = true;
204b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        mContentView.setText(getString(R.string.incoming_file_confirm_timeout_content,
205b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                mTransInfo.mDeviceName));
206b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        mAlert.getButton(DialogInterface.BUTTON_NEGATIVE).setVisibility(View.GONE);
207b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        mAlert.getButton(DialogInterface.BUTTON_POSITIVE).setText(
208b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                getString(R.string.incoming_file_confirm_timeout_ok));
209b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
210b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        mTimeoutHandler.sendMessageDelayed(mTimeoutHandler.obtainMessage(DISMISS_TIMEOUT_DIALOG),
211b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                DISMISS_TIMEOUT_DIALOG_VALUE);
212b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    }
213b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
214b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    private final Handler mTimeoutHandler = new Handler() {
215b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        @Override
216b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        public void handleMessage(Message msg) {
217b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            switch (msg.what) {
218b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                case DISMISS_TIMEOUT_DIALOG:
219b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                    if (V) Log.v(TAG, "Received DISMISS_TIMEOUT_DIALOG msg.");
220b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                    finish();
221b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                    break;
222b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                default:
223b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                    break;
224b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            }
225b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        }
226b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    };
22709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly}
228