| /* |
| * Copyright (c) 2008-2009, Motorola, Inc. |
| * |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * - Redistributions of source code must retain the above copyright notice, |
| * this list of conditions and the following disclaimer. |
| * |
| * - Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * |
| * - Neither the name of the Motorola, Inc. nor the names of its contributors |
| * may be used to endorse or promote products derived from this software |
| * without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
| * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| * POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| package com.android.bluetooth.opp; |
| |
| import com.android.bluetooth.R; |
| |
| import android.content.BroadcastReceiver; |
| import android.content.ContentValues; |
| import android.content.Context; |
| import android.content.DialogInterface; |
| import android.content.Intent; |
| import android.content.IntentFilter; |
| import android.net.Uri; |
| import android.os.Bundle; |
| import android.os.Handler; |
| import android.os.Message; |
| import android.util.Log; |
| import android.view.KeyEvent; |
| import android.view.View; |
| import android.widget.TextView; |
| import android.widget.Toast; |
| import android.text.format.Formatter; |
| |
| import com.android.internal.app.AlertActivity; |
| import com.android.internal.app.AlertController; |
| |
| /** |
| * This class is designed to ask user to confirm if accept incoming file; |
| */ |
| public class BluetoothOppIncomingFileConfirmActivity extends AlertActivity implements |
| DialogInterface.OnClickListener { |
| private static final String TAG = "BluetoothIncomingFileConfirmActivity"; |
| private static final boolean D = Constants.DEBUG; |
| private static final boolean V = Constants.VERBOSE; |
| |
| private static final int DISMISS_TIMEOUT_DIALOG = 0; |
| |
| private static final int DISMISS_TIMEOUT_DIALOG_VALUE = 2000; |
| |
| private static final String PREFERENCE_USER_TIMEOUT = "user_timeout"; |
| |
| private BluetoothOppTransferInfo mTransInfo; |
| |
| private Uri mUri; |
| |
| private ContentValues mUpdateValues; |
| |
| private TextView mContentView; |
| |
| private boolean mTimeout = false; |
| |
| private BroadcastReceiver mReceiver = new BroadcastReceiver() { |
| @Override |
| public void onReceive(Context context, Intent intent) { |
| if (!BluetoothShare.USER_CONFIRMATION_TIMEOUT_ACTION.equals(intent.getAction())) { |
| return; |
| } |
| onTimeout(); |
| } |
| }; |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| |
| Intent intent = getIntent(); |
| mUri = intent.getData(); |
| mTransInfo = new BluetoothOppTransferInfo(); |
| mTransInfo = BluetoothOppUtility.queryRecord(this, mUri); |
| if (mTransInfo == null) { |
| if (V) Log.e(TAG, "Error: Can not get data from db"); |
| finish(); |
| return; |
| } |
| |
| // Set up the "dialog" |
| final AlertController.AlertParams p = mAlertParams; |
| p.mIconId = android.R.drawable.ic_dialog_info; |
| p.mTitle = getString(R.string.incoming_file_confirm_title); |
| p.mView = createView(); |
| p.mPositiveButtonText = getString(R.string.incoming_file_confirm_ok); |
| p.mPositiveButtonListener = this; |
| p.mNegativeButtonText = getString(R.string.incoming_file_confirm_cancel); |
| p.mNegativeButtonListener = this; |
| setupAlert(); |
| if (V) Log.v(TAG, "mTimeout: " + mTimeout); |
| if (mTimeout) { |
| onTimeout(); |
| } |
| |
| if (V) Log.v(TAG, "BluetoothIncomingFileConfirmActivity: Got uri:" + mUri); |
| |
| registerReceiver(mReceiver, new IntentFilter( |
| BluetoothShare.USER_CONFIRMATION_TIMEOUT_ACTION)); |
| } |
| |
| private View createView() { |
| View view = getLayoutInflater().inflate(R.layout.confirm_dialog, null); |
| |
| mContentView = (TextView)view.findViewById(R.id.content); |
| |
| String text = getString(R.string.incoming_file_confirm_content, mTransInfo.mDeviceName, |
| mTransInfo.mFileName, Formatter.formatFileSize(this, mTransInfo.mTotalBytes)); |
| |
| mContentView.setText(text); |
| |
| return view; |
| } |
| |
| public void onClick(DialogInterface dialog, int which) { |
| switch (which) { |
| case DialogInterface.BUTTON_POSITIVE: |
| if (!mTimeout) { |
| // Update database |
| mUpdateValues = new ContentValues(); |
| mUpdateValues.put(BluetoothShare.USER_CONFIRMATION, |
| BluetoothShare.USER_CONFIRMATION_CONFIRMED); |
| this.getContentResolver().update(mUri, mUpdateValues, null, null); |
| |
| Toast.makeText(this, getString(R.string.bt_toast_1), Toast.LENGTH_SHORT).show(); |
| } |
| break; |
| |
| case DialogInterface.BUTTON_NEGATIVE: |
| // Update database |
| mUpdateValues = new ContentValues(); |
| mUpdateValues.put(BluetoothShare.USER_CONFIRMATION, |
| BluetoothShare.USER_CONFIRMATION_DENIED); |
| this.getContentResolver().update(mUri, mUpdateValues, null, null); |
| break; |
| } |
| } |
| |
| @Override |
| public boolean onKeyDown(int keyCode, KeyEvent event) { |
| if (keyCode == KeyEvent.KEYCODE_BACK) { |
| if (D) Log.d(TAG, "onKeyDown() called; Key: back key"); |
| mUpdateValues = new ContentValues(); |
| mUpdateValues.put(BluetoothShare.VISIBILITY, BluetoothShare.VISIBILITY_HIDDEN); |
| this.getContentResolver().update(mUri, mUpdateValues, null, null); |
| |
| Toast.makeText(this, getString(R.string.bt_toast_2), Toast.LENGTH_SHORT).show(); |
| finish(); |
| return true; |
| } |
| return false; |
| } |
| |
| @Override |
| protected void onDestroy() { |
| super.onDestroy(); |
| unregisterReceiver(mReceiver); |
| } |
| |
| @Override |
| protected void onRestoreInstanceState(Bundle savedInstanceState) { |
| super.onRestoreInstanceState(savedInstanceState); |
| mTimeout = savedInstanceState.getBoolean(PREFERENCE_USER_TIMEOUT); |
| if (V) Log.v(TAG, "onRestoreInstanceState() mTimeout: " + mTimeout); |
| if (mTimeout) { |
| onTimeout(); |
| } |
| } |
| |
| @Override |
| protected void onSaveInstanceState(Bundle outState) { |
| super.onSaveInstanceState(outState); |
| if (V) Log.v(TAG, "onSaveInstanceState() mTimeout: " + mTimeout); |
| outState.putBoolean(PREFERENCE_USER_TIMEOUT, mTimeout); |
| } |
| |
| private void onTimeout() { |
| mTimeout = true; |
| mContentView.setText(getString(R.string.incoming_file_confirm_timeout_content, |
| mTransInfo.mDeviceName)); |
| mAlert.getButton(DialogInterface.BUTTON_NEGATIVE).setVisibility(View.GONE); |
| mAlert.getButton(DialogInterface.BUTTON_POSITIVE).setText( |
| getString(R.string.incoming_file_confirm_timeout_ok)); |
| |
| mTimeoutHandler.sendMessageDelayed(mTimeoutHandler.obtainMessage(DISMISS_TIMEOUT_DIALOG), |
| DISMISS_TIMEOUT_DIALOG_VALUE); |
| } |
| |
| private final Handler mTimeoutHandler = new Handler() { |
| @Override |
| public void handleMessage(Message msg) { |
| switch (msg.what) { |
| case DISMISS_TIMEOUT_DIALOG: |
| if (V) Log.v(TAG, "Received DISMISS_TIMEOUT_DIALOG msg."); |
| finish(); |
| break; |
| default: |
| break; |
| } |
| } |
| }; |
| } |