Merge tag 'android-security-13.0.0_r9' into int/13/fp3

Android security 13.0.0 release 9

* tag 'android-security-13.0.0_r9':
  Ensure that SecureNFC setting cannot be bypassed

Change-Id: I6068dd57571023a944a6b8eda3e40d9a4d189a71
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index b622de5..2853706 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -35,7 +35,7 @@
     <string name="could_not_use_app" msgid="8137587876138569083">"<xliff:g id="APP">%1$s</xliff:g> ব্যৱহাৰ কৰিব পৰা নগ\'ল৷"</string>
     <string name="pay_with" msgid="5531545488795798945">"ইয়াৰ জৰিয়তে পৰিশোধ কৰক"</string>
     <string name="complete_with" msgid="6797459104103012992">"ইয়াৰ জৰিয়তে সম্পূৰ্ণ কৰক"</string>
-    <string name="default_pay_app_removed" msgid="4108250545457437360">"আপোনাৰ পচন্দৰ \'টিপক আৰু পৰিশোধ কৰক\' এপটো আঁতৰোৱা হৈছে৷ অন্য এটা বাছনি কৰিবনে?"</string>
+    <string name="default_pay_app_removed" msgid="4108250545457437360">"আপোনাৰ পচন্দৰ \'টিপক আৰু পৰিশোধ কৰক\' এপ্‌টো আঁতৰোৱা হৈছে৷ অন্য এটা বাছনি কৰিবনে?"</string>
     <string name="ask_nfc_tap" msgid="2925239870458286340">"সম্পূৰ্ণ কৰিবলৈ অন্য এটা ডিভাইচত টিপক"</string>
     <string name="wifi_connect" msgid="6250727951843550671">"সংযোগ কৰক"</string>
     <string name="status_unable_to_connect" msgid="9183908200295307657">"নেটৱৰ্কৰ লগত সংযোগ কৰিব পৰা নগ\'ল"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 504d8c4..bc85bc1 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="78565911793142902">"Nfc Service"</string>
+    <string name="app_name" msgid="78565911793142902">"Услуга NFC"</string>
     <string name="nfcUserLabel" msgid="7708535817084357357">"NFC"</string>
-    <string name="accessibility_nfc_enabled" msgid="7796246979948787735">"КБП е активирана."</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_outgoing" msgid="4679536649779123495">"Излъчва се..."</string>
@@ -42,15 +42,15 @@
     <string name="status_wifi_connected" msgid="5893022897732105739">"Установена е връзка"</string>
     <string name="title_connect_to_network" msgid="2474034615817280146">"Установяване на връзка с мрежата"</string>
     <string name="prompt_connect_to_network" msgid="8511683573657516114">"Да се установи ли връзка с мрежата „<xliff:g id="NETWORK_SSID">%1$s</xliff:g>“?"</string>
-    <string name="beam_requires_nfc_enabled" msgid="2800366967218600534">"Функцията „Android Лъч“ изисква да активирате КБП. Искате ли да го направите?"</string>
+    <string name="beam_requires_nfc_enabled" msgid="2800366967218600534">"Функцията „Android Лъч“ изисква да активирате NFC. Искате ли да го направите?"</string>
     <string name="android_beam" msgid="1666446406999492763">"Android Лъч"</string>
     <string name="beam_requires_external_storage_permission" msgid="8798337545702206901">"Приложението няма разрешение за външно хранилище. То се изисква за излъчването на този файл"</string>
     <string name="title_confirm_url_open" msgid="8069968913244794478">"Да се отвори ли връзката?"</string>
-    <string name="summary_confirm_url_open" product="tablet" msgid="3353502750736192055">"Таблетът ви получи връзка през КБП:"</string>
-    <string name="summary_confirm_url_open" product="default" msgid="1246398412196449226">"Телефонът ви получи връзка през КБП:"</string>
+    <string name="summary_confirm_url_open" product="tablet" msgid="3353502750736192055">"Таблетът ви получи връзка през NFC:"</string>
+    <string name="summary_confirm_url_open" product="default" msgid="1246398412196449226">"Телефонът ви получи връзка през NFC:"</string>
     <string name="action_confirm_url_open" msgid="3458322738812921189">"Отваряне на връзката"</string>
     <string name="tag_read_error" msgid="2485274498885877547">"Грешка при четене за NFC. Опитайте отново."</string>
-    <string name="tag_dispatch_failed" msgid="3562984995049738400">"Няма приложение, което поддържа този маркер за КБП"</string>
+    <string name="tag_dispatch_failed" msgid="3562984995049738400">"Няма приложение, което поддържа този маркер за NFC"</string>
     <string name="nfc_blocking_alert_title" msgid="1086172436984457085">"Функцията NFC може да е блокирана"</string>
     <string name="nfc_blocking_alert_message" msgid="7003156052570107490">"Докоснете, за да научите как да отстраните проблема."</string>
 </resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 946a42b..a5c9859 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -35,7 +35,7 @@
     <string name="could_not_use_app" msgid="8137587876138569083">"No se pudo utilizar <xliff:g id="APP">%1$s</xliff:g>."</string>
     <string name="pay_with" msgid="5531545488795798945">"Pagar con"</string>
     <string name="complete_with" msgid="6797459104103012992">"Completar con"</string>
-    <string name="default_pay_app_removed" msgid="4108250545457437360">"Se eliminó tu servicio preferido para usar la función Presionar y pagar. ¿Quieres seleccionar otro?"</string>
+    <string name="default_pay_app_removed" msgid="4108250545457437360">"Se eliminó tu servicio preferido para usar el pago sin contacto. ¿Quieres seleccionar otro?"</string>
     <string name="ask_nfc_tap" msgid="2925239870458286340">"Presiona otro dispositivo para completar."</string>
     <string name="wifi_connect" msgid="6250727951843550671">"Conectar"</string>
     <string name="status_unable_to_connect" msgid="9183908200295307657">"No se pudo establecer la conexión con la red."</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index eddc2c5..628bddd 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -35,7 +35,7 @@
     <string name="could_not_use_app" msgid="8137587876138569083">"نتوانست از <xliff:g id="APP">%1$s</xliff:g> استفاده کند."</string>
     <string name="pay_with" msgid="5531545488795798945">"پرداخت با"</string>
     <string name="complete_with" msgid="6797459104103012992">"تکمیل با"</string>
-    <string name="default_pay_app_removed" msgid="4108250545457437360">"سرویس ترجیحی شما برای ضربه و پرداخت حذف شده است. سرویس دیگری را انتخاب می‌کنید؟"</string>
+    <string name="default_pay_app_removed" msgid="4108250545457437360">"سرویس ترجیحی شما برای «پرداخت با یک ضربه» حذف شده است. سرویس دیگری انتخاب می‌کنید؟"</string>
     <string name="ask_nfc_tap" msgid="2925239870458286340">"برای تکمیل، روی دستگاه دیگری ضربه بزنید"</string>
     <string name="wifi_connect" msgid="6250727951843550671">"اتصال"</string>
     <string name="status_unable_to_connect" msgid="9183908200295307657">"اتصال به شبکه ممکن نیست"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index f444a10..b779868 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -42,7 +42,7 @@
     <string name="status_wifi_connected" msgid="5893022897732105739">"Connecté"</string>
     <string name="title_connect_to_network" msgid="2474034615817280146">"Se connecter au réseau"</string>
     <string name="prompt_connect_to_network" msgid="8511683573657516114">"Se connecter au réseau <xliff:g id="NETWORK_SSID">%1$s</xliff:g> ?"</string>
