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);
}
}