diff options
author | Martijn Coenen <maco@google.com> | 2012-04-06 13:47:52 -0700 |
---|---|---|
committer | Martijn Coenen <maco@google.com> | 2012-04-20 11:10:58 -0700 |
commit | 8099f5e7bfa7227ba674b5f0076f331e737bafd7 (patch) | |
tree | 44d1942249ed12d1f0d91e25d2157f2054cc302d /src/com/android/bluetooth/opp/BluetoothOppManager.java | |
parent | a4e5a2b1e7fc398285e304caf7019572dce3d16f (diff) | |
download | android_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.java | 61 |
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: " |