-    <string name="beam_requires_nfc_enabled" msgid="2800366967218600534">"L\'activation de la NFC est nécessaire pour utiliser Android Beam. Voulez-vous l\'activer ?"</string>
+    <string name="beam_requires_nfc_enabled" msgid="2800366967218600534">"L\'activation de le NFC est nécessaire pour utiliser Android Beam. Voulez-vous l\'activer ?"</string>
     <string name="android_beam" msgid="1666446406999492763">"Android Beam"</string>
     <string name="beam_requires_external_storage_permission" msgid="8798337545702206901">"L\'application n\'est pas autorisée à accéder à l\'espace de stockage externe. Or, cette autorisation est requise pour partager ce fichier."</string>
     <string name="title_confirm_url_open" msgid="8069968913244794478">"Ouvrir le lien ?"</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index b956b7e..45e999d 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -27,7 +27,7 @@
     <string name="confirm_pairing" msgid="4112568077038265363">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> Bluetooth түзмөгүн байланыштырасызбы?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Ооба"</string>
     <string name="pair_no" msgid="5022308368904055020">"Жок"</string>
-    <string name="tap_again_to_pay" msgid="5754988005412859897">"<xliff:g id="APP">%1$s</xliff:g> менен төлөө үчүн, кайра тийиңиз"</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>
     <string name="tap_again_description" msgid="3019101527041529661">"Окугучка жакын кармаңыз"</string>
     <string name="appchooser_description" msgid="2554187931814833244">"Скандоочу колдонмону тандаңыз"</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 48e666f..f879c6d 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="78565911793142902">"Nfc ဆားဗစ်"</string>
+    <string name="app_name" msgid="78565911793142902">"Nfc ဝန်ဆောင်မှု"</string>
     <string name="nfcUserLabel" msgid="7708535817084357357">"NFC"</string>
     <string name="accessibility_nfc_enabled" msgid="7796246979948787735">"NFC ရရှိသည်"</string>
     <string name="tap_to_beam" msgid="5819197866281059878">"ဘင်းမ်လုပ်ရန် တို့ပါ"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 854d4e3..e594a6f 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -35,7 +35,7 @@
     <string name="could_not_use_app" msgid="8137587876138569083">"Kunne ikke bruke <xliff:g id="APP">%1$s</xliff:g>."</string>
     <string name="pay_with" msgid="5531545488795798945">"Betal med"</string>
     <string name="complete_with" msgid="6797459104103012992">"Fullfør med"</string>
-    <string name="default_pay_app_removed" msgid="4108250545457437360">"Den foretrukne tjenesten din for berøringsbetaling har blitt fjernet. Vil du velge en annen?"</string>
+    <string name="default_pay_app_removed" msgid="4108250545457437360">"Den foretrukne tjenesten din for kontaktløs betaling er fjernet. Vil du velge en annen?"</string>
     <string name="ask_nfc_tap" msgid="2925239870458286340">"Trykk på en annen enhet for å fullføre"</string>
     <string name="wifi_connect" msgid="6250727951843550671">"Koble til"</string>
     <string name="status_unable_to_connect" msgid="9183908200295307657">"Kunne ikke koble til nettverket"</string>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 2421fef..7b6d321 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/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>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 304227d..652902c 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -4,17 +4,17 @@
     <string name="app_name" msgid="78565911793142902">"Serviciul NFC"</string>
     <string name="nfcUserLabel" msgid="7708535817084357357">"NFC"</string>
     <string name="accessibility_nfc_enabled" msgid="7796246979948787735">"NFC activat."</string>
-    <string name="tap_to_beam" msgid="5819197866281059878">"Atingeți pentru a transmite"</string>
+    <string name="tap_to_beam" msgid="5819197866281059878">"Atinge pentru a transmite"</string>
     <string name="beam_progress" msgid="7453634884807323920">"Transmitere primită..."</string>
     <string name="beam_outgoing" msgid="4679536649779123495">"Se transmite..."</string>
     <string name="beam_complete" msgid="477026736424637435">"Transmitere încheiată"</string>
     <string name="beam_failed" msgid="5116241718189888630">"Transmiterea nu este finalizată"</string>
     <string name="beam_canceled" msgid="5425192751826544741">"Transmitere anulată"</string>
-    <string name="cancel" msgid="61873902552555096">"Anulați"</string>
-    <string name="beam_tap_to_view" msgid="7430394753262448349">"Atingeți pentru a afișa"</string>
+    <string name="cancel" msgid="61873902552555096">"Anulează"</string>
+    <string name="beam_tap_to_view" msgid="7430394753262448349">"Atinge pentru a afișa"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Dispozitivul destinatarului nu acceptă transferul fișierelor mari prin fascicul."</string>
-    <string name="beam_try_again" msgid="3364677301009783455">"Apropiați dispozitivele din nou"</string>
-    <string name="beam_busy" msgid="5253335587620612576">"Beam este ocupat. Încercați după finalizarea transferului anterior."</string>
+    <string name="beam_try_again" msgid="3364677301009783455">"Apropie dispozitivele din nou"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam este ocupat. Încearcă după finalizarea transferului anterior."</string>
     <string name="device" msgid="4459621591392478151">"dispozitiv"</string>
     <string name="connecting_peripheral" msgid="1296182660525660935">"Se conectează <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="connected_peripheral" msgid="20748648543160091">"S-a conectat <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -24,33 +24,33 @@
     <string name="pairing_peripheral" msgid="6983626861540899365">"Se asociază <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Nu s-a putut asocia <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Activarea Bluetooth a eșuat"</string>
-    <string name="confirm_pairing" msgid="4112568077038265363">"Sigur doriți să asociați dispozitivul Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
+    <string name="confirm_pairing" msgid="4112568077038265363">"Sigur dorești să asociezi dispozitivul Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Da"</string>
     <string name="pair_no" msgid="5022308368904055020">"Nu"</string>
-    <string name="tap_again_to_pay" msgid="5754988005412859897">"Atingeți din nou pentru a plăti cu <xliff:g id="APP">%1$s</xliff:g>"</string>
-    <string name="tap_again_to_complete" msgid="5423640945118279123">"Atingeți din nou pentru a finaliza cu <xliff:g id="APP">%1$s</xliff:g>"</string>
-    <string name="tap_again_description" msgid="3019101527041529661">"Apropiați de cititor"</string>
-    <string name="appchooser_description" msgid="2554187931814833244">"Alegeți aplicația pentru scanare"</string>
+    <string name="tap_again_to_pay" msgid="5754988005412859897">"Atinge din nou pentru a plăti cu <xliff:g id="APP">%1$s</xliff:g>"</string>
+    <string name="tap_again_to_complete" msgid="5423640945118279123">"Atinge din nou pentru a finaliza cu <xliff:g id="APP">%1$s</xliff:g>"</string>
+    <string name="tap_again_description" msgid="3019101527041529661">"Apropie de cititor"</string>
+    <string name="appchooser_description" msgid="2554187931814833244">"Alege aplicația pentru scanare"</string>
     <string name="transaction_failure" msgid="7828102078637936513">"Această tranzacție nu a putut fi finalizată cu <xliff:g id="APP">%1$s</xliff:g>."</string>
     <string name="could_not_use_app" msgid="8137587876138569083">"Nu s-a putut utiliza <xliff:g id="APP">%1$s</xliff:g>."</string>
