Loading AndroidManifest.xml +10 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,16 @@ <action android:name="android.btopp.intent.action.WHITELIST_DEVICE" /> <action android:name="android.btopp.intent.action.STOP_HANDOVER_TRANSFER" /> </intent-filter> <intent-filter> <action android:name="android.btopp.intent.action.HANDOVER_SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="*/*" /> </intent-filter> <intent-filter> <action android:name="android.btopp.intent.action.HANDOVER_SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="*/*" /> </intent-filter> </receiver> <activity android:name=".opp.BluetoothOppLauncherActivity" android:process="@string/process" Loading src/com/android/bluetooth/opp/BluetoothOppHandoverReceiver.java +38 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import android.content.Intent; import android.net.Uri; import android.util.Log; import java.util.ArrayList; public class BluetoothOppHandoverReceiver extends BroadcastReceiver { public static final String TAG ="BluetoothOppHandoverReceiver"; private static final boolean D = Constants.DEBUG; Loading @@ -31,7 +33,42 @@ public class BluetoothOppHandoverReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(Constants.ACTION_WHITELIST_DEVICE)) { if (action.equals(Constants.ACTION_HANDOVER_SEND) || action.equals(Constants.ACTION_HANDOVER_SEND_MULTIPLE)) { BluetoothDevice device = (BluetoothDevice)intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (device == null) { if (D) Log.d(TAG, "No device attached to handover intent."); return; } if (action.equals(Constants.ACTION_HANDOVER_SEND)) { String type = intent.getType(); Uri stream = (Uri)intent.getParcelableExtra(Intent.EXTRA_STREAM); if (stream != null && type != null) { // Save type/stream, will be used when adding transfer // session to DB. BluetoothOppManager.getInstance(context).saveSendingFileInfo(type, stream.toString(), true); } else { if (D) Log.d(TAG, "No mimeType or stream attached to handover request"); } } else if (action.equals(Constants.ACTION_HANDOVER_SEND_MULTIPLE)) { ArrayList<Uri> uris = new ArrayList<Uri>(); String mimeType = intent.getType(); uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (mimeType != null && uris != null) { BluetoothOppManager.getInstance(context).saveSendingFileInfo(mimeType, uris, true); } else { if (D) Log.d(TAG, "No mimeType or stream attached to handover request"); return; } } // we already know where to send to BluetoothOppManager.getInstance(context).startTransfer(device); } else if (action.equals(Constants.ACTION_WHITELIST_DEVICE)) { BluetoothDevice device = (BluetoothDevice)intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (D) Log.d(TAG, "Adding " + device + " to whitelist"); Loading src/com/android/bluetooth/opp/BluetoothOppLauncherActivity.java +4 −13 Original line number Diff line number Diff line Loading @@ -67,8 +67,6 @@ public class BluetoothOppLauncherActivity extends Activity { Intent intent = getIntent(); String action = intent.getAction(); BluetoothDevice device = null; boolean isHandover = false; if (action.equals(Intent.ACTION_SEND) || action.equals(Intent.ACTION_SEND_MULTIPLE)) { /* Loading @@ -76,10 +74,6 @@ public class BluetoothOppLauncherActivity extends Activity { * probably Pictures, videos, or vCards. The Intent should contain * an EXTRA_STREAM with the data to attach. */ if (intent.getBooleanExtra(Constants.EXTRA_CONNECTION_HANDOVER, false)) { device = (BluetoothDevice)intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); isHandover = true; } if (action.equals(Intent.ACTION_SEND)) { // TODO: handle type == null case String type = intent.getType(); Loading @@ -96,7 +90,7 @@ public class BluetoothOppLauncherActivity extends Activity { // Save type/stream, will be used when adding transfer // session to DB. BluetoothOppManager.getInstance(this).saveSendingFileInfo(type, stream.toString(), isHandover); stream.toString(), false); } else if (extra_text != null && type != null) { if (V) Log.v(TAG, "Get ACTION_SEND intent with Extra_text = " + extra_text.toString() + "; mimetype = " + type); Loading @@ -104,7 +98,7 @@ public class BluetoothOppLauncherActivity extends Activity { if (fileUri != null) { BluetoothOppManager.getInstance(this).saveSendingFileInfo(type, fileUri.toString(), isHandover); fileUri.toString(), false); } } else { Log.e(TAG, "type is null; or sending file URI is null"); Loading @@ -119,7 +113,7 @@ public class BluetoothOppLauncherActivity extends Activity { if (V) Log.v(TAG, "Get ACTION_SHARE_MULTIPLE intent: uris " + uris + "\n Type= " + mimeType); BluetoothOppManager.getInstance(this).saveSendingFileInfo(mimeType, uris, isHandover); uris, false); } else { Log.e(TAG, "type is null; or sending files URIs are null"); finish(); Loading @@ -146,7 +140,7 @@ public class BluetoothOppLauncherActivity extends Activity { Intent in = new Intent(this, BluetoothOppBtEnableActivity.class); in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); this.startActivity(in); } else if (device == null) { } else { if (V) Log.v(TAG, "BT already enabled!! "); Intent in1 = new Intent(BluetoothDevicePicker.ACTION_LAUNCH); in1.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); Loading @@ -159,9 +153,6 @@ public class BluetoothOppLauncherActivity extends Activity { BluetoothOppReceiver.class.getName()); this.startActivity(in1); } else { // we already know where to send to BluetoothOppManager.getInstance(this).startTransfer(device); } } else if (action.equals(Constants.ACTION_OPEN)) { Uri uri = getIntent().getData(); Loading src/com/android/bluetooth/opp/BluetoothOppObexServerSession.java +16 −11 Original line number Diff line number Diff line Loading @@ -180,8 +180,18 @@ public class BluetoothOppObexServerSession extends ServerRequestHandler implemen return ResponseCodes.OBEX_HTTP_FORBIDDEN; } String destination; if (mTransport instanceof BluetoothOppRfcommTransport) { destination = ((BluetoothOppRfcommTransport)mTransport).getRemoteAddress(); } else { destination = "FF:FF:FF:00:00:00"; } boolean isWhitelisted = BluetoothOppManager.getInstance(mContext). isWhitelisted(destination); try { boolean pre_reject = false; request = op.getReceivedHeader(); if (V) Constants.logHeader(request); name = (String)request.getHeader(HeaderSet.NAME); Loading @@ -204,8 +214,9 @@ public class BluetoothOppObexServerSession extends ServerRequestHandler implemen /* first we look for Mimetype in Android map */ String extension, type; int dotIndex = name.lastIndexOf("."); if (dotIndex < 0) { if (D) Log.w(TAG, "There is no file extension, reject the transfer"); if (dotIndex < 0 && mimeType == null) { if (D) Log.w(TAG, "There is no file extension or mime type," + "reject the transfer"); pre_reject = true; obexResponse = ResponseCodes.OBEX_HTTP_BAD_REQUEST; } else { Loading Loading @@ -233,8 +244,8 @@ public class BluetoothOppObexServerSession extends ServerRequestHandler implemen // MIME Types. Also reject everything in the "black list". if (!pre_reject && (mimeType == null || !Constants.mimeTypeMatches(mimeType, Constants.ACCEPTABLE_SHARE_INBOUND_TYPES) || (!isWhitelisted && !Constants.mimeTypeMatches(mimeType, Constants.ACCEPTABLE_SHARE_INBOUND_TYPES)) || Constants.mimeTypeMatches(mimeType, Constants.UNACCEPTABLE_SHARE_INBOUND_TYPES))) { if (D) Log.w(TAG, "mimeType is null or in unacceptable list, reject the transfer"); Loading @@ -258,12 +269,6 @@ public class BluetoothOppObexServerSession extends ServerRequestHandler implemen values.put(BluetoothShare.TOTAL_BYTES, length.intValue()); values.put(BluetoothShare.MIMETYPE, mimeType); String destination; if (mTransport instanceof BluetoothOppRfcommTransport) { destination = ((BluetoothOppRfcommTransport)mTransport).getRemoteAddress(); } else { destination = "FF:FF:FF:00:00:00"; } values.put(BluetoothShare.DESTINATION, destination); values.put(BluetoothShare.DIRECTION, BluetoothShare.DIRECTION_INBOUND); Loading @@ -277,7 +282,7 @@ public class BluetoothOppObexServerSession extends ServerRequestHandler implemen needConfirm = false; } if (BluetoothOppManager.getInstance(mContext).isWhitelisted(destination)) { if (isWhitelisted) { values.put(BluetoothShare.USER_CONFIRMATION, BluetoothShare.USER_CONFIRMATION_HANDOVER_CONFIRMED); needConfirm = false; Loading src/com/android/bluetooth/opp/BluetoothOppReceiveFileInfo.java +8 −3 Original line number Diff line number Diff line Loading @@ -91,7 +91,7 @@ public class BluetoothOppReceiveFileInfo { ContentResolver contentResolver = context.getContentResolver(); Uri contentUri = Uri.parse(BluetoothShare.CONTENT_URI + "/" + id); String filename = null, hint = null; String filename = null, hint = null, mimeType = null; long length = 0; Cursor metadataCursor = contentResolver.query(contentUri, new String[] { BluetoothShare.FILENAME_HINT, BluetoothShare.TOTAL_BYTES, BluetoothShare.MIMETYPE Loading @@ -101,6 +101,7 @@ public class BluetoothOppReceiveFileInfo { if (metadataCursor.moveToFirst()) { hint = metadataCursor.getString(0); length = metadataCursor.getInt(1); mimeType = metadataCursor.getString(2); } } finally { metadataCursor.close(); Loading Loading @@ -142,8 +143,12 @@ public class BluetoothOppReceiveFileInfo { String extension = null; int dotIndex = filename.lastIndexOf("."); if (dotIndex < 0) { if (mimeType == null) { // should not happen. It must be pre-rejected return new BluetoothOppReceiveFileInfo(BluetoothShare.STATUS_FILE_ERROR); } else { extension = ""; } } else { extension = filename.substring(dotIndex); filename = filename.substring(0, dotIndex); Loading Loading
AndroidManifest.xml +10 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,16 @@ <action android:name="android.btopp.intent.action.WHITELIST_DEVICE" /> <action android:name="android.btopp.intent.action.STOP_HANDOVER_TRANSFER" /> </intent-filter> <intent-filter> <action android:name="android.btopp.intent.action.HANDOVER_SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="*/*" /> </intent-filter> <intent-filter> <action android:name="android.btopp.intent.action.HANDOVER_SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="*/*" /> </intent-filter> </receiver> <activity android:name=".opp.BluetoothOppLauncherActivity" android:process="@string/process" Loading
src/com/android/bluetooth/opp/BluetoothOppHandoverReceiver.java +38 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import android.content.Intent; import android.net.Uri; import android.util.Log; import java.util.ArrayList; public class BluetoothOppHandoverReceiver extends BroadcastReceiver { public static final String TAG ="BluetoothOppHandoverReceiver"; private static final boolean D = Constants.DEBUG; Loading @@ -31,7 +33,42 @@ public class BluetoothOppHandoverReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(Constants.ACTION_WHITELIST_DEVICE)) { if (action.equals(Constants.ACTION_HANDOVER_SEND) || action.equals(Constants.ACTION_HANDOVER_SEND_MULTIPLE)) { BluetoothDevice device = (BluetoothDevice)intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (device == null) { if (D) Log.d(TAG, "No device attached to handover intent."); return; } if (action.equals(Constants.ACTION_HANDOVER_SEND)) { String type = intent.getType(); Uri stream = (Uri)intent.getParcelableExtra(Intent.EXTRA_STREAM); if (stream != null && type != null) { // Save type/stream, will be used when adding transfer // session to DB. BluetoothOppManager.getInstance(context).saveSendingFileInfo(type, stream.toString(), true); } else { if (D) Log.d(TAG, "No mimeType or stream attached to handover request"); } } else if (action.equals(Constants.ACTION_HANDOVER_SEND_MULTIPLE)) { ArrayList<Uri> uris = new ArrayList<Uri>(); String mimeType = intent.getType(); uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (mimeType != null && uris != null) { BluetoothOppManager.getInstance(context).saveSendingFileInfo(mimeType, uris, true); } else { if (D) Log.d(TAG, "No mimeType or stream attached to handover request"); return; } } // we already know where to send to BluetoothOppManager.getInstance(context).startTransfer(device); } else if (action.equals(Constants.ACTION_WHITELIST_DEVICE)) { BluetoothDevice device = (BluetoothDevice)intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (D) Log.d(TAG, "Adding " + device + " to whitelist"); Loading
src/com/android/bluetooth/opp/BluetoothOppLauncherActivity.java +4 −13 Original line number Diff line number Diff line Loading @@ -67,8 +67,6 @@ public class BluetoothOppLauncherActivity extends Activity { Intent intent = getIntent(); String action = intent.getAction(); BluetoothDevice device = null; boolean isHandover = false; if (action.equals(Intent.ACTION_SEND) || action.equals(Intent.ACTION_SEND_MULTIPLE)) { /* Loading @@ -76,10 +74,6 @@ public class BluetoothOppLauncherActivity extends Activity { * probably Pictures, videos, or vCards. The Intent should contain * an EXTRA_STREAM with the data to attach. */ if (intent.getBooleanExtra(Constants.EXTRA_CONNECTION_HANDOVER, false)) { device = (BluetoothDevice)intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); isHandover = true; } if (action.equals(Intent.ACTION_SEND)) { // TODO: handle type == null case String type = intent.getType(); Loading @@ -96,7 +90,7 @@ public class BluetoothOppLauncherActivity extends Activity { // Save type/stream, will be used when adding transfer // session to DB. BluetoothOppManager.getInstance(this).saveSendingFileInfo(type, stream.toString(), isHandover); stream.toString(), false); } else if (extra_text != null && type != null) { if (V) Log.v(TAG, "Get ACTION_SEND intent with Extra_text = " + extra_text.toString() + "; mimetype = " + type); Loading @@ -104,7 +98,7 @@ public class BluetoothOppLauncherActivity extends Activity { if (fileUri != null) { BluetoothOppManager.getInstance(this).saveSendingFileInfo(type, fileUri.toString(), isHandover); fileUri.toString(), false); } } else { Log.e(TAG, "type is null; or sending file URI is null"); Loading @@ -119,7 +113,7 @@ public class BluetoothOppLauncherActivity extends Activity { if (V) Log.v(TAG, "Get ACTION_SHARE_MULTIPLE intent: uris " + uris + "\n Type= " + mimeType); BluetoothOppManager.getInstance(this).saveSendingFileInfo(mimeType, uris, isHandover); uris, false); } else { Log.e(TAG, "type is null; or sending files URIs are null"); finish(); Loading @@ -146,7 +140,7 @@ public class BluetoothOppLauncherActivity extends Activity { Intent in = new Intent(this, BluetoothOppBtEnableActivity.class); in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); this.startActivity(in); } else if (device == null) { } else { if (V) Log.v(TAG, "BT already enabled!! "); Intent in1 = new Intent(BluetoothDevicePicker.ACTION_LAUNCH); in1.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); Loading @@ -159,9 +153,6 @@ public class BluetoothOppLauncherActivity extends Activity { BluetoothOppReceiver.class.getName()); this.startActivity(in1); } else { // we already know where to send to BluetoothOppManager.getInstance(this).startTransfer(device); } } else if (action.equals(Constants.ACTION_OPEN)) { Uri uri = getIntent().getData(); Loading
src/com/android/bluetooth/opp/BluetoothOppObexServerSession.java +16 −11 Original line number Diff line number Diff line Loading @@ -180,8 +180,18 @@ public class BluetoothOppObexServerSession extends ServerRequestHandler implemen return ResponseCodes.OBEX_HTTP_FORBIDDEN; } String destination; if (mTransport instanceof BluetoothOppRfcommTransport) { destination = ((BluetoothOppRfcommTransport)mTransport).getRemoteAddress(); } else { destination = "FF:FF:FF:00:00:00"; } boolean isWhitelisted = BluetoothOppManager.getInstance(mContext). isWhitelisted(destination); try { boolean pre_reject = false; request = op.getReceivedHeader(); if (V) Constants.logHeader(request); name = (String)request.getHeader(HeaderSet.NAME); Loading @@ -204,8 +214,9 @@ public class BluetoothOppObexServerSession extends ServerRequestHandler implemen /* first we look for Mimetype in Android map */ String extension, type; int dotIndex = name.lastIndexOf("."); if (dotIndex < 0) { if (D) Log.w(TAG, "There is no file extension, reject the transfer"); if (dotIndex < 0 && mimeType == null) { if (D) Log.w(TAG, "There is no file extension or mime type," + "reject the transfer"); pre_reject = true; obexResponse = ResponseCodes.OBEX_HTTP_BAD_REQUEST; } else { Loading Loading @@ -233,8 +244,8 @@ public class BluetoothOppObexServerSession extends ServerRequestHandler implemen // MIME Types. Also reject everything in the "black list". if (!pre_reject && (mimeType == null || !Constants.mimeTypeMatches(mimeType, Constants.ACCEPTABLE_SHARE_INBOUND_TYPES) || (!isWhitelisted && !Constants.mimeTypeMatches(mimeType, Constants.ACCEPTABLE_SHARE_INBOUND_TYPES)) || Constants.mimeTypeMatches(mimeType, Constants.UNACCEPTABLE_SHARE_INBOUND_TYPES))) { if (D) Log.w(TAG, "mimeType is null or in unacceptable list, reject the transfer"); Loading @@ -258,12 +269,6 @@ public class BluetoothOppObexServerSession extends ServerRequestHandler implemen values.put(BluetoothShare.TOTAL_BYTES, length.intValue()); values.put(BluetoothShare.MIMETYPE, mimeType); String destination; if (mTransport instanceof BluetoothOppRfcommTransport) { destination = ((BluetoothOppRfcommTransport)mTransport).getRemoteAddress(); } else { destination = "FF:FF:FF:00:00:00"; } values.put(BluetoothShare.DESTINATION, destination); values.put(BluetoothShare.DIRECTION, BluetoothShare.DIRECTION_INBOUND); Loading @@ -277,7 +282,7 @@ public class BluetoothOppObexServerSession extends ServerRequestHandler implemen needConfirm = false; } if (BluetoothOppManager.getInstance(mContext).isWhitelisted(destination)) { if (isWhitelisted) { values.put(BluetoothShare.USER_CONFIRMATION, BluetoothShare.USER_CONFIRMATION_HANDOVER_CONFIRMED); needConfirm = false; Loading
src/com/android/bluetooth/opp/BluetoothOppReceiveFileInfo.java +8 −3 Original line number Diff line number Diff line Loading @@ -91,7 +91,7 @@ public class BluetoothOppReceiveFileInfo { ContentResolver contentResolver = context.getContentResolver(); Uri contentUri = Uri.parse(BluetoothShare.CONTENT_URI + "/" + id); String filename = null, hint = null; String filename = null, hint = null, mimeType = null; long length = 0; Cursor metadataCursor = contentResolver.query(contentUri, new String[] { BluetoothShare.FILENAME_HINT, BluetoothShare.TOTAL_BYTES, BluetoothShare.MIMETYPE Loading @@ -101,6 +101,7 @@ public class BluetoothOppReceiveFileInfo { if (metadataCursor.moveToFirst()) { hint = metadataCursor.getString(0); length = metadataCursor.getInt(1); mimeType = metadataCursor.getString(2); } } finally { metadataCursor.close(); Loading Loading @@ -142,8 +143,12 @@ public class BluetoothOppReceiveFileInfo { String extension = null; int dotIndex = filename.lastIndexOf("."); if (dotIndex < 0) { if (mimeType == null) { // should not happen. It must be pre-rejected return new BluetoothOppReceiveFileInfo(BluetoothShare.STATUS_FILE_ERROR); } else { extension = ""; } } else { extension = filename.substring(dotIndex); filename = filename.substring(0, dotIndex); Loading