summaryrefslogtreecommitdiffstats
path: root/src/com/android/bluetooth/opp/BluetoothOppManager.java
diff options
context:
space:
mode:
authorMartijn Coenen <maco@google.com>2012-04-06 13:47:52 -0700
committerMartijn Coenen <maco@google.com>2012-04-20 11:10:58 -0700
commit8099f5e7bfa7227ba674b5f0076f331e737bafd7 (patch)
tree44d1942249ed12d1f0d91e25d2157f2054cc302d /src/com/android/bluetooth/opp/BluetoothOppManager.java
parenta4e5a2b1e7fc398285e304caf7019572dce3d16f (diff)
downloadandroid_packages_apps_Bluetooth-8099f5e7bfa7227ba674b5f0076f331e737bafd7.tar.gz
android_packages_apps_Bluetooth-8099f5e7bfa7227ba674b5f0076f331e737bafd7.tar.bz2
android_packages_apps_Bluetooth-8099f5e7bfa7227ba674b5f0076f331e737bafd7.zip
Additional changes to support Bluetooth Beam.
- Added a whitelist permission, to ensure only system services (such as NFC) can whitelist MAC addresses. - Added HANDOVER_STATUS permission, to ensure handover transfer status can only be received by eligible services (such as NFC). - Added new confirmation type HANDOVER_CONFIRMED; this indicates the transfer was initiated by a handover, and doesn't need to be confirmed. This type is also reused to send broadcasts to the NFC service, so the NFC service can show notifications and deal with the received data. - Added 15 second timeout to whitelist. - Modify notication code to not show any notifications for handover transfers; instead, send broadcasts to indicate handover status. - Modify "transfer complete" code to sendbroasts to indicate handover status. Change-Id: I00c08e09eaf44f0bd4bd837cb6b0c37b802742bc
Diffstat (limited to 'src/com/android/bluetooth/opp/BluetoothOppManager.java')
-rw-r--r--src/com/android/bluetooth/opp/BluetoothOppManager.java61
1 files changed, 51 insertions, 10 deletions
diff --git a/src/com/android/bluetooth/opp/BluetoothOppManager.java b/src/com/android/bluetooth/opp/BluetoothOppManager.java
index 8546fac5b..158707acb 100644
--- a/src/com/android/bluetooth/opp/BluetoothOppManager.java
+++ b/src/com/android/bluetooth/opp/BluetoothOppManager.java
@@ -43,10 +43,13 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Process;
+import android.os.SystemClock;
import android.text.TextUtils;
import android.util.Log;
+import android.util.Pair;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
/**
@@ -77,6 +80,8 @@ public class BluetoothOppManager {
private ArrayList<Uri> mUrisOfSendingFiles;
+ private boolean mIsHandoverInitiated;
+
private static final String OPP_PREFERENCE_FILE = "OPPMGR";
private static final String SENDING_FLAG = "SENDINGFLAG";
@@ -105,6 +110,13 @@ public class BluetoothOppManager {
private int mInsertShareThreadNum = 0;
+ // A list of devices that may send files over OPP to this device
+ // without user confirmation. Used for connection handover from forex NFC.
+ private List<Pair<String,Long> > mWhitelist = new ArrayList<Pair<String, Long> >();
+
+ // The time for which the whitelist entries remain valid.
+ private static final int WHITELIST_DURATION_MS = 15000;
+
/**
* Get singleton instance.
*/
@@ -140,15 +152,31 @@ public class BluetoothOppManager {
return true;
}
- List<String> mWhitelist = new ArrayList<String>();
+
+ private void cleanupWhitelist() {
+ // Removes expired entries
+ long curTime = SystemClock.elapsedRealtime();
+ for (Iterator<Pair<String,Long>> iter = mWhitelist.iterator(); iter.hasNext(); ) {
+ Pair<String,Long> entry = iter.next();
+ if (curTime - entry.second > WHITELIST_DURATION_MS) {
+ if (V) Log.v(TAG, "Cleaning out whitelist entry " + entry.first);
+ iter.remove();
+ }
+ }
+ }
public void addToWhitelist(String address) {
- //TODO: timeout whitelist
- mWhitelist.add(address);
+ if (address == null) return;
+
+ mWhitelist.add(new Pair<String, Long>(address, SystemClock.elapsedRealtime()));
}
public boolean isWhitelisted(String address) {
- return mWhitelist.contains(address);
+ cleanupWhitelist();
+ for (Pair<String,Long> entry : mWhitelist) {
+ if (entry.first.equals(address)) return true;
+ }
+ return false;
}
/**
@@ -212,20 +240,22 @@ public class BluetoothOppManager {
if (V) Log.v(TAG, "Application data stored to SharedPreference! ");
}
- public void saveSendingFileInfo(String mimeType, String uri) {
+ public void saveSendingFileInfo(String mimeType, String uri, boolean isHandover) {
synchronized (BluetoothOppManager.this) {
mMultipleFlag = false;
mMimeTypeOfSendingFile = mimeType;
mUriOfSendingFile = uri;
+ mIsHandoverInitiated = isHandover;
storeApplicationData();
}
}
- public void saveSendingFileInfo(String mimeType, ArrayList<Uri> uris) {
+ public void saveSendingFileInfo(String mimeType, ArrayList<Uri> uris, boolean isHandover) {
synchronized (BluetoothOppManager.this) {
mMultipleFlag = true;
mMimeTypeOfSendingFiles = mimeType;
mUrisOfSendingFiles = uris;
+ mIsHandoverInitiated = isHandover;
storeApplicationData();
}
}
@@ -306,7 +336,8 @@ public class BluetoothOppManager {
return;
}
insertThread = new InsertShareInfoThread(device, mMultipleFlag, mMimeTypeOfSendingFile,
- mUriOfSendingFile, mMimeTypeOfSendingFiles, mUrisOfSendingFiles);
+ mUriOfSendingFile, mMimeTypeOfSendingFiles, mUrisOfSendingFiles,
+ mIsHandoverInitiated);
if (mMultipleFlag) {
mfileNumInBatch = mUrisOfSendingFiles.size();
}
@@ -336,8 +367,11 @@ public class BluetoothOppManager {
private final boolean mIsMultiple;
+ private final boolean mIsHandoverInitiated;
+
public InsertShareInfoThread(BluetoothDevice device, boolean multiple,
- String typeOfSingleFile, String uri, String typeOfMultipleFiles, ArrayList<Uri> uris) {
+ String typeOfSingleFile, String uri, String typeOfMultipleFiles,
+ ArrayList<Uri> uris, boolean handoverInitiated) {
super("Insert ShareInfo Thread");
this.mRemoteDevice = device;
this.mIsMultiple = multiple;
@@ -345,6 +379,7 @@ public class BluetoothOppManager {
this.mUri = uri;
this.mTypeOfMultipleFiles = typeOfMultipleFiles;
this.mUris = uris;
+ this.mIsHandoverInitiated = handoverInitiated;
synchronized (BluetoothOppManager.this) {
mInsertShareThreadNum++;
@@ -390,7 +425,10 @@ public class BluetoothOppManager {
values.put(BluetoothShare.MIMETYPE, contentType);
values.put(BluetoothShare.DESTINATION, mRemoteDevice.getAddress());
values.put(BluetoothShare.TIMESTAMP, ts);
-
+ if (mIsHandoverInitiated) {
+ values.put(BluetoothShare.USER_CONFIRMATION,
+ BluetoothShare.USER_CONFIRMATION_HANDOVER_CONFIRMED);
+ }
final Uri contentUri = mContext.getContentResolver().insert(
BluetoothShare.CONTENT_URI, values);
if (V) Log.v(TAG, "Insert contentUri: " + contentUri + " to device: "
@@ -406,7 +444,10 @@ public class BluetoothOppManager {
values.put(BluetoothShare.URI, mUri);
values.put(BluetoothShare.MIMETYPE, mTypeOfSingleFile);
values.put(BluetoothShare.DESTINATION, mRemoteDevice.getAddress());
-
+ if (mIsHandoverInitiated) {
+ values.put(BluetoothShare.USER_CONFIRMATION,
+ BluetoothShare.USER_CONFIRMATION_HANDOVER_CONFIRMED);
+ }
final Uri contentUri = mContext.getContentResolver().insert(BluetoothShare.CONTENT_URI,
values);
if (V) Log.v(TAG, "Insert contentUri: " + contentUri + " to device: "