-    <string name="pay_with" msgid="5531545488795798945">"Plătiți cu"</string>
-    <string name="complete_with" msgid="6797459104103012992">"Finalizați cu"</string>
-    <string name="default_pay_app_removed" msgid="4108250545457437360">"Serviciul preferat pentru funcția „atingeți și plătiți” a fost eliminat. Alegeți altul?"</string>
-    <string name="ask_nfc_tap" msgid="2925239870458286340">"Atingeți alt dispozitiv pentru a finaliza"</string>
-    <string name="wifi_connect" msgid="6250727951843550671">"Conectați"</string>
+    <string name="pay_with" msgid="5531545488795798945">"Plătește cu"</string>
+    <string name="complete_with" msgid="6797459104103012992">"Finalizează cu"</string>
+    <string name="default_pay_app_removed" msgid="4108250545457437360">"Serviciul preferat pentru funcția „atinge și plătește” a fost eliminat. Alegi altul?"</string>
+    <string name="ask_nfc_tap" msgid="2925239870458286340">"Atinge alt dispozitiv pentru a finaliza"</string>
+    <string name="wifi_connect" msgid="6250727951843550671">"Conectează"</string>
     <string name="status_unable_to_connect" msgid="9183908200295307657">"Conectarea la rețea nu este posibilă"</string>
     <string name="status_wifi_connected" msgid="5893022897732105739">"Conectată"</string>
-    <string name="title_connect_to_network" msgid="2474034615817280146">"Conectați-vă la rețea"</string>
-    <string name="prompt_connect_to_network" msgid="8511683573657516114">"Doriți să vă conectați la rețeaua <xliff:g id="NETWORK_SSID">%1$s</xliff:g>?"</string>
-    <string name="beam_requires_nfc_enabled" msgid="2800366967218600534">"Android Beam necesită activarea NFC. Activați?"</string>
+    <string name="title_connect_to_network" msgid="2474034615817280146">"Conectează-te la rețea"</string>
+    <string name="prompt_connect_to_network" msgid="8511683573657516114">"Dorești să te conectezi la rețeaua <xliff:g id="NETWORK_SSID">%1$s</xliff:g>?"</string>
+    <string name="beam_requires_nfc_enabled" msgid="2800366967218600534">"Android Beam necesită activarea NFC. Activezi?"</string>
     <string name="android_beam" msgid="1666446406999492763">"Android Beam"</string>
     <string name="beam_requires_external_storage_permission" msgid="8798337545702206901">"Aplicația nu are permisiune de stocare externă. Aceasta este necesară pentru transmiterea fișierului."</string>
-    <string name="title_confirm_url_open" msgid="8069968913244794478">"Accesați linkul?"</string>
-    <string name="summary_confirm_url_open" product="tablet" msgid="3353502750736192055">"Tableta dvs. a primit un link prin NFC:"</string>
-    <string name="summary_confirm_url_open" product="default" msgid="1246398412196449226">"Telefonul dvs. a primit un link prin NFC:"</string>
-    <string name="action_confirm_url_open" msgid="3458322738812921189">"Accesați linkul"</string>
-    <string name="tag_read_error" msgid="2485274498885877547">"Eroare de citire NFC. Încercați din nou."</string>
+    <string name="title_confirm_url_open" msgid="8069968913244794478">"Accesezi linkul?"</string>
+    <string name="summary_confirm_url_open" product="tablet" msgid="3353502750736192055">"Tableta ta a primit un link prin NFC:"</string>
+    <string name="summary_confirm_url_open" product="default" msgid="1246398412196449226">"Telefonul tău a primit un link prin NFC:"</string>
+    <string name="action_confirm_url_open" msgid="3458322738812921189">"Accesează linkul"</string>
+    <string name="tag_read_error" msgid="2485274498885877547">"Eroare de citire NFC. Încearcă din nou."</string>
     <string name="tag_dispatch_failed" msgid="3562984995049738400">"Nu există aplicații acceptate pentru această etichetă NFC"</string>
     <string name="nfc_blocking_alert_title" msgid="1086172436984457085">"Tehnologia NFC poate fi blocată"</string>
-    <string name="nfc_blocking_alert_message" msgid="7003156052570107490">"Atingeți ca să aflați cum să remediați problema."</string>
+    <string name="nfc_blocking_alert_message" msgid="7003156052570107490">"Atinge ca să afli cum să remediezi problema."</string>
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index b8e659d..9dcf4c3 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -35,7 +35,7 @@
     <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>
     <string name="complete_with" msgid="6797459104103012992">"Slutför med"</string>
-    <string name="default_pay_app_removed" msgid="4108250545457437360">"Standardtjänsten för snudda och betala har tagits bort. Vill du välja en annan?"</string>
+    <string name="default_pay_app_removed" msgid="4108250545457437360">"Standardtjänsten för blippa och betala har tagits bort. Vill du välja en annan?"</string>
     <string name="ask_nfc_tap" msgid="2925239870458286340">"Slutför genom att trycka på en annan enhet"</string>
     <string name="wifi_connect" msgid="6250727951843550671">"Anslut"</string>
     <string name="status_unable_to_connect" msgid="9183908200295307657">"Det gick inte att ansluta till nätverket"</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index d4cc4b9..7ae4a0b 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="78565911793142902">"Nfc సేవ"</string>
+    <string name="app_name" msgid="78565911793142902">"Nfc సర్వీస్"</string>
     <string name="nfcUserLabel" msgid="7708535817084357357">"Nfc"</string>
     <string name="accessibility_nfc_enabled" msgid="7796246979948787735">"NFC ప్రారంభించబడింది."</string>
     <string name="tap_to_beam" msgid="5819197866281059878">"ప్రసారం చేయడానికి నొక్కండి"</string>
@@ -11,7 +11,7 @@
     <string name="beam_failed" msgid="5116241718189888630">"Beam పూర్తి కాలేదు"</string>
     <string name="beam_canceled" msgid="5425192751826544741">"Beam రద్దు చేయబడింది"</string>
     <string name="cancel" msgid="61873902552555096">"రద్దు చేయండి"</string>
-    <string name="beam_tap_to_view" msgid="7430394753262448349">"వీక్షించడానికి నొక్కండి"</string>
+    <string name="beam_tap_to_view" msgid="7430394753262448349">"చూడటానికి నొక్కండి"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"స్వీకర్త పరికరం Beam ద్వారా పెద్ద ఫైల్ బదిలీకి మద్దతు ఇవ్వదు."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"పరికరాలను మళ్లీ సమీపంలోకి తీసుకురండి"</string>
     <string name="beam_busy" msgid="5253335587620612576">"Beam ప్రస్తుతం బిజీగా ఉంది. మునుపటి బదిలీ పూర్తయిన తర్వాత మళ్లీ ప్రయత్నించండి."</string>
@@ -44,7 +44,7 @@
     <string name="prompt_connect_to_network" msgid="8511683573657516114">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> నెట్‌వర్క్‌కు కనెక్ట్ చేయాలా?"</string>
     <string name="beam_requires_nfc_enabled" msgid="2800366967218600534">"Android Beam కోసం NFC ప్రారంభించబడటం అవసరం. మీరు దాన్ని ప్రారంభించాలనుకుంటున్నారా?"</string>
     <string name="android_beam" msgid="1666446406999492763">"Android Beam"</string>
