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) {
94addfd25b639047e8463772b14f249758bdb20fbcPauloftheWest        setTheme(R.style.Theme_Material_Settings_Floating);
9574ae04c73312403e89db0f8e9bd9601d403b4783fredc        if (V) Log.d(TAG, "onCreate(): action = " + getIntent().getAction());
9609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        super.onCreate(savedInstanceState);
9709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
9809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        Intent intent = getIntent();
9909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        mUri = intent.getData();
10009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        mTransInfo = new BluetoothOppTransferInfo();
10109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        mTransInfo = BluetoothOppUtility.queryRecord(this, mUri);
10209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        if (mTransInfo == null) {
103ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly            if (V) Log.e(TAG, "Error: Can not get data from db");
10409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            finish();
10509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            return;
10609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
10709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
10809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        // Set up the "dialog"
10909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        final AlertController.AlertParams p = mAlertParams;
110addfd25b639047e8463772b14f249758bdb20fbcPauloftheWest        p.mTitle = getString(R.string.incoming_file_confirm_content);
11109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        p.mView = createView();
11209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        p.mPositiveButtonText = getString(R.string.incoming_file_confirm_ok);
11309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        p.mPositiveButtonListener = this;
11409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        p.mNegativeButtonText = getString(R.string.incoming_file_confirm_cancel);
11509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        p.mNegativeButtonListener = this;
11609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        setupAlert();
117b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        if (V) Log.v(TAG, "mTimeout: " + mTimeout);
118b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        if (mTimeout) {
119b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            onTimeout();
120b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        }
12109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
122ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly        if (V) Log.v(TAG, "BluetoothIncomingFileConfirmActivity: Got uri:" + mUri);
123b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
124b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        registerReceiver(mReceiver, new IntentFilter(
125b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                BluetoothShare.USER_CONFIRMATION_TIMEOUT_ACTION));
12609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
12709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
12809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    private View createView() {
129addfd25b639047e8463772b14f249758bdb20fbcPauloftheWest        View view = getLayoutInflater().inflate(R.layout.incoming_dialog, null);
13009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
131addfd25b639047e8463772b14f249758bdb20fbcPauloftheWest        ((TextView)view.findViewById(R.id.from_content)).setText(mTransInfo.mDeviceName);
132addfd25b639047e8463772b14f249758bdb20fbcPauloftheWest        ((TextView)view.findViewById(R.id.filename_content)).setText(mTransInfo.mFileName);
133addfd25b639047e8463772b14f249758bdb20fbcPauloftheWest        ((TextView)view.findViewById(R.id.size_content)).setText(
134addfd25b639047e8463772b14f249758bdb20fbcPauloftheWest                Formatter.formatFileSize(this, mTransInfo.mTotalBytes));
13509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
13609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        return view;
13709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
13809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
13909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    public void onClick(DialogInterface dialog, int which) {
14009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        switch (which) {
14109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            case DialogInterface.BUTTON_POSITIVE:
142b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                if (!mTimeout) {
143b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                    // Update database
144b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                    mUpdateValues = new ContentValues();
145b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                    mUpdateValues.put(BluetoothShare.USER_CONFIRMATION,
146b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                            BluetoothShare.USER_CONFIRMATION_CONFIRMED);
147b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                    this.getContentResolver().update(mUri, mUpdateValues, null, null);
148b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
149b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                    Toast.makeText(this, getString(R.string.bt_toast_1), Toast.LENGTH_SHORT).show();
150b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                }
15109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                break;
15209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
15309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            case DialogInterface.BUTTON_NEGATIVE:
15409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                // Update database
15509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                mUpdateValues = new ContentValues();
15609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                mUpdateValues.put(BluetoothShare.USER_CONFIRMATION,
15709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                        BluetoothShare.USER_CONFIRMATION_DENIED);
15809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                this.getContentResolver().update(mUri, mUpdateValues, null, null);
15909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                break;
16009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
161b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    }
162b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
163b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    @Override
164b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    public boolean onKeyDown(int keyCode, KeyEvent event) {
165b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        if (keyCode == KeyEvent.KEYCODE_BACK) {
166b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            if (D) Log.d(TAG, "onKeyDown() called; Key: back key");
167b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            mUpdateValues = new ContentValues();
168b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            mUpdateValues.put(BluetoothShare.VISIBILITY, BluetoothShare.VISIBILITY_HIDDEN);
169b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            this.getContentResolver().update(mUri, mUpdateValues, null, null);
170b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
171b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            Toast.makeText(this, getString(R.string.bt_toast_2), Toast.LENGTH_SHORT).show();
172b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            finish();
173453050fdaf7dcd488f399d3549ce257e7b9e7e79Wojciech Jowsa            return true;
174b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        }
175453050fdaf7dcd488f399d3549ce257e7b9e7e79Wojciech Jowsa        return false;
17609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
17709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
17809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    @Override
17909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    protected void onDestroy() {
18009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        super.onDestroy();
181b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        unregisterReceiver(mReceiver);
182b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    }
183b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
184b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    @Override
185b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    protected void onRestoreInstanceState(Bundle savedInstanceState) {
186b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        super.onRestoreInstanceState(savedInstanceState);
187b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        mTimeout = savedInstanceState.getBoolean(PREFERENCE_USER_TIMEOUT);
188b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        if (V) Log.v(TAG, "onRestoreInstanceState() mTimeout: " + mTimeout);
189b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        if (mTimeout) {
190b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            onTimeout();
19109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
19209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
193b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
194b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    @Override
195b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    protected void onSaveInstanceState(Bundle outState) {
196b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        super.onSaveInstanceState(outState);
197b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        if (V) Log.v(TAG, "onSaveInstanceState() mTimeout: " + mTimeout);
198b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        outState.putBoolean(PREFERENCE_USER_TIMEOUT, mTimeout);
199b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    }
200b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
201b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    private void onTimeout() {
202b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        mTimeout = true;
203b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        mContentView.setText(getString(R.string.incoming_file_confirm_timeout_content,
204b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                mTransInfo.mDeviceName));
205b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        mAlert.getButton(DialogInterface.BUTTON_NEGATIVE).setVisibility(View.GONE);
206b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        mAlert.getButton(DialogInterface.BUTTON_POSITIVE).setText(
207b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                getString(R.string.incoming_file_confirm_timeout_ok));
208b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
209b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        mTimeoutHandler.sendMessageDelayed(mTimeoutHandler.obtainMessage(DISMISS_TIMEOUT_DIALOG),
210b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                DISMISS_TIMEOUT_DIALOG_VALUE);
211b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    }
212b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue
213b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    private final Handler mTimeoutHandler = new Handler() {
214b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        @Override
215b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        public void handleMessage(Message msg) {
216b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            switch (msg.what) {
217b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                case DISMISS_TIMEOUT_DIALOG:
218b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                    if (V) Log.v(TAG, "Received DISMISS_TIMEOUT_DIALOG msg.");
219b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                    finish();
220b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                    break;
221b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                default:
222b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue                    break;
223b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue            }
224b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue        }
225b0fa09caef6a0748a568dc2a89f5d94b85423bb2Lixin Yue    };
22609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly}
227