Fixed potention ANR issue with Bluetooth OPP share.
Updated BluetoothOppLauncherActivity so the call to
BluetoothOppManager.saveSendingFileInfo() runs on a child thread.
saveSendingFileInfo() opens/constructs the content stream, which
can take a long time, depending on the type of content.
It should not run inside the main UI thread of the
BluetoothOppLauncherActivity.
Bug 6802063
Change-Id: Id34b33fe37eb029d6a7592a811bbc9bbcde14ba8
diff --git a/src/com/android/bluetooth/opp/BluetoothOppLauncherActivity.java b/src/com/android/bluetooth/opp/BluetoothOppLauncherActivity.java
index f9e96f5..bbe7899 100644
--- a/src/com/android/bluetooth/opp/BluetoothOppLauncherActivity.java
+++ b/src/com/android/bluetooth/opp/BluetoothOppLauncherActivity.java
@@ -69,6 +69,17 @@
String action = intent.getAction();
if (action.equals(Intent.ACTION_SEND) || action.equals(Intent.ACTION_SEND_MULTIPLE)) {
+ //Check if Bluetooth is available in the beginning instead of at the end
+ if (!isBluetoothAllowed()) {
+ Intent in = new Intent(this, BluetoothOppBtErrorActivity.class);
+ in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ in.putExtra("title", this.getString(R.string.airplane_error_title));
+ in.putExtra("content", this.getString(R.string.airplane_error_msg));
+ startActivity(in);
+ finish();
+ return;
+ }
+
/*
* Other application is trying to share a file via Bluetooth,
* probably Pictures, videos, or vCards. The Intent should contain
@@ -76,8 +87,8 @@
*/
if (action.equals(Intent.ACTION_SEND)) {
// TODO: handle type == null case
- String type = intent.getType();
- Uri stream = (Uri)intent.getParcelableExtra(Intent.EXTRA_STREAM);
+ final String type = intent.getType();
+ final Uri stream = (Uri)intent.getParcelableExtra(Intent.EXTRA_STREAM);
CharSequence extra_text = intent.getCharSequenceExtra(Intent.EXTRA_TEXT);
// If we get ACTION_SEND intent with EXTRA_STREAM, we'll use the
// uri data;
@@ -89,16 +100,38 @@
+ type);
// Save type/stream, will be used when adding transfer
// session to DB.
- BluetoothOppManager.getInstance(this).saveSendingFileInfo(type,
- stream.toString(), false);
+ Thread t = new Thread(new Runnable() {
+ public void run() {
+ BluetoothOppManager.getInstance(BluetoothOppLauncherActivity.this)
+ .saveSendingFileInfo(type,stream.toString(), false);
+ //Done getting file info..Launch device picker and finish this activity
+ launchDevicePicker();
+ finish();
+ }
+ });
+ t.start();
+ return;
} else if (extra_text != null && type != null) {
if (V) Log.v(TAG, "Get ACTION_SEND intent with Extra_text = "
+ extra_text.toString() + "; mimetype = " + type);
- Uri fileUri = creatFileForSharedContent(this, extra_text);
-
+ final Uri fileUri = creatFileForSharedContent(this, extra_text);
if (fileUri != null) {
- BluetoothOppManager.getInstance(this).saveSendingFileInfo(type,
- fileUri.toString(), false);
+ Thread t = new Thread(new Runnable() {
+ public void run() {
+ BluetoothOppManager.getInstance(BluetoothOppLauncherActivity.this)
+ .saveSendingFileInfo(type,fileUri.toString(), false);
+ //Done getting file info..Launch device picker
+ //and finish this activity
+ launchDevicePicker();
+ finish();
+ }
+ });
+ t.start();
+ return;
+ } else {
+ Log.w(TAG,"Error trying to do set text...File not created!");
+ finish();
+ return;
}
} else {
Log.e(TAG, "type is null; or sending file URI is null");
@@ -106,54 +139,29 @@
return;
}
} else if (action.equals(Intent.ACTION_SEND_MULTIPLE)) {
- ArrayList<Uri> uris = new ArrayList<Uri>();
- String mimeType = intent.getType();
- uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
+ final String mimeType = intent.getType();
+ final ArrayList<Uri> uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
if (mimeType != null && uris != null) {
if (V) Log.v(TAG, "Get ACTION_SHARE_MULTIPLE intent: uris " + uris + "\n Type= "
+ mimeType);
- BluetoothOppManager.getInstance(this).saveSendingFileInfo(mimeType,
- uris, false);
+ Thread t = new Thread(new Runnable() {
+ public void run() {
+ BluetoothOppManager.getInstance(BluetoothOppLauncherActivity.this)
+ .saveSendingFileInfo(mimeType,uris, false);
+ //Done getting file info..Launch device picker
+ //and finish this activity
+ launchDevicePicker();
+ finish();
+ }
+ });
+ t.start();
+ return;
} else {
Log.e(TAG, "type is null; or sending files URIs are null");
finish();
return;
}
}
-
- if (!isBluetoothAllowed()) {
- Intent in = new Intent(this, BluetoothOppBtErrorActivity.class);
- in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- in.putExtra("title", this.getString(R.string.airplane_error_title));
- in.putExtra("content", this.getString(R.string.airplane_error_msg));
- this.startActivity(in);
-
- finish();
- return;
- }
-
- // TODO: In the future, we may send intent to DevicePickerActivity
- // directly,
- // and let DevicePickerActivity to handle Bluetooth Enable.
- if (!BluetoothOppManager.getInstance(this).isEnabled()) {
- if (V) Log.v(TAG, "Prepare Enable BT!! ");
- Intent in = new Intent(this, BluetoothOppBtEnableActivity.class);
- in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- this.startActivity(in);
- } else {
- if (V) Log.v(TAG, "BT already enabled!! ");
- Intent in1 = new Intent(BluetoothDevicePicker.ACTION_LAUNCH);
- in1.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
- in1.putExtra(BluetoothDevicePicker.EXTRA_NEED_AUTH, false);
- in1.putExtra(BluetoothDevicePicker.EXTRA_FILTER_TYPE,
- BluetoothDevicePicker.FILTER_TYPE_TRANSFER);
- in1.putExtra(BluetoothDevicePicker.EXTRA_LAUNCH_PACKAGE,
- Constants.THIS_PACKAGE_NAME);
- in1.putExtra(BluetoothDevicePicker.EXTRA_LAUNCH_CLASS,
- BluetoothOppReceiver.class.getName());
- if (V) {Log.d(TAG,"Launching " +BluetoothDevicePicker.ACTION_LAUNCH );}
- this.startActivity(in1);
- }
} else if (action.equals(Constants.ACTION_OPEN)) {
Uri uri = getIntent().getData();
if (V) Log.v(TAG, "Get ACTION_OPEN intent: Uri = " + uri);
@@ -163,10 +171,41 @@
intent1.setClassName(Constants.THIS_PACKAGE_NAME, BluetoothOppReceiver.class.getName());
intent1.setData(uri);
this.sendBroadcast(intent1);
+ finish();
+ } else {
+ Log.w(TAG, "Unsupported action: " + action);
+ finish();
}
- finish();
}
+ /**
+ * Turns on Bluetooth if not already on, or launches device picker if Bluetooth is on
+ * @return
+ */
+ private final void launchDevicePicker() {
+ // TODO: In the future, we may send intent to DevicePickerActivity
+ // directly,
+ // and let DevicePickerActivity to handle Bluetooth Enable.
+ if (!BluetoothOppManager.getInstance(this).isEnabled()) {
+ if (V) Log.v(TAG, "Prepare Enable BT!! ");
+ Intent in = new Intent(this, BluetoothOppBtEnableActivity.class);
+ in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(in);
+ } else {
+ if (V) Log.v(TAG, "BT already enabled!! ");
+ Intent in1 = new Intent(BluetoothDevicePicker.ACTION_LAUNCH);
+ in1.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+ in1.putExtra(BluetoothDevicePicker.EXTRA_NEED_AUTH, false);
+ in1.putExtra(BluetoothDevicePicker.EXTRA_FILTER_TYPE,
+ BluetoothDevicePicker.FILTER_TYPE_TRANSFER);
+ in1.putExtra(BluetoothDevicePicker.EXTRA_LAUNCH_PACKAGE,
+ Constants.THIS_PACKAGE_NAME);
+ in1.putExtra(BluetoothDevicePicker.EXTRA_LAUNCH_CLASS,
+ BluetoothOppReceiver.class.getName());
+ if (V) {Log.d(TAG,"Launching " +BluetoothDevicePicker.ACTION_LAUNCH );}
+ startActivity(in1);
+ }
+ }
/* Returns true if Bluetooth is allowed given current airplane mode settings. */
private final boolean isBluetoothAllowed() {
final ContentResolver resolver = this.getContentResolver();