-    <string name="beam_requires_external_storage_permission" msgid="8798337545702206901">"అప్లికేషన్ బాహ్య నిల్వ అనుమతిని కలిగి లేదు. దీనికి ఈ ఫైల్‌ని బీమ్ చేయడం అవసరమవుతుంది"</string>
+    <string name="beam_requires_external_storage_permission" msgid="8798337545702206901">"అప్లికేషన్ బాహ్య స్టోరేజ్‌ అనుమతిని కలిగి లేదు. దీనికి ఈ ఫైల్‌ని బీమ్ చేయడం అవసరమవుతుంది"</string>
     <string name="title_confirm_url_open" msgid="8069968913244794478">"లింక్‌ని తెరవాలా?"</string>
     <string name="summary_confirm_url_open" product="tablet" msgid="3353502750736192055">"మీ టాబ్లెట్ NFC ద్వారా లింక్‌ని పొందింది:"</string>
     <string name="summary_confirm_url_open" product="default" msgid="1246398412196449226">"మీ ఫోన్ NFC ద్వారా లింక్‌ని పొందింది:"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 439c9ae..359e6c3 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -29,7 +29,7 @@
     <string name="pair_no" msgid="5022308368904055020">"Không"</string>
     <string name="tap_again_to_pay" msgid="5754988005412859897">"Nhấn lại để thanh toán bằng <xliff:g id="APP">%1$s</xliff:g>"</string>
     <string name="tap_again_to_complete" msgid="5423640945118279123">"Nhấn lại để hoàn tất bằng <xliff:g id="APP">%1$s</xliff:g>"</string>
-    <string name="tap_again_description" msgid="3019101527041529661">"Đưa vào gần đầu đọc"</string>
+    <string name="tap_again_description" msgid="3019101527041529661">"Đưa vào máy đọc thẻ"</string>
     <string name="appchooser_description" msgid="2554187931814833244">"Chọn ứng dụng để quét"</string>
     <string name="transaction_failure" msgid="7828102078637936513">"Không thể hoàn tất giao dịch này bằng <xliff:g id="APP">%1$s</xliff:g>."</string>
     <string name="could_not_use_app" msgid="8137587876138569083">"Không thể sử dụng <xliff:g id="APP">%1$s</xliff:g>."</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 73a6a34..1068ca9 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="78565911793142902">"NFC服务"</string>
+    <string name="app_name" msgid="78565911793142902">"NFC 服务"</string>
     <string name="nfcUserLabel" msgid="7708535817084357357">"NFC"</string>
     <string name="accessibility_nfc_enabled" msgid="7796246979948787735">"NFC已开启。"</string>
     <string name="tap_to_beam" msgid="5819197866281059878">"点按即可传输"</string>
@@ -35,7 +35,7 @@
     <string name="could_not_use_app" msgid="8137587876138569083">"无法使用“<xliff:g id="APP">%1$s</xliff:g>”。"</string>
     <string name="pay_with" msgid="5531545488795798945">"付款方式:"</string>
     <string name="complete_with" msgid="6797459104103012992">"使用以下应用完成操作:"</string>
-    <string name="default_pay_app_removed" msgid="4108250545457437360">"用于触碰付款的首选服务已遭删除,您要选择使用其他服务吗?"</string>
+    <string name="default_pay_app_removed" msgid="4108250545457437360">"用于感应式付款的首选服务已遭删除,您要选择使用其他服务吗?"</string>
     <string name="ask_nfc_tap" msgid="2925239870458286340">"请点按其他设备来完成操作"</string>
     <string name="wifi_connect" msgid="6250727951843550671">"连接"</string>
     <string name="status_unable_to_connect" msgid="9183908200295307657">"无法连接到网络"</string>
diff --git a/res/values/config.xml b/res/values/config.xml
index b7658e1..fc399f3 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -12,6 +12,8 @@
     <integer name="max_antenna_blocked_failure_count">10</integer>
     <integer name="toast_debounce_time_ms">3000</integer>
     <integer name="unknown_tag_polling_delay">2000</integer>
+    <integer name="unknown_tag_polling_delay_count_max">5</integer>
+    <integer name="unknown_tag_polling_delay_long">30000</integer>
 
     <!-- List of SKUs where Secure NFC functionality is supported -->
     <string-array name="config_skuSupportsSecureNfc" translatable="false" />
diff --git a/src/com/android/nfc/ForegroundUtils.java b/src/com/android/nfc/ForegroundUtils.java
index 4ecec4b..fb66118 100644
--- a/src/com/android/nfc/ForegroundUtils.java
+++ b/src/com/android/nfc/ForegroundUtils.java
@@ -16,9 +16,6 @@
 package com.android.nfc;
 
 import android.app.ActivityManager;
-import android.app.IActivityManager;
-import android.app.IProcessObserver;
-import android.os.RemoteException;
 import android.os.SystemProperties;
 import android.util.Log;
 import android.util.SparseArray;
@@ -27,10 +24,10 @@
 import java.util.ArrayList;
 import java.util.List;
 
