diff options
author | Martijn Coenen <maco@google.com> | 2012-07-11 12:24:11 -0700 |
---|---|---|
committer | Martijn Coenen <maco@google.com> | 2012-07-16 18:07:14 -0700 |
commit | f5a196b643c654c7ea98a5e2935e3bff6683399b (patch) | |
tree | be3e76827f5325ffbb51aef5b7bb6a0fe9884522 /src/com/android/nfc/P2pLinkManager.java | |
parent | ef4a69e2fc7022ea4eadfa173e3c29ac59530473 (diff) | |
download | packages_apps_nfc-f5a196b643c654c7ea98a5e2935e3bff6683399b.zip packages_apps_nfc-f5a196b643c654c7ea98a5e2935e3bff6683399b.tar.gz packages_apps_nfc-f5a196b643c654c7ea98a5e2935e3bff6683399b.tar.bz2 |
Implement connection handover LLCP service.
The Connection Handover specification dictates that we should
exchange Hr/Hs records over a dedicated LLCP service. This adds
the service, and starts using it by default. It will fall back
to the SNEP GET method to remain compatible with Android 4.1
devices. SNEP GET on these devices will return "Not Implemented",
also per the SNEP spec.
Also fixed a bug in endianness of the OOB record.
Bug: 6759842
Change-Id: Iafe67ab119e933df5dfa0a5645a95bc59badd8ae
Diffstat (limited to 'src/com/android/nfc/P2pLinkManager.java')
-rwxr-xr-x | src/com/android/nfc/P2pLinkManager.java | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/src/com/android/nfc/P2pLinkManager.java b/src/com/android/nfc/P2pLinkManager.java index 189b560..253ddaf 100755 --- a/src/com/android/nfc/P2pLinkManager.java +++ b/src/com/android/nfc/P2pLinkManager.java @@ -17,7 +17,9 @@ package com.android.nfc; import com.android.nfc.echoserver.EchoServer; +import com.android.nfc.handover.HandoverClient; import com.android.nfc.handover.HandoverManager; +import com.android.nfc.handover.HandoverServer; import com.android.nfc.ndefpush.NdefPushClient; import com.android.nfc.ndefpush.NdefPushServer; import com.android.nfc.snep.SnepClient; @@ -123,6 +125,7 @@ public class P2pLinkManager implements Handler.Callback, P2pEventListener.Callba // TODO dynamically assign SAP values static final int NDEFPUSH_SAP = 0x10; + static final int HANDOVER_SAP = 0x14; static final int LINK_DEBOUNCE_MS = 750; @@ -155,6 +158,7 @@ public class P2pLinkManager implements Handler.Callback, P2pEventListener.Callba final NdefPushServer mNdefPushServer; final SnepServer mDefaultSnepServer; + final HandoverServer mHandoverServer; final EchoServer mEchoServer; final ActivityManager mActivityManager; final PackageManager mPackageManager; @@ -178,6 +182,8 @@ public class P2pLinkManager implements Handler.Callback, P2pEventListener.Callba public P2pLinkManager(Context context, HandoverManager handoverManager) { mNdefPushServer = new NdefPushServer(NDEFPUSH_SAP, mNppCallback); mDefaultSnepServer = new SnepServer(mDefaultSnepCallback); + mHandoverServer = new HandoverServer(HANDOVER_SAP, handoverManager, mHandoverCallback); + if (ECHOSERVER_ENABLED) { mEchoServer = new EchoServer(); } else { @@ -206,12 +212,14 @@ public class P2pLinkManager implements Handler.Callback, P2pEventListener.Callba if (!mIsReceiveEnabled && receiveEnable) { mDefaultSnepServer.start(); mNdefPushServer.start(); + mHandoverServer.start(); if (mEchoServer != null) { mHandler.sendEmptyMessage(MSG_START_ECHOSERVER); } } else if (mIsReceiveEnabled && !receiveEnable) { mDefaultSnepServer.stop(); mNdefPushServer.stop(); + mHandoverServer.stop(); if (mEchoServer != null) { mHandler.sendEmptyMessage(MSG_STOP_ECHOSERVER); } @@ -465,11 +473,20 @@ public class P2pLinkManager implements Handler.Callback, P2pEventListener.Callba try { if (uris != null) { + HandoverClient handoverClient = new HandoverClient(); + NdefMessage response = null; NdefMessage request = handoverManager.createHandoverRequestMessage(); if (request != null) { - SnepMessage snepResponse = snepClient.get(request); - response = snepResponse.getNdefMessage(); + response = handoverClient.sendHandoverRequest(request); + + if (response == null) { + // Remote device may not support handover service, + // try the (deprecated) SNEP GET implementation + // for devices running Android 4.1 + SnepMessage snepResponse = snepClient.get(request); + response = snepResponse.getNdefMessage(); + } } // else, handover not supported if (response != null) { handoverManager.doHandoverUri(uris, response); @@ -495,6 +512,13 @@ public class P2pLinkManager implements Handler.Callback, P2pEventListener.Callba return SNEP_FAILURE; } + final HandoverServer.Callback mHandoverCallback = new HandoverServer.Callback() { + @Override + public void onHandoverRequestReceived() { + onReceiveHandover(); + } + }; + final NdefPushServer.Callback mNppCallback = new NdefPushServer.Callback() { @Override public void onMessageReceived(NdefMessage msg) { @@ -511,13 +535,17 @@ public class P2pLinkManager implements Handler.Callback, P2pEventListener.Callba @Override public SnepMessage doGet(int acceptableLength, NdefMessage msg) { + // The NFC Forum Default SNEP server is not allowed to respond to + // SNEP GET requests - see SNEP 1.0 TS section 6.1. However, + // since Android 4.1 used the NFC Forum default server to + // implement connection handover, we will support this + // until we can deprecate it. NdefMessage response = mHandoverManager.tryHandoverRequest(msg); - if (response != null) { onReceiveHandover(); return SnepMessage.getSuccessResponse(response); } else { - return SnepMessage.getMessage(SnepMessage.RESPONSE_NOT_FOUND); + return SnepMessage.getMessage(SnepMessage.RESPONSE_NOT_IMPLEMENTED); } } }; |