summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Kondik <shade@chemlab.org>2013-02-12 22:38:54 -0800
committerSteve Kondik <shade@chemlab.org>2013-02-12 22:38:54 -0800
commit188ea52a1fd8bbf97d6ac936cd518080466f0df5 (patch)
treecbf6d1e39f5bc99b70bea90b7800b9a7147416fd
parent5d54e372e49ebfd7049a896b20e81c51af81d409 (diff)
parentfa5a6affffb0efe6c41ea44499b0e9b619bee161 (diff)
downloadandroid_packages_apps_Bluetooth-mr1.1-staging.tar.gz
android_packages_apps_Bluetooth-mr1.1-staging.tar.bz2
android_packages_apps_Bluetooth-mr1.1-staging.zip
Merge tag 'android-4.2.2_r1' of https://android.googlesource.com/platform/packages/apps/Bluetooth into 1.1mr1.1-staging
Android 4.2.2 release 1
-rwxr-xr-xsrc/com/android/bluetooth/btservice/AdapterProperties.java5
-rw-r--r--src/com/android/bluetooth/btservice/ProfileService.java20
-rwxr-xr-xsrc/com/android/bluetooth/hfp/HeadsetStateMachine.java87
-rwxr-xr-xsrc/com/android/bluetooth/hid/HidService.java2
-rw-r--r--src/com/android/bluetooth/opp/BluetoothOppLauncherActivity.java135
-rwxr-xr-xsrc/com/android/bluetooth/opp/BluetoothOppService.java2
6 files changed, 189 insertions, 62 deletions
diff --git a/src/com/android/bluetooth/btservice/AdapterProperties.java b/src/com/android/bluetooth/btservice/AdapterProperties.java
index 73e795ea0..9b3c20acc 100755
--- a/src/com/android/bluetooth/btservice/AdapterProperties.java
+++ b/src/com/android/bluetooth/btservice/AdapterProperties.java
@@ -445,7 +445,8 @@ class AdapterProperties {
intent = new Intent(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED);
intent.putExtra(BluetoothAdapter.EXTRA_LOCAL_NAME, mName);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
- mService.sendBroadcast(intent, mService.BLUETOOTH_PERM);
+ mService.sendBroadcastAsUser(intent, UserHandle.ALL,
+ mService.BLUETOOTH_PERM);
debugLog("Name is: " + mName);
break;
case AbstractionLayer.BT_PROPERTY_BDADDR:
@@ -546,7 +547,7 @@ class AdapterProperties {
}
private void infoLog(String msg) {
- Log.i(TAG, msg);
+ if (DBG) Log.i(TAG, msg);
}
private void debugLog(String msg) {
diff --git a/src/com/android/bluetooth/btservice/ProfileService.java b/src/com/android/bluetooth/btservice/ProfileService.java
index 83394181d..e3d9196fe 100644
--- a/src/com/android/bluetooth/btservice/ProfileService.java
+++ b/src/com/android/bluetooth/btservice/ProfileService.java
@@ -77,7 +77,7 @@ public abstract class ProfileService extends Service {
refCount = refCount+1;
}
sReferenceCount.put(mName, refCount);
- log("REFCOUNT: CREATED. INSTANCE_COUNT=" +refCount);
+ if (DBG) log("REFCOUNT: CREATED. INSTANCE_COUNT=" +refCount);
}
}
}
@@ -99,14 +99,14 @@ public abstract class ProfileService extends Service {
@Override
public void onCreate() {
- log("onCreate");
+ if (DBG) log("onCreate");
super.onCreate();
mAdapter = BluetoothAdapter.getDefaultAdapter();
mBinder = initBinder();
}
public int onStartCommand(Intent intent, int flags, int startId) {
- log("onStartCommand()");
+ if (DBG) log("onStartCommand()");
if (mStartError || mAdapter == null) {
Log.w(mName, "Stopping profile service: device does not have BT");
doStop(intent);
@@ -138,22 +138,22 @@ public abstract class ProfileService extends Service {
}
public IBinder onBind(Intent intent) {
- log("onBind");
+ if (DBG) log("onBind");
return mBinder;
}
public boolean onUnbind(Intent intent) {
- log("onUnbind");
+ if (DBG) log("onUnbind");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
- log("Destroying service.");
+ if (DBG) log("Destroying service.");
if (mCleaningUp) {
- log("Cleanup already started... Skipping cleanup()...");
+ if (DBG) log("Cleanup already started... Skipping cleanup()...");
} else {
- log("cleanup()");
+ if (DBG) log("cleanup()");
mCleaningUp = true;
cleanup();
if (mBinder != null) {
@@ -170,7 +170,7 @@ public abstract class ProfileService extends Service {
if (mAdapter == null) {
Log.e(mName, "Error starting profile. BluetoothAdapter is null");
} else {
- log("start()");
+ if (DBG) log("start()");
mStartError = !start();
if (!mStartError) {
notifyProfileServiceStateChanged(BluetoothAdapter.STATE_ON);
@@ -182,7 +182,7 @@ public abstract class ProfileService extends Service {
private void doStop(Intent intent) {
if (stop()) {
- log("stop()");
+ if (DBG) log("stop()");
notifyProfileServiceStateChanged(BluetoothAdapter.STATE_OFF);
stopSelf();
} else {
diff --git a/src/com/android/bluetooth/hfp/HeadsetStateMachine.java b/src/com/android/bluetooth/hfp/HeadsetStateMachine.java
index e48521502..7282a9902 100755
--- a/src/com/android/bluetooth/hfp/HeadsetStateMachine.java
+++ b/src/com/android/bluetooth/hfp/HeadsetStateMachine.java
@@ -33,6 +33,7 @@
package com.android.bluetooth.hfp;
import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothAssignedNumbers;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothHeadset;
import android.bluetooth.BluetoothProfile;
@@ -1275,6 +1276,30 @@ final class HeadsetStateMachine extends StateMachine {
log("Audio state " + device + ": " + prevState + "->" + newState);
}
+ /*
+ * Put the AT command, company ID, arguments, and device in an Intent and broadcast it.
+ */
+ private void broadcastVendorSpecificEventIntent(String command,
+ int companyId,
+ int commandType,
+ Object[] arguments,
+ BluetoothDevice device) {
+ log("broadcastVendorSpecificEventIntent(" + command + ")");
+ Intent intent =
+ new Intent(BluetoothHeadset.ACTION_VENDOR_SPECIFIC_HEADSET_EVENT);
+ intent.putExtra(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD, command);
+ intent.putExtra(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD_TYPE,
+ commandType);
+ // assert: all elements of args are Serializable
+ intent.putExtra(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_ARGS, arguments);
+ intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
+
+ intent.addCategory(BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_COMPANY_ID_CATEGORY
+ + "." + Integer.toString(companyId));
+
+ mService.sendBroadcast(intent, HeadsetService.BLUETOOTH_PERM);
+ }
+
private void configAudioParameters()
{
// Reset NREC on connect event. Headset will override later
@@ -1653,6 +1678,66 @@ final class HeadsetStateMachine extends StateMachine {
}
}
+ /**
+ * Find a character ch, ignoring quoted sections.
+ * Return input.length() if not found.
+ */
+ static private int findChar(char ch, String input, int fromIndex) {
+ for (int i = fromIndex; i < input.length(); i++) {
+ char c = input.charAt(i);
+ if (c == '"') {
+ i = input.indexOf('"', i + 1);
+ if (i == -1) {
+ return input.length();
+ }
+ } else if (c == ch) {
+ return i;
+ }
+ }
+ return input.length();
+ }
+
+ /**
+ * Break an argument string into individual arguments (comma delimited).
+ * Integer arguments are turned into Integer objects. Otherwise a String
+ * object is used.
+ */
+ static private Object[] generateArgs(String input) {
+ int i = 0;
+ int j;
+ ArrayList<Object> out = new ArrayList<Object>();
+ while (i <= input.length()) {
+ j = findChar(',', input, i);
+
+ String arg = input.substring(i, j);
+ try {
+ out.add(new Integer(arg));
+ } catch (NumberFormatException e) {
+ out.add(arg);
+ }
+
+ i = j + 1; // move past comma
+ }
+ return out.toArray();
+ }
+
+ private void processAtXevent(String atString) {
+ log("processAtXevent - atString = "+ atString);
+ if (atString.startsWith("=") && !atString.startsWith("=?")) {
+ Object[] args = generateArgs(atString.substring(1));
+ broadcastVendorSpecificEventIntent("+XEVENT",
+ BluetoothAssignedNumbers.PLANTRONICS,
+ BluetoothHeadset.AT_CMD_TYPE_SET,
+ args,
+ mCurrentDevice);
+ atResponseCodeNative(HeadsetHalConstants.AT_RESPONSE_OK, 0);
+ }
+ else {
+ Log.e(TAG, "processAtXevent: command type error");
+ atResponseCodeNative(HeadsetHalConstants.AT_RESPONSE_ERROR, 0);
+ }
+ }
+
private void processUnknownAt(String atString) {
// TODO (BT)
log("processUnknownAt - atString = "+ atString);
@@ -1664,6 +1749,8 @@ final class HeadsetStateMachine extends StateMachine {
processAtCpbs(atCommand.substring(5), commandType);
else if (atCommand.startsWith("+CPBR"))
processAtCpbr(atCommand.substring(5), commandType, mCurrentDevice);
+ else if (atCommand.startsWith("+XEVENT"))
+ processAtXevent(atCommand.substring(7));
else
atResponseCodeNative(HeadsetHalConstants.AT_RESPONSE_ERROR, 0);
}
diff --git a/src/com/android/bluetooth/hid/HidService.java b/src/com/android/bluetooth/hid/HidService.java
index 2e67154bd..8f2051f37 100755
--- a/src/com/android/bluetooth/hid/HidService.java
+++ b/src/com/android/bluetooth/hid/HidService.java
@@ -179,7 +179,7 @@ public class HidService extends ProfileService {
if(halState == CONN_STATE_CONNECTED &&
prevState == BluetoothInputDevice.STATE_DISCONNECTED &&
(!okToConnect(device))) {
- Log.d(TAG,"Incoming HID connection rejected");
+ if (DBG) Log.d(TAG,"Incoming HID connection rejected");
disconnectHidNative(Utils.getByteAddress(device));
} else {
broadcastConnectionState(device, convertHalState(halState));
diff --git a/src/com/android/bluetooth/opp/BluetoothOppLauncherActivity.java b/src/com/android/bluetooth/opp/BluetoothOppLauncherActivity.java
index f9e96f558..bbe789927 100644
--- a/src/com/android/bluetooth/opp/BluetoothOppLauncherActivity.java
+++ b/src/com/android/bluetooth/opp/BluetoothOppLauncherActivity.java
@@ -69,6 +69,17 @@ public class BluetoothOppLauncherActivity extends Activity {
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 @@ public class BluetoothOppLauncherActivity extends Activity {
*/
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 @@ public class BluetoothOppLauncherActivity extends Activity {
+ 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 @@ public class BluetoothOppLauncherActivity extends Activity {
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 @@ public class BluetoothOppLauncherActivity extends Activity {
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();
diff --git a/src/com/android/bluetooth/opp/BluetoothOppService.java b/src/com/android/bluetooth/opp/BluetoothOppService.java
index 902000614..421ad2efb 100755
--- a/src/com/android/bluetooth/opp/BluetoothOppService.java
+++ b/src/com/android/bluetooth/opp/BluetoothOppService.java
@@ -680,7 +680,7 @@ public class BluetoothOppService extends Service {
info.mUri = Uri.parse(stringFromCursor(info.mUri.toString(), cursor,
BluetoothShare.URI));
} else {
- Log.d(TAG, "updateShare() called for ID " + info.mId + " with null URI");
+ Log.w(TAG, "updateShare() called for ID " + info.mId + " with null URI");
}
info.mHint = stringFromCursor(info.mHint, cursor, BluetoothShare.FILENAME_HINT);
info.mFilename = stringFromCursor(info.mFilename, cursor, BluetoothShare._DATA);