diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2016-12-15 02:58:05 -0700 |
---|---|---|
committer | Linux Build Service Account <lnxbuild@localhost> | 2016-12-15 02:58:05 -0700 |
commit | b413e422db30b7f7e3699c2a282e1e5add835399 (patch) | |
tree | bd7a7ee9e6bda175cad692efc763664864e63f00 | |
parent | f65e296c4e37a0796cb062b34086a681b35b857c (diff) | |
parent | b516b5681783ea38a834d77fc02926737472076f (diff) | |
download | android_packages_apps_Nfc-b413e422db30b7f7e3699c2a282e1e5add835399.tar.gz android_packages_apps_Nfc-b413e422db30b7f7e3699c2a282e1e5add835399.tar.bz2 android_packages_apps_Nfc-b413e422db30b7f7e3699c2a282e1e5add835399.zip |
Merge b516b5681783ea38a834d77fc02926737472076f on remote branch
Change-Id: I617e90263c9c0689633be6ca72269852a3a59961
-rwxr-xr-x | AndroidManifest.xml | 3 | ||||
-rwxr-xr-x | nci/jni/NfcTag.cpp | 3 | ||||
-rwxr-xr-x | nci/jni/RoutingManager.cpp | 16 | ||||
-rwxr-xr-x | nci/src/com/android/nfc/dhimpl/NativeNfcTag.java | 5 | ||||
-rw-r--r-- | res/values-iw/strings.xml | 4 | ||||
-rw-r--r-- | res/values-my-rMM/strings.xml | 4 | ||||
-rw-r--r-- | res/values-sv/strings.xml | 4 | ||||
-rw-r--r-- | src/com/android/nfc/BeamShareActivity.java | 9 | ||||
-rwxr-xr-x | src/com/android/nfc/NfcService.java | 111 | ||||
-rw-r--r-- | src/com/android/nfc/beam/BeamTransferManager.java | 3 | ||||
-rw-r--r-- | src/com/android/nfc/cardemulation/CardEmulationManager.java | 10 | ||||
-rw-r--r-- | src/com/android/nfc/handover/HandoverDataParser.java | 9 |
12 files changed, 119 insertions, 62 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index eea72fd4..8cd16c70 100755 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -53,6 +53,9 @@ <uses-permission android:name="com.android.permission.WHITELIST_BLUETOOTH_DEVICE" /> <uses-permission android:name="android.permission.DISPATCH_NFC_MESSAGE" /> <uses-permission android:name="android.permission.OVERRIDE_WIFI_CONFIG" /> + <uses-permission android:name="android.permission.DEVICE_POWER" /> + <uses-permission android:name="android.permission.USER_ACTIVITY" /> + <application android:name=".NfcApplication" android:icon="@drawable/icon" android:label="@string/app_name" diff --git a/nci/jni/NfcTag.cpp b/nci/jni/NfcTag.cpp index ddf354a3..c6e074bd 100755 --- a/nci/jni/NfcTag.cpp +++ b/nci/jni/NfcTag.cpp @@ -1422,6 +1422,9 @@ void NfcTag::connectionEventHandler (UINT8 event, tNFA_CONN_EVT_DATA* data) { SyncEventGuard g (mReadCompleteEvent); mReadCompletedStatus = data->status; + mNdefDetectionTimedOut = data->status != NFA_STATUS_OK; + if (mNdefDetectionTimedOut) + ALOGE ("%s: NDEF detection timed out", fn); mReadCompleteEvent.notifyOne (); } break; diff --git a/nci/jni/RoutingManager.cpp b/nci/jni/RoutingManager.cpp index 6a8a452b..17ccf559 100755 --- a/nci/jni/RoutingManager.cpp +++ b/nci/jni/RoutingManager.cpp @@ -454,20 +454,20 @@ void RoutingManager::notifyDeactivated (UINT8 technology) void RoutingManager::handleData (UINT8 technology, const UINT8* data, UINT32 dataLen, tNFA_STATUS status) { - if (dataLen <= 0) - { - ALOGE("no data"); - goto TheEnd; - } - if (status == NFA_STATUS_CONTINUE) { - mRxDataBuffer.insert (mRxDataBuffer.end(), &data[0], &data[dataLen]); //append data; more to come + if (dataLen > 0) + { + mRxDataBuffer.insert (mRxDataBuffer.end(), &data[0], &data[dataLen]); //append data; more to come + } return; //expect another NFA_CE_DATA_EVT to come } else if (status == NFA_STATUS_OK) { - mRxDataBuffer.insert (mRxDataBuffer.end(), &data[0], &data[dataLen]); //append data + if (dataLen > 0) + { + mRxDataBuffer.insert (mRxDataBuffer.end(), &data[0], &data[dataLen]); //append data + } //entire data packet has been received; no more NFA_CE_DATA_EVT } else if (status == NFA_STATUS_FAILED) diff --git a/nci/src/com/android/nfc/dhimpl/NativeNfcTag.java b/nci/src/com/android/nfc/dhimpl/NativeNfcTag.java index c121a622..6e5ffca7 100755 --- a/nci/src/com/android/nfc/dhimpl/NativeNfcTag.java +++ b/nci/src/com/android/nfc/dhimpl/NativeNfcTag.java @@ -812,11 +812,6 @@ public class NativeNfcTag implements TagEndpoint { if (generateEmptyNdef) { ndefMsg = null; - addNdefTechnology(null, - getConnectedHandle(), - getConnectedLibNfcType(), - getConnectedTechnology(), - supportedNdefLength, cardState); foundFormattable = false; reconnect(); } diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index d7eeb3a6..b7eb4045 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -5,9 +5,9 @@ <string name="nfcUserLabel" msgid="7708535817084357357">"Nfc"</string> <string name="accessibility_nfc_enabled" msgid="7796246979948787735">"NFC מופעל."</string> <string name="tap_to_beam" msgid="5819197866281059878">"הקש כדי להקרין"</string> - <string name="beam_progress" msgid="7453634884807323920">"קרן נכנסת..."</string> + <string name="beam_progress" msgid="7453634884807323920">"שידור נכנס…"</string> <string name="beam_outgoing" msgid="4679536649779123495">"מעביר תוכן..."</string> - <string name="beam_complete" msgid="477026736424637435">"הקרנה הושלמה"</string> + <string name="beam_complete" msgid="477026736424637435">"העברה הושלמה"</string> <string name="beam_failed" msgid="5116241718189888630">"הקרן לא הושלמה"</string> <string name="beam_canceled" msgid="5425192751826544741">"הקרן בוטלה"</string> <string name="cancel" msgid="61873902552555096">"ביטול"</string> diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 7ffb711b..6fb1a4ec 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -10,7 +10,7 @@ <string name="beam_complete" msgid="477026736424637435">"လှိုင်းလွှင့်မှု ပြီးဆုံးပါပြီ"</string> <string name="beam_failed" msgid="5116241718189888630">"လှိုင်းလွှင့်မှု မပြီးဆုံးပါ"</string> <string name="beam_canceled" msgid="5425192751826544741">"လှိုင်းလွှင့်မှု ပယ်ဖျက်မည်"</string> - <string name="cancel" msgid="61873902552555096">"မလုပ်တော့ပါ"</string> + <string name="cancel" msgid="61873902552555096">"မလုပ်တော့"</string> <string name="beam_tap_to_view" msgid="7430394753262448349">"ကြည့်ရှုရန် တို့ပါ"</string> <string name="beam_handover_not_supported" msgid="4083165921751489015">"လက်ခံစက်သည် လှိုင်းလွှင့်ခြင်းမှတစ်ဆင့် ကြီးမားသောဖိုင်လွဲခြင်းများကို မထောက်ပံ့ပါ"</string> <string name="beam_try_again" msgid="3364677301009783455">"ထပ်ပြီး စက်ကို အတူထားပါ"</string> @@ -25,7 +25,7 @@ <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>နှင့်မတွဲချိတ်နိုင်ပါ"</string> <string name="failed_to_enable_bt" msgid="7229153323594758077">"ဘလူးတုသ်ကို မရရှိနိုင်ပါ"</string> <string name="confirm_pairing" msgid="4112568077038265363">"ဘလူးတုသ်စက်<xliff:g id="DEVICE_NAME">%1$s</xliff:g>နှင့် တွဲချိတ်ရန် ကျိန်းသေပါသလား?"</string> - <string name="pair_yes" msgid="3525614878559994448">"မှန်ပါသည်"</string> + <string name="pair_yes" msgid="3525614878559994448">"Yes"</string> <string name="pair_no" msgid="5022308368904055020">"No"</string> <string name="tap_again_to_pay" msgid="5754988005412859897">"<xliff:g id="APP">%1$s</xliff:g>နှင့် ပေးချေရန် နောက်တစ်ခါ ခေါက်ထိပါ"</string> <string name="tap_again_to_complete" msgid="5423640945118279123">"<xliff:g id="APP">%1$s</xliff:g>နှင့် ပြီးဆုံးရန် နောက်တစ်ခါ ခေါက်ထိပါ"</string> diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 56bc2e5f..cc165fa6 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -27,8 +27,8 @@ <string name="confirm_pairing" msgid="4112568077038265363">"Är du säker på att du vill para ihop Bluetooth-enheten <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string> <string name="pair_yes" msgid="3525614878559994448">"Ja"</string> <string name="pair_no" msgid="5022308368904055020">"Nej"</string> - <string name="tap_again_to_pay" msgid="5754988005412859897">"Tryck igen om du vill betala med <xliff:g id="APP">%1$s</xliff:g>"</string> - <string name="tap_again_to_complete" msgid="5423640945118279123">"Tryck igen om du vill slutföra med <xliff:g id="APP">%1$s</xliff:g>"</string> + <string name="tap_again_to_pay" msgid="5754988005412859897">"Tryck igen för att betala med <xliff:g id="APP">%1$s</xliff:g>"</string> + <string name="tap_again_to_complete" msgid="5423640945118279123">"Tryck igen för att slutföra med <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="transaction_failure" msgid="7828102078637936513">"Transaktionen kunde inte slutföras med <xliff:g id="APP">%1$s</xliff:g>."</string> <string name="could_not_use_app" msgid="8137587876138569083">"Det gick inte att använda <xliff:g id="APP">%1$s</xliff:g>."</string> <string name="pay_with" msgid="5531545488795798945">"Betala med"</string> diff --git a/src/com/android/nfc/BeamShareActivity.java b/src/com/android/nfc/BeamShareActivity.java index 76629b88..5b8acacd 100644 --- a/src/com/android/nfc/BeamShareActivity.java +++ b/src/com/android/nfc/BeamShareActivity.java @@ -76,6 +76,15 @@ public class BeamShareActivity extends Activity { } } + @Override + protected void onDestroy() { + try { + unregisterReceiver(mReceiver); + } catch (Exception e) { + Log.w(TAG, e.getMessage()); + } + super.onDestroy(); + } private void showNfcDialogAndExit(int msgId) { IntentFilter filter = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED); diff --git a/src/com/android/nfc/NfcService.java b/src/com/android/nfc/NfcService.java index 90a9bb2f..ab50f23a 100755 --- a/src/com/android/nfc/NfcService.java +++ b/src/com/android/nfc/NfcService.java @@ -73,6 +73,7 @@ import android.os.UserManager; import android.provider.Settings; import android.util.Log; +import com.android.internal.logging.MetricsLogger; import com.android.nfc.DeviceHost.DeviceHostListener; import com.android.nfc.DeviceHost.LlcpConnectionlessSocket; import com.android.nfc.DeviceHost.LlcpServerSocket; @@ -86,6 +87,7 @@ import com.android.nfc.handover.HandoverDataParser; import java.io.FileDescriptor; import java.io.PrintWriter; import java.nio.ByteBuffer; +import java.util.concurrent.atomic.AtomicInteger; import java.util.Arrays; import java.util.ArrayList; import java.util.HashMap; @@ -109,6 +111,10 @@ public class NfcService implements DeviceHostListener { static final String PREF_FIRST_BEAM = "first_beam"; static final String PREF_FIRST_BOOT = "first_boot"; + static final String TRON_NFC_CE = "nfc_ce"; + static final String TRON_NFC_P2P = "nfc_p2p"; + static final String TRON_NFC_TAG = "nfc_tag"; + static final int MSG_NDEF_TAG = 0; static final int MSG_LLCP_LINK_ACTIVATION = 1; static final int MSG_LLCP_LINK_DEACTIVATED = 2; @@ -124,7 +130,10 @@ public class NfcService implements DeviceHostListener { static final int MSG_REGISTER_T3T_IDENTIFIER = 12; static final int MSG_DEREGISTER_T3T_IDENTIFIER = 13; static final int MSG_TAG_DEBOUNCE = 14; + static final int MSG_UPDATE_STATS = 15; + // Update stats every 4 hours + static final long STATS_UPDATE_INTERVAL_MS = 4 * 60 * 60 * 1000; static final long MAX_POLLING_PAUSE_TIMEOUT = 40000; static final int TASK_ENABLE = 1; @@ -207,6 +216,14 @@ public class NfcService implements DeviceHostListener { int mDebounceTagDebounceMs; ITagRemovedCallback mDebounceTagRemovedCallback; + // Only accessed on one thread so doesn't need locking + NdefMessage mLastReadNdefMessage; + + // Metrics + AtomicInteger mNumTagsDetected; + AtomicInteger mNumP2pDetected; + AtomicInteger mNumHceDetected; + // mState is protected by this, however it is only modified in onCreate() // and the default AsyncTask thread so it is read unprotected from that // thread @@ -270,6 +287,8 @@ public class NfcService implements DeviceHostListener { @Override public void onHostCardEmulationDeactivated(int technology) { if (mCardEmulationManager != null) { + // Do metrics here so we don't slow the CE path down + mNumHceDetected.incrementAndGet(); mCardEmulationManager.onHostCardEmulationDeactivated(technology); } } @@ -295,6 +314,7 @@ public class NfcService implements DeviceHostListener { */ @Override public void onLlcpFirstPacketReceived(NfcDepEndpoint device) { + mNumP2pDetected.incrementAndGet(); sendMessage(NfcService.MSG_LLCP_LINK_FIRST_PACKET, device); } @@ -370,6 +390,10 @@ public class NfcService implements DeviceHostListener { mScreenState = mScreenStateHelper.checkScreenState(); + mNumTagsDetected = new AtomicInteger(); + mNumP2pDetected = new AtomicInteger(); + mNumHceDetected = new AtomicInteger(); + // Intents for all users IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_ON); @@ -407,6 +431,8 @@ public class NfcService implements DeviceHostListener { ServiceManager.addService(SERVICE_NAME, mNfcAdapter); new EnableDisableTask().execute(TASK_BOOT); // do blocking boot tasks + + mHandler.sendEmptyMessageDelayed(MSG_UPDATE_STATS, STATS_UPDATE_INTERVAL_MS); } void initSoundPool() { @@ -1800,6 +1826,7 @@ public class NfcService implements DeviceHostListener { case MSG_NDEF_TAG: if (DBG) Log.d(TAG, "Tag detected, notifying applications"); + mNumTagsDetected.incrementAndGet(); TagEndpoint tag = (TagEndpoint) msg.obj; byte[] debounceTagUid; int debounceTagMs; @@ -1809,26 +1836,6 @@ public class NfcService implements DeviceHostListener { debounceTagMs = mDebounceTagDebounceMs; debounceTagRemovedCallback = mDebounceTagRemovedCallback; } - if (debounceTagUid != null) { - if (Arrays.equals(debounceTagUid, tag.getUid())) { - // Still ignoring this tag...poll again and reset debounce timer - mHandler.removeMessages(MSG_TAG_DEBOUNCE); - mHandler.sendEmptyMessageDelayed(MSG_TAG_DEBOUNCE, debounceTagMs); - tag.disconnect(); - return; - } else { - synchronized (NfcService.this) { - mDebounceTagUid = null; - } - if (debounceTagRemovedCallback != null) { - try { - debounceTagRemovedCallback.onTagRemoved(); - } catch (RemoteException e) { - // Ignore - } - } - } - } ReaderModeParams readerParams = null; int presenceCheckDelay = DEFAULT_PRESENCE_CHECK_DELAY; DeviceHost.TagDisconnectedCallback callback = @@ -1851,11 +1858,6 @@ public class NfcService implements DeviceHostListener { } } - boolean playSound = readerParams == null || - (readerParams.flags & NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS) == 0; - if (mScreenState == ScreenStateHelper.SCREEN_STATE_ON_UNLOCKED && playSound) { - playSound(SOUND_START); - } if (tag.getConnectedTechnology() == TagTechnology.NFC_BARCODE) { // When these tags start containing NDEF, they will require // the stack to deal with them in a different way, since @@ -1868,18 +1870,42 @@ public class NfcService implements DeviceHostListener { } NdefMessage ndefMsg = tag.findAndReadNdef(); - if (ndefMsg != null) { - tag.startPresenceChecking(presenceCheckDelay, callback); - dispatchTagEndpoint(tag, readerParams); - } else { - if (tag.reconnect()) { - tag.startPresenceChecking(presenceCheckDelay, callback); - dispatchTagEndpoint(tag, readerParams); - } else { + if (ndefMsg == null) { + // First try to see if this was a bad tag read + if (!tag.reconnect()) { + tag.disconnect(); + break; + } + } + + if (debounceTagUid != null) { + // If we're debouncing and the UID or the NDEF message of the tag match, + // don't dispatch but drop it. + if (Arrays.equals(debounceTagUid, tag.getUid()) || + (ndefMsg != null && ndefMsg.equals(mLastReadNdefMessage))) { + mHandler.removeMessages(MSG_TAG_DEBOUNCE); + mHandler.sendEmptyMessageDelayed(MSG_TAG_DEBOUNCE, debounceTagMs); tag.disconnect(); - playSound(SOUND_ERROR); + return; + } else { + synchronized (NfcService.this) { + mDebounceTagUid = null; + mDebounceTagRemovedCallback = null; + } + if (debounceTagRemovedCallback != null) { + try { + debounceTagRemovedCallback.onTagRemoved(); + } catch (RemoteException e) { + // Ignore + } + } } } + + mLastReadNdefMessage = ndefMsg; + + tag.startPresenceChecking(presenceCheckDelay, callback); + dispatchTagEndpoint(tag, readerParams); break; case MSG_LLCP_LINK_ACTIVATION: if (mIsDebugBuild) { @@ -1936,6 +1962,7 @@ public class NfcService implements DeviceHostListener { synchronized (NfcService.this) { mDebounceTagUid = null; tagRemovedCallback = mDebounceTagRemovedCallback; + mDebounceTagRemovedCallback = null; } if (tagRemovedCallback != null) { try { @@ -1945,6 +1972,22 @@ public class NfcService implements DeviceHostListener { } } break; + case MSG_UPDATE_STATS: + if (mNumTagsDetected.get() > 0) { + MetricsLogger.count(mContext, TRON_NFC_TAG, mNumTagsDetected.get()); + mNumTagsDetected.set(0); + } + if (mNumHceDetected.get() > 0) { + MetricsLogger.count(mContext, TRON_NFC_CE, mNumHceDetected.get()); + mNumHceDetected.set(0); + } + if (mNumP2pDetected.get() > 0) { + MetricsLogger.count(mContext, TRON_NFC_P2P, mNumP2pDetected.get()); + mNumP2pDetected.set(0); + } + removeMessages(MSG_UPDATE_STATS); + sendEmptyMessageDelayed(MSG_UPDATE_STATS, STATS_UPDATE_INTERVAL_MS); + break; default: Log.e(TAG, "Unknown message received"); break; diff --git a/src/com/android/nfc/beam/BeamTransferManager.java b/src/com/android/nfc/beam/BeamTransferManager.java index a082d8fd..e05c223d 100644 --- a/src/com/android/nfc/beam/BeamTransferManager.java +++ b/src/com/android/nfc/beam/BeamTransferManager.java @@ -251,7 +251,8 @@ public class BeamTransferManager implements Handler.Callback, } public boolean isRunning() { - if (mState != STATE_NEW && mState != STATE_IN_PROGRESS && mState != STATE_W4_NEXT_TRANSFER) { + if (mState != STATE_NEW && mState != STATE_IN_PROGRESS && mState != STATE_W4_NEXT_TRANSFER + && mState != STATE_CANCELLING) { return false; } else { return true; diff --git a/src/com/android/nfc/cardemulation/CardEmulationManager.java b/src/com/android/nfc/cardemulation/CardEmulationManager.java index 73ed881a..5f1ff5b8 100644 --- a/src/com/android/nfc/cardemulation/CardEmulationManager.java +++ b/src/com/android/nfc/cardemulation/CardEmulationManager.java @@ -32,6 +32,8 @@ import android.nfc.cardemulation.NfcFCardEmulation; import android.os.Binder; import android.os.RemoteException; import android.os.UserHandle; +import android.os.PowerManager; +import android.os.SystemClock; import android.provider.Settings; import android.util.Log; @@ -75,6 +77,7 @@ public class CardEmulationManager implements RegisteredServicesCache.Callback, final Context mContext; final CardEmulationInterface mCardEmulationInterface; final NfcFCardEmulationInterface mNfcFCardEmulationInterface; + final PowerManager mPowerManager; public CardEmulationManager(Context context) { mContext = context; @@ -91,6 +94,7 @@ public class CardEmulationManager implements RegisteredServicesCache.Callback, context, mNfcFServicesCache, mT3tIdentifiersCache, this); mServiceCache.initialize(); mNfcFServicesCache.initialize(); + mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); } public INfcCardEmulation getNfcCardEmulationInterface() { @@ -103,6 +107,9 @@ public class CardEmulationManager implements RegisteredServicesCache.Callback, public void onHostCardEmulationActivated(int technology) { + if (mPowerManager != null) { + mPowerManager.userActivity(SystemClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0); + } if (technology == NFC_HCE_APDU) { mHostEmulationManager.onHostEmulationActivated(); mPreferredServices.onHostEmulationActivated(); @@ -114,6 +121,9 @@ public class CardEmulationManager implements RegisteredServicesCache.Callback, } public void onHostCardEmulationData(int technology, byte[] data) { + if (mPowerManager != null) { + mPowerManager.userActivity(SystemClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0); + } if (technology == NFC_HCE_APDU) { mHostEmulationManager.onHostEmulationData(data); } else if (technology == NFC_HCE_NFCF) { diff --git a/src/com/android/nfc/handover/HandoverDataParser.java b/src/com/android/nfc/handover/HandoverDataParser.java index eb77aaad..2921c679 100644 --- a/src/com/android/nfc/handover/HandoverDataParser.java +++ b/src/com/android/nfc/handover/HandoverDataParser.java @@ -443,15 +443,8 @@ public class HandoverDataParser { break; } - byte[] reversedTK = new byte[len - 1]; - payload.get(reversedTK); - byte[] securityManagerTK = new byte[len - 1]; - - //TK in AD is in reverse order - for (int i = 0; i < reversedTK.length; i++) { - securityManagerTK[i] = reversedTK[securityManagerTK.length - 1 - i]; - } + payload.get(securityManagerTK); result.oobData = new OobData(); result.oobData.setSecurityManagerTk(securityManagerTK); |