-public class ForegroundUtils extends IProcessObserver.Stub {
+public class ForegroundUtils implements ActivityManager.OnUidImportanceListener {
     static final boolean DBG = SystemProperties.getBoolean("persist.nfc.debug_enabled", false);;
     private final String TAG = "ForegroundUtils";
-    private final IActivityManager mIActivityManager;
+    private final ActivityManager mActivityManager;
 
     private final Object mLock = new Object();
     // We need to keep track of the individual PIDs per UID,
@@ -41,17 +38,20 @@
     private final SparseArray<List<Callback>> mBackgroundCallbacks =
             new SparseArray<List<Callback>>();
 
+    private final SparseBooleanArray mForegroundUids = new SparseBooleanArray();
+
     private static class Singleton {
-        private static final ForegroundUtils INSTANCE = new ForegroundUtils();
+        private static ForegroundUtils sInstance = null;
     }
 
-    private ForegroundUtils() {
-        mIActivityManager = ActivityManager.getService();
+    private ForegroundUtils(ActivityManager am) {
+        mActivityManager = am;
         try {
-            mIActivityManager.registerProcessObserver(this);
-        } catch (RemoteException e) {
+            mActivityManager.addOnUidImportanceListener(this,
+                    ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND);
+        } catch (Exception e) {
             // Should not happen!
-            Log.e(TAG, "ForegroundUtils: could not get IActivityManager");
+            Log.e(TAG, "ForegroundUtils: could not register UidImportanceListener");
         }
     }
 
@@ -59,8 +59,17 @@
         void onUidToBackground(int uid);
     }
 
-    public static ForegroundUtils getInstance() {
-        return Singleton.INSTANCE;
+    /**
+     * Get an instance of the ForegroundUtils sinleton
+     *
+     * @param am The ActivityManager instance for initialization
+     * @return the instance
+     */
+    public static ForegroundUtils getInstance(ActivityManager am) {
+        if (Singleton.sInstance == null) {
+            Singleton.sInstance = new ForegroundUtils(am);
+        }
+        return Singleton.sInstance;
     }
 
     /**
@@ -103,27 +112,26 @@
      *         if none are found.
      */
     public List<Integer> getForegroundUids() {
-        ArrayList<Integer> uids = new ArrayList<Integer>(mForegroundUidPids.size());
+        ArrayList<Integer> uids = new ArrayList<Integer>(mForegroundUids.size());
         synchronized (mLock) {
-            for (int i = 0; i < mForegroundUidPids.size(); i++) {
-                uids.add(mForegroundUidPids.keyAt(i));
+            for (int i = 0; i < mForegroundUids.size(); i++) {
+                if (mForegroundUids.valueAt(i)) {
+                    uids.add(mForegroundUids.keyAt(i));
+                }
             }
         }
         return uids;
     }
 
     private boolean isInForegroundLocked(int uid) {
-        if (mForegroundUidPids.get(uid) != null)
+        if (mForegroundUids.get(uid)) {
             return true;
-        if (DBG) Log.d(TAG, "Checking UID:" + Integer.toString(uid));
-        try {
-            // If the onForegroundActivitiesChanged() has not yet been called,
-            // check whether the UID is in an active state to use the NFC.
-            return mIActivityManager.isUidActive(uid, NfcApplication.NFC_PROCESS);
-        } catch (RemoteException e) {
-            Log.e(TAG, "ForegroundUtils: could not get isUidActive");
         }
-        return false;
+        if (DBG) Log.d(TAG, "Checking UID:" + Integer.toString(uid));
+        // If the onForegroundActivitiesChanged() has not yet been called,
+        // check whether the UID is in an active state to use the NFC.
+        return (mActivityManager.getUidImportance(uid)
+                == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND);
     }
 
     private void handleUidToBackground(int uid) {
@@ -145,55 +153,35 @@
     }
 
     @Override
-    public void onForegroundActivitiesChanged(int pid, int uid,
-            boolean hasForegroundActivities) throws RemoteException {
+    public void onUidImportance(int uid, int importance) {
         boolean uidToBackground = false;
         synchronized (mLock) {
-            SparseBooleanArray foregroundPids = mForegroundUidPids.get(uid,
-                    new SparseBooleanArray());
-            if (hasForegroundActivities) {
-               foregroundPids.put(pid, true);
-            } else {
-               foregroundPids.delete(pid);
+            if (importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_GONE) {
+                mForegroundUids.delete(uid);
+                mBackgroundCallbacks.remove(uid);
+                if (DBG) Log.d(TAG, "UID: " + Integer.toString(uid) + " deleted.");
+                return;
             }
-            if (foregroundPids.size() == 0) {
-                mForegroundUidPids.remove(uid);
-                uidToBackground = true;
+            if (importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
+                mForegroundUids.put(uid, true);
             } else {
-                mForegroundUidPids.put(uid, foregroundPids);
+                if (mForegroundUids.get(uid)) {
+                    uidToBackground = true;
+                    mForegroundUids.put(uid, false);
+                }
             }
         }
         if (uidToBackground) {
             handleUidToBackground(uid);
         }
         if (DBG) {
-            if (DBG) Log.d(TAG, "Foreground changed, PID: " + Integer.toString(pid) + " UID: " +
-                                    Integer.toString(uid) + " foreground: " +
-                                    hasForegroundActivities);
+            Log.d(TAG, "Foreground UID status:");
             synchronized (mLock) {
-                Log.d(TAG, "Foreground UID/PID combinations:");
-                for (int i = 0; i < mForegroundUidPids.size(); i++) {
-                    int foregroundUid = mForegroundUidPids.keyAt(i);
-                    SparseBooleanArray foregroundPids = mForegroundUidPids.get(foregroundUid);
-                    if (foregroundPids.size() == 0) {
-                        Log.e(TAG, "No PIDS associated with foreground UID!");
-                    }
-                    for (int j = 0; j < foregroundPids.size(); j++)
-                        Log.d(TAG, "UID: " + Integer.toString(foregroundUid) + " PID: " +
-                                Integer.toString(foregroundPids.keyAt(j)));
+                for (int j = 0; j < mForegroundUids.size(); j++) {
+                    Log.d(TAG, "UID: " + Integer.toString(mForegroundUids.keyAt(j))
+                            + " is in foreground: " + Boolean.toString(mForegroundUids.valueAt(j)));
                 }
             }
         }
     }
-
-    @Override
-    public void onForegroundServicesChanged(int pid, int uid, int fgServiceTypes) {
-    }
-
-    @Override
-    public void onProcessDied(int pid, int uid) throws RemoteException {
-        if (DBG) Log.d(TAG, "Process died; UID " + Integer.toString(uid) + " PID " +
-                Integer.toString(pid));
-        onForegroundActivitiesChanged(pid, uid, false);
-    }
 }
diff --git a/src/com/android/nfc/NfcDispatcher.java b/src/com/android/nfc/NfcDispatcher.java
index e079d6d..e8f2c50 100644
--- a/src/com/android/nfc/NfcDispatcher.java
+++ b/src/com/android/nfc/NfcDispatcher.java
@@ -19,7 +19,6 @@
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.AlertDialog;
-import android.app.IActivityManager;
 import android.app.PendingIntent;
 import android.app.PendingIntent.CanceledException;
 import android.bluetooth.BluetoothAdapter;
@@ -45,7 +44,6 @@
 import android.os.Message;
 import android.os.Messenger;
 import android.os.Process;
-import android.os.RemoteException;
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.os.UserManager;
@@ -83,7 +81,6 @@
     static final int DISPATCH_UNLOCK = 3;
 
     private final Context mContext;
-    private final IActivityManager mIActivityManager;
     private final RegisteredComponentCache mTechListFilters;
     private final ContentResolver mContentResolver;
     private final HandoverDataParser mHandoverDataParser;
@@ -107,7 +104,6 @@
                   HandoverDataParser handoverDataParser,
                   boolean provisionOnly) {
         mContext = context;
-        mIActivityManager = ActivityManager.getService();
         mTechListFilters = new RegisteredComponentCache(mContext,
                 NfcAdapter.ACTION_TECH_DISCOVERED, NfcAdapter.ACTION_TECH_DISCOVERED);
         mContentResolver = context.getContentResolver();
@@ -116,7 +112,8 @@
         mNfcUnlockManager = NfcUnlockManager.getInstance();
         mDeviceSupportsBluetooth = BluetoothAdapter.getDefaultAdapter() != null;
         mForegroundUid = Process.INVALID_UID;
-        mForegroundUtils = ForegroundUtils.getInstance();
+        mForegroundUtils = ForegroundUtils.getInstance(
+                context.getSystemService(ActivityManager.class));
         synchronized (this) {
             mProvisioningOnly = provisionOnly;
         }
@@ -783,9 +780,10 @@
      * resumeAppSwitches().
     */
     void resumeAppSwitches() {
-        try {
-            mIActivityManager.resumeAppSwitches();
-        } catch (RemoteException e) { }
+        //// Should be auto resumed after S
+        // try {
+        //     mIActivityManager.resumeAppSwitches();
+        // } catch (RemoteException e) { }
     }
 
     /** Returns true if the tech list filter matches the techs on the tag */
diff --git a/src/com/android/nfc/NfcService.java b/src/com/android/nfc/NfcService.java
index 54b0561..8ff1078 100644
--- a/src/com/android/nfc/NfcService.java
+++ b/src/com/android/nfc/NfcService.java
@@ -1,4 +1,7 @@
 /*
+ * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ * Not a Contribution.
+ *
  * Copyright (C) 2010 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -108,6 +111,7 @@
 import java.io.UnsupportedEncodingException;
 import java.nio.ByteBuffer;
 import java.nio.file.Files;
+import java.security.SecureRandom;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -247,6 +251,7 @@
             VibrationAttributes.createForUsage(VibrationAttributes.USAGE_HARDWARE_FEEDBACK);
 
     private final UserManager mUserManager;
+    private final ActivityManager mActivityManager;
 
     private static int nci_version = NCI_VERSION_1_0;
     // NFC Execution Environment
@@ -260,6 +265,8 @@
 
     private final BackupManager mBackupManager;
 
+    private final SecureRandom mCookieGenerator = new SecureRandom();
+
     // cached version of installed packages requesting Android.permission.NFC_TRANSACTION_EVENTS
     // for current user and profiles. The Integer part is the userId.
     HashMap<Integer, List<String>> mNfcEventInstalledPackages =
@@ -285,7 +292,6 @@
 
     private int mUserId;
     boolean mPollingPaused;
-    boolean mPollingDelayed;
 
     // True if nfc notification message already shown
     boolean mAntennaBlockedMessageShown;
@@ -338,12 +344,18 @@
     boolean mIsRequestUnlockShowed;
     boolean mIsRecovering;
 
-    int mPollDelay;
+    // polling delay control variables
+    private final int mPollDelayTime;
+    private final int mPollDelayTimeLong;
+    private final int mPollDelayCountMax;
+    private int mPollDelayCount;
+    private boolean mPollDelayed;
+
     boolean mNotifyDispatchFailed;
     boolean mNotifyReadFailed;
 
     // for recording the latest Tag object cookie
-    long mCookieUpToDate = 0;
+    long mCookieUpToDate = -1;
 
     private NfcDispatcher mNfcDispatcher;
     private PowerManager mPowerManager;
@@ -525,9 +537,10 @@
                         | PowerManager.ACQUIRE_CAUSES_WAKEUP
                         | PowerManager.ON_AFTER_RELEASE, "NfcService:mRequireUnlockWakeLock");
 
-        mKeyguard = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
-        mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
-        mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
+        mKeyguard = mContext.getSystemService(KeyguardManager.class);
+        mUserManager = mContext.getSystemService(UserManager.class);
+        mActivityManager = mContext.getSystemService(ActivityManager.class);
+        mVibrator = mContext.getSystemService(Vibrator.class);
         mVibrationEffect = VibrationEffect.createOneShot(200, VibrationEffect.DEFAULT_AMPLITUDE);
 
         mScreenState = mScreenStateHelper.checkScreenState();
@@ -592,7 +605,7 @@
         if (mIsHceCapable) {
             mCardEmulationManager = new CardEmulationManager(mContext);
         }
-        mForegroundUtils = ForegroundUtils.getInstance();
+        mForegroundUtils = ForegroundUtils.getInstance(mActivityManager);
 
         mIsSecureNfcCapable = mNfcAdapter.deviceSupportsNfcSecure();
         mIsSecureNfcEnabled =
@@ -617,8 +630,15 @@
             mAntennaBlockedMessageShown = true;
         }
 
-        // Polling delay variables
-        mPollDelay = mContext.getResources().getInteger(R.integer.unknown_tag_polling_delay);
+        // Polling delay count for switching from stage one to stage two.
+        mPollDelayCountMax =
+                mContext.getResources().getInteger(R.integer.unknown_tag_polling_delay_count_max);
+        // Stage one: polling delay time for the first few unknown tag detections
+        mPollDelayTime = mContext.getResources().getInteger(R.integer.unknown_tag_polling_delay);
+        // Stage two: longer polling delay time after max_poll_delay_count
+        mPollDelayTimeLong =
+                mContext.getResources().getInteger(R.integer.unknown_tag_polling_delay_long);
+
         mNotifyDispatchFailed = mContext.getResources().getBoolean(R.bool.enable_notify_dispatch_failed);
         mNotifyReadFailed = mContext.getResources().getBoolean(R.bool.enable_notify_read_failed);
 
@@ -950,7 +970,8 @@
 
             synchronized (NfcService.this) {
                 // Disable delay polling when disabling
-                mPollingDelayed = false;
+                mPollDelayed = false;
+                mPollDelayCount = 0;
                 mHandler.removeMessages(MSG_DELAY_POLLING);
                 mPollingDisableDeathRecipients.clear();
                 mReaderModeParams = null;
@@ -1029,17 +1050,12 @@
                 updateAlwaysOnState(NfcAdapter.STATE_OFF);
             } else if (mState == NfcAdapter.STATE_OFF) {
                 /* Special case when mState is OFF but NFCC is already initialized.
-                 * Temperatorily enable NfcAdapter without initialize NFCC and applyRouting.
-                 * And disable NfcAdapter normally with deinitialize.
-                 * All state will switch back to OFF in the end.
+                 * Deinitialize mDevicehost directly.
                  */
                 updateAlwaysOnState(NfcAdapter.STATE_TURNING_OFF);
                 mDeviceHost.setNfceePowerAndLinkCtrl(false);
-                if (!enableInternal()) {
-                    updateAlwaysOnState(NfcAdapter.STATE_OFF);
-                    return;
-                }
-                disableInternal();
+                boolean result = mDeviceHost.deinitialize();
+                if (DBG) Log.d(TAG, "mDeviceHost.deinitialize() = " + result);
                 updateAlwaysOnState(NfcAdapter.STATE_OFF);
             }
         }
@@ -1160,6 +1176,13 @@
     }
 
     final class NfcAdapterService extends INfcAdapter.Stub {
+        /**
+         * An interface for vendor specific extensions
+         */
+        public IBinder getNfcAdapterVendorInterface(String vendor) {
+            return null;
+        }
+
         @Override
         public boolean enable() throws RemoteException {
             NfcPermissions.enforceAdminPermissions(mContext);
@@ -2027,8 +2050,10 @@
                 tag.findAndReadNdef();
                 // Build a new Tag object to return
                 try {
+                    /* Avoid setting mCookieUpToDate to negative values */
+                    mCookieUpToDate = mCookieGenerator.nextLong() >>> 1;
                     Tag newTag = new Tag(tag.getUid(), tag.getTechList(),
-                            tag.getTechExtras(), tag.getHandle(), this);
+                            tag.getTechExtras(), tag.getHandle(), mCookieUpToDate, this);
                     return newTag;
                 } catch (Exception e) {
                     Log.e(TAG, "Tag creation exception.", e);
@@ -2079,14 +2104,8 @@
         }
 
         @Override
-        public void setTagUpToDate(long cookie) throws RemoteException {
-            if (DBG) Log.d(TAG, "Register Tag " + Long.toString(cookie) + " as the latest");
-            mCookieUpToDate = cookie;
-        }
-
-        @Override
         public boolean isTagUpToDate(long cookie) throws RemoteException {
-            if (mCookieUpToDate == cookie) {
+            if (mCookieUpToDate != -1 && mCookieUpToDate == cookie) {
                 if (DBG) Log.d(TAG, "Tag " + Long.toString(cookie) + " is up to date");
                 return true;
             }
@@ -2628,9 +2647,11 @@
                     extras.putInt(Ndef.EXTRA_NDEF_MAXLENGTH, 0);
                     extras.putInt(Ndef.EXTRA_NDEF_CARDSTATE, Ndef.NDEF_MODE_READ_ONLY);
                     extras.putInt(Ndef.EXTRA_NDEF_TYPE, Ndef.TYPE_OTHER);
+                    /* Avoid setting mCookieUpToDate to negative values */
+                    mCookieUpToDate = mCookieGenerator.nextLong() >>> 1;
                     Tag tag = Tag.createMockTag(new byte[]{0x00},
                             new int[]{TagTechnology.NDEF},
-                            new Bundle[]{extras});
+                            new Bundle[]{extras}, mCookieUpToDate);
                     Log.d(TAG, "mock NDEF tag, starting corresponding activity");
                     Log.d(TAG, tag.toString());
                     int dispatchStatus = mNfcDispatcher.dispatchTag(tag);
@@ -2660,6 +2681,7 @@
                             new DeviceHost.TagDisconnectedCallback() {
                                 @Override
                                 public void onTagDisconnected(long handle) {
+                                    mCookieUpToDate = -1;
                                     applyRouting(false);
                                 }
                             };
@@ -2838,7 +2860,7 @@
 
                     synchronized (NfcService.this) {
                         // Disable delay polling when screen state changed
-                        mPollingDelayed = false;
+                        mPollDelayed = false;
                         mHandler.removeMessages(MSG_DELAY_POLLING);
                         // If NFC is turning off, we shouldn't need any changes here
                         if (mState == NfcAdapter.STATE_TURNING_OFF)
@@ -2880,10 +2902,10 @@
 
                 case MSG_DELAY_POLLING:
                     synchronized (NfcService.this) {
-                        if (!mPollingDelayed) {
+                        if (!mPollDelayed) {
                             return;
                         }
-                        mPollingDelayed = false;
+                        mPollDelayed = false;
                         mDeviceHost.startStopPolling(true);
                     }
                     if (DBG) Log.d(TAG, "Polling is started");
@@ -3111,8 +3133,11 @@
 
         private void dispatchTagEndpoint(TagEndpoint tagEndpoint, ReaderModeParams readerParams) {
             try {
+                /* Avoid setting mCookieUpToDate to negative values */
+                mCookieUpToDate = mCookieGenerator.nextLong() >>> 1;
                 Tag tag = new Tag(tagEndpoint.getUid(), tagEndpoint.getTechList(),
-                        tagEndpoint.getTechExtras(), tagEndpoint.getHandle(), mNfcTagService);
+                        tagEndpoint.getTechExtras(), tagEndpoint.getHandle(),
+                        mCookieUpToDate, mNfcTagService);
                 registerTagObject(tagEndpoint);
                 if (readerParams != null) {
                     try {
@@ -3144,15 +3169,21 @@
                 if (dispatchResult == NfcDispatcher.DISPATCH_FAIL && !mInProvisionMode) {
                     if (DBG) Log.d(TAG, "Tag dispatch failed");
                     unregisterObject(tagEndpoint.getHandle());
-                    if (mPollDelay > NO_POLL_DELAY) {
+                    if (mPollDelayTime > NO_POLL_DELAY) {
                         tagEndpoint.stopPresenceChecking();
                         synchronized (NfcService.this) {
-                            if (!mPollingDelayed) {
-                                mPollingDelayed = true;
+                            if (!mPollDelayed) {
+                                int delayTime = mPollDelayTime;
+                                mPollDelayed = true;
                                 mDeviceHost.startStopPolling(false);
-                                if (DBG) Log.d(TAG, "Polling delayed");
+                                if (mPollDelayCount < mPollDelayCountMax) {
+                                    mPollDelayCount++;
+                                } else {
+                                    delayTime = mPollDelayTimeLong;
+                                }
+                                if (DBG) Log.d(TAG, "Polling delayed " + delayTime);
                                 mHandler.sendMessageDelayed(
-                                        mHandler.obtainMessage(MSG_DELAY_POLLING), mPollDelay);
+                                        mHandler.obtainMessage(MSG_DELAY_POLLING), delayTime);
                             } else {
                                 if (DBG) Log.d(TAG, "Keep waiting for polling delay");
                             }
@@ -3182,6 +3213,7 @@
                         if (DBG) Log.d(TAG, "Tag dispatch failed notification");
                     }
                 } else if (dispatchResult == NfcDispatcher.DISPATCH_SUCCESS) {
+                    mPollDelayCount = 0;
                     if (mScreenState == ScreenStateHelper.SCREEN_STATE_ON_UNLOCKED) {
                         mPowerManager.userActivity(SystemClock.uptimeMillis(),
                                 PowerManager.USER_ACTIVITY_EVENT_OTHER, 0);
@@ -3236,6 +3268,7 @@
                         ScreenStateHelper.SCREEN_STATE_OFF_LOCKED : ScreenStateHelper.SCREEN_STATE_OFF_UNLOCKED;
                      }
                 } else if (action.equals(Intent.ACTION_SCREEN_ON)) {
+                    mPollDelayCount = 0;
                     screenState = mKeyguard.isKeyguardLocked()
                             ? ScreenStateHelper.SCREEN_STATE_ON_LOCKED
                             : ScreenStateHelper.SCREEN_STATE_ON_UNLOCKED;
diff --git a/src/com/android/nfc/P2pLinkManager.java b/src/com/android/nfc/P2pLinkManager.java
index fc39c0a..b5edb20 100755
--- a/src/com/android/nfc/P2pLinkManager.java
+++ b/src/com/android/nfc/P2pLinkManager.java
@@ -16,6 +16,7 @@
 
 package com.android.nfc;
 
+import android.app.ActivityManager;
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.pm.ApplicationInfo;
@@ -282,7 +283,8 @@
         mDefaultRwSize = defaultRwSize;
         mLlcpServicesConnected = false;
         mNdefCallbackUid = -1;
-        mForegroundUtils = ForegroundUtils.getInstance();
+        mForegroundUtils = ForegroundUtils.getInstance(
+                context.getSystemService(ActivityManager.class));
      }
 
     /**
diff --git a/src/com/android/nfc/cardemulation/CardEmulationManager.java b/src/com/android/nfc/cardemulation/CardEmulationManager.java
index 75c08c4..d43f89a 100644
--- a/src/com/android/nfc/cardemulation/CardEmulationManager.java
+++ b/src/com/android/nfc/cardemulation/CardEmulationManager.java
@@ -40,6 +40,7 @@
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
+import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -65,6 +66,20 @@
 
     static final int NFC_HCE_APDU = 0x01;
     static final int NFC_HCE_NFCF = 0x04;
+    /** Minimum AID length as per ISO7816 */
+    static final int MINIMUM_AID_LENGTH = 5;
+    /** Length of Select APDU header including length byte */
+    static final int SELECT_APDU_HDR_LENGTH = 5;
+    /** Length of the NDEF Tag application AID */
+    static final int NDEF_AID_LENGTH = 7;
+    /** AID of the NDEF Tag application Mapping Version 1.0 */
+    static final byte[] NDEF_AID_V1 =
+            new byte[] {(byte) 0xd2, 0x76, 0x00, 0x00, (byte) 0x85, 0x01, 0x00};
+    /** AID of the NDEF Tag application Mapping Version 2.0 */
+    static final byte[] NDEF_AID_V2 =
+            new byte[] {(byte) 0xd2, 0x76, 0x00, 0x00, (byte) 0x85, 0x01, 0x01};
+    /** Select APDU header */
+    static final byte[] SELECT_AID_HDR = new byte[] {0x00, (byte) 0xa4, 0x04, 0x00};
 
     final RegisteredAidCache mAidCache;
     final RegisteredT3tIdentifiersCache mT3tIdentifiersCache;
@@ -78,6 +93,7 @@
     final CardEmulationInterface mCardEmulationInterface;
     final NfcFCardEmulationInterface mNfcFCardEmulationInterface;
     final PowerManager mPowerManager;
+    boolean mNotSkipAid;
 
     public CardEmulationManager(Context context) {
         mContext = context;
@@ -108,11 +124,16 @@
 
     public void onHostCardEmulationActivated(int technology) {
         if (mPowerManager != null) {
-            mPowerManager.userActivity(SystemClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
+            // Use USER_ACTIVITY_FLAG_INDIRECT to applying power hints without resets
+            // the screen timeout
+            mPowerManager.userActivity(SystemClock.uptimeMillis(),
+                    PowerManager.USER_ACTIVITY_EVENT_TOUCH,
+                    PowerManager.USER_ACTIVITY_FLAG_INDIRECT);
         }
         if (technology == NFC_HCE_APDU) {
             mHostEmulationManager.onHostEmulationActivated();
             mPreferredServices.onHostEmulationActivated();
+            mNotSkipAid = false;
         } else if (technology == NFC_HCE_NFCF) {
             mHostNfcFEmulationManager.onHostEmulationActivated();
             mNfcFServicesCache.onHostEmulationActivated();
@@ -121,14 +142,17 @@
     }
 
     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) {
             mHostNfcFEmulationManager.onHostEmulationData(data);
         }
+        // Don't trigger userActivity if it's selecting NDEF AID
+        if (mPowerManager != null && !(technology == NFC_HCE_APDU && isSkipAid(data))) {
+            // Caution!! USER_ACTIVITY_EVENT_TOUCH resets the screen timeout
+            mPowerManager.userActivity(SystemClock.uptimeMillis(),
+                    PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
+        }
     }
 
     public void onHostCardEmulationDeactivated(int technology) {
@@ -393,6 +417,37 @@
     }
 
     /**
+     * Returns true if it's not selecting NDEF AIDs
+     * It's used to skip userActivity if it only selects NDEF AIDs
+     */
+    boolean isSkipAid(byte[] data) {
+        if (mNotSkipAid || data == null
+                || data.length < SELECT_APDU_HDR_LENGTH + MINIMUM_AID_LENGTH
+                || !Arrays.equals(SELECT_AID_HDR, 0, SELECT_AID_HDR.length,
+                        data, 0, SELECT_AID_HDR.length)) {
+            return false;
+        }
+        int aidLength = data[SELECT_APDU_HDR_LENGTH - 1];
+        if (data.length >= SELECT_APDU_HDR_LENGTH + NDEF_AID_LENGTH
+                && aidLength == NDEF_AID_LENGTH) {
+            if (Arrays.equals(data, SELECT_APDU_HDR_LENGTH,
+                        SELECT_APDU_HDR_LENGTH + NDEF_AID_LENGTH,
+                        NDEF_AID_V1, 0, NDEF_AID_LENGTH)) {
+                if (DBG) Log.d(TAG, "Skip for NDEF_V1");
+                return true;
+            } else if (Arrays.equals(data, SELECT_APDU_HDR_LENGTH,
+                        SELECT_APDU_HDR_LENGTH + NDEF_AID_LENGTH,
+                        NDEF_AID_V2, 0, NDEF_AID_LENGTH)) {
+                if (DBG) Log.d(TAG, "Skip for NDEF_V2");
+                return true;
+            }
+        }
+        // The data payload is not selecting the skip AID.
+        mNotSkipAid = true;
+        return false;
+    }
+
+    /**
      * Returns whether a service in this package is preferred,
      * either because it's the default payment app or it's running
      * in the foreground.
diff --git a/src/com/android/nfc/cardemulation/EnabledNfcFServices.java b/src/com/android/nfc/cardemulation/EnabledNfcFServices.java
index 734dd0d..d636298 100644
--- a/src/com/android/nfc/cardemulation/EnabledNfcFServices.java
+++ b/src/com/android/nfc/cardemulation/EnabledNfcFServices.java
@@ -15,6 +15,7 @@
  */
 package com.android.nfc.cardemulation;
 
+import android.app.ActivityManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.nfc.cardemulation.NfcFServiceInfo;
@@ -38,7 +39,7 @@
     final RegisteredNfcFServicesCache mNfcFServiceCache;
     final RegisteredT3tIdentifiersCache mT3tIdentifiersCache;
     final Callback mCallback;
-    final ForegroundUtils mForegroundUtils = ForegroundUtils.getInstance();
+    final ForegroundUtils mForegroundUtils;
     final Handler mHandler = new Handler(Looper.getMainLooper());
 
     final Object mLock = new Object();
@@ -62,6 +63,8 @@
             RegisteredT3tIdentifiersCache t3tIdentifiersCache, Callback callback) {
         if (DBG) Log.d(TAG, "EnabledNfcFServices");
         mContext = context;
+        mForegroundUtils = ForegroundUtils.getInstance(
+                context.getSystemService(ActivityManager.class));
         mNfcFServiceCache = nfcFServiceCache;
         mT3tIdentifiersCache = t3tIdentifiersCache;
         mCallback = callback;
diff --git a/src/com/android/nfc/cardemulation/HostEmulationManager.java b/src/com/android/nfc/cardemulation/HostEmulationManager.java
index 61a9d64..8849cca 100644
--- a/src/com/android/nfc/cardemulation/HostEmulationManager.java
+++ b/src/com/android/nfc/cardemulation/HostEmulationManager.java
@@ -55,7 +55,7 @@
     static final int STATE_W4_DEACTIVATE = 3;
     static final int STATE_XFER = 4;
 
-    /** Minimum AID lenth as per ISO7816 */
+    /** Minimum AID length as per ISO7816 */
     static final int MINIMUM_AID_LENGTH = 5;
 
     /** Length of Select APDU header including length byte */
diff --git a/src/com/android/nfc/cardemulation/PreferredServices.java b/src/com/android/nfc/cardemulation/PreferredServices.java
index 1f9b880..d6e2fa6 100644
--- a/src/com/android/nfc/cardemulation/PreferredServices.java
+++ b/src/com/android/nfc/cardemulation/PreferredServices.java
@@ -67,7 +67,7 @@
     final RegisteredServicesCache mServiceCache;
     final RegisteredAidCache mAidCache;
     final Callback mCallback;
-    final ForegroundUtils mForegroundUtils = ForegroundUtils.getInstance();
+    final ForegroundUtils mForegroundUtils;
     final Handler mHandler = new Handler(Looper.getMainLooper());
 
     final class PaymentDefaults {
@@ -105,6 +105,8 @@
     public PreferredServices(Context context, RegisteredServicesCache serviceCache,
             RegisteredAidCache aidCache, Callback callback) {
         mContext = context;
+        mForegroundUtils = ForegroundUtils.getInstance(
+                context.getSystemService(ActivityManager.class));
         mServiceCache = serviceCache;
         mAidCache = aidCache;
         mCallback = callback;
diff --git a/tests/unit/src/com/android/nfc/NfcStateTest.java b/tests/unit/src/com/android/nfc/NfcStateTest.java
index 26f93a4..50b8eea 100644
--- a/tests/unit/src/com/android/nfc/NfcStateTest.java
+++ b/tests/unit/src/com/android/nfc/NfcStateTest.java
@@ -86,7 +86,7 @@
     @After
     public void tearDown() throws Exception {
         mContext.unregisterReceiver(mAdapterStateChangedReceiver);
-        if (mNfcAdapter.isControllerAlwaysOnSupported()) {
+        if (mNfcSupported && mNfcAdapter.isControllerAlwaysOnSupported()) {
             mNfcAdapter.unregisterControllerAlwaysOnListener(mListener);
         }
     }