diff --git a/res/values-ar/cm_strings.xml b/res/values-ar/cm_strings.xml
index db7565ae43fb030da9a273de607b6177a7549fe4..7f30b4625018364d6f39fb305a3ec65a1e89f668 100644
--- a/res/values-ar/cm_strings.xml
+++ b/res/values-ar/cm_strings.xml
@@ -32,14 +32,10 @@
لا داعي، فخيارات المطور مفعّلة.
- المنصة
- إجمالي الذاكرةأدوات التطوير
- إعادة تشغيل متقدمة
- عند إلغاء القفل، ستتضمن خيارات قائمة إعادة التشغيل الذهاب الى وضع الاسترداد او وضع محمل الاقلاعصلاحيات الجذرالسماح بالوصول الجذري؟
@@ -49,45 +45,31 @@
لـADB فقطالتطبيقات وADB
- إدارة صلاحيات الجذر
- عرض قواعد الجذر والتحكم فيها
- اضغط للنوم
- الضغط مرتين فوق شريط الحالة لإطفاء الشاشة
- الإيماءات اللمسية
- عمل إيماءات لمسية متعددة لأعمال سريعةمنع الاستيقاظ العشوائي
- التحقق من مستشعر القرب قبل إيقاظ الشاشةإظهار إدخال كلمة المرور مباشرة
- تخطي التمرير لفتح قفل الشاشة والبدء فورا في إدخال كلمة المرورإظهار عرض النمط مباشرة
- تخطي التمرير لفتح قفل الشاشة والبدء فورا في إدخال النقشإظهار إدخال رقم PIN مباشرة
- تخطي التمرير لفتح قفل الشاشة والبدء فورا في إدخال رمز pinتخطيط الترميزتخطيط رقم PIN المرمز عند إلغاء تأمين الجهازعرض صورة الغلاف للموسيقى
- عرض الغلاف الفني للوسائط
- اختر حجم النمطإظهار خطأ النمطإظهار نقاط النمطاهتزاز
- الاهتزاز عند الفتحتصحيح أخطاء Android
- تمكين واجهة جسر تصحيح أخطاء أندرويد (ADB)إشعار تنقيح الأخطاءعرض إشعار عند تمكين تنقيح الأخطاء عبر USB أو الشبكات
@@ -99,12 +81,7 @@
زر إلغاء التطبيق مجدداًقم بإنهاء التطبيق الأمامي بالضغط الطويل على زر العودة
- حدد موقع حساس بصمة الأصبع %1$s من هاتفك.
- في الخلف
- في الأمام
- على الجانب الأيسر
- على الجانب الأيمناسم مضيف الجهاز
@@ -112,7 +89,6 @@
حجم الصوت البدئيّزمن التدرج
- ربط حجم صوت النغمة وصوت الإشعاراتالتطبيقات بدأت في التمهيد
@@ -138,7 +114,6 @@
المراسلةوسائطالجهاز
- يعمل في الخلفيةإعادة تحميلالوصول إلى الجذرأخرى
@@ -186,7 +161,6 @@
البقاء بحالة انتباهمراقبة الموقعرصد موقع عالي الطاقة
- الحصول على إحصائيات استخدام التطبيقكتم/إلغاء كتم الميكروفونعرض الرسائل الإشعاريةوسائط المشروع
@@ -206,13 +180,6 @@
الكتابة على الذاكرة الخارجيةتشغيل الشاشةالحصول على الحسابات
- يعمل في الخلفية
- الوصول إلى مستوى الصوت
- قراءة أرقام الهاتف
- طلب حزم التثبيت
- استخدام صورة في صورة
- بدء التطبيق الفوري في المقدمة
- الرد على المكالمات الهاتفيةتبديل Wi-Fiتبديل بلوتوثبدء تشغيل في التمهيد
@@ -283,13 +250,6 @@
الكتابة على الذاكرة الخارجيةتشغيل الشاشةالحصول على الحسابات
- يعمل في الخلفية
- إمكانية الوصول لمستوى الصوت
- قراءة أرقام الهاتف
- طلب تثبيت الحزم
- استخدام صورة في صورة
- بدء التطبيق الفوري في المقدمة
- الرد على المكالمات الهاتفيةتبديل Wi-Fiتبديل بلوتوثبدء تشغيل في التمهيد
@@ -305,7 +265,6 @@
المسموح بها %sمرفوض%sمسموح%1$s, مرفوض%2$s
- ليست هناك أذونات متاحة للحظرإظهار تطبيقات المستخدمإظهار تطبيقات مضمنة
@@ -313,7 +272,6 @@
تأكيد إعادة تعيين العداداتهل أنت متأكد من رغبتك في إعادة تعيين العدادات؟موافق
- الأمان والخصوصيةقانون LineageOS
@@ -322,8 +280,6 @@
الإيقاظ عند التوصيلتشغيل الشاشة عند الاتصال أو قطع الاتصال بمصدر الطاقة
- الإشعارات العائمة
- عرض الإشعارات ذات الأولوية في إطار عائم صغيرحساسية ذات لمس عاليزيادة حساسية شاشة اللمس حتى يمكن استخدامها أثناء ارتداء القفازات
@@ -331,8 +287,4 @@
المرور فوق الشاشة اللمسيةيسمح لك بالمرور فوق الشاشة مثل الماوس في مستعرضات الويب، أو سطح المكتب عن بُعد، إلخ
- بيانات شبكة الجوّال
- تمكين استخدام البيانات
- بيانات WiFi
- تمكين استخدام بيانات WiFi
diff --git a/res/values-ast-rES/cm_strings.xml b/res/values-ast-rES/cm_strings.xml
index 08f5dfcc38266c817db48d815412642874d60378..aa0d36f81fce07ca5fac2cbc0411ff6077c0c537 100644
--- a/res/values-ast-rES/cm_strings.xml
+++ b/res/values-ast-rES/cm_strings.xml
@@ -28,14 +28,11 @@
Nun fai falta, yá tán activaes los axustes de desendolcu.
- Plataforma
- RAM totalFerramientes de desendolcuReaniciu avanzáu
- Destorgáu, inclúi opciones nel menú d\'apagáu pa reiniciar nel mou recuperación o cargador d\'arranqueAccesu root¿Permitir l\'accesu root?
@@ -48,100 +45,43 @@
Xestionar accesos rootMira y controla les regles root
- Calca pa suspender
- Calca dos vegaes na barra d\'estáu o pantalla de bloquéu p\'apagar la pantalla
- Xestos de pantalla táutil
- Fai dellos xestos táutiles p\'aiciones rápidesEvitar esconsueñu accidental
- Comprueba\'l sensor de proximidá enantes de prender la pantalla
- Amosar direutamente la contraseña
- Omitir l\'esbarie pa destorgar la pantalla y entamar darréu la introducción de la contraseña
- Amosar direutamente\'l patrón
- Omitir l\'esbarie pa destorgar la pantalla y entamar darréu la introducción del patrón
- Amosar direutamente la entrada PIN
- Omitir l\'esbarie pa destorgar la pantalla y entamar darréu la introducción del PIN
- Disposición al debalu
- Cambiar la disposición de los númberos del PIN pa desbloquiar el preséu
- Amosar visualizador de música
- Amosar la portada del álbumEscueyi un tamañu de patrón
- Amosar fallu de patrón
- Amosar puntos del patrón
- Vibración
- Vibrar al desbloquiar
- Depuración AndroidHabilita la interfaz de depuración ADBAvisu de depuración
- Amosar un avisu cuando tea activada la depuración per USB o rede
- ADB sobre rede
- Activar la depuración TCP/IP sobre les interfaces de rede (Wi\u2011Fi, redes USB). Esta configuración restablezse al reaniciar el preséu
- AVISU: Cuando ta habilitáu ADB sobre rede, el teléfono ta abiertu pa intrusiones en toles redes coneutaes.\n\nUsa esta función namái coneutáu a redes de confianza.\n\n¿Daveres quies activar esta función?
- Botón Volver
- Matar l\'aplicación actual al caltener primíu\'l botón Volver
- Alluga\'l sensor de buelgues na parte %1$s del to teléfonu.
- d\'atrás
- frontal
- llau esquierdu
- llau drechu
- Nome del preséu
- Volume de timbre ascendenteVolume inicial
- Duración d\'incrementu
- Venceyar tonu de llamada & y volume de les notificaciones
- Apps aniciaes nel arranque
- %1$s ta %2$s
- deshabilitada
- ausente o defeutuosa
- Desactivaráse la tarxeta SIM. ¿Quies siguir?
- Atención
- Esta SIM va desactivase y la SIM %1$s va usase pa servicios de datos. ¿De xuru que quies continuar?
- Nun pue facese la operación entrín el mou avión tea activáu.
- Nun pue facese la operación entrín teas llamando.
- Nun puen deshabilitase toles tarxetes SIM
- Activando\u2026
- Desactivando\u2026
- Activóse la SIM.
- Falló l\'activación.
- Desactivóse la SIM.
- Falló la desactivación.AllugamientuPersonalMensaxería
- MultimediaPreséu
- Executar de fonduArranqueAccesu root
- Otros
- allugamientu pocu precisu
- allugamientu precisuGPS
- vibraciónlleer contautosmodificar contautoslleer el rexistru de llamaes
@@ -149,21 +89,15 @@
lleer calendariumodificar calendariuescanéu Wi-Fi
- notific/not. emerxent
- guetar redes
- Llamar per teléfonulleer SMSescribir SMSrecibir SMSrecibir SMS d\'emerxenciarecibir MMS
- recibir WAP pushunviar SMSlleer ICC SMSescribir ICC SMSmodificar axustes
- amosar arriba
- acceder a les notificacionescámaragrabar audiureproducir audiu
@@ -174,72 +108,27 @@
volume principalvolume de vozvolume del timbre
- volume de multimediavolume d\'alarmavolume d\'avisuvolume Bluetooth
- caltener encesumonitorizar allugamientu
- monitorizar llocalización n\'alta precisiónconsiguir estadístiques d\'usu d\'aplicacionesde/silenciar micrófonu
- amosar notificaciones emerxentes
- proyeutar conteníu multimediaactivar VPN
- escribir fondu de pantalla
- encontu a la estructura
- encontu a captura pantalla
- lleer estáu del teléfonu
- amestar buzón de voz
- usar SIP
- facer llamada
- usar buelga
- usar sensores corporales
- lleer tresmisiones celularesallugamientu falsu
- lleer almacenamientu esternu
- escribir al almacenamientu esternu
- prender pantalla
- consiguir cuentesexecutase de fondu
- volume d\'accesibilidá d\'audiu
- lleer númberos telefónicos
- solicitar instalación de paquetes
- usar Picture-in-Picture
- aniciar aplicación nel intre en primer planu
- contestar llamaes de teléfonu
- alternar Wi-Fi
- alternar bluetooth
- aniciar nel arranquealternar NFC
- alternar datos móviles
- accesu alministrativu
- Llocalización aproximada
- Llocalización finaGPS
- Vibrar
- Lleer contautos
- Modificar contautos
- Lleer rexistru de llamaes
- Modificar rexistru de llamaes
- Lleer calendariu
- Modificar calendariu
- Escanear Wi-Fi
- Notificación/Mensaxe
- Escanéu de rede móvil
- LlamarLleer SMSEscribir SMSRecibir SMSRecibir mensaxes SMS d\'emerxenciaRecibir MMS
- Recibir mensaxes WAPUnviar SMSLleer ICC SMSEscribir ICC SMSModificar axustes
- Amosar encimaAccesu a avisosCámaraGrabar audiu
@@ -255,36 +144,15 @@
Volume d\'alarmaVolume d\'avisuVolume Bluetooth
- Caltener encesu
- Monitorear llocalización
- Monitorear llocalización fina
- Obtener estadístiques d\'usu
- Silenciar/nun silenciar micrófonu
- Amosar notificaciones emerxentes
- Proyeutu MediaActivar VPN
- Escribir fondu de pantalla
- Encontu d\'estructura
- encontu a captura pantalla
- lleer estáu del teléfonu
- amestar buzón de vozUsar SIP
- Facer llamadaUsar buelgaUsar sensores corporales
- Lleer tresmisiones celularesAllugamientu falsuLleer almacenamientu esternuEscribir nel almacenamientu esternuPrender pantallaConsiguir cuentes
- Executar de fondu
- Volume d\'accesibilidá d\'audiu
- Lleer númberos telefónicos
- Riquir la instalación de paquetes
- Usar Picture in Picture
- Aniciar aplicación nel intre en primer planu
- Contestar llamaes de teléfonuAlternar Wi-FiAlternar bluetoothAniciar nel arranque
@@ -292,25 +160,13 @@
Alternar datos móvilesAccesu root
- Permitíu
- inoráuEntrugar siempre
- %1$s (used %2$s)
- Permitíu %s
- Refugáu %s
- Permitíu %1$s, refugáu %2$s
- Nun hai permisos disponibles pa torgarAmosar aplicaciones d\'usuariu
- Amuesa les app del sistema
- Restablecer contadores
- Confirma\'l reaniciu de los contadores¿De xuru que quies reafitar los contadores?Aceutar
- Seguranza y privacidá
- Llicencia LineageOSSonios d\'axuste de volume
@@ -320,14 +176,6 @@
Avisos emerxentesAmuesa los avisos prioritarios nuna ventana pequeña flotante
- Sensibilidá alta al tactu
- Incrementar la sensibilidá del panel táctil pa que pueda usase llevando guantes
- Pantalla táctil eslizante
- Permite eslizase pela pantalla como un mur en navegadores, escritorios remotos, etc.
- Datos móviles
- Activar l\'usu de los datos móviles
- Datos Wi\u2011Fi
- Activar l\'usu de los datos Wi\u2011Fi
diff --git a/res/values-cy/arrays.xml b/res/values-cy/arrays.xml
index 0229e5ec54947ee0addc393fb311a7703c76feda..4fd275e87255c380748f61f8fd0a3b3fc0df203c 100644
--- a/res/values-cy/arrays.xml
+++ b/res/values-cy/arrays.xml
@@ -78,7 +78,7 @@
Bach
- Arferol
+ DefaultMawrMwyaf
@@ -109,7 +109,7 @@
Wedi\'i rhwystro
- Yn osgoi cysylltiad gwael am y tro
+ Temporarily avoiding poor connection
@@ -152,14 +152,6 @@
-
-
- Gwthio botwm
-
- PIN gan ddyfais cyfaill
-
- PIN gan y ddyfais hon
-
@@ -195,8 +187,8 @@
- Amser defnydd
- Defnyddiwyd ddiwethaf
+ Usage time
+ Last time usedEnw\'r ap
@@ -244,28 +236,10 @@
DimPAPCHAP
- PAP neu CHAP
+ PAP or CHAP
-
- Anhysbys
- LTE
- HSPAP
- HSPA
- HSUPA
- HSDPA
- UMTS
- EDGE
- GPRS
- eHRPD
- EVDO_B
- EVDO_A
- EVDO_0
- 1xRTT
- IS95B
- IS95A
- Dim
@@ -277,18 +251,13 @@
GID
-
- Internal device storage
- Removable SD card
- Gadael i\'r system benderfynu
- Lleoliad
- Personol
- Negesu
- Cyfryngau
+ Personal
+ Messaging
+ MediaDyfais
@@ -296,65 +265,65 @@
coarse locationfine locationGPS
- dirgrynu
- darllen cysylltiadau
- addasu cysylltiadau
+ vibrate
+ read contacts
+ modify contactsdarllen y log galwadauaddasu\'r log galwadau
- darllen y calendr
- addasu\'r calendr
- sganio wi-fi
+ read calendar
+ modify calendar
+ wi-fi scanhysbysiadcell scangalw ffôn
- darllen SMS
- ysgrifennu SMS
- derbyn SMS
- derbyn SMS brys
- derbyn MMS
+ read SMS
+ write SMS
+ receive SMS
+ receive emergency SMS
+ receive MMSreceive WAP pushanfon SMS
- darllen SMS ICC
+ read ICC SMSwrite ICC SMSaddasu gosodiadaudraw on topaccess notificationscamera
- recordio sain
- chwarae sain
- darllen y clipfwrdd
- addasu\'r clipfwrdd
- botymau cyfryngau
- ffocws sain
- prif uchder sain
- uchder sain llais
- uchder sain caniad ffôn
- uchder sain cyfryngau
+ record audio
+ play audio
+ read clipboard
+ modify clipboard
+ media buttons
+ audio focus
+ master volume
+ voice volume
+ ring volume
+ media volumeuchder sain larymauuchder sain hysbysiadau
- Uchder sain Bluetooth
- cadw\'n effro
+ bluetooth volume
+ keep awakemonitor locationmonitor high power location
- cael ystadegau defnydd
- distewi/dad-ddistewi\'r meicroffon
+ get usage stats
+ mute/unmute microphoneshow toastproject mediaactivate VPN
- ysgrifennu papur wal
+ write wallpaperassist structureassist screenshotread phone state
- ychwanegu lleisbost
+ add voicemailuse sipprocess outgoing call
- ôl bys
- synwyryddion corff
+ fingerprint
+ body sensorsread cell broadcastsmock locationread storagewrite storage
- troi sgrin ymlaen
+ turn on screenget accountsrun in backgrounduchder sain hygyrchedd
@@ -364,91 +333,72 @@
LleoliadLleoliadLleoliad
- Dirgrynu
- Darllen cysylltiadau
- Addasu cysylltiadau
+ Vibrate
+ Read contacts
+ Modify contactsDarllen y log galwadauAddasu\'r log galwadau
- Darllen y calendr
- Addasu\'r calendr
+ Read calendar
+ Modify calendarLleoliadPost notificationLleoliadGalw ffôn
- Darllen SMS/MMS
- Ysgrifennu SMS/MMS
- Derbyn SMS/MMS
- Derbyn SMS/MMS
- Derbyn SMS/MMS
- Derbyn SMS/MMS
+ Read SMS/MMS
+ Write SMS/MMS
+ Receive SMS/MMS
+ Receive SMS/MMS
+ Receive SMS/MMS
+ Receive SMS/MMSAnfon SMS/MMS
- Darllen SMS/MMS
- Ysgrifennu SMS/MMS
+ Read SMS/MMS
+ Write SMS/MMSAddasu gosodiadauDraw on topAccess notificationsCamera
- Recordio sain
- Chwarae sain
- Darllen y clipfwrdd
- Addasu\'r clipfwrdd
- Botymau cyfryngau
- Ffocws sain
- Prif uchder sain
- Uchder sain llais
- Uchder sain caniad ffôn
- Uchder sain cyfryngau
+ Record audio
+ Play audio
+ Read clipboard
+ Modify clipboard
+ Media buttons
+ Audio focus
+ Master volume
+ Voice volume
+ Ring volume
+ Media volumeUchder sain larymauUchder sain hysbysiadauBluetooth volume
- Cadw\'n effro
+ Keep awakeLleoliadLleoliad
- Cael ystadegau defnydd
- Distewi/dad-ddistewi\'r meicroffon
+ Get usage stats
+ Mute/unmute microphoneShow toastProject mediaActivate VPN
- Ysgrifennu papur wal
+ Write wallpaperAssist structureAssist screenshotRead phone state
- Ychwanegu lleisbost
+ Add voicemailUse sipProcess outgoing call
- Ôl bys
- Synwyryddion corff
+ Fingerprint
+ Body sensorsRead cell broadcastsMock locationRead storageWrite storage
- Troi sgrin ymlaen
+ Turn on screenGet accountsRun in backgroundUchder sain hygyrchedd
-
-
- Byr
-
- Canolig
-
- Hir
-
-
- Rhagosodiad
- Sans-serif
- Sans-serif condensed
- Sans-serif monospace
- Serif
- Serif monospace
- Achlysurol
- Rhedol
- Priflythrennau bychain
-
@@ -461,12 +411,12 @@
- Rhagosodiad
+ DefaultDim
- Amlinell
+ OutlineDrop shadow
- Codwyd
- Gostyngwyd
+ Raised
+ Depressed
@@ -487,90 +437,56 @@
-
- PPTP VPN
- L2TP/IPSec VPN with pre-shared keys
- L2TP/IPSec VPN gyda thystysgrifau
- IPSec VPN with pre-shared keys and Xauth authentication
- IPSec VPN with certificates and Xauth authentication
- IPSec VPN with certificates and hybrid authentication
- Heb gysylltu
- Yn ymgychwyn\u2026
+ Initializing\u2026
- Yn cysylltu\u2026
+ Connecting\u2026
- Wedi cysyllltu
+ ConnectedTimeout
- Aflwyddiannus
+ Unsuccessful
- Gofyn
+ AskCaniatáu BythCaniatáu Bob Tro
-
-
- Arferol
-
- Cymedrol
-
- Isel
-
- Critigol
-
- \?
-
-
- Arferol
- Cymedrol
- Isel
- Critigol
- PersistentTop activity
- Pwysig (blaendir)
- Pwysig (cefndir)
+ Important (foreground)
+ Important (background)Copi wrth gefnHeavy weight
- Gwasanaeth (yn rhedeg)
- Gwasanaeth (ailddechrau)
+ Service (running)
+ Service (restarting)ReceiverCartref
- Gweithred ddiwethaf
+ Last activityCached (activity)Cached (activity client)Cached (empty)
-
- Glaswyrdd
- Glas
- Indigo
- Porffor
- Pinc
- Coch
-
diff --git a/res/values-cy/cm_strings.xml b/res/values-cy/cm_strings.xml
index 62efc30ae4c24344d0f4ccbb167924a187dd3b25..de402bb4eeea46221821a370a98aa0ae07bf1c52 100644
--- a/res/values-cy/cm_strings.xml
+++ b/res/values-cy/cm_strings.xml
@@ -22,31 +22,20 @@
- PlatfformCyfanswm RAMAilgychwyn arbennig
- Mynediad craidd
- Caniatáu mynediad craidd?
- Mae caniatáu i apiau gael mynediad craidd yn hynod beryglus a gall peryglu diogelwch dy ddyfais!
- Dim
- Apiau yn unig
- ADB yn unig
- Apiau ac ADBTara i gysgu
- Neidio\'r sgrin llithro i ddatgloi a dechrau yn hytrach gyda\'r sgrin cyfrinair yn syth
- Neidio\'r sgrin llithro i ddatgloi a dechrau yn hytrach gyda\'r sgrin patrwm yn syth
- Neidio\'r sgrin llithro i ddatgloi a dechrau yn hytrach gyda\'r sgrin PIN yn syth
@@ -54,147 +43,57 @@
- Dirgrynu
- Dadfygio Android
- ADB dros rwydwaith
- Galluogi dadfygio TCP/IP dros ryngwynebau rhwydwaith (Wi\u2011Fi, rhwydweithiau USB). Mae\'r gosodiad yn cael ei ail-osod wrth ail-gychwyn y ddyfais.
- RHYBUDD: Tra bod ADB dros rwydwaith wedi\'i alluogi, mae dy ffôn ar gael ac yn agor i ymyrraeth ar bob rhwydwaith mae wedi cysylltu â nhw!\n\nDefnyddia\'r nodwedd hon dim ond pan wyt wedi cysylltu â rhwydweithiau rwyt yn ymddiried ynddynt.\n\nWyt ti wir eisiau parhau i alluogi\'r nodwedd hon?nôl
- blaen
- ochr chwith
- ochr dde
- Uchder sain yn cynyddu
- Sain dechreuol
- SylwCaiff y SIM hwn ei analluogi a defnyddir SIM %1$s ar gyfer gwasanaethau data. Wyt ti am barhau?Nid yw\'n bosib cyflawni\'r dasg tra ym modd awyren.Nid yw\'n bosib cyflawni\'r dasg tra bod galwad ar y gweill.
- Yn rhoi ar waith\u2026
- Methwyd â\'i roi ar waith.
- Lleoliad
- Personol
- Negesu
- Cyfryngau
- DyfaisRhedeg yn y cefndir
- Mynediad craidd
- Arall
- lleoliad union
- dirgrynu
- darllen cysylltiadau
- darllen y cofnod galwadau
- darllen y calendrSganio wi-figalw ffôn
- darllen SMSysgrifennu SMS
- derbyn SMS
- derbyn MMS
- anfon SMS
- darllen SMS ICCcamera
- recordio sain
- botymau cyfryngau
- ffocws sain
- prif uchder sainuchder sain llais
- uchder sain caniad ffôn
- uchder sain cyfryngau
- uchder sain larwmdistewi/dad-ddistewi\'r meicroffon
- taflunio cyfryngau
- rhoi VPN ar waithysgrifennu papur wal
- ychwanegu lleisbost
- defnyddio SIP
- gwneud galwaddefnyddio ôl bysdefnyddio synwyryddion corff
- ffugio lleoliad
- troi\'r sgrin ymlaen
- cael cyfrifonrhedeg yn y cefndir
- uchder sain hygyrchedd
- darllen rhifau ffôn
- gofyn i weld pecynnau gosoddefnyddio llun o fewn llun
- ateb galwadau ffôntoglo Wi-Fitoglo Bluetoothtoglo data symudol
- mynediad craidd
- Lleoliad union
- Dirgrynu
- Darllen cysylltiadau
- Darllen y log galwadau
- Darllen y calendrSganio wi-fiGalw ffôn
- Darllen SMSYsgrifennu SMS
- Derbyn SMS
- Derbyn MMS
- Anfon SMS
- Darllen SMS ICCCamera
- Recordio sain
- Darllen y clipfwrdd
- Botymau cyfryngau
- Ffocws sain
- Prif uchder sainUchder sain llais
- Uchder sain caniad ffôn
- Uchder sain cyfryngau
- Uchder sain larwm
- Taflunio cyfryngau
- Rhoi VPN ar waithYsgrifennu papur wal
- Ychwanegu lleisbost
- Defnyddio SIP
- Gwneud galwadDefnyddio ôl bysDefnyddio synwyryddion corff
- Ffugio lleoliad
- Troi\'r sgrin ymlaen
- Cael cyfrifonRhedeg yn y cefndir
- Darllen rhifau ffôn
- Gofyn i weld pecynnau gosodDefnyddio llun o fewn llun
- Ateb galwadau ffônToglo Wi-FiToglo BluetoothToglo data symudol
- Mynediad craidd
- Caniateir
- Anwybyddwyd
- Gofyn pob tro
- Caniateir %s
- Caniateir %1$s, gwrthodwyd %2$s
- Dangos apiau defnyddiwr
- Ailosod rhifyddion caniatáu/gwrthod
- Wyt ti\'n bendant eisiau ailosod rhifyddion?Iawn
- Diogelwch a phreifatrwydd
- Cyfreithiol LineageOSDeffro wrth gysylltu â phŵer
@@ -202,8 +101,5 @@
- Data symudol
- Galluogi defnydd data symudolData Wi\u2011Fi
- Galluogi defnydd data Wi\u2011Fi
diff --git a/res/values-cy/strings.xml b/res/values-cy/strings.xml
index 4f4e2d0dc4e4d8e8ace6a418e3396723ac10abe8..c34d85c6ddfb164c4c6667ba4868705c0fb42145 100644
--- a/res/values-cy/strings.xml
+++ b/res/values-cy/strings.xml
@@ -17,38 +17,23 @@
- "Na"
- CreuCaniatáu
- GwrthodCau
- Anhysybys
-
- Rwyt nawr %1$d camau i ffwrdd o gael mynediad datblygwr.
- Rwyt nawr %1$d cam i ffwrdd o gael mynediad datblygwr.
- Rwyt nawr %1$d gam i ffwrdd o gael mynediad datblygwr.
- Rwyt nawr %1$d cam i ffwrdd o gael mynediad datblygwr.
- Rwyt nawr %1$d cham i ffwrdd o gael mynediad datblygwr.
- Rwyt nawr %1$d cam i ffwrdd o gael mynediad datblygwr.
-
- Rwyt bellach â mynediad fel datblygwr!
- Dim angen; rwyt eisoes yn ddatblygwr.Di-wifr a rhwydweithiau
- CysylltiadauDyfais
@@ -56,7 +41,6 @@
Mynediad
- SystemGalluogi Cysylltiad Data
@@ -82,9 +66,7 @@
Heb Gofrestru
- Ar gael
- Dim ar gaelCofrestriad IMS: %1$s\u000ALlais dros LTE: %2$s\u000ALlais dros WiFi: %3$s\u000AGalwadau fideo: %4$s\u000ARhyngwyneb UT:%5$s
@@ -96,35 +78,23 @@
Radio wedi\'i Diffodd
- CrwydroDim yn Crwydro
- SegurGalwad ar y Gweill
- Wedi datgysylltu
- Yn cysylltu
- Wedi cysyllltu
- Anhysybys
- pkts
- beitiau
- dBm
- asu
- LAC
- CID
@@ -143,28 +113,30 @@
Gwneud yn fwyTestun enghreifftiol
- Llyfr Gwyn Rhydderch
+ Pedeir Keinc y Mabinogi
- Ail Gainc y Mabinogi
- ...\n
- Bendigeiduran a doeth ẏ r tir a llẏnghes ẏ gẏt ac ef parth a glann ẏr auon.\n
- \"arglỽẏd\" heb ẏ ỽẏrda \"ti a ỽdost kẏnnedẏf ẏr auon. nẏ eill neb uẏnet drỽẏdi. nẏt oes bont arnei hitheu. Mae dẏ gẏnghor am bont\" heb ỽẏ.\n
- \"Nit oes\" heb ẏnteu \"namẏn a uo penn bit pont. Mi a uẏdaf pont\" heb ef.\n
-ac ẏna gẏntaf ẏ dẏỽetpỽẏt ẏ geir hỽnnỽ ac ẏ diharebir etỽa ohonaỽ.\n
- ac ẏna guedẏ gorỽed ohonaỽ ef ar traỽs ẏr auon ẏ bẏrỽẏt clỽẏdeu arnaỽ ef. ac ẏd aeth ẏ luoed ef ar ẏ draỽs ef drỽod. ar hẏnnẏ gẏt ac ẏ kẏuodes ef. llẏma gennadeu matholỽch ẏn dẏuot attaỽ ef ac ẏn kẏuarch guell idaỽ. ac ẏn ẏ annerch ẏ gan uatholỽch ẏ gẏua thrachỽr ac ẏn menegi o e uod ef na haedei arnaỽ ef namẏn da.\n
- \"ac ẏ mae matholỽch ẏn rodi brenhinaeth iỽerdon ẏ ỽern uab matholỽch dẏ nei ditheu uab dẏ chỽaer ac ẏn ẏ ẏstẏnnu ẏ th ỽẏd di ẏn lle ẏ cam a r codẏant a ỽnaethpỽẏt ẏ uranỽen. ac ẏn ẏ lle ẏ mẏnnẏch ditheu aẏ ẏma aẏ ẏn ẏnẏs ẏ kedẏrn gossẏmdeitha uatholỽch.\"\n
- \"Je\" heb ẏnteu uendigeiduran \"onẏ allaf i ue hun cael ẏ urenhinaeth. ac aduẏd ẏs kẏmeraf gẏnghor am ẏch kennadỽri chỽi. O hẏn hẏt ban del amgen nẏ cheffỽch ẏ genhẏf i attep.\"\n
- \"Je\" heb ỽẏnteu \"ẏr atteb goreu a gaffom ninheu attat ti ẏ doỽn ac ef ac aro ditheu ẏn kennadỽri ninheu.\"\n
- \"arhoaf\" heb ef \"o doỽch ẏn ehegẏr\"\n
- ...
+ Pwyll a Riannon
+ Sewyll ac arhos a oruc y uorwyn, a gwaret y rann a dylyei uot am y hwyneb o wisc y phenn, ac attal y golwc arnaw, a dechrau ymdidan ac ef.\n
+ ‘Arglwydes,’ heb ef, ‘pan doy di, a pha gerdet yssyd arnat ti?’\n
+ ‘Kerdet wrth uy negesseu,’ heb hi, ‘a da yw gennyf dy welet ti.’\n
+ ‘Crassaw wrthyt y gennyf i,’ heb ef.\n
+ Ac yna medylyaw a wnaeth bot yn diuwyn ganthaw pryt a welsei o uorwyn eiroet, a gwreic, y wrth y ffryt hi.\n
+ ‘Arglwydes,’ heb ef, ‘a dywedy di ymi dim o’th negesseu?’\n
+ ‘Dywedaf, y rof a Duw,’ heb hi, ‘Pennaf neges uu ymi, keissaw dy welet ti.’\n
+ ‘Llyna,’ heb y Pwyll, ‘y neges oreu gennyf i dy dyuot ti idi. Ac y dywedy di ymi pwy wyt?’\n
+ ‘Dywedaf, arglwyd,’ heb hi. ‘Riannon, uerch Heueyd Hen, wyf i, a’m rodi y wyr o’m hanwod yd ydys. Ac ny mynneis innheu un gwr, a hynny o’th garyat ti. Ac nys mynnaf etwa, onyt ti a’m gwrthyt. Ac e wybot dy attep di am hynny e deuthum i.’\n
+ ‘Rof i a Duw,’ heb ynteu Pwyll, ‘llyna uy attep i iti, pei caffwn dewis ar holl wraged a morynnyon y byt, y mae ti a dewisswn.’\n
+ ‘Ie,’ heb hitheu, ‘os hynny a uynny, kyn uy rodi y wr arall, gwna oed a mi.’\n
+ ‘Goreu yw gennyf i,’ heb y Pwyll, ‘bo kyntaf; ac yn y lle y mynnych ti, gwna yr oet.’\n
+ ‘Gwnaf, arglwyd,’ heb hi. ‘Blwydyn y heno, yn llys Heueyd, mi a baraf bot gwled darparedic yn barawt erbyn dy dyuot.’\n
+ ‘Yn llawen,’ heb ynteu, ‘a mi a uydaf yn yr oet hwnnw.’\n
+ ‘Arlwyd,’ heb hi, ‘tric yn iach, a choffa gywiraw dy edewit, ac e ymdeith yd af i.’\n
+ A guahanu a wnaethont, a chyrchu a wnaeth ef parth a’u teulu a’u niuer. Pa ymouyn bynnac a uei ganthunt wy y wrth y uorwyn, y chwedleu ereill y trossei ynteu. Iawn
- Storfa USB
- Cerdyn SD
- BluetoothYn weladwy i ddyfeisiau Bluetooth gerllaw (%1$s)
@@ -172,7 +144,6 @@ ac ẏna gẏntaf ẏ dẏỽetpỽẏt ẏ geir hỽnnỽ ac ẏ diharebir et
Dim i\'w gweld gan ddyfeisiau Bluetooth eraill
- Dim ond yn weladwy i ddyfeisiau wedi\'u paru
@@ -194,17 +165,12 @@ ac ẏna gẏntaf ẏ dẏỽetpỽẏt ẏ geir hỽnnỽ ac ẏ diharebir et
Ailenwi
- Datgysylltu\'r ddyfais?
- Bydd dy ffôn yn datgysylltu o \"%1$s.\"
- Bydd dy lechen yn datgysylltu o \"%1$s.\"
- Bydd dy ddyfais yn datgysylltu o \"%1$s.\"Datgysylltu
- Nid oes gennyt ganiatâd i addasu gosodiadau Bluetooth.Mae %1$s yn weladwy i ddyfeisiau gerllaw tra bod gosodiadau Bluetooth ar agor.
@@ -215,127 +181,74 @@ ac ẏna gẏntaf ẏ dẏỽetpỽẏt ẏ geir hỽnnỽ ac ẏ diharebir et
Cyfeiriad Bluetooth y ddyfais: %1$s
- Datgysylltu %1$s?
- Darlledu
- Analluogi\'r proffil?
- Bydd hyn yn analluogi:<br><b>%1$s</b><br><br>Oddi wrth:<br><b>%2$s</b>
- Dyfais Bluetooth dienw
- Yn chwilio
- Ni chanfuwyd unrhyw ddyfeisiau Bluetooth cyfagos.
- Cais paru Bluetooth
- Cais paruTara i baru gyda %1$s.
- Ffeiliau a dderbyniwyd
- Dewisa ddyfais Bluetooth
- Mae %1$s eisiau troi Bluetooth ymlaen
- Mae %1$s eisiau troi Bluetooth i ffwrdd
- Mae ap eisiau troi Bluetooth ymlaen
- Mae ap eisiau troi Bluetooth i ffwrdd
- Mae %1$s eisiau gwneud dy lechen yn weladwy i ddyfeisiau Bluetooth eraill am %2$d eiliad.
- Mae %1$s eisiau gwneud dy ffôn yn weladwy i ddyfeisiau Bluetooth eraill am %2$d eiliad.
- Mae ap eisiau gwneud dy lechen yn weladwy i ddyfeisiau Bluetooth eraill am %1$d eiliad.
- Mae ap eisiau gwneud dy ffôn yn weladwy i ddyfeisiau Bluetooth eraill am %1$d eiliad.
- Mae %1$s eisiau gwneud dy lechen yn weladwy i ddyfeisiau Bluetooth eraill. Gellir newid hyn yn hwyrach yn y gosodiadau Bluetooth.
- Mae %1$s eisiau gwneud dy ffôn yn weladwy i ddyfeisiau Bluetooth eraill. Gellir newid hyn yn hwyrach yn y gosodiadau Bluetooth.
- Mae ap eisiau gwneud dy lechen yn weladwy i ddyfeisiau Bluetooth eraill. Gellir newid hyn yn hwyrach yng ngosodiadau Bluetooth.
- Mae ap eisiau gwneud dy ffôn yn weladwy i ddyfeisiau Bluetooth eraill. Gellir newid hyn yn hwyrach yng ngosodiadau Bluetooth.
- Mae %1$s eisiau troi Bluetooth ymlaen a gwneud dy lechen yn weladwy i ddyfeisiau Bluetooth eraill am %2$d eiliad.
- Mae %1$s eisiau troi Bluetooth ymlaen a gwneud dy ffôn yn weladwy i ddyfeisiau Bluetooth eraill am %2$d eiliad.
- Mae ap eisiau troi Bluetooth ymlaen a gwneud dy lechen yn weladwy i ddyfeisiau Bluetooth eraill am %1$d eiliad.
- Mae ap eisiau troi Bluetooth ymlaen a gwneud dy ffôn yn weladwy i ddyfeisiau Bluetooth eraill am %1$d eiliad.
- Mae %1$s eisiau troi Bluetooth ymlaen a gwneud dy lechen yn weladwy i ddyfeisiau Bluetooth eraill. Gellir newid hyn yn hwyrach yn y gosodiadau Bluetooth.
- Mae %1$s eisiau troi Bluetooth ymlaen a gwneud dy ffôn yn weladwy i ddyfeisiau Bluetooth eraill. Gellir newid hyn yn hwyrach yn y gosodiadau Bluetooth.
- Mae ap eisiau troi Bluetooth ymlaen a gwneud dy lechen yn weladwy i ddyfeisiau Bluetooth eraill. Gellir newid hyn yn hwyrach yn y gosodiadau Bluetooth.
- Mae ap eisiau troi Bluetooth ymlaen a gwneud dy ffôn yn weladwy i ddyfeisiau Bluetooth eraill. Gellir newid hyn yn hwyrach yn y gosodiadau Bluetooth.
- "Yn troi Bluetooth ymlaen\u2026"
- "Yn troi Bluetooth i ffwrdd\u2026"
- Awto-gysylltu
- "Cais cysylltiad Bluetooth""Tara i gysylltu gyda \u0022%1$s\u0022."
- "Wyt ti am gysylltu â \u0022%1$s\u0022?"
- Mae %1$s eisiau medru gweld dy holl gysylltiadau a hanes galwadau. Caniatáu mynediad i %2$s?
-
- Peidio â gofyn eto
- Peidio â gofyn eto
- Hoffai %1$s gyrchu dy negeseuon. Caniatáu mynediad i %2$s?
- Hoffai %1$s gyrchu dy gerdyn SIM. Bydd caniatáu mynediad i\'r cerdyn SIM yn analluogi cysylltiad data ar dy ddyfais tra bod y cysylltiad yn parhau. Caniatáu mynediad %2$s i\'r SIM?
- Dy ddyfeisiau
- Dyddiad ac amser
- Dewisa gylchfa amser
- Data:Anfon darllediad
- Gweithred:
- Adnodd:
- Cyfrif:
- Procsi
- Clirio
- Iawn
- SylwIawn
@@ -345,7 +258,6 @@ ac ẏna gẏntaf ẏ dẏỽetpỽẏt ẏ geir hỽnnỽ ac ẏ diharebir et
- "PAC URL: "Cell Location Info (deprecated):
@@ -359,11 +271,8 @@ ac ẏna gẏntaf ẏ dẏỽetpỽẏt ẏ geir hỽnnỽ ac ẏ diharebir et
Gwasanaeth Data:
- Crwydro:
- IMEI:
- IMSI:Ailgyfeirio Galwadau:
@@ -401,7 +310,6 @@ ac ẏna gẏntaf ẏ dẏỽetpỽẏt ẏ geir hỽnnỽ ac ẏ diharebir et
Rhedeg Prawf Ping
- SMSC:Diweddariad
@@ -415,36 +323,23 @@ ac ẏna gẏntaf ẏ dẏỽetpỽẏt ẏ geir hỽnnỽ ac ẏ diharebir et
Yn Llwytho Rhestr Bandiau\u2026
- Gosod
- Aflwyddiannus
- Llwyddiannus
- Cyfanswm beitiau:
- Dim cerdyn SD.
- Beitiau ar gael:
- Mae nawr yn ddiogel i ddatgysylltu\'r storfa USB.
- Mae nawr yn ddiogel i dynnu\'r cerdyn SD allan.
- Cafodd y storfa USB ei ddatgysylltu tra roedd yn cael ei ddefnyddio!
- Cafodd y cerdyn SD ei dynnu allan tra roedd yn cael ei ddefnyddio!
- Beitiau a defnyddiwyd:
- Yn sganio\'r storfa USB am gyfryngau\u2026
- Yn sganio\'r cerdyn SD am gyfryngau\u2026
@@ -457,7 +352,6 @@ ac ẏna gẏntaf ẏ dẏỽetpỽẏt ẏ geir hỽnnỽ ac ẏ diharebir et
Dewisiadau ieithoedd
- TynnuYchwanegu iaith
@@ -488,22 +382,16 @@ ac ẏna gẏntaf ẏ dẏỽetpỽẏt ẏ geir hỽnnỽ ac ẏ diharebir et
Tynnu\'r iaith
- Dewis gweithredGwybodaeth am y ddyfaisSgrin
- Gwybodaeth y llechen
- Gwybodaeth y ffôn
- Storfa USB
- Cerdyn SD
- Gosodiadau procsi
@@ -512,11 +400,9 @@ ac ẏna gẏntaf ẏ dẏỽetpỽẏt ẏ geir hỽnnỽ ac ẏ diharebir et
Iawn
- AnghofioCadw
- IawnGosodiadau
@@ -530,19 +416,14 @@ ac ẏna gẏntaf ẏ dẏỽetpỽẏt ẏ geir hỽnnỽ ac ẏ diharebir et
Di-wifr a rhwydweithiau
- Rheoli Wi\u2011Fi, Bluetooth, modd awyren, rhwydweithiau symudol, a rhwydweithiau preifat rhithwir (VPN)
- Data symudolGalwadau
- Negeseuon SMS
- Caniatáu defnydd data dros rwydwaith symudolCaniatáu defnydd data wrth grwydro tramor
- Data wrth grwydro
@@ -550,20 +431,16 @@ ac ẏna gẏntaf ẏ dẏỽetpỽẏt ẏ geir hỽnnỽ ac ẏ diharebir et
Mae\'n bosib y bydd costau sylweddol.
- Pan wyt ti\'n defnyddio crwydro data mae\'n bosib y bydd costau sylweddol!\n\nMae hyn yn effeithio ar holl ddefnyddwyr y llechen hon.
- Pan wyt ti\'n defnyddio crwydro data mae\'n bosib y bydd costau sylweddol!\n\nMae hyn yn effeithio ar holl ddefnyddwyr y ffôn hwn.Caniatáu data crwydro?
- Dyddiad ac amserGosod dyddiad ac amser
- Gosod dyddiad, amser, cylchfa amser a fformatauDyddiad ac amser awtomatigDefnyddio\'r cylchfa amser gan y rhwydwaith
- Fformat 24\u2011awrDefnyddio fformat 24 awr
- Amser
- Gosod yr amser
- Cylchfa amser
- Dewis cylchfa amser
- Dyddiad
- Gosod y dyddiadTrefnu yn nhrefn yr wyddor
- Dyddiad
- AmserCloi yn awtomatig%1$s ar ôl cysgu
- Yn syth ar ôl cysgu, oni bai fod %1$s yn ei gadw heb ei gloi.
- %1$s ar ôl cysgu, oni bai fod %1$s yn ei gadw heb ei gloi.
- Galluogi teclynnauDim
- %1$d / %2$d
- E.e. Android Aled.
- Gwybodaeth defnyddiwr
- Dangos gwybodaeth proffil ar y sgrin cloi
- Gwybodaeth proffil
- CyfrifonLleoliad
- CyfrifonDiogelwch a lleoliad
- Dewisiadau\'r sgrin cloi
@@ -654,49 +511,30 @@ ac ẏna gẏntaf ẏ dẏỽetpỽẏt ẏ geir hỽnnỽ ac ẏ diharebir et
- Ôl bysRheoli olion bysedd
- Defnyddio ôl bys ar gyfer
- Ychwanegu ôl bys
- clo sgrin
-
- Gosod %1$d olion bysedd
- Gosod %1$d ôl bys
- Gosod %1$d ôl bys
- Gosod %1$d ôl bys
- Gosod %1$d ôl bys
- Gosod %1$d ôl bys
-
- Datgloi gydag ôl dy fysDefnyddio ôl dy fysCyffyrdda\'r synhwyrydd olion bysedd i ddatgloi dy ffôn, awdurdodi prynu pethau, neu fewngofnodi i apiau. Bydda\'n ofalus ôl bys pwy wyt ti\'n eu hychwanegu. Gall un ôl bys yn unig wneud yr holl bethau hyn.\n\nNodyn: Mae dy ôl bys yn llai diogel na phatrwm neu PIN cryf.
- Defnyddia ôl dy fys i ddatgloi dy ffôn neu i awdurdodi prynu pethau.\n\nNodyn: Ni ellir defnyddio ôl dy fys i ddatgloi\'r ddyfais hon. Am ragor o wybodaeth, cysyllta â gweinyddwr dy sefydliad.
- Defnyddia ôl dy fys i ddatgloi dy ffôn neu i awdurdodi prynu pethau.\n\nNodyn: Gall defnyddio ôl dy fys fod yn llai diogel na PIN neu batrwm cryf.Diddymu
- ParhauNeidioNesaf
- Neidio ôl bys?
- Dyw gosod ôl bys ond yn cymryd munud neu ddau. Os wyt yn neidio hyn, mi fydd yn bosib gosod dy ôl fys yn y gosodiadau yn hwyrach.
- Neidio sgrin cloi?Ni fydd nodweddion diogelu\'r ddyfais ar waith. Ni fydd yn bosib rhwystro eraill rhag defnyddio\'r llechen hon os yw\'n cael ei cholli, dwyn neu ailosod.
@@ -710,7 +548,6 @@ ac ẏna gẏntaf ẏ dẏỽetpỽẏt ẏ geir hỽnnỽ ac ẏ diharebir et
Ni fydd nodweddion diogelu\'r ddyfais ar waith. Ni fydd yn bosib rhwystro eraill rhag defnyddio\'r ffôn hwn os yw\'n cael ei golli neu ddwyn.
- Neidio beth bynnagMynd nôl
@@ -721,7 +558,6 @@ ac ẏna gẏntaf ẏ dẏỽetpỽẏt ẏ geir hỽnnỽ ac ẏ diharebir et
Iawn
- Dileu
@@ -730,9 +566,7 @@ ac ẏna gẏntaf ẏ dẏỽetpỽẏt ẏ geir hỽnnỽ ac ẏ diharebir et
- Neidio gosod ôl bys?
- Rwyt wedi dewis defnyddio ôl dy fys fel dull i ddatgloi dy ffôn. Os wyt ti\'n neidio\'r cam nawr, mi fydd yn rhai gosod hyn yn hwyrach. Dyw ond yn cymryd funud neu ddwy i\'w osod.Gorffen
@@ -742,94 +576,56 @@ ac ẏna gẏntaf ẏ dẏỽetpỽẏt ẏ geir hỽnnỽ ac ẏ diharebir et
- Ychwanegu un arallNesaf
- Dyw\'r sgrin cloi heb ei alluogi. I ddysgu mwy, cysyllta â gweinyddwr dy sefydliad.
- Mwy o wybodaeth\n\nMae dal yn bosib defnyddio ôl dy fys i awdurdodi mynediad apiau a phrynu pethau.
- Dysgu mwy
- Coda dy fys, yna cyffyrdda\'r synhwyrydd eto
- Gellir ychwanegu hyd at %d ôl bys
- Rwyt wedi ychwanegu\'r nifer mwyaf o olion bysau a ganiateir.
- Methu ag ychwanegu rhagor o ôl fysedd
- Tynnu pob un o\'r olion bysedd?
- Tynnu \'%1$s\'
- Wyt ti am ddileu\'r ôl bys hwn?
- Ni fyddi’n medru defnyddio dy olion bysedd i ddatgloi dy ffôn, awdurdodi prynu pethau, na mewngofnodi i apiau.
- Ie, dw i am ei dynnu
- Defnyddia ôl dy fys i barhau.
- Amgryptiad
- Amgryptio\'r llechen
- Amgryptio\'r ffôn
- Wedi’i amgryptioMae\'n bosib amgryptio dy gyfrifon, gosodiadau, apiau wedi\'u lawrlwytho a\'u data, cyfryngau, a ffeiliau eraill. Ar ôl amgryptio dy lechen, gan gymryd dy fod wedi gosod sgrin cloi (boed yn batrwm, PIN neu gyfrinair), bydd yn rhaid datgloi\'r sgrin i ddadgryptio\'r llechen pob tro mae\'n cael ei throi ymlaen. Yr unig ffordd arall i ddadgryptio yw ail-osod y ddyfais i fel yr oedd yn gadael y ffatri, gan golli dy holl ddata.\n\nMae amgryptio yn cymryd tuag awr neu\'n fwy o amser. Rhaid bod y batri yn llawn cyn dechrau a\'r llechen wedi ei gysylltu i brif ffynhonnell pŵer trwy gydol y broses. Os oes rhywbeth yn tarfu ar y broses, mae\'n bosib colli peth neu\'r cyfan o dy ddata.Mae\'n bosib amgryptio dy gyfrifon, gosodiadau, apiau wedi\'u lawrlwytho a\'u data, cyfryngau, a ffeiliau eraill. Ar ôl amgryptio dy ffôn, gan gymryd dy fod wedi gosod sgrin cloi (boed yn batrwm, PIN neu gyfrinair), bydd yn rhaid datgloi\'r sgrin i ddadgryptio\'r ffôn pob tro mae\'n cael ei droi ymlaen. Yr unig ffordd arall i ddadgryptio yw ail-osod y ddyfais i fel yr oedd yn gadael y ffatri, gan golli dy holl ddata.\n\nMae amgryptio yn cymryd tuag awr neu\'n fwy o amser. Rhaid bod y batri yn llawn cyn dechrau a\'r ffôn wedi ei gysylltu i brif ffynhonnell pŵer trwy gydol y broses. Os oes rhywbeth yn tarfu ar y broses, mae\'n bosib colli peth neu\'r cyfan o dy ddata.
- Amgryptio\'r llechen
- Amgryptio\'r ffôn
- Rhaid gwefru\'r batri a rhoi cynnig arall arni.
- Cysyllta gwefrydd a rhoi cynnig arall arni.
- Nid oes PIN na chyfrinair i\'r sgrin cloi
- Rhaid gosod PIN neu gyfrinair i\'r sgrin cloi cyn medru dechrau amgryptiad.
- Amgryptio?
- Nid yw\'n bosib dadwneud y weithred amgryptio a bydd data yn cael ei golli os yw\'r amgryptiad yn cael ei stopio cyn cwblhau.
-Mae amgryptio yn cymryd awr neu\'n hirach a bydd y llechen yn ailgychwyn sawl tro yn ystod yr amser yna.
- Nid yw\'n bosib dadwneud y weithred amgryptio a bydd data yn cael ei golli os yw\'r amgryptiad yn cael ei stopio cyn cwblhau.
-Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro yn ystod yr amser yna.
- Yn amgryptio
- Arhosa tra bod dy lechen yn cael ei hamgryptio. Wedi cwblhau ^1%.
- Arhosa tra bod dy ffôn yn cael ei amgryptio. Wedi cwblhau ^1%.
- Arhosa tra bod dy lechen yn cael ei hamgryptio. Amser yn weddill: ^1
- Arhosa tra bod dy ffôn yn cael ei amgryptio. Amser yn weddill: ^1I ddatgloi\'r llechen, tro\'r ddyfais i ffwrdd ac yna ymlaen eto.I ddatgloi\'r ffôn, tro\'r ddyfais i ffwrdd ac yna ymlaen eto.
- Rhybudd: Caiff dy ddyfais ei chlirio o\'i holl ddata ar ôl ^1 ymdrech aflwyddiannus arall i\'w datgloi! Rho dy gyfrinair
- Amgryptiad aflwyddiannusCafodd y broses amgryptio ei dorri ar ei draws ac nid yw\'n bosib ei gwblhau. O ganlyniad, dyw data dy lechen ddim yn hygyrch bellach.\n\nI barhau defnyddio dy lechen, rhaid ei ailosod nôl i fel yr oedd wrth adael y ffatri. Pan wyt ti\'n gosod dy lechen ar ôl ei ailosod, mi fydd yn cynnig cyfle iti adfer unrhyw ddata cafodd ei gadw wrth gefn i dy gyfrif Google. Cafodd y broses amgryptio ei dorri ar ei draws ac nid yw\'n bosib ei gwblhau. O ganlyniad, dyw data dy ffôn ddim yn hygyrch bellach.\n\nI barhau defnyddio dy ffôn, rhaid ei ailosod nôl i fel yr oedd wrth adael y ffatri. Pan wyt ti\'n gosod dy ffôn ar ôl ei ailosod, mi fydd yn cynnig cyfle iti adfer unrhyw ddata cafodd ei gadw wrth gefn i dy gyfrif Google.
- Dadamgryptiad aflwyddiannusMae\'r cyfrinair a rhoddaist yn gywir, ond yn anffodus mae dy ddata yn llwgr.\n\nI barhau i ddefnyddio dy lechen, rhaid ei ailosod nôl i fel yr oedd yn gadael y ffatri.\n\nWrth osod dy lechen ar ôl ei ailosod, bydd cyfle i adfer unrhyw ddata a gafodd ei gadw fel copi wrth gefn ar dy gyfrif Google.Mae\'r cyfrinair a rhoddaist yn gywir, ond yn anffodus mae dy ddata yn llwgr.\n\nI barhau i ddefnyddio dy ffôn, rhaid ei ailosod nôl i fel yr oedd yn gadael y ffatri.\n\nWrth osod dy ffôn ar ôl ei ailosod, bydd cyfle i adfer unrhyw ddata a gafodd ei gadw fel copi wrth gefn ar dy gyfrif Google.
- Newid dull mewnbwn
@@ -841,7 +637,6 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Datgloi gydag ôl dy fys
- Dewis clo sgrinDewis clo gwaith
@@ -878,11 +673,9 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Dim diogelwch
- PatrwmDiogelwch cymedrol
- PINDiogelwch cymedrol i uchel
@@ -907,9 +700,7 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Dim
- Patrwm
- PINCyfrinair
- Tynnu amddiffyniad y ddyfais?Tynnu amddiffyniad proffil?
@@ -954,47 +744,29 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
"Ni fydd nodweddion diogelu proffil yn gweithio heb dy sgrin cloi.\n\nBydd olion dy fysedd sydd wedi eu cadw hefyd yn cael eu tynnu o'r proffil ac ni fydd yn bosib datgloi dy broffil, awdurdodi prynu pethau, na mewngofnodi i apiau hebddyn nhw."
- Ie, dw i am ei dynnu.
- Newid y patrwm datgloi
- Newid y PIN datgloi
- Newid y cyfrinair datgloiRho gynnig arall arni. Cais %1$d o %2$d.
- Caiff dy ddata ei ddileu
- Os rwyt yn rhoi patrwm anghywir ar dy ymdrech nesaf caiff holl ddata\'r ddyfais ei ddileu
- Os rwyt yn rhoi PIN anghywir ar dy ymdrech nesaf caiff holl ddata\'r ddyfais ei ddileu
- Os rwyt yn rhoi cyfrinair anghywir ar dy ymdrech nesaf caiff holl ddata\'r ddyfais ei ddileu
- Os rwyt yn rhoi patrwm anghywir ar dy ymdrech nesaf caiff y defnyddiwr hwn ei ddileu
- Os rwyt yn rhoi PIN anghywir ar dy ymdrech nesaf caiff y defnyddiwr hwn ei ddileu
- Os rwyt yn rhoi cyfrinair anghywir ar dy ymdrech nesaf caiff y defnyddiwr hwn ei ddileu
- Os rwyt yn rhoi patrwm anghywir ar dy ymdrech nesaf caiff dy broffil gwaith a\'i ddata eu dileu
- Os rwyt yn rhoi PIN anghywir ar dy ymdrech nesaf caiff holl ddata\'r ddyfais ei ddileu
- Os rwyt yn rhoi cyfrinair anghywir ar dy ymdrech nesaf caiff dy broffil gwaith a\'i ddata eu dileu
- Bu gormod o ymdrechion aflwyddiannus. Caiff data\'r ddyfais ei ddileu.
- Bu gormod o ymdrechion aflwyddiannus. Caiff y defnyddiwr hwn ei ddileu.
- Bu gormod o ymdrechion aflwyddiannus. Caiff y proffil gwaith a\'i ddata eu dileu.Wfftio
- Parhau
@@ -1020,7 +792,6 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Diddymu
- ClirioDiddymu
@@ -1029,14 +800,6 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
-
- %d apiau yn weithredol
- %d ap yn weithredol
- %d ap yn weithredol
- %d ap yn weithredol
- %d ap yn weithredol
- %d ap yn weithredol
-
@@ -1044,13 +807,9 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- Bluetooth
- Troi Bluetooth ymlaen
- Bluetooth
- BluetoothRheoli cysylltiadau, gosod enw\'r ddyfais, a\'r dulliau canfod
@@ -1059,11 +818,9 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- Paru gyda %1$s?
- PIN yn cynnwys llythrennau neu symbolauRhaid bod yn 16 digid
@@ -1074,7 +831,6 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
I baru gyda:<br><b>%1$s</b><br><br>Teipia hyn arno:<br><b>%2$s</b>, ac yna pwyso \'Return\' neu \'Enter\'.
- Caniatáu mynediad i dy gysylltiadau a hanes galwadau
@@ -1085,24 +841,20 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Gosodiadau\'r ddyfais
- Dyfais wedi\'i pharuEnwCysylltiad rhyngrwyd
- BysellfwrddCysylltiadau a hanes galwadau
- Paru gyda\'r ddyfais hon?Mae %1$s eisiau mynediad at dy gysylltiadau a hanes galwadau.Mae %1$s eisiau paru gyda Bluetooth. Tra wedi cysylltu, mi fydd gyda mynediad at dy gysylltiadau a hanes galwadau.
- Dyfeisiau wedi\'u paruDyfeisiau ar gael
@@ -1117,7 +869,6 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Datgysylltu a datbaru
- Dewisiadau\u2026Uwch
@@ -1126,42 +877,31 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- I wella cywirdeb lleoliad, gall apiau a gwasanaethau system dal i synhwyro dyfeisiau Bluetooth. Gellir newid hyn yn LINK_BEGINgosodiadau sganioLINK_END.
- Methwyd â chysylltu. Rho gynnig arall arni.Cyfeiriad Bluetooth y ddyfais: %1$s
- Ni fydd dy ffôn mwyach wedi ei baru â \"%1$s
- Ni fydd dy lechen mwyach wedi ei pharu â \"%1$s.\"
- Cysylltu â\u2026
- Caiff %1$s ei ddatgysylltu o sain cyfryngau.
- Caiff %1$s ei ddatgysylltu o sain heb ddwylo.
- Caiff %1$s ei ddatgysylltu o ddyfais mewnbwn.
- Dyfais Bluetooth wedi\'i pharuCysylltu
- Defnnyddio ar gyferAilenwi
- Caniatáu trosglwyddo ffeiliau i mewn
@@ -1171,7 +911,6 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Cofio\'r gosodiadau
- Bwrw
@@ -1180,13 +919,10 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Wedi cysyllltu
- Dim ar gael
- Anghofio
- IawnEnw
@@ -1199,22 +935,14 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- 2.4 GHz
- 5 GHz
- %1$d Mbps
- Mae %s eisiau troi Wi-Fi ymlaen
- Mae %s eisiau troi Wi-Fi i ffwrdd
- NFC
- Caniatáu cyfnewid data pan mae\'r llechen yn cyffwrdd â dyfais arall
- Caniatáu cyfnewid data pan mae\'r ffôn yn cyffwrdd â dyfais arallRhoi NFC ar waith
@@ -1225,11 +953,9 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- Pan mae\'r nodwedd hon ar waith, mae\'n bosib pelydru cynnwys ap i ddyfais arall gyda NFC gan ddal y dyfeisiau yn agos at ei gilydd. Er enghraifft, gellir pelydru tudalennau gwe, fideos YouTube, cysylltiadau, a mwy.\n\nRho\'r dyfeisiau wrth ei gilydd (cefn wrth gefn fel arfer) yna cyffyrdda dy sgrin. Mae\'r ap yn pennu beth sy\'n cael ei belydru.
- Troi Wi-Fi ymlaenGosodiadau Wi\u2011Fi
@@ -1242,15 +968,12 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Yn troi Wi-Fi i ffwrdd\u2026
- Gwall
- Dyw band 5 GHz ddim ar gael yn y wlad hon
- Bydd Wi\u2011Fi yn troi ymlaen eto o fewn cyrraedd rhwydweithiau safon uchel wedi\'u cadw, fel dy rwydwaith cartref.
@@ -1260,9 +983,7 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Defnyddio dim ond rhwydweithiau gyda chysylltiad da i\'r rhyngrwyd
- Cysylltu â rhwydweithiau agored
- Cysylltu yn awtomatig â rhwydweithiau cyhoeddus ansawdd uchel
@@ -1270,7 +991,6 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- I wella cywirdeb lleoliad, gall apiau a gwasanaethau system dal i sganio am rwydweithiau Wi\u2011Fi. Gellir newid hyn yn LINK_BEGINgosodiadau sganioLINK_END.
@@ -1280,44 +1000,30 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- Gwella effeithlonrwydd
- Lleihau defnydd batri tra bod Wi\u2011Fi ymlaen
- Cyfyngu ar ddefnydd batri Wi-Fi
- Defnyddio data symudol pan nad oes gan y Wi\u2011Fi mynediad i\'r rhyngrwyd. Mae\'n bosib bydd costau am ddefnydd data.Ychwanegu rhwydwaith
- Dewisiadau Wi\u2011Fi
- Mae Wi\u2011Fi yn troi ymlaen eto\'n awtomatig
- Dyw Wi\u2011Fi ddim yn troi ymlaen eto yn awtomatig
- Rhwydweithiau Wi\u2011Fi
- Botwm Gwthio WPS
- Rhagor o ddewisiadau
- Rhoi Pin WPSUwch
- Ffurfweddu
- Anghofio\'r rhwydwaith
- Addasu\'r rhwydwaithI weld pa rwydweithiau sydd ar gael, rhaid troi Wi-Fi ymlaen.
@@ -1325,7 +1031,6 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Yn chwilio am rwydweithiau Wi-Fi\u2026
- MwyGosod awtomatig (WPS)
@@ -1337,17 +1042,13 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Dewislen disgyn Dewisiadau Uwch. Tariad dwbl i\'w ehangu.
- Yn dechrau WPS\u2026Pwysa\'r botwm \"Wi\u2011Fi Protected Setup\" ar dy lwybrydd neu \"router\". Mae\'n debyg ei bod gyda \u201cWPS\u201d neu\'r symbol yma:
- WPS wedi llwyddo. Yn cysylltu i\'r rhwydwaith\u2026
- Mae WPS eisoes ar y gweill a gall gymryd hyd at ddau funud i\'w gwblhau.
- Methodd WPS. Ceisia eto mewn ychydig funudau.
@@ -1375,23 +1076,17 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Parth
- AdnabodCyfrinair
- Dangos cyfrinair
- Band 2.4 GHz
- Band 5 GHz
- Gosodiadau IPRhannu gyda defnyddwyr eraill y ddyfais
- (heb newid)Dewisa
@@ -1410,49 +1105,39 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Rhaid rhoi parth.
- WPS ar gael\u0020(WPS ar gael)
- Rho gyfrinair dy rwydwaithCaniatáu
- GwrthodMewngofnodi er mwyn cysylltu?
- Mae ar %1$s angen dy fod wedi mewngofnodi ar-lein cyn medru cysylltu â\'r rhwydwaith.CYSYLLTUDoes gan y rhwydwaith hwn dim mynediad i\'r rhyngrwyd. Parhau wedi cysylltu?Dyw\'r Wi\u2011Fi heb gysylltu â\'r rhyngrwyd.
- Mae\'n bosib newid i\'r rhwydwaith symudol pan mae\'r cysylltiad Wi\u2011Fi yn wael. Mae\'n bosib bydd costau am ddefnydd data.Aros ar Wi\u2011FiByth dangos etoCysylltu
- Methwyd â chysylltu â\'r rhwydwaith
- Addasu
- Methwyd ag anghofio\'r rhwydwaithCadw
- Methwyd a chadw\'r rhwydwaithDiddymu
- Rhwydweithiau wedi\'u cadwGosodiadau Wi-Fi uwch
@@ -1465,13 +1150,10 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- DNSCyfeiriadau IPv6
- Rhwydweithiau wedi\'u cadw
- Gosodiadau IPDyw gosodiadau uwch Wi\u2011Fi ddim ar gael ar gyfer y defnyddiwr hwn.
@@ -1484,9 +1166,7 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- DNS 1
- DNS 2
@@ -1505,48 +1185,32 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Datgysylltu?
- Os wyt yn datgysylltu, bydd dy gysylltiad gyda %1$s yn dod i ben.
- Os wyt yn datgysylltu, bydd dy gysylltiad gyda %1$s a %2$s dyfais arall yn dod i ben.
- Wyt ti am ddiddymu\'r gwahoddiad i gysylltu gyda %1$s?
- Anghofio\'r grŵp hwn?
- Llecynnau Cysylltiad Wi\u2011Fi
- Mae\'r ap yn rhannu cynnwys. I rannu cysylltiad rhyngrwyd, tro\'r llecyn Wi-Fi i ffwrdd ac yna ymlaen eto
- Band AP
- Gall apiau creu llecyn Wi-Fi er mwyn rhannu cynnwys gyda dyfeisiau cyfagos.
- Yn troi\'r llecyn Wi-Fi ymlaen\u2026
- Yn troi\'r llecyn Wi-Fi i ffwrdd\u2026
- Mae %1$s yn weithredol
- Gwall llecyn Wi\u2011Fi cludadwy
- Creu llecyn cysylltiad Wi\u2011Fi
- Creu llecyn cysylltiad Wi\u2011Fi
- Llecyn AndroidAP WPA2 PSK
- Llecyn Wi-Fi %1$s%2$s hotspotLlecynAndroid
- Galwadau Wi-FiTroi Galwadau Wi-Fi ymlaen
@@ -1610,7 +1273,6 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Dewisiadau galw
- Modd galwadau Wi-FiDewis crwydro (tramor)
@@ -1618,13 +1280,13 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Dewis crwydro (tramor)
- Ffafrio Wi-Fi
+ Wi-Fi preferredMobile preferredWi-Fi yn unigWi-Fi
- Symudol
+ MobileWi-Fi yn unig
@@ -1632,25 +1294,15 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
"1""0"
-
- Ffafrio Wi-Fi
- Mobile preferred
- Wi-Fi
- Symudol
-
-
- "2"
- "1"
+ Mobile
- Tra bod galwadau Wi-Fi ymlaen, gall dy ffôn dargyfeirio galwadau trwy rwydweithiau Wi-Fi neu rwydwaith dy ddarparwr gwasanaeth symudol, yn dibynnu ar dy osodiadau a pha signal sy\'n gryfach ar y pryd. Cyn troi\'r nodwedd hon ymlaen, mae\'n syniad da gwirio gyda dy ddarparwr symudol am ffioedd a manylion eraill.Diweddaru\'r Cyfeiriad Argyfwng
- Y cyfeiriad i\'w ddefnyddio gan wasanaethau brys fel dy leoliad yn yr achos dy fod yn gwneud galwad brys dros Wi-FiDangosydd
@@ -1660,9 +1312,7 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- Effeithiau sain
- Uchder sain caniad ffônDirgrynu pan yn ddistaw
@@ -1674,14 +1324,11 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- Nid yw\'n cefnogi proffiliau gwaithSain hysbysiad rhagosodedig
- Cyfryngau
- LarwmTonau cyffwrdd pad deialu
@@ -1692,25 +1339,20 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Dirgrynu wrth daro
- Cerddoriaeth, fideo, gemau a chyfryngau eraillTôn caniad a hysbysiadauHysbysiadau
- LarymauDistewi\'r tôn caniad a hysbysiadau
- Distewi cerddoriaeth a chyfryngau eraillDistewi hysbysiadau
- Distewi larymau
- Sain
@@ -1730,9 +1372,7 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- Chwilio
- Rheoli gosodiadau a hanes chwilio
@@ -1741,9 +1381,7 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Troi\'r sgrin yn awtomatig
- Lliwiau
- Naturiol
@@ -1759,36 +1397,25 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Disgleirdeb addasedig
- Addasu disgleirdeb y sgrin yn ôl goleuniI ffwrdd
- Ffafrio disgleirdeb isel iawn
- Ffafrio disgleirdeb isel
- Ffafrio disgleirdeb arferol
- Ffafrio disgleirdeb uchel
- Ffafrio disgleirdeb uchel iawnI ffwrdd
- Isel iawn
- Isel
- Uchel
- Y lefel o ddisgleirdeb sydd well gennyt ti
- Addasu disgleirdeb y sgrin yn ôl goleuni. Pan fydd y nodwedd hon ar waith, mi fydd dal yn bosib i ti addasu\'r disgleirdeb dy hun dros dro.Golau Nos
@@ -1798,12 +1425,9 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Dim
- Mae\'n troi ymlaen am amser penodol
- Amser dechrau
- Amser gorffenStatws
@@ -1839,7 +1463,6 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- BythI ffwrdd
@@ -1847,15 +1470,12 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- Dechrau nawr
- GosodiadauDisgleirdeb awtomatig
- Ymlaen o hyd / Defnydd uwch o\'r batriHysbysiadau newydd
@@ -1864,7 +1484,6 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Deffro\'r sgrin pan mae hysbysiadau\'n cael eu derbyn
- Ymlaen o hydMaint ffont
@@ -1876,29 +1495,21 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
I ffwrdd
- Wedi cloi
- Cloi cerdyn SIM
- Newid PIN SIM
- PIN SIM
- Cloi cerdyn SIM
- Hen PIN SIM
- PIN SIM
- PIN Anghywir
@@ -1908,13 +1519,11 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Diddymu
- Canfuwyd mwy nag un SIM
- %1$s yw\'r unig SIM yn dy ddyfais. Wyt ti eisiau defnyddio\'r cerdyn SIM hwn ar gyfer negeseuon SMS, data a galwadau symudol?
@@ -1922,27 +1531,21 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- Diweddariadau systemFersiwn Android
- Lefel patsh diogelwch AndroidModel
- Model a chaledwedd
- Fersiwn caledwedd
- Fersiwn BasebandFersiwn cnewyllynRhif adeiledd
- Statws SELinuxDim ar gael
@@ -1956,35 +1559,25 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- Gosodiadau storfa
- ICCID
- MDN
- Fy rif ffôn
- MIN
- MSID
- MEID
- ICCID
- Crwydro
- RhwydwaithCyfeiriad MAC Wi-Fi
@@ -1992,32 +1585,24 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Rhif cyfres
- Dim ar gaelAmser yn rhedeg
- Storfa mewnol
- Storfa USB
- Cerdyn SD
- Ar gael
- Cyfryngau
- LlwythiLluniau, fideosSain (cerddoriaeth, tonau caniad, podlediadau, ayyb)
- Ffeiliau eraill
@@ -2035,9 +1620,7 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Dileu popeth ar y cerdyn SD
- Mae\'n dileu\'r holl ddata ar y storfa USB mewnol, megis lluniau a cherddoriaeth
- Mae\'n dileu\'r holl ddata ar y cerdyn SD, megis lluniau a cherddoriaeth
@@ -2061,36 +1644,26 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- FformatioFformatio fel datgysylltadwy
- Fformatio fel mewnol
- Mudo data
- ArchwilioRhyddhau lleRheoli storfa
- Cysylltiad USB cyfrifiadur
- Cysylltu fel
- Mae\'n caniatáu i ti drosglwyddo ffeiliau ar Windows neu gan ddefnyddio Android File Transfer ar Mac (gweler www.android.com/filetransfer)
- Mae\'n caniatáu i ti drosglwyddo lluniau gan ddefnyddio meddalwedd camera, a throsglwyddo unrhyw ffeiliau ar gyfrifiaduron na sy\'n cefnogi MTP.
- MIDI
- Defnyddwyr eraillStorfa\'r ddyfais
@@ -2107,7 +1680,6 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- Mae %1$s wedi\'i fformatioAilenwi\'r storfa
@@ -2121,30 +1693,22 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
I ddefnyddio apiau, lluniau neu ddata ^1, rho gynnig ar ei ailosod yn y ddyfais.\n\nFel arall, mae\'n bosib dewis anghofio\'r storfa hon os nad yw\'r ddyfais ar gael.\n\nOs wyt yn dewis ei anghofio, bydd yr holl ddata mae\'r ddyfais yn ei gynnwys yn cael ei golli am byth.\n\nMae\'n bosib ailosod yr apiau yn hwyrach, ond bydd y data maen nhw wedi cadw ar y ddyfais hon wedi ei golli.
- Anghofio ^1?
- Apiau
- DelweddauFideos
- SainArall
- System
- Archwilio ^1
- Mae Arall yn cynnwys ffeiliau wedi\'u rhannu a gadwyd gan apiau, ffeiliau wedi\'u lawrlwytho o\'r rhyngrwyd neu Bluetooth, ffeiliau Android, ac yn y blaen.
-\n\nI weld cynnwys gweledol y cerdyn SD ^1, tara Archwilio.
+ Mae Arall yn cynnwys ffeiliau wedi\'i rhannu a gadwyd gan apiau, ffeiliau wedi\'u lawrlwytho o\'r rhyngrwyd neu Bluetooth, ffeiliau Android, ac yn y blaen.
+\n\nI weld cynnwys gweledol y cerdyn SD ^1, tapia Archwilio.
- Gall ^1 fod wedi cadw lluniau, cerddoriaeth, apiau, neu ddata arall gan ddefnyddio ^2 o\'r storfa.
-\n\nI weld manylion, newidia defnyddiwr i ^1.Defnyddio fel storfa datgysylltadwy
@@ -2153,13 +1717,11 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Er mwyn cadw unrhyw beth beth ar y ddyfais hon yn unig, gan gynnwys apiau a lluniau. Bydd rhaid ei fformatio a ni fydd yn gweithio gyda dyfeisiau eraill.
- Fformatio fel storfa fewnolMae hyn angen fod ^1 yn cael ei fformatio i\'w wneud yn ddiogel.\n\nAr ôl ei fformatio, bydd ^1 ond yn gweithio yn y ddyfais hon.\n\nMae fformatio yn dileu\'r holl ddata sydd eisoes ar ^1. Er mwyn osgoi colli\'r data, mae\'n dda ystyried creu copi wrth gefn.Fformatio fel storfa datgysylltadwy
- Mae hyn angen i\'r ^1 cael ei fformatio.\n\nMae fformatio yn dileu\'r holl ddata eisoes ar y ^1. Os am osgoi colli\'r data, rhaid cadw copi wrth gefn rhywle arall. Dileu popeth a fformatio
@@ -2167,85 +1729,54 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Paid â thynnu\'r ^ hyd nes bod y fformatio wedi cwblhau.
- Symud data i storfa newyddGellir symud dy luniau, ffeiliau a rhai apiau i\'r ^1.\n\nBydd eu symud yn cymryd tua ^2 ac yn rhyddhau ^3 o le yn y storfa fewnol. Bydd rhai apiau ddim yn gweithio tra bod y trosglwyddo ar waith.
- Symud nawr
- Symud yn hwyrach
- Symud data nawr
- Mae\'r symud yn cymryd tua ^1. Mi fydd yn rhyddhau ^2 ar ^3.
- Symud
- Yn symud data\u2026
- Mae ^1 yn barod
- Mae dy ^1 wedi ei osod ac yn barod i\'w ddefnyddio gyda lluniau a chyfryngau eraill.
- Mae dy ^1 newydd yn gweithio.\n\nI symud lluniau, ffeiliau, a data apiau i\'r ddyfais hon, gweler Dewisiadau > Storfa.
- Symud ^1Bydd symud ^1 a\'i ddata i ^2 ond yn cymryd ychydig funudau. Ni fyddi\'n medru defnyddio\'r ap nes bod y trosglwyddo wedi ei gwblhau.\n\nPaid â thynnu ^2 nes bod y trosglwyddo wedi ei gwblhau.
- Yn symud ^1\u2026
- Mae\'r ^1 hwn yn ymddangos i fod yn araf.
-\n\nMae\'n bosib parhau, ond mae\'n bosib y bydd apiau sy\'n cael eu symud i\'r lleoliad hwn yn araf wrth stopio a dechrau a gall trosglwyddo data gymryd amser hir.
-\n\nYstyria defnyddio ^1 mwy cyflym ar gyfer perfformiad gwell.Statws batri
- Lefel batri
- APNau
- Golygu pwynt mynediadHeb ei osodEnw
- APN
- Procsi
- Enw defnyddiwrCyfrinair
- Gweinydd
- MMSC
- Procsi MMS
- Porth MMS
- MCC
- MNCDim
- PAP
- CHAP
- PAP neu CHAP
- Math APN
@@ -2253,7 +1784,6 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- Dileu APNCadw
@@ -2268,12 +1798,10 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
- Ailosod dewisiadauGellir ailosod rhwydwaith, apiau neu\'r ddyfais
- Ailosod Wi-Fi, symudol a BluetoothBydd hyn yn ailosod pob gosodiad rhwydwaith, gan gynnwys:\n\n
Wi\u2011Fi
\n
Data symudol
\n
Bluetooth
\"
@@ -2290,17 +1818,13 @@ Mae amgryptio yn cymryd awr neu\'n hirach a bydd y ffôn yn ailgychwyn sawl tro
Ailosodwyd gosodiadau rhwydweithiau
- Dileu\'r holl ddata (ailosod i fel yr oedd yn gadael y ffatri)
- Bydd hyn yn dileu\'r holl data o storfa mewnol dy lechen, gan gynnwys:\n\n
Dy gyfrif Google
\n
Data a gosodiadau system ac apiau
\n
Apiau wedi\'u lawrlwytho
- Bydd hyn yn dileu\'r holl data o storfa mewnol dy ffôn, gan gynnwys:\n\n
Dy gyfrif Google
\n
Data a gosodiadau system ac apiau
\n
Apiau wedi\'u lawrlwytho
\n\nRwyt ar hyn o bryd wedi mewngofnodi i\'r cyfrifon a ganlyn:\n\n\nMae defnyddwyr eraill ar y ddyfais hon.\n
-
\n\nI chwyddo dros dro, tara\'r sgrin yn gyflym tair gwaith gan gadw dy drydydd cyffyrddiad.\n
Llusga i symud o amgylch y sgrin
\n
Coda dy fys i ddadchwyddo
\n\nNid yw\'n bosib chwyddo ar y bysellfwrdd na\'r bar llywio.
- Man fo chwyddo wedi\'i droi ymlaen, defnyddia\'r botwm Hygyrchedd ar waelod y sgrin i chwyddo\'n gyflym.\n\nI chwyddo, tara\'r botwm Hygyrchedd, yna tara rhywle ar y sgrin.\n
Llusga dau fys i sgrolio
\n
Pinsia dau fys i addasu\'r chwyddo
\n\nI chwyddo dros dro, tara\'r botwm Hygyrchedd, yna cyffyrdda a dal dy gyffyrddiad rhywle ar y sgrin.\n
Llusga i symud o amgylch y sgrin
\n
Coda dy fys i ddadchwyddo
\n\nNid yw\'n bosib chwyddo ar y bysellfwrdd na\'r bar llywio.
- Mae\'r botwm Hygyrchedd wedi\'i osod i %1$s. I ddefnyddio chwyddo, cyffyrdda a dal y botwm Hygyrchedd, yna dewisa chwyddo.
- Caniatáu o\'r sgrin gloi
- Testun cyferbyniad uchel
- Awto diweddaru chwyddo\'r sgrinBotwm pŵer yn gorffen galwad
@@ -3193,13 +2536,9 @@ Defnyddio\'r gwirydd sillafu hwn?
Cyfuno sianeli wrth chwarae sain
- Oediad cyffwrdd a dal
- Gwrthdroad lliwiau
- Gall gael effaith ar berfformiad
- Clicio pan mae\'r pwyntydd yn stopio symudOedi cyn clicio
@@ -3207,9 +2546,7 @@ Defnyddio\'r gwirydd sillafu hwn?
I FFWRDD
- Dangos yng Ngosodiadau Cyflym
- Modd cywiroOediad hynod o fyr (%1$d me)
@@ -3256,7 +2593,6 @@ Defnyddio\'r gwirydd sillafu hwn?
Oediad hynod o hir (%1$d me)
- GosodiadauYmlaen
@@ -3280,69 +2616,47 @@ Defnyddio\'r gwirydd sillafu hwn?
Anhryloywder ffenestr capsiwn
- Lliw testunAnhryloywder testun
- Lliw ymyl
- Math o ymylTeulu ffontBydd capsiynau yn edrych fel hyn
- AaRhagosodiad
- Lliw
- RhagosodiadDim
- Gwyn
- Llwyd
- Du
- Coch
- Gwyrdd
- Glas
- Gwyrddlas
- Melyn
- Magenta
- Defnyddio %1$s?
- Mae ar %1$s angen:
- Os wyt yn troi %1$s ymlaen, ni fydd dy ddyfais yn defnyddio\'r sgrin cloi i wella amgryptiad data.
- Gan fod troi %1$s i ffwrdd yn effeithio ar dy amgryptiad data, rhaid cadarnhau dy batrwm.
- Gan fod troi %1$s i ffwrdd yn effeithio ar dy amgryptiad data, rhaid cadarnhau dy PIN.
- Gan fod troi %1$s i ffwrdd yn effeithio ar dy amgryptiad data, rhaid cadarnhau dy gyfrinair.
- Stopio %1$s?Bydd taro Iawn yn stopio %1$s.
@@ -3350,7 +2664,6 @@ Defnyddio\'r gwirydd sillafu hwn?
- GosodiadauArgraffu
@@ -3363,9 +2676,7 @@ Defnyddio\'r gwirydd sillafu hwn?
Dim gwasanaeth wedi\'i osod
- Ni ddaethpwyd o hyd i argraffydd
- GosodiadauYmlaen
@@ -3385,11 +2696,9 @@ Defnyddio\'r gwirydd sillafu hwn?
Diddymu
- %1$s\n%2$sYn argraffu %1$s
- Yn diddymu %1$s
@@ -3401,47 +2710,31 @@ Defnyddio\'r gwirydd sillafu hwn?
Batri
- Pethau sydd wedi bod yn defnyddio\'r batri
- Dyw data defnydd batri ddim ar gael.
- %1$s
- - %2$s
- %1$s yn weddill
- Caniatáu i\'r ap hwn redeg yn y cefndir
- Gall yr ap redeg yn y cefndir pan nad yw\'n cael ei ddefnyddio
- Ni chaniateir i\'r ap redeg yn y cefndir
- ^1 yn ôl
- Defnydd apiau ers gwefru\'n llawn (^1 yn ôl)
- Pa mor hir mae\'r sgrin wedi bod ymlaen ers gwefru\'n llawn
- Defnydd batri ers datgysylltu\'r gwefrydd
- Defnydd batri ers ailosod
- %1$s ar fatri
- Yn gwefruSgrin ymlaen
- GPS ymlaenFflacholau ymlaen.
@@ -3453,36 +2746,25 @@ Defnyddio\'r gwirydd sillafu hwn?
- Defnydd batri uwch
- Manylion hanes
- Defnydd batri
- Apiau sy\'n draenio batri
- %1$d ap yn camymddwynNi all dy ffôn reoli\'r batri fel arfer gan fod %1$s yn cadw dy ffôn yn effro.\n\nI geisio cywiro hyn, rhaid stopio\'r ap.\n\nOs yw hyn yn parhau i ddigwydd, mae\'n bosib bydd yn rhaid dadosod yr ap i wella perfformiad batri.
- Ni all dy lechen reoli\'r batri yn yr un modd ag arfer gan fod %1$s yn cadw dy ddyfais yn effro.\n\nI geisio cywiro hyn, rhaid stopio\'r ap.\n\nOs yw hyn yn parhau i ddigwydd, mae\'n bosib bydd yn rhaid dadosod yr ap i wella perfformiad batri.
- Ni all dy ddyfais reoli\'r batri yn yr un modd ag arfer gan fod %1$s yn cadw dy ddyfais yn effro.\n\nI geisio cywiro hyn, rhaid stopio\'r ap.\n\nOs yw hyn yn parhau i ddigwydd, mae\'n bosib bydd yn rhaid dadosod yr ap i wella perfformiad batri.
- Ni all dy ffôn reoli\'r batri yn yr un modd ag arfer gan fod %1$s yn deffro\'r ddyfais o hyd.\n\nI geisio cywiro hyn, gellir stopio %1$s.\n\nOs yw hyn yn parhau i ddigwydd, mae\'n bosib bydd yn rhaid dadosod yr ap i wella perfformiad batri.
- Ni all dy lechen reoli\'r batri yn yr un modd ag arfer gan fod %1$s yn deffro\'r ddyfais o hyd.\n\nI geisio cywiro hyn, gellir stopio %1$s.\n\nOs yw hyn yn parhau i ddigwydd, mae\'n bosib bydd yn rhaid dadosod yr ap i wella perfformiad batri.
- Ni all dy ddyfais reoli\'r batri yn yr un modd ag arfer gan fod %1$s yn deffro\'r ddyfais o hyd.\n\nI geisio cywiro hyn, gellir stopio %1$s.\n\nOs yw hyn yn parhau i ddigwydd, mae\'n bosib bydd yn rhaid dadosod yr ap i wella perfformiad batri.
- Stopio\'r apNi all dy ffôn rheoli\'r batri yn y modd arferol gan fod %1$s yn deffro\'r ffôn o hyd.\n\nI gywiro\'r sefyllfa, awgrymir stopio %1$s a\'i rhwystro rhag rhedeg yn y cefndir.
@@ -3493,11 +2775,8 @@ Defnyddio\'r gwirydd sillafu hwn?
Troi i ffwrdd
- Troi lleoliad i ffwrdd?
- Ni all dy ffôn rheoli\'r batri yn yr un modd ag arfer gan fod %1$s yn gwneud ceisiadau cyson am dy leoliad tra nad wyt yn defnyddio\'r ap.\n\nI gywiro hyn, gellir troi lleoliad i ffwrdd ar gyfer yr ap hwn.
- Ni all dy lechen rheoli\'r batri yn yr un modd ag arfer gan fod %1$s yn gwneud ceisiadau cyson am dy leoliad tra nad wyt yn defnyddio\'r ap.\n\nI gywiro hyn, gellir troi lleoliad i ffwrdd ar gyfer yr ap hwn.Troi i ffwrdd
@@ -3506,36 +2785,25 @@ Defnyddio\'r gwirydd sillafu hwn?
Fflacholau
- Camera
- Wi\u2011Fi
- Bluetooth
- Galwadau llais
- Amrywiol
- ApiauGwasanaethau
- System
- Defnyddwyr eraill
- Cadw\'n effro
- GPS
- LlechenFfôn
@@ -3547,11 +2815,8 @@ Defnyddio\'r gwirydd sillafu hwn?
- Sain
- Fideo
- CameraFflacholau
@@ -3561,66 +2826,50 @@ Defnyddio\'r gwirydd sillafu hwn?
- Gorfodi stopio
- Gwybodaeth apGosodiadau apiauGosodiadau\'r sgrin
- Gosodiadau Wi\u2011FiGosodiadau Bluetooth
- Batri a ddefnyddiwyd gan alwadau llais
- Batri a ddefnyddiwyd tra bod y llechen yn segur
- Batri a ddefnyddiwyd tra bod y ffôn yn segur
- Batri a ddefnyddiwyd gan y fflacholau
- Batri a ddefnyddiwyd gan y camera
- Batri a ddefnyddiwyd gan y sgrin a\'i golau cefn
- Batri a ddefnyddiwyd gan Wi-Fi
- Batri a ddefnyddiwyd gan BluetoothTroi Bluetooth i ffwrdd pan nad yw\'n cael ei ddefnyddio
- Batri a ddefnyddiwyd gan apiau
- Batri a ddefnyddiwyd gan y defnyddiwr
- %d mAh
- Dadansoddiad ers y gwefriad llawn ddiwethafMae\'r data defnydd batri yn amcangyfrif a gall newid yn ôl defnydd
- Defnydd batri
@@ -3634,26 +2883,20 @@ Defnyddio\'r gwirydd sillafu hwn?
Ail-lwytho
- Android OSArbedwr batri
- Troi ymlaen yn awtomatig
- Byth
- pan fo %1$s o fatri
- Canran batriDangos canran batri yn y bar statws
- Defnydd cof%1$s
@@ -3669,7 +2912,6 @@ Defnyddio\'r gwirydd sillafu hwn?
- Android OSCnewyllyn
@@ -3684,25 +2926,18 @@ Defnyddio\'r gwirydd sillafu hwn?
Gwasanaethau
- Manylion cof
- Defnydd cofCnewyllynStorfeydd cnewyll
- Cyfnewid ZRam
- Ar gael
- Cyfanswm
- 3 awr
- 6 awr12 awr
@@ -3713,14 +2948,12 @@ Defnyddio\'r gwirydd sillafu hwn?
Cuddio apiau system
- Dangos canrannauCefndir
- Blaendir
@@ -3745,30 +2978,24 @@ Defnyddio\'r gwirydd sillafu hwn?
- Bydd y gwasanaeth mewnbwn llais hwn yn gallu perfformio monitro ymlaen-o-hyd a rheoli apiau y mae\'n bosib eu rheoli â llais ar dy ran. Mae\'n dod o\'r ap %s. Galluogi defnydd o\'r gwasanaeth hwn?Cyflymder a thraw llefaru
- Injan
- Lleisiau
- Agor apDiddymuAilosod
- ChwaraeRheoli pŵer
- %1$s%2$symlaen
@@ -3777,22 +3004,16 @@ Defnyddio\'r gwirydd sillafu hwn?
- BluetoothLleoliad
- Cysoni
- %1$s disgleirdeb
- llawn
- hanneri ffwrdd
- VPN
@@ -3802,7 +3023,6 @@ Defnyddio\'r gwirydd sillafu hwn?
Gosod tystysgrifau o gerdyn SD
- Tynnu pob tystysgrif
@@ -3820,11 +3040,8 @@ Defnyddio\'r gwirydd sillafu hwn?
- Cyfrinair cyfredol:
- Tynnu\'r holl gynnwys?
- Cyfrinair anghywir
@@ -3837,7 +3054,6 @@ Defnyddio\'r gwirydd sillafu hwn?
- Copi wrth gefnCadw copi wrth gefn ac adfer
@@ -3849,11 +3065,9 @@ Defnyddio\'r gwirydd sillafu hwn?
- Dyw\'r gwasanaeth cadw copi wrth gefn ddim ar gael
- Stopio cadw copi wrth gefn o dy gyfrifon Wi\u2011Fi, nodau tudalennau, gosodiadau eraill, a data apiau, a dileu\'r holl gopïau ar weinyddion Google?Stopio cadw copi wrth gefn o ddata\'r ddyfais (megis cyfrineiriau Wi-Fi a hanes galwadau) a data apiau (megis gosodiadau a ffeiliau sy\'n cael eu cadw gan apiau), a hefyd dileu\'r holl gopïau wrth gefn oddi ar weinyddion?
@@ -3868,33 +3082,25 @@ Defnyddio\'r gwirydd sillafu hwn?
- Personol
- Gwaith
- Rhoi ap gweinyddu\'r ddyfais ar waith?
- Rhoi\'r ap gweinyddu dyfais hwn ar waith
- Bydd rhoi\'r ap hwn ar waith yn galluogi\'r ap %1$s i wneud y canlynol:Mae\'r ap gweinyddwr hwn yn weithredol ac yn caniatáu i\'r ap %1$s gwneud y gweithredoedd hyn:
- Wrth barhau, bydd dy Ddefnyddiwr yn cael ei reoli gan dy Weinyddwr ac mae\'n bosib y bydd gan y Gweinyddwr gyda\'r gallu i gadw data cysylltiedig, yn ogystal â dy ddata personol.\n\nMae gan dy weinyddwr y gallu i fonitro a rheoli gosodiadau, mynediad, apiau, a data yn gysylltiedig â\'r Defnyddiwr hwn, gan gynnwys gweithgaredd rhwydwaith a gwybodaeth lleoliad dy ddyfais.Rhagor o fanylion
- CyffredinolLog hysbysiadauTôn caniad a dirgrynu galwadau
- SystemGosod Wi\u2011Fi
@@ -3967,7 +3173,6 @@ Defnyddio\'r gwirydd sillafu hwn?
- Rho ffurfweddiad y rhwydwaithCysylltu i rwydwaith newydd
@@ -3992,29 +3197,21 @@ Defnyddio\'r gwirydd sillafu hwn?
Tara Nesaf i barhau i osod.\n\nTara Nôl i gysylltu â rhwydwaith Wi\u2011Fi gwahanol.
- Galluogwyd cysoni
- Analluogwyd cysoni
- Yn cysoni nawr
- Gwall cysoni.Methwyd â chysoni
- Cysoni\'n weithredol
- Cysoni
- Ychwanegu cyfrifModd gwaithCaniatáu proffil gwaith i weithio, gan gynnwys apiau, cysoni\'n y cefndir, a nodweddion cysylltiedig.
- Tynnu\'r proffil gwaithData cefndir
@@ -4023,168 +3220,108 @@ Defnyddio\'r gwirydd sillafu hwn?
- Mae cysoni YMLAEN
- Mae cysoni I FFWRDD
- Gwall cysoni
- Cysonwyd diwethaf %1$s
- Yn cysoni nawr\u2026Cadw fy ngosodiadau wrth gefn
- Cysoni nawr
- Diddymu cysoniTara nawr i gysoni \n%1$s
- Gmail
- CalendrCysylltiadauCroeso i gysoni Google!
\nMae dull Google o gysoni data yn dy ganiatáu di i gael mynediad at dy gysylltiadau, apwyntiadau a mwy o ble bynnag wyt ti.
- Gosodiadau cysoni\'r ap
- Data a chysoni
- Newid cyfrinairGosodiadau cyfrif
- Tynnu\'r cyfrif
- Ychwanegu cyfrif
- Gorffen
- Tynnu\'r cyfrif?
- Bydd tynnu\'r cyfrif hwn yn dileu ei holl negeseuon, cysylltiadau, a data arall oddi ar y llechen!
- Bydd tynnu\'r cyfrif hwn yn dileu ei holl negeseuon, cysylltiadau, a data arall oddi ar y ffôn!
- %s
- Mae cysoni ar gyfer yr eitem hon wedi\'i analluogi. I newid y gosodiad, tro data cefndirol a chysoni awtomatig ymlaen am gyfnod dros dro.
- 4GCyfeiriad MAC 4G
- I ddechrau Android, rho dy gyfrinair
- I ddechrau Android, rho dy PIN
- I ddechrau Android, llunia dy batrwm
- Patrwm Anghywir
- Cyfrinair Anghywir
- PIN Anghywir
- Yn gwirio\u2026Yn dechrau Android\u2026
- Dileu
- dewiswyd %1$d allan o %2$d
- %1$s allan o %2$s
- Dewis y cyfan
- Defnydd data
- Defnydd data apiau
- Defnydd ap
- GWYBODAETH AP
- Data symudol
- Cylchred defnydd data
- Defnydd ap
- Data wrth grwydroCaniatáu data cefndir
- Cuddio Wi\u2011Fi
- Cuddio defnydd ether-rwydCyfyngiadau rhwydwaith
- Rhwydweithiau symudol
- Cysoni data gwaith yn awtomatig
- Diwrnod o\'r mis i ailosod y cylchred defnydd data:Cefndir
- Troi data symudol i ffwrdd?
- Gosod terfyn data symudol
- Gosod terfyn data 4G
- Gosod terfyn data 2G-3G
- Gosod terfyn data Wi\u2011Fi
- Wi\u2011Fi
- Ether-rwyd
- Symudol
- 4G
- 2G-3G
- SymudolDim
- Data symudol
- Data 2G-3G
- Data 4G
- Blaendir:Cefndir:
@@ -4192,65 +3329,45 @@ Defnyddio\'r gwirydd sillafu hwn?
Data cefndir
- Galluogi defnydd data symudol yn y cefndirCyfyngu data cefndir?
- Gall y nodwedd hon achosi rhai apiau sy\'n dibynnu ar ddata cefndirol i beidio â gweithio tra bod dim ond rhwydweithiau symudol ar gael.\n\nMae rhagor o wybodaeth am reolaeth defnydd data priodol yn y gosodiadau o fewn yr ap.
- Troi awto-cysoni data ymlaen?
- Bydd hyn yn arbed defnydd data a batri, ond bydd yn rhaid cysoni pob cyfrif dy hun i gael y wybodaeth ddiweddaraf. A ni fyddi\'n derbyn hysbysiadau pan fydd diweddariadau ar gael.
- Dyddiad ailosod y cylchred defnydd
- Dyddiad pob mis:
- Gosod rhybudd defnydd data
- Gosod terfyn defnydd data
- Yn gosod terfyn defnydd data
- Bydd dy lechen yn diffodd defnydd data symudol pan fydd wedi cyrraedd y terfyn wyt ti\'n ei osod.\n\nWrth bod defnydd data yn cael ei fesur gan dy lechen, ac mae\'n bosib bydd dy ddarparwr gwasanaeth symudol yn cyfrif yn wahanol, gall fod yn syniad da gosod terfyn ceidwadol.
- Bydd dy ffôn yn diffodd defnydd data symudol pan fydd wedi cyrraedd y terfyn wyt ti\'n ei osod.\n\nWrth bod defnydd data yn cael ei fesur gan dy lechen, ac mae\'n bosib bydd dy ddarparwr gwasanaeth symudol yn cyfrif yn wahanol, gall fod yn syniad da gosod terfyn ceidwadol.Cyfyngu data cefndir?
- Os wyt yn cyfyngu data cefndir symudol, ni fydd rhai apiau a gwasanaethau yn gweithio oni bai bod gan y ddyfais cysylltiad Wi\u2011Fi.
- Os wyt yn cyfyngu data cefndir symudol, ni fydd rhai apiau a gwasanaethau yn gweithio oni bai bod gan y ddyfais cysylltiad Wi\u2011Fi.\n\nMae\'r gosodiad hwn yn effeithio ar holl ddefnyddwyr y llechen.
- Os wyt yn cyfyngu data cefndir symudol, ni fydd rhai apiau a gwasanaethau yn gweithio oni bai bod gan y ddyfais cysylltiad Wi\u2011Fi.\n\nMae\'r gosodiad hwn yn effeithio ar holl ddefnyddwyr y ffôn hwn.Rhybudd: ^1^2\nCyfyngiad: ^1^2\n
- Apiau wedi eu tynnu
- Apiau a defnyddwyr wedi eu tynnu
- %2$s: tua %1$s wedi\'i defnyddio, yn ôl mesur dy lechen. Gall fod cyfrif defnydd data dy ddarparwr gwasanaeth symudol fod yn wahanol.
- %2$s: tua %1$s wedi\'i defnyddio, yn ôl mesur dy ffôn. Gall fod cyfrif defnydd data dy ddarparwr gwasanaeth symudol fod yn wahanol.Cyfyngiadau rhwydwaith
- Mae rhwydweithiau sy\'n cael eu mesur yn cael eu trin yn yr un modd a rhwydweithiau symudol pan mae data cefndirol wedi ei gyfyngu. Gall apiau rhoi rhybudd cyn defnyddio\'r rhwydweithiau hyn i lawrlwytho llawer o ddata.
- Rhwydweithiau symudolRhwydweithiau Wi-Fi wedi\'u mesur
@@ -4260,7 +3377,6 @@ Defnyddio\'r gwirydd sillafu hwn?
- Galwad brysEnw
@@ -4279,17 +3395,11 @@ Defnyddio\'r gwirydd sillafu hwn?
- Enw defnyddiwr
- Cyfrinair
- Cadw gwybodaeth y cyfrif
- (heb ei ddefnyddio)
- (peidio â gwirio\'r gweinydd)
- (derbyniwyd gan y gweinydd)Cadw
- CysylltuDisodli
- Anghofio
- Datgysylltu\'r VPN hwn?
- Datgysylltu
- Fersiwn %sAnghofio\'r VPN
@@ -4336,13 +3441,9 @@ Defnyddio\'r gwirydd sillafu hwn?
Dyw %1$s methu â chysylltu
- VPN
- Ychwanegu proffil VPN
- Golygu proffil
- Dileu\'r proffil
@@ -4364,17 +3465,11 @@ Defnyddio\'r gwirydd sillafu hwn?
Dim
- Mae tystysgrif ar goll. Ceisia olygu\'r proffil.
- System
- Defnyddiwr
- Analluogi
- Galluogi
- TynnuYmddiried
@@ -4406,13 +3501,10 @@ Defnyddio\'r gwirydd sillafu hwn?
"system_update_settings_list_item_title" in this project. [CHAR LIMIT=25] -->
- Analluogwyd
- Yn gorfodi
- IawnYmddiried yn neu dynnu tystysgrifau
@@ -4452,9 +3544,7 @@ Defnyddio\'r gwirydd sillafu hwn?
- Defnyddwyr
- Defnyddwyr a phroffiliau
@@ -4469,7 +3559,6 @@ Defnyddio\'r gwirydd sillafu hwn?
Gweinyddwr
- Ti (%s)Llysenw
@@ -4493,59 +3582,34 @@ Defnyddio\'r gwirydd sillafu hwn?
Dim ond perchennog y ffôn gall rheoli defnyddwyr.
- Ni all proffiliau cyfyngedig ychwanegu cyfrifon
- Dileu %1$s o\'r ddyfais hon.Gosodiadau sgrin cloi
- Ychwanegu defnyddwyr o\'r sgrin cloi
- Defnyddiwr newydd
- Proffil newydd
- Dileu dy hun?
- Tynnu\'r defnyddiwr hwn?
- Tynnu\'r proffil hwn?
- Tynnu\'r proffil gwaith?
- Mi fyddi\'n colli dy holl ddata a lle ar y llechen hon. Nid yw\'n bosib dadwneud y weithred hon.
- Mi fyddi\'n colli dy holl ddata a lle ar y ffôn hwn. Nid yw\'n bosib dadwneud y weithred hon.
- Caiff yr holl apiau a data eu dileu.
- Caiff pob ap a holl ddata\'r proffil hwn ei dileu os wyt ti\'n parhau.
- Caiff yr holl apiau a data eu dileu.
- Yn ychwanegu defnyddiwr newydd\u2026
- Dileu\'r defnyddiwr
- Dileu
- Gwestai
- Tynnu gwestai
- Tynnu\'r gwestai?
- Caiff holl apiau a data\'r sesiwn hon eu dileu.
- Tynnu
- Troi galwadau ffôn ymlaen
- Tynnu defnyddiwr
- Troi galwadau ffôn ymlaen?
@@ -4562,14 +3626,12 @@ Defnyddio\'r gwirydd sillafu hwn?
Newid iaith
- Sut mae\'n gweithioAp talu arferolHeb ei osod
- %1$s - %2$s
@@ -4579,7 +3641,6 @@ Defnyddio\'r gwirydd sillafu hwn?
Sefydla ap talu ac yna cei dal dy ffôn wrth unrhyw derfynell gyda\'r symbol talu awyr.
- Deall yn iawnMwy...
- Cyfyngiadau rhwydwaith
- Newid PINDangos hysbysiadau
@@ -4638,7 +3697,6 @@ Defnyddio\'r gwirydd sillafu hwn?
Cyfrif ar gyfer cynnwys
- Bygythiadau eithafol
@@ -4647,13 +3705,11 @@ Defnyddio\'r gwirydd sillafu hwn?
- Galluogi Rheolwr GalwadauCaniatáu i\'r gwasanaeth hwn reoli sut mae dy alwadau yn cael eu gwneud.Rheolwr Galwadau
- %1$s
@@ -4675,14 +3731,11 @@ Defnyddio\'r gwirydd sillafu hwn?
Caniatáu addasu gosodiadau Wi\u2011Fi a Symudol
- Bluetooth
- Caniatáu cyfnewid data pan mae\'r llechen yn cyffwrdd â dyfais arall
- Caniatáu cyfnewid data pan mae\'r ffôn yn cyffwrdd â dyfais arallLleoliad
@@ -4691,76 +3744,58 @@ Defnyddio\'r gwirydd sillafu hwn?
Nesaf
- Gorffen
- Tynnu llunDewis llun o\'r oriel
- Cardiau SIM
- Cardiau SIM
- %1$s - %2$sTara i osod gweithgareddau
- Dyw data symudol ddim ar gael.Tara i ddewis SIM data
- Defnyddio hwn bob tro ar gyfer galwadau
- Yn newid SIM data. Gall hyn gymryd munud...
- SIM %1$dEnw\'r SIM
- Darparwr gwasanaeth
- Rhif
- Oren
- Porffor
- Dim cerdyn SIM wedi\'i osodStatws SIM
- Gosodiadau galwadau eraillBydd analluogi Darlledu Enw\'r Rhwydwaith yn rhwystro cysylltu\'n awtomatig i rwydweithiau cudd.
- %1$d dBm %2$d asuTara i\'w osod
- Gofyn bob tro
- GosodiadauDangos %d eitemau wedi eu cuddio
@@ -4773,16 +3808,12 @@ Defnyddio\'r gwirydd sillafu hwn?
- defnydd data
- llecynDyfeisiadau wedi cysylltu
- Bluetooth, Bwrw
- Apiau a hysbysiadau
- Gosodiadau
- Gosodiadau chwilio
- Gosodiadau chwilioWiFi, wi-fi, cysylltiad rhwydwaithneges destun, testun, neges, negeseuon, negeseua, negesu
- symudol, darparwr gwasanaeth, di-wifr, data, 4g, 3g, 2g, lte, signalWiFi, wi-fi, galwad, galwsgrin, sgrin cyffwrddpylu sgrin, pylu\'r sgrin, sgrin cyffwrdd, batri
@@ -4818,12 +3845,10 @@ Defnyddio\'r gwirydd sillafu hwn?
ailosod, ail-osod, ffatridileu, dadosod, ailosod, ail-osod, clirio, tynnudim tarfu, tarfu, ymyrryd, torriad
- RAMgerllaw, lleol, lleoliad, hanes, adrodd
- cyfrifrhwystr, rhwystro, rhwystrwydcywiro testun, cywiriad sillafu, cywiro, sain, dirgrynu, awto, iaith, ystum, awgrym, awgrymiad, awgrymu, thema, gair, math, emoji, gwenoglun, rhyngwladol
- ailosod, dewisiadau, rhagosod, rhagosodedig
+ ailsod, dewisiadau, rhagosod, rhagosodedigargyfwng, rhew, ap, rhagosodedigffôn, deialu, deialydd, rhagosodedigap, lawrlwytho, llwytho i lawr, apiau, system
@@ -4832,17 +3857,13 @@ Defnyddio\'r gwirydd sillafu hwn?
llusgo i ddatgloi, cyfrinair, patrwm, PINher gwaith, gwaith, proffilproffil gwaithh, proffil, rheoli, uno, gwaitth, rheolaeth proffil
- ystumiau
- cadw copi wrth gefn, copi wrth gefnystum
- Ysgrifennu
- Llwyddiant!
@@ -4861,11 +3882,9 @@ Defnyddio\'r gwirydd sillafu hwn?
Uchder sain canu ar 80%
- Uchder sain cyfryngauUchder sain larymau
- Uchder sain caniad ffônUchder sain hysbysiadau
@@ -4878,12 +3897,10 @@ Defnyddio\'r gwirydd sillafu hwn?
- Synau eraillTonau pad deialu
- Seiniau gwefruSeiniau cyffwrdd
@@ -4897,13 +3914,11 @@ Defnyddio\'r gwirydd sillafu hwn?
Rhybudd
- DirgrynuSynau wrth droi ymlaen
- Dewisiadau Dim Tarfu
@@ -4926,7 +3941,6 @@ Defnyddio\'r gwirydd sillafu hwn?
Disodli
- Caiff seiniau dy broffil personol eu defnyddio ar gyfer dy broffil gwaithCaiff y ffeil ei gopïo i\'r ffolder %s
@@ -4941,7 +3955,6 @@ Defnyddio\'r gwirydd sillafu hwn?
Hysbysiadau gwaith
- Golau ysbeidiolAr y sgrin cloiHysbysiadau
- Hysbysiadau apiauPwysigrwydd
@@ -4989,7 +4001,6 @@ Defnyddio\'r gwirydd sillafu hwn?
summary on the channel page-->
- Dim sain
- IselCanolig
- UchelCaniatáu torri ar draws
@@ -5049,36 +4058,21 @@ Defnyddio\'r gwirydd sillafu hwn?
- Caniatáu llun-o-fewn-llun
- Caniatáu i\'r ap hwn greu ffenestr llun-o-fewn-llun tra bod yr ap ar agor neu ar ôl i ti ei adael (i barhau i wylio fideo, er enghraifft). Bydd y ffenestr hon yn ymddangos dros ben yr apiau eraill sy\'n cael eu defnyddio.Yn llwytho apiau...
- Mae Android yn rhwystro hysbysiadau\'r ap hwn rhag ymddangos ar y ddyfais hon
- Mae Android yn rhwystro\'r categori hwn o hysbysiadau rhag ymddangos ar y ddyfais hon
- CategorïauArall
- Gosodiadau ychwanegol yn yr ap
- Wedi\'i droi ymlaen ar gyfer pob ap
-
- %d categori wedi\'u dileu
- %d categori wedi\'i ddileu
- %d gategori wedi\'u dileu
- %d categori wedi\'u dileu
- %d chategori wedi\'u dileu
- %d categori wedi\'u dileu
- Ymlaen
@@ -5101,17 +4095,13 @@ Defnyddio\'r gwirydd sillafu hwn?
- IawnPwysigrwydd
- Golau ysbeidiol
- DirgrynuSain
- DileuAilenwi
@@ -5119,48 +4109,33 @@ Defnyddio\'r gwirydd sillafu hwn?
- Ychwanegu rhagor
- Dileu rheolDewis math o reol
- Dileu\'r rheol \u201c%1$s\u201d?
- Dileu
- Math o reol
- Anhysybys
- Ffurfweddu rheol
- Rheol amser
- Rheol digwyddiad
- unrhyw galendr
- Unrhyw galendr
- Ie, Efallai, neu Heb ateb
- Ie neu Efallai
- IeYmlaen / %1$s%1$s\n%2$s
- DiwrnodauDim
@@ -5170,51 +4145,34 @@ Defnyddio\'r gwirydd sillafu hwn?
Stopio am yr amser diwedd neu\'r larwm nesaf, pa bynnag un sy\'n dod gyntaf.
- ,\u0020
- %1$s - %2$s
- %1$s i %2$s
- Galwadau
- NegeseuonPob neges
- Oddi wrth unrhyw un
- Oddi wrth cysylltiadau yn unig
- Oddi wrth cysylltiadau serennog yn unigDim
- Larymau
- Negeseuon atgoffa
- DigwyddiadauPob galwr
- Troi ymlaen yn atomatig
- Byth
- Pob nos
- Amser dechrau
- Amser gorffen
- %s y diwrnod canlynol
@@ -5253,26 +4211,18 @@ Defnyddio\'r gwirydd sillafu hwn?
Pan mae\'r gosodiad hwn wedi ei droi ymlaen, mae\'n bosib defnyddio pinio sgrin i gadw\'r sgrin bresennol mewn golwg nes dy fod yn ei datbinio.\n\nI ddefnyddio pinio sginiau:\n\n1. Sicrha bod pinio sgrin wedi ei droi ymlaen.\n\n2. Agora\'r sgrin wyt am ei phinio.\n\n3. Tara \'Trosolwg\'.\n\n4. Llithra i fyny ac yna taro\'r eicon pin.
- Gofyn am batrwm datgloi cyn dadbinio
- Gofyn am PIN cyn dadbinio
- Gofyn am gyfrinair cyn dadbinio
- Mae\'r proffil hwn yn cael ei reoli gan:Rheolir gan %s
- (Arbrofol)
- Mae\'n bosib diogelu\'r ddyfais ymhellach gan fynnu bod angen PIN er mwyn cychwyn y system. Ni fydd y ddyfais yn medru derbyn galwadau, negeseuon na hysbysiadau, gan gynnwys larymau, nes ei bod wedi ei chychwyn.\n\nMae hyn yn helpu diogelu data yn yr achos bod y ddyfais yn cael ei cholli neu ei dwyn. Wyt ti am ddefnyddio PIN i fedru cychwyn dy ddyfais?
- Mae\'n bosib diogelu\'r ddyfais ymhellach gan fynnu bod angen patrwm er mwyn cychwyn y system. Ni fydd y ddyfais yn medru derbyn galwadau, negeseuon na hysbysiadau, gan gynnwys larymau, nes ei bod wedi ei chychwyn.\n\nMae hyn yn helpu diogelu data yn yr achos bod y ddyfais yn cael ei cholli neu ei dwyn. Wyt ti am ddefnyddio patrwm i fedru cychwyn dy ddyfais?
- Mae\'n bosib diogelu\'r ddyfais ymhellach gan fynnu bod angen cyfrinair er mwyn cychwyn y system. Ni fydd y ddyfais yn medru derbyn galwadau, negeseuon na hysbysiadau, gan gynnwys larymau, nes ei bod wedi ei chychwyn.\n\nMae hyn yn helpu diogelu data yn yr achos bod y ddyfais yn cael ei cholli neu ei dwyn. Wyt ti am ddefnyddio cyfrinair i fedru cychwyn dy ddyfais? Yn ogystal â defnyddio ôl dy fys i ddatgloi\'r ddyfais, mae\'n bosib diogelu\'r ddyfais ymhellach gan fynnu bod angen PIN er mwyn dechrau\'r system. Nes bod y system yn rhedeg, ni all y ddyfais derbyn galwadau, negeseuon na hysbysiadau, gan gynnwys larymau.\n\nMae hyn yn helpu diogelu data yn yr achos bod y ddyfais yn cael ei cholli neu ei dwyn. Wyt ti am osod PIN er mwyn medru dechrau dy ddyfais?
@@ -5281,7 +4231,6 @@ Defnyddio\'r gwirydd sillafu hwn?
Yn ogystal â defnyddio ôl dy fys i ddatgloi\'r ddyfais, mae\'n bosib diogelu\'r ddyfais ymhellach gan fynnu bod angen cyfrinair er mwyn dechrau\'r system. Nes bod y system yn rhedeg, ni all y ddyfais derbyn galwadau, negeseuon na hysbysiadau, gan gynnwys larymau.\n\nMae hyn yn helpu diogelu data yn yr achos bod y ddyfais yn cael ei cholli neu ei dwyn. Wyt ti am osod cyfrinair er mwyn medru dechrau dy ddyfais?
- Na
@@ -5293,32 +4242,23 @@ Defnyddio\'r gwirydd sillafu hwn?
Nodyn: Ar ôl ailddechrau, ni all yr ap hwn ddechrau nes bod dy ffôn wedi ei ddatgloi.Gwybodaeth IMEI
- (Slot%1$d)Agor dolenni
- Agor heb ofyn
- Storfa allanol
- Defnydd data\'r ap
- Newid
- Newid storfa
- Hysbysiadau apiauYmlaen
- Popeth wedi\'i troi ffwrdd
- %1$d o %2$d categori wedi\'u troi ffwrddWedi\'i distewi
@@ -5331,54 +4271,44 @@ Defnyddio\'r gwirydd sillafu hwn?
Lefel %d
- %1$s \u2022 %2$s
- Pob apApiau wedi eu gosod
- GwaithApiau: Pob unApiau: Wedi\'u troi ffwrdd
- Categorïau: Pwysigrwydd brys
- Categorïau: Pwysigrwydd iselCategorïau: Wedi\'u troi ffwrdd
- Categorïau: Yn anwybyddu Dim TarfuUwch
- Caniatâd yr ap
- Apiau sy\'n defnyddio %1$sAgor dolenni
- Agor %sAgor %s ac URLs eraill
- Gofyn bob troDim yn ei adnabod
@@ -5391,36 +4321,26 @@ Defnyddio\'r gwirydd sillafu hwn?
Gosod %s fel dy gynorthwyydd?
- Bydd y cynorthwyydd yn medru darllen gwybodaeth am yr apiau mewn defnydd ar dy system, gan gynnwys gwybodaeth sy\'n weledol ar dy sgrin neu ar gael o fewn yr apiau.
- Cytuno
- AnghytunoAp Porwr
- Dim porwr rhagosodedig
- Ap ffôn
- (Rhagosodiad)(System)(Rhagosodiad y system)
- Storfa apiau
- Dewisiadau defnydd apiauMae mynediad defnydd yn caniatáu i ap ddilyn pa apiau eraill wyt yn eu defnyddio a pha mor aml, yn ogystal â dy ddarparwr gwasanaeth, iaith y system a manylion eraill.
- Cof
- Manylion cof
@@ -5430,7 +4350,6 @@ Defnyddio\'r gwirydd sillafu hwn?
- %1$s (%2$d)Rhybuddion defnydd
@@ -5445,21 +4364,15 @@ Defnyddio\'r gwirydd sillafu hwn?
- Gadael i\'r ap redeg yn y cefndir o hyd?
- Gall caniatáu %1$s i redeg yn y cefndir o hyd leihau oes batri.
- \n\nGellir newid hyn yn hwyrach yn Gosodiadau > Apiau a hysbysiadau.
- %1$s ers gwefru\'n llawn tro diwethaf
- Dim defnydd batri ers gwefru llawn ddiwethafGosodiadau apiau
- %1$d yn rhagorRhannu adroddiad am wall?
@@ -5501,7 +4414,6 @@ Defnyddio\'r gwirydd sillafu hwn?
- Trosglwyddo lluniau neu ffeiliau (dull PTP) os na chefnogir MTP
@@ -5515,11 +4427,9 @@ Defnyddio\'r gwirydd sillafu hwn?
usb_use_file_transfer, use_use_photo_transfer, and usb_use_MIDI -->
Defnyddio USB i
- USB
- Trosglwyddo ffeiliau
@@ -5539,23 +4449,17 @@ Defnyddio\'r gwirydd sillafu hwn?
- Defnydd cof
- Defnydd ap
- Perfformiad
- Cyfartaledd defnyddiwyd (%)
- Ar gael
- Cof a ddefnyddir gan apiau
@@ -5574,27 +4478,21 @@ Defnyddio\'r gwirydd sillafu hwn?
Dim
- Dyw diffodd mynediad data ar gyfer yr ap hwn ddim yn rhwystro dy weinyddwr rhag tracio defnydd data ar gyfer apiau yn dy broffil gwaith%1$d o %2$d wedi\'u defnyddio
- Apiau
- Caniatáu dangos dros ben apiau eraill
- Caniatáu i\'r ap hwn ymddangos dros ben apiau eraill sy\u2019n cael eu defnyddio. Mae\'n bosib y gellir ymyrryd yn dy ddefnydd o apiau eraill neu newid sut maen nhw\'n ymddangos neu\'n ymddwyn.
- %1$d o %2$d ap yn cael dangos dros ben apiau eraill
- Apiau gyda chaniatâdCaniateir
@@ -5605,9 +4503,7 @@ Defnyddio\'r gwirydd sillafu hwn?
Addasu gosodiadau\'r system
- %1$d o %2$d ap yn cael addasu gosodiadau\'r system
- Yn medru gosod apiau eraill
@@ -5619,9 +4515,7 @@ Defnyddio\'r gwirydd sillafu hwn?
Mae\'n caniatáu i ap addasu gosodiadau\'r system.
- Na
- Caniatáu o\'r ffynhonnell hon
@@ -5673,7 +4567,6 @@ Defnyddio\'r gwirydd sillafu hwn?
24 ap wedi eu gosod
- %1$s wedi\'i defnyddio - %2$s ar gael
@@ -5696,7 +4589,6 @@ Defnyddio\'r gwirydd sillafu hwn?
Gweithred heb ei ganiatáu
- Methu â newid uchder sainNi chaniateir SMS
@@ -5724,7 +4616,6 @@ Defnyddio\'r gwirydd sillafu hwn?
Mae\'r modd awyren ymlaen
- Mae Wi-Fi, Bluetooth a rhwydwaith symudol wedi eu diffodd. Nid yw\'n bosib gwneud galwadau na chysylltu â\'r rhyngrwyd.Mae Dim Tarfu ymlaen (%1$s)
@@ -5732,7 +4623,6 @@ Defnyddio\'r gwirydd sillafu hwn?
Mae perfformiad yn salach. Dyw gwasanaethau lleoliad a data cefndir ddim ar waith.
- Mae data symudol i ffwrddDyw\'r rhyngrwyd ond ar gael trwy Wi-Fi.
@@ -5755,7 +4645,6 @@ Defnyddio\'r gwirydd sillafu hwn?
+%1$d
- +%1$d arall
@@ -5767,7 +4656,6 @@ Defnyddio\'r gwirydd sillafu hwn?
+%1$d awgrym
- Tynnu
@@ -5778,7 +4666,6 @@ Defnyddio\'r gwirydd sillafu hwn?
Defnydd
- Defnydd data symudolDefnydd data dros Wi-Fi
@@ -5786,13 +4673,9 @@ Defnyddio\'r gwirydd sillafu hwn?
Wi-Fi
- Ether-rwyd
- ^1 data symudol
- ^1 data Wi-Fi
- ^1 data ether-rwydRhybydd data %1$s
@@ -5815,21 +4698,11 @@ Defnyddio\'r gwirydd sillafu hwn?
Terfyn data
- %1$s wedi\'i defnyddio %2$s
- FfurfwedduApiau eraill yn y defnydd
-
- %1$d apiau yn cael defnyddio data yn ddiderfyn tra bod Arbedwr Data ymlaen.
- %1$d ap yn cael defnyddio data yn ddiderfyn tra bod Arbedwr Data ymlaen.
- %1$d ap yn cael defnyddio data yn ddiderfyn tra bod Arbedwr Data ymlaen.
- %1$d ap yn cael defnyddio data yn ddiderfyn tra bod Arbedwr Data ymlaen.
- %1$d ap yn cael defnyddio data yn ddiderfyn tra bod Arbedwr Data ymlaen.
- %1$d ap yn cael defnyddio data yn ddiderfyn tra bod Arbedwr Data ymlaen.
- Arbedwr Data
@@ -5943,7 +4816,6 @@ Defnyddio\'r gwirydd sillafu hwn?
Dangos neu guddio cynnwys hysbysiadau
- Y cwbl
@@ -5984,8 +4856,6 @@ Defnyddio\'r gwirydd sillafu hwn?
%1$s - %2$s
- %1$s (%2$s)
- Yn teithio tramor?
@@ -6011,7 +4881,6 @@ Defnyddio\'r gwirydd sillafu hwn?
Peidio â dangos eto
- Ychwanegu cyfrifGosodiadau proffil gwaith
@@ -6059,7 +4928,6 @@ Defnyddio\'r gwirydd sillafu hwn?
Clustffonau
- BluetoothRheoli storfa
@@ -6081,7 +4949,6 @@ Defnyddio\'r gwirydd sillafu hwn?
Ystumiau cyflym i reoli dy ddyfais
- Neidio i\'r CameraI agor y camera\'n gyflym, gwasga\'r botwm pŵer dwywaith. Mae\'n gweithio pa bynnag beth sydd ar y sgrin.
@@ -6142,7 +5009,6 @@ Defnyddio\'r gwirydd sillafu hwn?
Cyfrifon ar gyfer %1$s
- FfurfwedduCysoni data yn awtomatig
@@ -6164,35 +5030,23 @@ Defnyddio\'r gwirydd sillafu hwn?
- Dy fynediad i\'r ddyfais hon
- Yr amser a data y\'i defnyddir ar bob apDim
- Apiau wedi\'u gosod
- Caniatâd cameaApiau rhagosodedig
-
- %d apiau
- %d ap
- %d ap
- %d ap
- %d ap
- %d ap
-
@@ -6210,29 +5064,12 @@ Defnyddio\'r gwirydd sillafu hwn?
-
- %d ymdrechion
- %d ymdrech
- %d ymdrech
- %d ymdrech
- %d ymdrech
- %d ymdrech
-
- Dysgu mwy
-
- Apiau camera
- Ap camera
- Apiau camera
- Apiau camera
- Apiau camera
- Apiau camera
- Ap calendr
@@ -6241,31 +5078,17 @@ Defnyddio\'r gwirydd sillafu hwn?
Ap map
-
- Apiau ffôn
- Ap ffôn
- Apiau ffôn
- Apiau ffôn
- Apiau ffôn
- Apiau ffôn
-
- %1$s, %2$s
- %1$s, %2$s, %3$s
- Apiau eraill
- Ffeiliau
- ^1^2Wedi defnyddio o %1$s
- defnyddiwyd
@@ -6274,20 +5097,11 @@ Defnyddio\'r gwirydd sillafu hwn?
Ffeiliau sain
- (wedi\'i ddadosod ar gyfer y defnyddiwr %s)
- (wedi\'i analluogi ar gyfer y defnyddiwr %s)
- Gwasanaeth awtolenwi
- awto, llenwi, cwblhau, awtolenwi, awtogwblhau
- Sicrha dy fod yn ymddiried yn yr ap hwn
-
-
- Mae %1$s yn defnyddio beth sydd ar dy sgrin i benderfynu pa bethau gellir eu awtolenwi.
- ]]>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index aab68f6d994f948a4506e6dc25810718558f8dcc..305f4e76c5920c724bef31fa5632bf3eaaa6e35d 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -3568,7 +3568,7 @@
"Schnelle Gesten zum Steuern deines Tablets""Schnelle Gesten zum Steuern deines Geräts""Zur Kamera wechseln"
- "Ein-/Aus-Taste zweimal drücken, um Kamera direkt zu starten. Funktioniert unabhängig davon, welche App gerade geöffnet ist."
+ "Ein-/Aus-Taste zweimal drücken, um Kamera direkt zu starten. Funktioniert bei jedem Display.""Kamera schnell öffnen""Ein-/Aus-Taste zweimal drücken, um die Kamera zu öffnen""Kamera wechseln"
diff --git a/res/values-pt-rPT/cm_strings.xml b/res/values-pt-rPT/cm_strings.xml
index 16d271b0d7d8dbeb79e112da3da3f8295be67e75..c14e5f279f9a6538d5110da2789d2bca05f277ee 100644
--- a/res/values-pt-rPT/cm_strings.xml
+++ b/res/values-pt-rPT/cm_strings.xml
@@ -118,7 +118,7 @@
O cartão SIM será desativado. Quer continuar?AtençãoEste cartão SIM será desativado e o cartão SIM %1$s será usado para os serviços de dados. Tem a certeza que deseja continuar?
- Não é possível executar a operação enquanto o modo de voo estiver ativado.
+ Não é possível executar a operação enquanto o modo de avião estiver ativado.Não é possível executar a operação enquanto estiver numa chamada.Não é possível desativar todos os cartões SIMA ativar\u2026
diff --git a/res/values-sc-rIT/cm_strings.xml b/res/values-sc-rIT/cm_strings.xml
index 60b57e7790c78b2c9ca9924fb18db2f1aa5cdba3..32c55fb5afe581b75e774be140d587ed8f4f8245 100644
--- a/res/values-sc-rIT/cm_strings.xml
+++ b/res/values-sc-rIT/cm_strings.xml
@@ -23,7 +23,6 @@
- RAM totale
diff --git a/tests/Android.mk b/tests/Android.mk
new file mode 100644
index 0000000000000000000000000000000000000000..fd297e35397bbd1bdff98f3f9a84285b3587d8e5
--- /dev/null
+++ b/tests/Android.mk
@@ -0,0 +1,5 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+# Include all makefiles in subdirectories
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/anomaly-tester/Android.mk b/tests/anomaly-tester/Android.mk
new file mode 100644
index 0000000000000000000000000000000000000000..ade37db02849340ed06f316b9a32d82cef1f1b86
--- /dev/null
+++ b/tests/anomaly-tester/Android.mk
@@ -0,0 +1,25 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+LOCAL_CERTIFICATE := platform
+
+LOCAL_JAVA_LIBRARIES := android.test.runner bouncycastle
+
+LOCAL_STATIC_JAVA_LIBRARIES := \
+ android-support-test \
+ mockito-target \
+ ub-uiautomator \
+ truth-prebuilt \
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_PROGUARD_ENABLED := disabled
+
+LOCAL_PACKAGE_NAME := AnomalyTester
+
+LOCAL_INSTRUMENTATION_FOR := Settings
+
+LOCAL_USE_AAPT2 := true
+
+include $(BUILD_PACKAGE)
\ No newline at end of file
diff --git a/tests/anomaly-tester/AndroidManifest.xml b/tests/anomaly-tester/AndroidManifest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7893b866bfa797c6f9f5d3f30468ef780b3431cc
--- /dev/null
+++ b/tests/anomaly-tester/AndroidManifest.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/anomaly-tester/res/layout/activity_main.xml b/tests/anomaly-tester/res/layout/activity_main.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0561cff9fc355bbb03910d7c7e258eeb28c6c5c5
--- /dev/null
+++ b/tests/anomaly-tester/res/layout/activity_main.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/anomaly-tester/res/layout/bluetooth_anomaly.xml b/tests/anomaly-tester/res/layout/bluetooth_anomaly.xml
new file mode 100644
index 0000000000000000000000000000000000000000..87e61b0d786eaa1a5abcf9813ff87e2cd1ac90c9
--- /dev/null
+++ b/tests/anomaly-tester/res/layout/bluetooth_anomaly.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/anomaly-tester/res/layout/wakelock_anomaly.xml b/tests/anomaly-tester/res/layout/wakelock_anomaly.xml
new file mode 100644
index 0000000000000000000000000000000000000000..08cb7958419f86ccece61531b8b22f980ff5aaf6
--- /dev/null
+++ b/tests/anomaly-tester/res/layout/wakelock_anomaly.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/anomaly-tester/res/values-af/strings.xml b/tests/anomaly-tester/res/values-af/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-af/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-am/strings.xml b/tests/anomaly-tester/res/values-am/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-am/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-ar/strings.xml b/tests/anomaly-tester/res/values-ar/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-ar/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-az/strings.xml b/tests/anomaly-tester/res/values-az/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-az/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-b+sr+Latn/strings.xml b/tests/anomaly-tester/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-be/strings.xml b/tests/anomaly-tester/res/values-be/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-be/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-bg/strings.xml b/tests/anomaly-tester/res/values-bg/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-bg/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-bn/strings.xml b/tests/anomaly-tester/res/values-bn/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-bn/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-bs/strings.xml b/tests/anomaly-tester/res/values-bs/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-bs/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-ca/strings.xml b/tests/anomaly-tester/res/values-ca/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-ca/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-cs/strings.xml b/tests/anomaly-tester/res/values-cs/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-cs/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-da/strings.xml b/tests/anomaly-tester/res/values-da/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-da/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-de/strings.xml b/tests/anomaly-tester/res/values-de/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-de/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-el/strings.xml b/tests/anomaly-tester/res/values-el/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-el/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-en-rAU/strings.xml b/tests/anomaly-tester/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-en-rAU/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-en-rCA/strings.xml b/tests/anomaly-tester/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-en-rCA/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-en-rGB/strings.xml b/tests/anomaly-tester/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-en-rGB/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-en-rIN/strings.xml b/tests/anomaly-tester/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-en-rIN/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-en-rXC/strings.xml b/tests/anomaly-tester/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8fce2b841b02b0417e713edbe99b8cb5c63e935b
--- /dev/null
+++ b/tests/anomaly-tester/res/values-en-rXC/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-es-rUS/strings.xml b/tests/anomaly-tester/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-es-rUS/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-es/strings.xml b/tests/anomaly-tester/res/values-es/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-es/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-et/strings.xml b/tests/anomaly-tester/res/values-et/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-et/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-eu/strings.xml b/tests/anomaly-tester/res/values-eu/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-eu/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-fa/strings.xml b/tests/anomaly-tester/res/values-fa/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-fa/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-fi/strings.xml b/tests/anomaly-tester/res/values-fi/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-fi/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-fr-rCA/strings.xml b/tests/anomaly-tester/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-fr-rCA/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-fr/strings.xml b/tests/anomaly-tester/res/values-fr/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-fr/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-gl/strings.xml b/tests/anomaly-tester/res/values-gl/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-gl/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-gu/strings.xml b/tests/anomaly-tester/res/values-gu/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8c09d6cbea04b85991e420a587abc725dfc45a76
--- /dev/null
+++ b/tests/anomaly-tester/res/values-gu/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "અસંગતિ પરીક્ષક"
+
diff --git a/tests/anomaly-tester/res/values-hi/strings.xml b/tests/anomaly-tester/res/values-hi/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-hi/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-hr/strings.xml b/tests/anomaly-tester/res/values-hr/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-hr/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-hu/strings.xml b/tests/anomaly-tester/res/values-hu/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-hu/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-hy/strings.xml b/tests/anomaly-tester/res/values-hy/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-hy/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-in/strings.xml b/tests/anomaly-tester/res/values-in/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-in/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-is/strings.xml b/tests/anomaly-tester/res/values-is/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-is/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-it/strings.xml b/tests/anomaly-tester/res/values-it/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-it/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-iw/strings.xml b/tests/anomaly-tester/res/values-iw/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-iw/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-ja/strings.xml b/tests/anomaly-tester/res/values-ja/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-ja/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-ka/strings.xml b/tests/anomaly-tester/res/values-ka/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-ka/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-kk/strings.xml b/tests/anomaly-tester/res/values-kk/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-kk/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-km/strings.xml b/tests/anomaly-tester/res/values-km/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-km/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-kn/strings.xml b/tests/anomaly-tester/res/values-kn/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..dace89cfd41c5ac87505b18c90e00869cdd74785
--- /dev/null
+++ b/tests/anomaly-tester/res/values-kn/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "ಅನೋಮಲಿಟೆಸ್ಟರ್"
+
diff --git a/tests/anomaly-tester/res/values-ko/strings.xml b/tests/anomaly-tester/res/values-ko/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d8b6c6aa169de97d80e627ec53eed074ff93bf04
--- /dev/null
+++ b/tests/anomaly-tester/res/values-ko/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "비정상 상황 테스터"
+
diff --git a/tests/anomaly-tester/res/values-ky/strings.xml b/tests/anomaly-tester/res/values-ky/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-ky/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-lo/strings.xml b/tests/anomaly-tester/res/values-lo/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-lo/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-lt/strings.xml b/tests/anomaly-tester/res/values-lt/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-lt/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-lv/strings.xml b/tests/anomaly-tester/res/values-lv/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-lv/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-mk/strings.xml b/tests/anomaly-tester/res/values-mk/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-mk/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-ml/strings.xml b/tests/anomaly-tester/res/values-ml/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-ml/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-mn/strings.xml b/tests/anomaly-tester/res/values-mn/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-mn/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-mr/strings.xml b/tests/anomaly-tester/res/values-mr/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3472e9934d1c9da5e1817ed11659c6fa8ec5b77d
--- /dev/null
+++ b/tests/anomaly-tester/res/values-mr/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "विसंगती परीक्षक"
+
diff --git a/tests/anomaly-tester/res/values-ms/strings.xml b/tests/anomaly-tester/res/values-ms/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-ms/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-my/strings.xml b/tests/anomaly-tester/res/values-my/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3535a3f3f07beefd86f1e80c84a6d95d07b85c1e
--- /dev/null
+++ b/tests/anomaly-tester/res/values-my/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "Anomaly စမ်းသပ်ကိရိယာ"
+
diff --git a/tests/anomaly-tester/res/values-nb/strings.xml b/tests/anomaly-tester/res/values-nb/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-nb/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-ne/strings.xml b/tests/anomaly-tester/res/values-ne/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-ne/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-nl/strings.xml b/tests/anomaly-tester/res/values-nl/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-nl/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-pa/strings.xml b/tests/anomaly-tester/res/values-pa/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-pa/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-pl/strings.xml b/tests/anomaly-tester/res/values-pl/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-pl/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-pt-rBR/strings.xml b/tests/anomaly-tester/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-pt-rBR/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-pt-rPT/strings.xml b/tests/anomaly-tester/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-pt-rPT/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-pt/strings.xml b/tests/anomaly-tester/res/values-pt/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-pt/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-ro/strings.xml b/tests/anomaly-tester/res/values-ro/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-ro/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-ru/strings.xml b/tests/anomaly-tester/res/values-ru/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-ru/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-si/strings.xml b/tests/anomaly-tester/res/values-si/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..de39b09515d300f70251ef554669e855fa771717
--- /dev/null
+++ b/tests/anomaly-tester/res/values-si/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "විෂමතා පරීක්ෂක"
+
diff --git a/tests/anomaly-tester/res/values-sk/strings.xml b/tests/anomaly-tester/res/values-sk/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-sk/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-sl/strings.xml b/tests/anomaly-tester/res/values-sl/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-sl/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-sq/strings.xml b/tests/anomaly-tester/res/values-sq/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-sq/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-sr/strings.xml b/tests/anomaly-tester/res/values-sr/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-sr/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-sv/strings.xml b/tests/anomaly-tester/res/values-sv/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-sv/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-sw/strings.xml b/tests/anomaly-tester/res/values-sw/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e8d6de8e628bead0349bb03a31265ba8f85a27bf
--- /dev/null
+++ b/tests/anomaly-tester/res/values-sw/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "Kipengele cha Kubaini Hitilafu"
+
diff --git a/tests/anomaly-tester/res/values-ta/strings.xml b/tests/anomaly-tester/res/values-ta/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-ta/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-te/strings.xml b/tests/anomaly-tester/res/values-te/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f1758403fc18ff3a166dd89ffb421f960ee230a0
--- /dev/null
+++ b/tests/anomaly-tester/res/values-te/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "అనామలీ టెస్టర్"
+
diff --git a/tests/anomaly-tester/res/values-th/strings.xml b/tests/anomaly-tester/res/values-th/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-th/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-tl/strings.xml b/tests/anomaly-tester/res/values-tl/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-tl/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-tr/strings.xml b/tests/anomaly-tester/res/values-tr/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-tr/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-uk/strings.xml b/tests/anomaly-tester/res/values-uk/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-uk/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-ur/strings.xml b/tests/anomaly-tester/res/values-ur/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-ur/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-uz/strings.xml b/tests/anomaly-tester/res/values-uz/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-uz/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-vi/strings.xml b/tests/anomaly-tester/res/values-vi/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-vi/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-zh-rCN/strings.xml b/tests/anomaly-tester/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-zh-rCN/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-zh-rHK/strings.xml b/tests/anomaly-tester/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-zh-rHK/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-zh-rTW/strings.xml b/tests/anomaly-tester/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cdc7ee558a9f75fffd91f35d9d8aa742d9331ea9
--- /dev/null
+++ b/tests/anomaly-tester/res/values-zh-rTW/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values-zu/strings.xml b/tests/anomaly-tester/res/values-zu/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e28ad504d8eece809f7688059b6ebcaddf231cae
--- /dev/null
+++ b/tests/anomaly-tester/res/values-zu/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ "I-AnomalyTester"
+
diff --git a/tests/anomaly-tester/res/values/strings.xml b/tests/anomaly-tester/res/values/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..99de34e62dd1e8d97777135177170f348d3f918a
--- /dev/null
+++ b/tests/anomaly-tester/res/values/strings.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ AnomalyTester
+
diff --git a/tests/anomaly-tester/src/com/android/settings/anomaly/tester/AnomalyActivity.java b/tests/anomaly-tester/src/com/android/settings/anomaly/tester/AnomalyActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..e4567c2fbc31e717e24412347e59be329e159748
--- /dev/null
+++ b/tests/anomaly-tester/src/com/android/settings/anomaly/tester/AnomalyActivity.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.settings.anomaly.tester;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.ResultReceiver;
+import android.provider.Settings;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import com.android.settings.anomaly.tester.service.AnomalyService;
+import com.android.settings.anomaly.tester.utils.AnomalyActions;
+import com.android.settings.anomaly.tester.utils.AnomalyPolicyBuilder;
+
+/**
+ * Main activity to control and start anomaly
+ */
+public class AnomalyActivity extends Activity {
+ private static final String TAG = AnomalyActivity.class.getSimpleName();
+
+ public static final String KEY_TARGET_BUTTON = "target_button";
+
+ private AnomalyResultReceiver mResultReceiver;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ mResultReceiver = new AnomalyResultReceiver(new Handler());
+ }
+
+ public void startBluetoothAnomaly(View view) {
+ try {
+ // Enable anomaly detection and change the threshold
+ final String config = new AnomalyPolicyBuilder()
+ .addPolicy(AnomalyPolicyBuilder.KEY_ANOMALY_DETECTION_ENABLED, true)
+ .addPolicy(AnomalyPolicyBuilder.KEY_BLUETOOTH_SCAN_DETECTION_ENABLED, true)
+ .addPolicy(AnomalyPolicyBuilder.KEY_BLUETOOTH_SCAN_THRESHOLD,
+ getValueFromEditText(R.id.bluetooth_threshold))
+ .build();
+ Settings.Global.putString(getContentResolver(),
+ Settings.Global.ANOMALY_DETECTION_CONSTANTS, config);
+
+ // Start the anomaly service
+ Intent intent = new Intent(this, AnomalyService.class);
+ intent.putExtra(AnomalyActions.KEY_ACTION, AnomalyActions.ACTION_BLE_SCAN_UNOPTIMIZED);
+ intent.putExtra(AnomalyActions.KEY_DURATION_MS,
+ getValueFromEditText(R.id.bluetooth_run_time));
+ intent.putExtra(AnomalyActions.KEY_RESULT_RECEIVER, mResultReceiver);
+ intent.putExtra(KEY_TARGET_BUTTON, view.getId());
+ startService(intent);
+
+ view.setEnabled(false);
+ } catch (NumberFormatException e) {
+ Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ public void startWakelockAnomaly(View view) {
+ try {
+ // Enable anomaly detection and change the threshold
+ final String config = new AnomalyPolicyBuilder()
+ .addPolicy(AnomalyPolicyBuilder.KEY_ANOMALY_DETECTION_ENABLED, true)
+ .addPolicy(AnomalyPolicyBuilder.KEY_WAKELOCK_DETECTION_ENABLED, true)
+ .addPolicy(AnomalyPolicyBuilder.KEY_WAKELOCK_THRESHOLD,
+ getValueFromEditText(R.id.wakelock_threshold))
+ .build();
+ Settings.Global.putString(getContentResolver(),
+ Settings.Global.ANOMALY_DETECTION_CONSTANTS,
+ config);
+
+ // Start the anomaly service
+ Intent intent = new Intent(this, AnomalyService.class);
+ intent.putExtra(AnomalyActions.KEY_ACTION, AnomalyActions.ACTION_WAKE_LOCK);
+ intent.putExtra(AnomalyActions.KEY_DURATION_MS,
+ getValueFromEditText(R.id.wakelock_run_time));
+ intent.putExtra(AnomalyActions.KEY_RESULT_RECEIVER, mResultReceiver);
+ intent.putExtra(KEY_TARGET_BUTTON, view.getId());
+ startService(intent);
+
+ view.setEnabled(false);
+ } catch (NumberFormatException e) {
+ Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ private long getValueFromEditText(final int id) throws NumberFormatException {
+ final EditText editText = findViewById(id);
+ if (editText != null) {
+ final long value = Long.parseLong(editText.getText().toString());
+ if (value > 0) {
+ return value;
+ }
+ }
+
+ throw new NumberFormatException("Number should be positive");
+ }
+
+ private class AnomalyResultReceiver extends ResultReceiver {
+
+ public AnomalyResultReceiver(Handler handler) {
+ super(handler);
+ }
+
+ @Override
+ protected void onReceiveResult(int resultCode, Bundle resultData) {
+ super.onReceiveResult(resultCode, resultData);
+
+ final Button button = findViewById(resultData.getInt(KEY_TARGET_BUTTON));
+ if (button != null) {
+ button.setEnabled(true);
+ }
+
+ }
+ }
+}
diff --git a/tests/anomaly-tester/src/com/android/settings/anomaly/tester/service/AnomalyService.java b/tests/anomaly-tester/src/com/android/settings/anomaly/tester/service/AnomalyService.java
new file mode 100644
index 0000000000000000000000000000000000000000..b569bcecb373374a87beb1f371b2725c591ce545
--- /dev/null
+++ b/tests/anomaly-tester/src/com/android/settings/anomaly/tester/service/AnomalyService.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.anomaly.tester.service;
+
+import android.annotation.Nullable;
+import android.app.IntentService;
+import android.content.Intent;
+import android.os.ResultReceiver;
+
+import com.android.settings.anomaly.tester.utils.AnomalyActions;
+
+/**
+ * Service to run the anomaly action
+ */
+public class AnomalyService extends IntentService {
+ private static final String TAG = AnomalyService.class.getSimpleName();
+
+ public AnomalyService() {
+ super(AnomalyService.class.getSimpleName());
+ }
+
+ @Override
+ protected void onHandleIntent(@Nullable Intent intent) {
+ final String action = intent.getStringExtra(AnomalyActions.KEY_ACTION);
+ final long durationMs = intent.getLongExtra(AnomalyActions.KEY_DURATION_MS, 0);
+ final ResultReceiver resultReceiver = intent.getParcelableExtra(
+ AnomalyActions.KEY_RESULT_RECEIVER);
+
+ AnomalyActions.doAction(this, action, durationMs);
+
+ if (resultReceiver != null) {
+ resultReceiver.send(0 /* resultCode */, intent.getExtras());
+ }
+ }
+}
diff --git a/tests/anomaly-tester/src/com/android/settings/anomaly/tester/utils/AnomalyActions.java b/tests/anomaly-tester/src/com/android/settings/anomaly/tester/utils/AnomalyActions.java
new file mode 100644
index 0000000000000000000000000000000000000000..58e5a99fb5227113179b6e2dce9bef7a96cda9c4
--- /dev/null
+++ b/tests/anomaly-tester/src/com/android/settings/anomaly/tester/utils/AnomalyActions.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.anomaly.tester.utils;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.le.BluetoothLeScanner;
+import android.bluetooth.le.ScanCallback;
+import android.bluetooth.le.ScanResult;
+import android.bluetooth.le.ScanSettings;
+import android.content.Context;
+import android.os.PowerManager;
+import android.util.Log;
+
+import java.util.List;
+
+/**
+ * Actions to generate anomaly.
+ */
+public class AnomalyActions {
+ private static final String TAG = AnomalyActions.class.getSimpleName();
+
+ public static final String KEY_ACTION = "action";
+ public static final String KEY_DURATION_MS = "duration_ms";
+ public static final String KEY_RESULT_RECEIVER = "result_receiver";
+
+ public static final String ACTION_BLE_SCAN_UNOPTIMIZED = "action.ble_scan_unoptimized";
+ public static final String ACTION_WAKE_LOCK = "action.wake_lock";
+
+ public static void doAction(Context ctx, String actionCode, long durationMs) {
+ if (actionCode == null) {
+ Log.e(TAG, "Intent was missing action.");
+ return;
+ }
+ switch (actionCode) {
+ case ACTION_BLE_SCAN_UNOPTIMIZED:
+ doUnoptimizedBleScan(ctx, durationMs);
+ break;
+ case ACTION_WAKE_LOCK:
+ doHoldWakelock(ctx, durationMs);
+ default:
+ Log.e(TAG, "Intent had invalid action");
+ }
+ }
+
+ private static void doUnoptimizedBleScan(Context ctx, long durationMs) {
+ ScanSettings scanSettings = new ScanSettings.Builder()
+ .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();
+
+ // perform ble scanning
+ BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+ if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled() ) {
+ Log.e(TAG, "Device does not support Bluetooth or Bluetooth not enabled");
+ return;
+ }
+ BluetoothLeScanner bleScanner = bluetoothAdapter.getBluetoothLeScanner();
+ if (bleScanner == null) {
+ Log.e(TAG, "Cannot access BLE scanner");
+ return;
+ }
+
+ ScanCallback scanCallback = new ScanCallback() {
+ @Override
+ public void onScanResult(int callbackType, ScanResult result) {
+ Log.v(TAG, "called onScanResult");
+ }
+
+ @Override
+ public void onScanFailed(int errorCode) {
+ Log.v(TAG, "called onScanFailed");
+ }
+
+ @Override
+ public void onBatchScanResults(List results) {
+ Log.v(TAG, "called onBatchScanResults");
+ }
+ };
+
+ bleScanner.startScan(null, scanSettings, scanCallback);
+ try {
+ Thread.sleep(durationMs);
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Thread couldn't sleep for " + durationMs, e);
+ }
+ bleScanner.stopScan(scanCallback);
+ }
+
+ private static void doHoldWakelock(Context ctx, long durationMs) {
+ PowerManager powerManager = ctx.getSystemService(PowerManager.class);
+ PowerManager.WakeLock wl = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
+ "AnomalyWakeLock");
+ wl.acquire();
+ try {
+ Thread.sleep(durationMs);
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Thread couldn't sleep for " + durationMs, e);
+ }
+ wl.release();
+ }
+}
diff --git a/tests/anomaly-tester/src/com/android/settings/anomaly/tester/utils/AnomalyPolicyBuilder.java b/tests/anomaly-tester/src/com/android/settings/anomaly/tester/utils/AnomalyPolicyBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..bf8e075d4f84359d07ff8946dd932129cfc80df7
--- /dev/null
+++ b/tests/anomaly-tester/src/com/android/settings/anomaly/tester/utils/AnomalyPolicyBuilder.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.anomaly.tester.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Builder to build the anomaly policy string, used in {@link android.provider.Settings.Global}
+ *
+ * @see android.provider.Settings.Global#ANOMALY_DETECTION_CONSTANTS
+ */
+public class AnomalyPolicyBuilder {
+ public static final String KEY_ANOMALY_DETECTION_ENABLED = "anomaly_detection_enabled";
+ public static final String KEY_WAKELOCK_DETECTION_ENABLED = "wakelock_enabled";
+ public static final String KEY_WAKEUP_ALARM_DETECTION_ENABLED = "wakeup_alarm_enabled";
+ public static final String KEY_BLUETOOTH_SCAN_DETECTION_ENABLED = "bluetooth_scan_enabled";
+ public static final String KEY_WAKELOCK_THRESHOLD = "wakelock_threshold";
+ public static final String KEY_WAKEUP_ALARM_THRESHOLD = "wakeup_alarm_threshold";
+ public static final String KEY_BLUETOOTH_SCAN_THRESHOLD = "bluetooth_scan_threshold";
+
+ public static final String DELIM = ",";
+
+ private Map mValues;
+
+ public AnomalyPolicyBuilder() {
+ mValues = new HashMap<>();
+ }
+
+ public AnomalyPolicyBuilder addPolicy(String key, String value) {
+ mValues.put(key, value);
+ return this;
+ }
+
+ public AnomalyPolicyBuilder addPolicy(String key, long value) {
+ mValues.put(key, Long.toString(value));
+ return this;
+ }
+
+
+ public AnomalyPolicyBuilder addPolicy(String key, boolean value) {
+ mValues.put(key, value ? "true" : "false");
+ return this;
+ }
+
+ public String build() {
+ StringBuilder sb = new StringBuilder();
+ for (Map.Entry entry : mValues.entrySet()) {
+ sb.append(entry.getKey() + "=" + entry.getValue() + DELIM);
+ }
+
+ if (sb.length() != 0) {
+ return sb.substring(0, sb.length() - 1);
+ } else {
+ return "";
+ }
+ }
+}
diff --git a/tests/anomaly-tester/src/com/android/settings/anomaly/tests/BluetoothAnomalyTest.java b/tests/anomaly-tester/src/com/android/settings/anomaly/tests/BluetoothAnomalyTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..3630ce420dd38dbfff0f724dc67763a39f647643
--- /dev/null
+++ b/tests/anomaly-tester/src/com/android/settings/anomaly/tests/BluetoothAnomalyTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.settings.anomaly.tests;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.Until;
+import android.text.format.DateUtils;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Functional test for bluetooth unoptimized scanning anomaly detector
+ *
+ * @see com.android.settings.fuelgauge.anomaly.checker.BluetoothScanAnomalyDetector
+ */
+@RunWith(AndroidJUnit4.class)
+public class BluetoothAnomalyTest {
+ private static final String BATTERY_INTENT = "android.intent.action.POWER_USAGE_SUMMARY";
+ private static final String RES_BT_EDITTEXT =
+ "com.android.settings.anomaly.tester:id/bluetooth_run_time";
+ private static final String RES_BT_BUTTON =
+ "com.android.settings.anomaly.tester:id/bluetooth_button";
+ private static final long TIME_OUT = 3000;
+ private UiDevice mDevice;
+
+ @Before
+ public void setUp() {
+ final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ final Context context = instrumentation.getContext();
+ mDevice = UiDevice.getInstance(instrumentation);
+
+ // setup environment
+ TestUtils.setUp(instrumentation);
+ // start anomaly-tester app
+ TestUtils.startAnomalyApp(context, mDevice);
+ }
+
+ @After
+ public void tearDown() {
+ TestUtils.tearDown(InstrumentationRegistry.getInstrumentation());
+ }
+
+ @Test
+ public void testBluetoothAnomaly_longScanningTime_reportAnomaly() throws InterruptedException {
+ // Set running time
+ final long durationMs = DateUtils.SECOND_IN_MILLIS * 15;
+ TestUtils.setEditTextWithValue(mDevice, RES_BT_EDITTEXT, durationMs);
+
+ // Click start button
+ TestUtils.clickButton(mDevice, RES_BT_BUTTON);
+
+ // Wait for its running
+ mDevice.pressHome();
+ TestUtils.wait(mDevice, durationMs);
+
+ // Check it in battery main page
+ Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ instrumentation.startActivitySync(new Intent(BATTERY_INTENT));
+ assertWithMessage("Doesn't have bluetooth anomaly").that(
+ mDevice.wait(Until.findObject(By.text("AnomalyTester draining battery")),
+ TIME_OUT)).isNotNull();
+ }
+
+ @Test
+ public void testBluetoothAnomaly_shortScanningTime_notReport() throws InterruptedException {
+ // Set running time
+ final long durationMs = DateUtils.SECOND_IN_MILLIS;
+ TestUtils.setEditTextWithValue(mDevice, RES_BT_EDITTEXT, durationMs);
+
+ // Click start button
+ TestUtils.clickButton(mDevice, RES_BT_BUTTON);
+
+ // Wait for its running
+ mDevice.pressHome();
+ TestUtils.wait(mDevice, durationMs);
+
+ // Check it in battery main page
+ Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ instrumentation.startActivitySync(new Intent(BATTERY_INTENT));
+ assertWithMessage("Shouldn't have bluetooth anomaly").that(
+ mDevice.wait(Until.findObject(By.text("AnomalyTester draining battery")),
+ TIME_OUT)).isNull();
+ }
+
+}
diff --git a/tests/anomaly-tester/src/com/android/settings/anomaly/tests/TestUtils.java b/tests/anomaly-tester/src/com/android/settings/anomaly/tests/TestUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac15d77bb18736cc3169c81babd234b885e30f16
--- /dev/null
+++ b/tests/anomaly-tester/src/com/android/settings/anomaly/tests/TestUtils.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.settings.anomaly.tests;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.app.Instrumentation;
+import android.app.UiAutomation;
+import android.content.Context;
+import android.content.Intent;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObject2;
+import android.support.test.uiautomator.Until;
+
+public class TestUtils {
+ private static final String PACKAGE_NAME = "com.android.settings.anomaly.tester";
+ private static final long TIME_OUT = 3000;
+
+ /**
+ * This method set up the environment for anomaly test
+ *
+ * @param instrumentation to execute command
+ */
+ public static void setUp(Instrumentation instrumentation) {
+ final UiAutomation uiAutomation = instrumentation.getUiAutomation();
+ // pretend unplug and screen off, also reset the battery stats
+ uiAutomation.executeShellCommand("dumpsys battery unplug");
+ uiAutomation.executeShellCommand("dumpsys batterystats enable pretend-screen-off");
+ uiAutomation.executeShellCommand("dumpsys batterystats --reset");
+ }
+
+ /**
+ * This method cleans up all the commands in {@link #setUp(Instrumentation)}
+ *
+ * @param instrumentation to execute command
+ */
+ public static void tearDown(Instrumentation instrumentation) {
+ final UiAutomation uiAutomation = instrumentation.getUiAutomation();
+ // reset unplug and screen-off
+ uiAutomation.executeShellCommand("dumpsys battery reset");
+ uiAutomation.executeShellCommand("dumpsys batterystats disable pretend-screen-off");
+ }
+
+ public static void startAnomalyApp(Context context, UiDevice uiDevice) {
+ final Intent intent = context.getPackageManager().getLaunchIntentForPackage(PACKAGE_NAME);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ context.startActivity(intent);
+ uiDevice.wait(Until.hasObject(By.pkg(PACKAGE_NAME).depth(0)), TIME_OUT);
+ }
+
+ /**
+ * Find {@link android.widget.EditText} with {@code res} and set its {@code value}
+ */
+ public static void setEditTextWithValue(UiDevice uiDevice, String res, long value) {
+ final UiObject2 editText = uiDevice.findObject(By.res(res));
+ assertWithMessage("Cannot find editText with res: " + res).that(editText).isNotNull();
+ editText.setText(String.valueOf(value));
+ }
+
+ /**
+ * Find {@link android.widget.Button} with {@code res} and click it
+ */
+ public static void clickButton(UiDevice uiDevice, String res) {
+ final UiObject2 button = uiDevice.findObject(By.res(res));
+ assertWithMessage("Cannot find button with res: " + res).that(button).isNotNull();
+ button.click();
+ }
+
+ /**
+ * Make {@link UiDevice} wait for {@code timeMs}
+ *
+ * @see Thread#sleep(long)
+ */
+ public static void wait(UiDevice uiDevice, long timeMs) throws InterruptedException {
+ uiDevice.waitForIdle();
+ Thread.sleep(timeMs);
+ }
+}
diff --git a/tests/anomaly-tester/src/com/android/settings/anomaly/tests/WakelockAnomalyTest.java b/tests/anomaly-tester/src/com/android/settings/anomaly/tests/WakelockAnomalyTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..a2f380489777064742272e750426ea1961b69947
--- /dev/null
+++ b/tests/anomaly-tester/src/com/android/settings/anomaly/tests/WakelockAnomalyTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.settings.anomaly.tests;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.Until;
+import android.text.format.DateUtils;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Functional test for bluetooth unoptimized scanning anomaly detector
+ *
+ * @see com.android.settings.fuelgauge.anomaly.checker.BluetoothScanAnomalyDetector
+ */
+@RunWith(AndroidJUnit4.class)
+public class WakelockAnomalyTest {
+ private static final String BATTERY_INTENT = "android.intent.action.POWER_USAGE_SUMMARY";
+ private static final String RES_WAKELOCK_EDITTEXT =
+ "com.android.settings.anomaly.tester:id/wakelock_run_time";
+ private static final String RES_WAKELOCK_BUTTON =
+ "com.android.settings.anomaly.tester:id/wakelock_button";
+ private static final long TIME_OUT = 3000;
+ private UiDevice mDevice;
+
+ @Before
+ public void setUp() {
+ final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ final Context context = instrumentation.getContext();
+ mDevice = UiDevice.getInstance(instrumentation);
+
+ // setup environment
+ TestUtils.setUp(instrumentation);
+ // start anomaly-tester app
+ TestUtils.startAnomalyApp(context, mDevice);
+ }
+
+ @After
+ public void tearDown() {
+ TestUtils.tearDown(InstrumentationRegistry.getInstrumentation());
+ }
+
+ @Test
+ public void testWakelockAnomaly_longTimeWhileRunning_report() throws InterruptedException {
+ // Set running time
+ final long durationMs = DateUtils.SECOND_IN_MILLIS * 15;
+ TestUtils.setEditTextWithValue(mDevice, RES_WAKELOCK_EDITTEXT, durationMs);
+
+ // Click start button
+ TestUtils.clickButton(mDevice, RES_WAKELOCK_BUTTON);
+
+ // Wait for its running
+ mDevice.pressHome();
+ // Sleeping time less than running time, so the app still holding wakelock when we check
+ TestUtils.wait(mDevice, durationMs - TIME_OUT);
+
+ // Check it in battery main page
+ Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ instrumentation.startActivitySync(new Intent(BATTERY_INTENT));
+ assertWithMessage("Doesn't have wakelock anomaly").that(
+ mDevice.wait(Until.findObject(By.text("AnomalyTester draining battery")),
+ TIME_OUT)).isNotNull();
+ }
+
+ @Test
+ public void testWakelockAnomaly_shortTime_notReport() throws InterruptedException {
+ // Set running time
+ final long durationMs = DateUtils.SECOND_IN_MILLIS;
+ TestUtils.setEditTextWithValue(mDevice, RES_WAKELOCK_EDITTEXT, durationMs);
+
+ // Click start button
+ TestUtils.clickButton(mDevice, RES_WAKELOCK_BUTTON);
+
+ // Wait for its running
+ mDevice.pressHome();
+ TestUtils.wait(mDevice, durationMs);
+
+ // Check it in battery main page
+ Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ instrumentation.startActivitySync(new Intent(BATTERY_INTENT));
+ assertWithMessage("Shouldn't have wakelock anomaly").that(
+ mDevice.wait(Until.findObject(By.text("AnomalyTester draining battery")),
+ TIME_OUT)).isNull();
+ }
+
+ @Test
+ public void testWakelockAnomaly_longTimeWhileNotRunning_notReport()
+ throws InterruptedException {
+ // Set running time
+ final long durationMs = DateUtils.SECOND_IN_MILLIS * 10;
+ TestUtils.setEditTextWithValue(mDevice, RES_WAKELOCK_EDITTEXT, durationMs);
+
+ // Click start button
+ TestUtils.clickButton(mDevice, RES_WAKELOCK_BUTTON);
+
+ // Wait for its running
+ mDevice.pressHome();
+ // Wait more time for releasing the wakelock
+ TestUtils.wait(mDevice, durationMs + TIME_OUT);
+
+ // Check it in battery main page
+ Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ instrumentation.startActivitySync(new Intent(BATTERY_INTENT));
+ assertWithMessage("Shouldn't have wakelock anomaly").that(
+ mDevice.wait(Until.findObject(By.text("AnomalyTester draining battery")),
+ TIME_OUT)).isNull();
+ }
+
+}
diff --git a/tests/app/Android.mk b/tests/app/Android.mk
new file mode 100644
index 0000000000000000000000000000000000000000..c0c0ccfc852c6346caaa1c9c2907c82b5122b2a4
--- /dev/null
+++ b/tests/app/Android.mk
@@ -0,0 +1,27 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# We only want this apk build for tests.
+LOCAL_MODULE_TAGS := tests
+LOCAL_CERTIFICATE := platform
+
+LOCAL_JAVA_LIBRARIES := android.test.runner bouncycastle
+
+LOCAL_STATIC_JAVA_LIBRARIES := \
+ android-support-test \
+ mockito-target \
+ espresso-core \
+ espresso-contrib-nodep \
+ espresso-intents-nodep \
+ ub-uiautomator \
+ truth-prebuilt \
+ legacy-android-test
+
+# Include all test java files.
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := SettingsTests
+
+LOCAL_INSTRUMENTATION_FOR := Settings
+
+include $(BUILD_PACKAGE)
diff --git a/tests/app/AndroidManifest.xml b/tests/app/AndroidManifest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6659e5ff18482d99d7f18654b2376a731ba7790c
--- /dev/null
+++ b/tests/app/AndroidManifest.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/app/res/drawable-hdpi/ic_settings_applications.png b/tests/app/res/drawable-hdpi/ic_settings_applications.png
new file mode 100755
index 0000000000000000000000000000000000000000..5cea33f487a41ed762dfdb099a479faee02943b8
Binary files /dev/null and b/tests/app/res/drawable-hdpi/ic_settings_applications.png differ
diff --git a/tests/app/res/drawable-mdpi/ic_settings_applications.png b/tests/app/res/drawable-mdpi/ic_settings_applications.png
new file mode 100755
index 0000000000000000000000000000000000000000..745ff2a159880c08df7ed2f02ed8260ae02b066b
Binary files /dev/null and b/tests/app/res/drawable-mdpi/ic_settings_applications.png differ
diff --git a/tests/app/res/drawable-xhdpi/ic_settings_applications.png b/tests/app/res/drawable-xhdpi/ic_settings_applications.png
new file mode 100644
index 0000000000000000000000000000000000000000..8eda83fc81d6934551a25a9380f2c505a7a1a45b
Binary files /dev/null and b/tests/app/res/drawable-xhdpi/ic_settings_applications.png differ
diff --git a/tests/app/res/layout/bluetooth_request_permission_test.xml b/tests/app/res/layout/bluetooth_request_permission_test.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b62db197ce60587dbbc547bae6555409fe34ad9b
--- /dev/null
+++ b/tests/app/res/layout/bluetooth_request_permission_test.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/app/res/layout/manufacturer_main.xml b/tests/app/res/layout/manufacturer_main.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8f8c48f1f26f62829d06ea81530db4217ba15600
--- /dev/null
+++ b/tests/app/res/layout/manufacturer_main.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
diff --git a/tests/app/res/layout/operator_main.xml b/tests/app/res/layout/operator_main.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3cf8e00aab2ef11f85d8265e49758ac78fd36d7c
--- /dev/null
+++ b/tests/app/res/layout/operator_main.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
diff --git a/tests/app/res/values-af/strings.xml b/tests/app/res/values-af/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5a9ae32ae58e73eab7f1b80b35a1c3703910ca4f
--- /dev/null
+++ b/tests/app/res/values-af/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Opspoorbaar"
+ "Begin skandering"
+ "Stop skandering"
+ "Hallo, operateur!"
+ "Operateur"
+ "Operateurhoek wat gebruik kan word om voorkeuraktiwiteit te begin"
+ "Hallo, vervaardiger!"
+ "Vervaardiger"
+ "Vervaardigerhoek wat gebruik kan word om voorkeuraktiwiteit te begin"
+
diff --git a/tests/app/res/values-am/strings.xml b/tests/app/res/values-am/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f77c8528a087e15ed3c53fd026bb11380083c20e
--- /dev/null
+++ b/tests/app/res/values-am/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "ሊገኝ የሚችል"
+ "ቅኝት ጀምር"
+ "ቅኝት አቁም"
+ "ታዲያስ ከዋኝ!"
+ "ከዋኝ"
+ "የምርጫን እንቅስቃሴ ለማስጀመር ጥቅም ላይ መዋል የሚችል የከዋኝ መንጠቆ።"
+ "ታዲያስ አምራች!"
+ "አምራች"
+ "የምርጫን እንቅስቃሴ ለማስጀመር ጥቅም ላይ መዋል የሚችል የአምራች መንጠቆ።"
+
diff --git a/tests/app/res/values-ar/strings.xml b/tests/app/res/values-ar/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6ca54bef0120befd62fff1d0b6082cc09a4690f2
--- /dev/null
+++ b/tests/app/res/values-ar/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "قابل للاكتشاف"
+ "بدء الفحص"
+ "إيقاف الفحص"
+ "مرحبًا بمشغِّل شبكة الجوّال!"
+ "مشغِّل شبكة الجوال"
+ "أداة مشغِّل شبكة الجوّال التي يمكن استخدامها لبدء النشاط المختار"
+ "مرحبًا بجهة التصنيع!"
+ "جهة التصنيع"
+ "أداة جهة التصنيع التي يمكن استخدامها لبدء النشاط المختار"
+
diff --git a/tests/app/res/values-az/strings.xml b/tests/app/res/values-az/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d24e093e49e38c5ea2e3defb3efcebaa117263b8
--- /dev/null
+++ b/tests/app/res/values-az/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Aşkarlana bilən"
+ "Skana başlay"
+ "Skan prosesini dayandırın"
+ "Salam, Operator!"
+ "Operator"
+ "Seçim fəaliyyətinə başlamaq üçün istifadə edilə bilən Operator qarmağı"
+ "İstehsalçıya Salamlar!"
+ "İstehsalçı"
+ "İstehsalçı dəhrəsi seçim aktivliyinə başlamaq üçün işlənə bilər"
+
diff --git a/tests/app/res/values-b+sr+Latn/strings.xml b/tests/app/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9ee1c5ee8e36f433e1c04de0baf5cb191ca35718
--- /dev/null
+++ b/tests/app/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Vidljivo"
+ "Pokreni skeniranje"
+ "Zaustavi skeniranje"
+ "Zdravo, operateru!"
+ "Mobilni operater"
+ "Mamac za operatera koji može da se koristi za pokretanje željene aktivnosti"
+ "Zdravo, proizvođaču!"
+ "Proizvođač"
+ "Mamac za proizvođača koji može da se koristi za pokretanje željene aktivnosti"
+
diff --git a/tests/app/res/values-be/strings.xml b/tests/app/res/values-be/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..41d62b43d69741346e8d95e8cdefe4ceccc98eb0
--- /dev/null
+++ b/tests/app/res/values-be/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Бачная прылада"
+ "Пачаць сканіраванне"
+ "Спыніць сканіраванне"
+ "Прывітанне, аператар!"
+ "Аператар"
+ "Хітрык аператара, які можна выкарыстоўваць для выбранай дзейнасці"
+ "Прывітанне, вытворца!"
+ "Вытворца"
+ "Заводскі сродак перахопу, праз які можна распачаць патрэбныя дзеянні"
+
diff --git a/tests/app/res/values-bg/strings.xml b/tests/app/res/values-bg/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..580bf85e4f5ee679f7ec2a92adbd3e9bda91ffda
--- /dev/null
+++ b/tests/app/res/values-bg/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Откриваемо"
+ "Стартиране на сканирането"
+ "Спиране на сканирането"
+ "Здравейте, операторе!"
+ "Оператор"
+ "Фраза за поздрав към оператора, чрез която може да се стартира желана дейност"
+ "Здравейте, производителю!"
+ "Производител"
+ "Фраза за поздрав към производителя, чрез която може да се стартира желана дейност"
+
diff --git a/tests/app/res/values-bn/strings.xml b/tests/app/res/values-bn/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ac6edab94419e494f8e20876bfe7926ecdbeaaa9
--- /dev/null
+++ b/tests/app/res/values-bn/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "খুঁজে নেওয়ার যোগ্য"
+ "স্ক্যান শুরু করুন"
+ "স্ক্যান বন্ধ করুন"
+ "হ্যালো অপারেটর!"
+ "অপারেটর"
+ "অপারেটর হুক যা পছন্দের কার্যকলাপ শুরু করতে ব্যবহার করা যেতে পারে"
+ "হ্যালো প্রস্তুতকর্তা!"
+ "প্রস্তুতকারক"
+ "প্রস্তুতকর্তা হুক যা পছন্দের কার্যকলাপ শুরু করতে ব্যবহার করা যেতে পারে"
+
diff --git a/tests/app/res/values-bs/strings.xml b/tests/app/res/values-bs/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..db915321d89f0e5690789d1d57a6268a5bb41c19
--- /dev/null
+++ b/tests/app/res/values-bs/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Vidljiv"
+ "Započni skeniranje"
+ "Zaustavi skeniranje"
+ "Zdravo, operateru!"
+ "Operater"
+ "Zakačka operatera koja se može koristiti za pokretanje aktivnosti po izboru"
+ "Zdravo, proizvođaču!"
+ "Proizvođač"
+ "Zakačka proizvođača koja se može koristiti za pokretanje aktivnosti po izboru"
+
diff --git a/tests/app/res/values-ca/strings.xml b/tests/app/res/values-ca/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e324eeb4678d02da6af42b88e25ad6e24c8bbf89
--- /dev/null
+++ b/tests/app/res/values-ca/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Visible"
+ "Inicia la cerca"
+ "Atura la cerca"
+ "Hola, operador!"
+ "Operador"
+ "Esquer per a l\'operador que es pot utilitzar per iniciar l\'activitat triada"
+ "Hola, fabricant!"
+ "Fabricant"
+ "Esquer per al fabricant que es pot utilitzar per iniciar l\'activitat triada"
+
diff --git a/tests/app/res/values-cs/strings.xml b/tests/app/res/values-cs/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..92a93cf50a486919cb0df8fd997b135e4bdc61cb
--- /dev/null
+++ b/tests/app/res/values-cs/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Viditelné"
+ "Zahájit vyhledávání"
+ "Zastavit vyhledávání"
+ "Ahoj operátore!"
+ "Operátor"
+ "Háček operátora, který lze použít ke spuštění vybrané činnosti"
+ "Ahoj výrobce!"
+ "Výrobce"
+ "Háček výrobce, který lze použít ke spuštění vybrané činnosti"
+
diff --git a/tests/app/res/values-da/strings.xml b/tests/app/res/values-da/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6a76b15bdaddbeaf9f545b0f97533b583834aa4d
--- /dev/null
+++ b/tests/app/res/values-da/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Søgbar"
+ "Start scanning"
+ "Stop scanning"
+ "Hej mobilselskab"
+ "Mobilselskab"
+ "Hook fra mobilselskabet, der kan bruges til at starte en aktivitet"
+ "Hej producent"
+ "Producent"
+ "Hook fra producenten, der kan bruges til at starte en aktivitet"
+
diff --git a/tests/app/res/values-de/strings.xml b/tests/app/res/values-de/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8916379f42779ffffff873382ef8d227ee86b73c
--- /dev/null
+++ b/tests/app/res/values-de/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Sichtbar"
+ "Scan starten"
+ "Scan beenden"
+ "Hallo Operator!"
+ "Operator"
+ "Operator-Hook zum Starten einer gewünschten Aktivität"
+ "Hallo Hersteller!"
+ "Hersteller"
+ "Hersteller-Hook zum Starten einer gewünschten Aktivität"
+
diff --git a/tests/app/res/values-el/strings.xml b/tests/app/res/values-el/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1e7f4ec18b2a889e641f645cd1fda803a476a00f
--- /dev/null
+++ b/tests/app/res/values-el/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Ανιχνεύσιμο"
+ "Έναρξη σάρωσης"
+ "Διακοπή σάρωσης"
+ "Γεια σας, χειριστή!"
+ "Χειριστής"
+ "Άγκιστρο χειριστή που μπορεί να χρησιμοποιηθεί για την έναρξη της επιλεγμένης δραστηριότητας"
+ "Γεια σας, κατασκευαστή!"
+ "Κατασκευαστής"
+ "Άγκιστρο κατασκευαστή που μπορεί να χρησιμοποιηθεί για την έναρξη της επιλεγμένης δραστηριότητας"
+
diff --git a/tests/app/res/values-en-rAU/strings.xml b/tests/app/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e1a9a098364476a88754c5e075102a4e727d0bb1
--- /dev/null
+++ b/tests/app/res/values-en-rAU/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Discoverable"
+ "Start scan"
+ "Stop scan"
+ "Hello Operator!"
+ "Operator"
+ "Operator\'s hook that can be used to start activity of choice"
+ "Hello Manufacturer!"
+ "Manufacturer"
+ "Manufacturer\'s hook that can be used to start activity of choice"
+
diff --git a/tests/app/res/values-en-rCA/strings.xml b/tests/app/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e1a9a098364476a88754c5e075102a4e727d0bb1
--- /dev/null
+++ b/tests/app/res/values-en-rCA/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Discoverable"
+ "Start scan"
+ "Stop scan"
+ "Hello Operator!"
+ "Operator"
+ "Operator\'s hook that can be used to start activity of choice"
+ "Hello Manufacturer!"
+ "Manufacturer"
+ "Manufacturer\'s hook that can be used to start activity of choice"
+
diff --git a/tests/app/res/values-en-rGB/strings.xml b/tests/app/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e1a9a098364476a88754c5e075102a4e727d0bb1
--- /dev/null
+++ b/tests/app/res/values-en-rGB/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Discoverable"
+ "Start scan"
+ "Stop scan"
+ "Hello Operator!"
+ "Operator"
+ "Operator\'s hook that can be used to start activity of choice"
+ "Hello Manufacturer!"
+ "Manufacturer"
+ "Manufacturer\'s hook that can be used to start activity of choice"
+
diff --git a/tests/app/res/values-en-rIN/strings.xml b/tests/app/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e1a9a098364476a88754c5e075102a4e727d0bb1
--- /dev/null
+++ b/tests/app/res/values-en-rIN/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Discoverable"
+ "Start scan"
+ "Stop scan"
+ "Hello Operator!"
+ "Operator"
+ "Operator\'s hook that can be used to start activity of choice"
+ "Hello Manufacturer!"
+ "Manufacturer"
+ "Manufacturer\'s hook that can be used to start activity of choice"
+
diff --git a/tests/app/res/values-en-rXC/strings.xml b/tests/app/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0b0936161d9ca0ec61f0a229efa6e3f877714f37
--- /dev/null
+++ b/tests/app/res/values-en-rXC/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Discoverable"
+ "Start scan"
+ "Stop scan"
+ "Hello Operator!"
+ "Operator"
+ "Operator hook that can be used to start activity of choice"
+ "Hello Manufacturer!"
+ "Manufacturer"
+ "Manufacturer hook that can be used to start activity of choice"
+
diff --git a/tests/app/res/values-es-rUS/strings.xml b/tests/app/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1ea3671cd344c4390b146a85d6ae53aaa995fa44
--- /dev/null
+++ b/tests/app/res/values-es-rUS/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Visible"
+ "Comenzar lectura"
+ "Detener lectura"
+ "¡Hola operador!"
+ "Operador"
+ "Vínculo del operador que puede utilizarse para iniciar la actividad que elijas"
+ "¡Hola fabricante!"
+ "Fabricante"
+ "Vínculo del fabricante que puede utilizarse para iniciar la actividad que elijas"
+
diff --git a/tests/app/res/values-es/strings.xml b/tests/app/res/values-es/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..efd42e3cc3c072a8a2d77e81e5a1096993e623e9
--- /dev/null
+++ b/tests/app/res/values-es/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Visible"
+ "Iniciar búsqueda"
+ "Detener búsqueda"
+ "¡Hola, operador!"
+ "Operador"
+ "Enlace del operador que se puede utilizar para iniciar la selección"
+ "¡Hola, fabricante!"
+ "Fabricante"
+ "Enlace del fabricante que se puede utilizar para iniciar la selección"
+
diff --git a/tests/app/res/values-et/strings.xml b/tests/app/res/values-et/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..077d066116d034ac7722f01f25237b70f8111edc
--- /dev/null
+++ b/tests/app/res/values-et/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Leitav"
+ "Käivita skannimine"
+ "Peata skannimine"
+ "Tere, operaator!"
+ "Operaator"
+ "Operaatoriharki saab kasutada teie valitud tegevuse käivitamiseks"
+ "Tere, tootja!"
+ "Tootja"
+ "Tootjaharki saab kasutada teie valitud tegevuse käivitamiseks"
+
diff --git a/tests/app/res/values-eu/strings.xml b/tests/app/res/values-eu/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..22344369f095684163c4e2fffeeca1fb25bb89fb
--- /dev/null
+++ b/tests/app/res/values-eu/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Ikusgai"
+ "Hasi aztertzen"
+ "Gelditu azterketa"
+ "Kaixo, operadore hori!"
+ "Operadorea"
+ "Operadorearen lotura, jarduerak nahieran hasteko erabil daitekeena"
+ "Kaixo, fabrikatzaile hori!"
+ "Fabrikatzailea"
+ "Fabrikatzailearen lotura, jarduerak nahieran hasteko erabil daitekeena"
+
diff --git a/tests/app/res/values-fa/strings.xml b/tests/app/res/values-fa/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5f8a919204955b32ea3a915128cdb3799aa7f804
--- /dev/null
+++ b/tests/app/res/values-fa/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "قابل شناسایی"
+ "شروع اسکن"
+ "توقف اسکن"
+ "سلام اپراتور!"
+ "اپراتور"
+ "گیره اپراتور که میتوان از آن برای شروع فعالیت دلخواه استفاده کرد"
+ "سلام سازنده!"
+ "سازنده"
+ "گیره سازنده که میتوان از آن برای شروع فعالیت دلخواه استفاده کرد"
+
diff --git a/tests/app/res/values-fi/strings.xml b/tests/app/res/values-fi/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0b2b23708b8746d88974fa26c7b7e062ad43c989
--- /dev/null
+++ b/tests/app/res/values-fi/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Tunnistettavissa"
+ "Aloita haku"
+ "Pysäytä haku"
+ "Hei operaattori!"
+ "Operaattori"
+ "Operaattorin pakote, jonka avulla voidaan aloittaa valittu toiminto"
+ "Hei valmistaja!"
+ "Valmistaja"
+ "Valmistajan pakote, jonka avulla valittu toiminto voidaan aloittaa"
+
diff --git a/tests/app/res/values-fr-rCA/strings.xml b/tests/app/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f8df49a74c3e41cf0bbbe5c6488fb3619cd9cf7b
--- /dev/null
+++ b/tests/app/res/values-fr-rCA/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Visible"
+ "Démarrer la recherche"
+ "Arrêter la recherche"
+ "Bonjour, fournisseur de services!"
+ "Fournisseur de services"
+ "Accroche à l\'intention du fournisseur de services pouvant servir à démarrer l\'opération souhaitée"
+ "Bonjour, fabricant!"
+ "Fabricant"
+ "Accroche à l\'intention du fabricant pouvant servir à démarrer l\'opération souhaitée"
+
diff --git a/tests/app/res/values-fr/strings.xml b/tests/app/res/values-fr/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a2df7ed96451b39f808e805023ccd5dbef273c40
--- /dev/null
+++ b/tests/app/res/values-fr/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Visible"
+ "Démarrer la recherche"
+ "Arrêter la recherche"
+ "Hello Operator!"
+ "Opérateur"
+ "Accroche opérateur pouvant servir à démarrer l\'opération souhaitée"
+ "Hello Manufacturer!"
+ "Fabricant"
+ "Accroche fabricant pouvant servir à démarrer l\'opération souhaitée"
+
diff --git a/tests/app/res/values-gl/strings.xml b/tests/app/res/values-gl/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d4343d21cd3ba8d7825d078327c0551e89a2084e
--- /dev/null
+++ b/tests/app/res/values-gl/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Detectable"
+ "Iniciar escaneo"
+ "Deter escaneo"
+ "Ola, operador!"
+ "Operador"
+ "Gancho do operador que se pode usar para iniciar a actividade escollida"
+ "Ola, fabricante!"
+ "Fabricante"
+ "Gancho do fabricante que se pode usar para iniciar a actividade escollida"
+
diff --git a/tests/app/res/values-gu/strings.xml b/tests/app/res/values-gu/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..703f70e8e869ab1086a9c3883eb2a131846014ec
--- /dev/null
+++ b/tests/app/res/values-gu/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "શોધવાયોગ્ય"
+ "સ્કૅન પ્રારંભ કરો"
+ "સ્કૅન રોકો"
+ "ઓપરેટરને નમસ્કાર!"
+ "ઓપરેટર"
+ "ઓપરેટર હુક કે જેનો ઉપયોગ પસંદગીની પ્રવૃત્તિ પ્રારંભ કરવા માટે કરી શકાય છે"
+ "નિર્માતાને નમસ્કાર!"
+ "નિર્માતા"
+ "નિર્માતા હુક કે જેનો ઉપયોગ પસંદગીની પ્રવૃત્તિ પ્રારંભ કરવા માટે કરી શકાય છે"
+
diff --git a/tests/app/res/values-hi/strings.xml b/tests/app/res/values-hi/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3a754c65ce3249009c4416f54d1256d8583f5ba0
--- /dev/null
+++ b/tests/app/res/values-hi/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "खोजे जाने लायक"
+ "स्कैन शुरू करें"
+ "स्कैन बंद करें"
+ "नमस्कार ऑपरेटर!"
+ "ऑपरेटर"
+ "पसंद की गतिविधि प्रारंभ करने में उपयोग किया जाने वाला ऑपरेटर हुक"
+ "नमस्कार निर्माता!"
+ "निर्माता"
+ "पसंद की गतिविधि प्रारंभ करने में उपयोग किया जाने वाला निर्माता हुक"
+
diff --git a/tests/app/res/values-hr/strings.xml b/tests/app/res/values-hr/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..768ebb75a87a7c8908777c21bc3bd501e833f2fd
--- /dev/null
+++ b/tests/app/res/values-hr/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Moguće otkrivanje"
+ "Pokreni skeniranje"
+ "Zaustavi skeniranje"
+ "Pozdrav, operateru!"
+ "Mobilni operater"
+ "Operatorska kvaka koja se može upotrijebiti da bi se započela odabrana aktivnost"
+ "Pozdrav, proizvođaču!"
+ "Proizvođač"
+ "Proizvođačka kvaka koja se može upotrijebiti da bi se započela odabrana aktivnost"
+
diff --git a/tests/app/res/values-hu/strings.xml b/tests/app/res/values-hu/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..da413963e8fff599afa18aaaa84bcd6a5d2f189a
--- /dev/null
+++ b/tests/app/res/values-hu/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Látható"
+ "Keresés indítása"
+ "Keresés leállítása"
+ "Üdv, Operátor!"
+ "Szolgáltató"
+ "Operátori horog, amelyet tetszés szerinti tevékenység elindítására lehet használni"
+ "Tisztelt Gyártó!"
+ "Gyártó"
+ "Gyártói horog, amely tetszés szerinti tevékenység elindítására használható"
+
diff --git a/tests/app/res/values-hy/strings.xml b/tests/app/res/values-hy/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c8cd4a148ec352592177daf1042b0f13db8528e9
--- /dev/null
+++ b/tests/app/res/values-hy/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Հայտնաբերելի"
+ "Սկսել սկանավորումը"
+ "Դադարեցնել սկանավորումը"
+ "Ողջու˜յն, օպերատոր:"
+ "Օպերատոր"
+ "Օպերատորի սլաքը կարող է օգտագործվել ընտրված գործողությունը սկսելու համար"
+ "Ողջու˜յն, արտադրող:"
+ "Արտադրող"
+ "Արտադրողի սլաքը կարող է օգտագործվել ընտրված գործողությունը սկսելու համար"
+
diff --git a/tests/app/res/values-in/strings.xml b/tests/app/res/values-in/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..51c474c463ea9810284faef0991c2ecf5f9751d5
--- /dev/null
+++ b/tests/app/res/values-in/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Dapat ditemukan"
+ "Mulai memindai"
+ "Hentikan pemindaian"
+ "Halo Operator!"
+ "Operator"
+ "Hook operator yang dapat digunakan untuk memulai aktivitas pilihan"
+ "Halo Pabrikan!"
+ "Produsen"
+ "Hook produsen yang dapat digunakan untuk memulai aktivitas pilihan"
+
diff --git a/tests/app/res/values-is/strings.xml b/tests/app/res/values-is/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4d694ccead1220083803b3676d689c663f9d0c7f
--- /dev/null
+++ b/tests/app/res/values-is/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Sýnilegt"
+ "Hefja skönnun"
+ "Stöðva skönnun"
+ "Halló, símafyrirtæki!"
+ "Símafyrirtæki"
+ "Símafyrirtækishlið sem hægt er að nota til að ræsa hvaða virkni sem er"
+ "Halló, framleiðandi!"
+ "Framleiðandi"
+ "Framleiðandahlið sem hægt er að nota til að ræsa hvaða virkni sem er"
+
diff --git a/tests/app/res/values-it/strings.xml b/tests/app/res/values-it/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..46a8a1c22e7834b0dc5464dd60a2ec1a541017c7
--- /dev/null
+++ b/tests/app/res/values-it/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Rilevabile"
+ "Avvia scansione"
+ "Interrompi scansione"
+ "Ciao operatore!"
+ "Operatore"
+ "Collegamento all\'operatore utilizzabile per avviare l\'attività di propria scelta"
+ "Ciao produttore!"
+ "Produttore"
+ "Collegamento al produttore utilizzabile per avviare l\'attività di propria scelta"
+
diff --git a/tests/app/res/values-iw/strings.xml b/tests/app/res/values-iw/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a2c9e4654a33433d13906385cb8abf26203c85b6
--- /dev/null
+++ b/tests/app/res/values-iw/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "גלוי"
+ "התחל סריקה"
+ "הפסק סריקה"
+ "שלום לך ספק!"
+ "ספק"
+ "חיבור ספק שיכול לשמש להתחלת הפעילות שנבחרה"
+ "שלום לך יצרן!"
+ "יצרן"
+ "חיבור יצרן שיכול לשמש להתחלת הפעילות שנבחרה"
+
diff --git a/tests/app/res/values-ja/strings.xml b/tests/app/res/values-ja/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5b663e7ec8049335a18e911bb1e970e12b2c38f7
--- /dev/null
+++ b/tests/app/res/values-ja/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "検出可能"
+ "スキャンを開始"
+ "スキャンを停止"
+ "オペレーター"
+ "オペレーター"
+ "選択した操作を開始するためのオペレーター フック"
+ "メーカー"
+ "メーカー"
+ "選択した操作を開始するためのメーカーフック"
+
diff --git a/tests/app/res/values-ka/strings.xml b/tests/app/res/values-ka/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..303a3c525489c0abd3b8f71d32220fdf867c06b9
--- /dev/null
+++ b/tests/app/res/values-ka/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "აღმოჩენადი"
+ "სკანირების დაწყება"
+ "სკანირების შეწყვეტა"
+ "გამარჯობა, ოპერატორო!"
+ "ოპერატორი"
+ "ოპერატორის ფანდი, რომლის გამოყენებაც არჩევანის გაკეთების იძულებისთვის შეიძლება"
+ "გამარჯობა, მწარმოებელო!"
+ "მწარმოებელი"
+ "მწარმოებლის ფანდი, რომლის გამოყენებაც არჩევანის გაკეთების იძულებისთვის შეიძლება"
+
diff --git a/tests/app/res/values-kk/strings.xml b/tests/app/res/values-kk/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f68c61b54e44db0386fe71c76da54f14e0f20457
--- /dev/null
+++ b/tests/app/res/values-kk/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Табу мүмкіндігі бар"
+ "Іздеуді бастау"
+ "Іздеуді тоқтату"
+ "Сәлем, Operator!"
+ "Operator"
+ "Таңдалған әрекетті іске қосу үшін пайдалануға болатын Operator хугы"
+ "Сәлем, Manufacturer!"
+ "Өндіруші"
+ "Таңдалған әрекетті іске қосу үшін пайдалануға болатын Manufacturer хугы"
+
diff --git a/tests/app/res/values-km/strings.xml b/tests/app/res/values-km/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a738ee00488e6e5ae992e9226ae7a10dd7917302
--- /dev/null
+++ b/tests/app/res/values-km/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "អាចរកឃើញ"
+ "ចាប់ផ្ដើមស្កេន"
+ "ឈប់ស្កេន"
+ "សួស្ដីប្រតិបត្តិករ!"
+ "ប្រតិបត្តិករ"
+ "ការទាក់ទាញប្រតិបត្តិករអាចត្រូវបានប្រើដើម្បីចាប់ផ្ដើមជម្រើសសកម្មភាព"
+ "សួស្ដីក្រុមហ៊ុនផលិត!"
+ "ក្រុមហ៊ុនផលិត"
+ "ការទាក់ទាញក្រុមហ៊ុនផលិតអាចត្រូវបានប្រើដើម្បីចាប់ផ្ដើមជម្រើសសកម្មភាព"
+
diff --git a/tests/app/res/values-kn/strings.xml b/tests/app/res/values-kn/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2bc15ed342aa4e46fdfa2bdd8afa36111a54fc70
--- /dev/null
+++ b/tests/app/res/values-kn/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "ಅನ್ವೇಷಿಸಬಹುದಾದ"
+ "ಸ್ಕ್ಯಾನ್ ಪ್ರಾರಂಭಿಸಿ"
+ "ಸ್ಕ್ಯಾನ್ ನಿಲ್ಲಿಸಿ"
+ "ಹಲೋ ಆಪರೇಟರ್!"
+ "ಆಪರೇಟರ್"
+ "ಆಯ್ಕೆಯ ಚಟುವಟಿಕೆಯನ್ನು ಪ್ರಾರಂಭಿಸಲು ಬಳಸಬಹುದಾದ ಆಪರೇಟರ್ ಹುಕ್"
+ "ಹಲೋ ತಯಾರಕರೇ!"
+ "ತಯಾರಕರು"
+ "ಆಯ್ಕೆಯ ಚಟುವಟಿಕೆಯನ್ನು ಪ್ರಾರಂಭಿಸಲು ಬಳಸಬಹುದಾದ ತಯಾರಕರ ಹುಕ್"
+
diff --git a/tests/app/res/values-ko/strings.xml b/tests/app/res/values-ko/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..996016cfe735ecbc5428454166a759ebd69bfc96
--- /dev/null
+++ b/tests/app/res/values-ko/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "검색 가능"
+ "검색 시작"
+ "검색 중지"
+ "운영자님, 안녕하세요."
+ "운영자"
+ "선택한 작업을 시작하는 데 사용할 수 있는 운영자 안내"
+ "제조업자님, 안녕하세요."
+ "제조업체"
+ "선택한 작업을 시작하는 데 사용할 수 있는 제조업체 안내"
+
diff --git a/tests/app/res/values-ky/strings.xml b/tests/app/res/values-ky/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..766d591437b00d6d8370c86627594ae8d492a32e
--- /dev/null
+++ b/tests/app/res/values-ky/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Ачык"
+ "Скандоону баштоо"
+ "Скандоону токтотуу"
+ "Салам!"
+ "Оператор"
+ "Тандалган аракетти баштоо үчүн колдонула турган оператордун куралы"
+ "Салам!"
+ "Өндүрүүчү"
+ "Тандалган аракетти баштоо үчүн колдонула турган өндүрүүчүнүн куралы"
+
diff --git a/tests/app/res/values-lo/strings.xml b/tests/app/res/values-lo/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b10e8e46d7fc5cd40b371bfd1436e93cfdd2ec27
--- /dev/null
+++ b/tests/app/res/values-lo/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "ສາມາດຄົ້ນພົບໄດ້"
+ "ເລີ່ມຕົ້ນສະແກນ"
+ "ຢຸດສະແກນ"
+ "ສະບາຍດີຜູ້ໃຫ້ບໍລິການ!"
+ "ຜູ້ໃຫ້ບໍລິການ"
+ "ຂໍ້ຄວາມຂອງຜູ້ໃຫ້ບໍລິການທີ່ສາມາດໃຊ້ ເພື່ອເລີ່ມການເຄື່ອນໄຫວທີ່ເລືອກໄດ້"
+ "ສະບາຍດີຜູ້ຜະລິດ!"
+ "ຜູ້ຜະລິດ"
+ "ຂໍ້ຄວາມຂອງຜູ້ຜະລິດທີ່ສາມາດໃຊ້ເພື່ອເລີ່ມການເຄື່ອນໄຫວທີ່ເລືອກໄດ້"
+
diff --git a/tests/app/res/values-lt/strings.xml b/tests/app/res/values-lt/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a59099983044fedb78cca8721f9e18f4c9b04b89
--- /dev/null
+++ b/tests/app/res/values-lt/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Aptinkamas"
+ "Pradėti nuskaitymą"
+ "Sustabdyti nuskaitymą"
+ "Sveiki, operatoriau!"
+ "Operatorius"
+ "Operatoriaus dominantis turinys, kurį galima naudoti norint pradėti pasirinktą veiklą"
+ "Sveiki, gamintojau!"
+ "Gamintojas"
+ "Gamintojo dominantis turinys, kurį galima naudoti norint pradėti pasirinktą veiklą"
+
diff --git a/tests/app/res/values-lv/strings.xml b/tests/app/res/values-lv/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e28fe2a4b422d2575e94f8d92956f729bec3f13d
--- /dev/null
+++ b/tests/app/res/values-lv/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Uztverama"
+ "Sākt skenēšanu"
+ "Apturēt skenēšanu"
+ "Esiet sveicināts, operator!"
+ "Operators"
+ "Operatora aizķere, ko var izmantot, lai startētu izvēlētu darbību"
+ "Esiet sveicināts, ražotāj!"
+ "Ražotājs"
+ "Ražotāja aizķere, ko var izmantot, lai startētu izvēlētu darbību"
+
diff --git a/tests/app/res/values-mk/strings.xml b/tests/app/res/values-mk/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b6eca5411376565d0ecc0777861c5cb060dcb9d7
--- /dev/null
+++ b/tests/app/res/values-mk/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Достапен"
+ "Започни скенирање"
+ "Запри скенирање"
+ "Здраво операторе!"
+ "Оператор"
+ "Кука на оператор што може да се употреби за да се започне активност по избор"
+ "Здраво производителе!"
+ "Производителот"
+ "Кука на производител што може да се употреби за да се започне активност по избор"
+
diff --git a/tests/app/res/values-ml/strings.xml b/tests/app/res/values-ml/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e1aa334bbc7b2843a5493f35043f7e7749147ba6
--- /dev/null
+++ b/tests/app/res/values-ml/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "കണ്ടെത്താനാകുന്നത്"
+ "സ്കാൻ ചെയ്യാൻ ആരംഭിക്കുക"
+ "സ്കാൻ ചെയ്യുന്നത് നിർത്തുക"
+ "ഹലോ, ഓപ്പറേറ്റർ!"
+ "ഓപ്പറേറ്റർ"
+ "തിരഞ്ഞെടുക്കൽ പ്രവർത്തനം ആരംഭിക്കാൻ ഉപയോഗിക്കാവുന്ന ഓപ്പറേറ്റർ ഹുക്ക്"
+ "ഹലോ, നിർമ്മാതാവെ!"
+ "നിർമ്മാതാവ്"
+ "തിരഞ്ഞെടുക്കൽ പ്രവർത്തനം ആരംഭിക്കാൻ ഉപയോഗിക്കാവുന്ന നിർമ്മാതാവിന്റെ ഹുക്ക്"
+
diff --git a/tests/app/res/values-mn/strings.xml b/tests/app/res/values-mn/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c2648267c1abcbb24381e1e45a176a1d641acf17
--- /dev/null
+++ b/tests/app/res/values-mn/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Харагдахуйц"
+ "Сканийг эхлүүлэх"
+ "Шинжлэхийг зогсоох"
+ "Сайн байна уу, Оператор оо!"
+ "Оператор"
+ "Сонгох ажлыг эхлүүлэхэд ашиглаж болох үйлдвэрлэгчийн хэсэг"
+ "Сайн байна уу, үйлдвэрлэгчид ээ!"
+ "Үйлдвэрлэгч"
+ "Сонгох ажлыг эхлүүлэхэд ашиглаж болох үйлдвэрлэгчийн хэсэг"
+
diff --git a/tests/app/res/values-mr/strings.xml b/tests/app/res/values-mr/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..be6511b446f0ca03a3794e938858e3f370abe4df
--- /dev/null
+++ b/tests/app/res/values-mr/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "शोधसुलभ"
+ "स्कॅन सुरू करा"
+ "स्कॅन थांबवा"
+ "हॅलो ऑपरेटर!"
+ "ऑपरेटर"
+ "पसंतीची अॅक्टिव्हिटी सुरू करण्यासाठी वापरले जाऊ शकणारे अॉपरेटर हूक"
+ "हॅलो निर्माता!"
+ "निर्माता"
+ "पसंतीची अॅक्टिव्हिटी सुरू करण्यासाठी वापरले जाऊ शकणारे निर्माता हूक"
+
diff --git a/tests/app/res/values-ms/strings.xml b/tests/app/res/values-ms/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6d19101e486f4fc50311ff5e866f791ffa4e24a7
--- /dev/null
+++ b/tests/app/res/values-ms/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Boleh ditemui"
+ "Mulakan pengimbasan"
+ "Hentikan pengimbasan"
+ "Helo Pembawa!"
+ "Pembawa"
+ "Tarikan pembawa yang dapat digunakan untuk memulakan aktiviti pilihan"
+ "Helo Pengeluar!"
+ "Pengeluar"
+ "Tarikan pengeluar yang dapat digunakan untuk memulakan aktiviti pilihan"
+
diff --git a/tests/app/res/values-my/strings.xml b/tests/app/res/values-my/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..45b090d74b289be07507fd3cd03308ce2223f5d3
--- /dev/null
+++ b/tests/app/res/values-my/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "ရှာတွေ့နိုင်သော"
+ "ဖတ်ခြင်းစပါ"
+ "ဖတ်ခြင်းရပ်ပါ"
+ "မင်္ဂလာပါ အော်ပရေတာ။"
+ "အော်ပရေတာ"
+ "ရွေးချယ်မှု စတင်အသုံးပြုနိုင်မည့် အော်ပရေတာမှ စိတ်ဝင်စားစရာအကြောင်းအရာ"
+ "မင်္လာပါ ထုတ်လုပ်သူ။"
+ "ထုတ်လုပ်သူ"
+ "ရွေးချယ်မှုကို စတင်အသုံးပြုနိုင်မည့် ထုတ်လုပ်သူမှ စိတ်ဝင်စားစရာအကြောင်းအရာ"
+
diff --git a/tests/app/res/values-nb/strings.xml b/tests/app/res/values-nb/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..dbc3ec845c1eb7c9e4649fc19570b062019a910b
--- /dev/null
+++ b/tests/app/res/values-nb/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Synlig"
+ "Start skanning"
+ "Stopp skanning"
+ "Hei, operatør!"
+ "Operatør"
+ "Operatøraktivering som kan brukes til å starte en ønsket aktivitet"
+ "Hei, produsent!"
+ "Produsent"
+ "Produsentaktivering som kan brukes til å starte en ønsket aktivitet"
+
diff --git a/tests/app/res/values-ne/strings.xml b/tests/app/res/values-ne/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9ec6fd3b2746f5a295dad0aad626e411c80fdd68
--- /dev/null
+++ b/tests/app/res/values-ne/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "पत्ता लगाउनयोग्य"
+ "स्क्यान सुरु गर्नुहोस्"
+ "स्क्यान बन्द गर्नुहोस्"
+ "नमस्कार अपरेटर!"
+ "अपरेटर"
+ "अपरेटर हुक जसलाई रोजाइको गतिविधि सुरु गर्न प्रयोग गर्न सकिन्छ"
+ "नमस्कार निर्माता!"
+ "निर्माता"
+ "निर्माता हुक जसलाई रोजाइको गतिविधि सुरु गर्न प्रयोग गर्न सकिन्छ"
+
diff --git a/tests/app/res/values-nl/strings.xml b/tests/app/res/values-nl/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..384670e35db8b4efaabc4722fe06ccb2702fa312
--- /dev/null
+++ b/tests/app/res/values-nl/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Vindbaar"
+ "Scan starten"
+ "Scan stoppen"
+ "Hallo operator!"
+ "Operator"
+ "Hook van operator die kan worden gebruikt om de gewenste activiteit te starten"
+ "Hallo fabrikant!"
+ "Fabrikant"
+ "Hook van fabrikant die kan worden gebruikt om de gewenste activiteit te starten"
+
diff --git a/tests/app/res/values-pa/strings.xml b/tests/app/res/values-pa/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3604287d4705629e3c8dc11d9f77db08e57aaaf8
--- /dev/null
+++ b/tests/app/res/values-pa/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "ਖੋਜਣਯੋਗ"
+ "ਸਕੈਨ ਚਾਲੂ ਕਰੋ"
+ "ਸਕੈਨ ਰੋਕੋ"
+ "ਹੈਲੋ ਓਪਰੇਟਰ!"
+ "ਓਪਰੇਟਰ"
+ "ਓਪਰੇਟਰ ਹੁੱਕ ਜਿਸਦੀ ਵਰਤੋਂ ਪਸੰਦ ਦੀ ਸਰਗਰਮੀ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ"
+ "ਹੈਲੋ ਨਿਰਮਾਤਾ!"
+ "ਨਿਰਮਾਤਾ"
+ "ਨਿਰਮਾਤਾ ਹੁੱਕ ਜਿਸ ਦੀ ਵਰਤੋਂ ਪਸੰਦ ਦੀ ਸਰਗਰਮੀ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ"
+
diff --git a/tests/app/res/values-pl/strings.xml b/tests/app/res/values-pl/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3d6427480d5dca981276d5af511688f8bae94c46
--- /dev/null
+++ b/tests/app/res/values-pl/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Wykrywalny"
+ "Rozpocznij skanowanie"
+ "Zatrzymaj skanowanie"
+ "Witaj operatorze"
+ "Operator"
+ "Interfejs operatora umożliwiający uruchomienie wybranego działania"
+ "Witaj producencie"
+ "Producent"
+ "Interfejs producenta umożliwiający uruchomienie wybranego działania"
+
diff --git a/tests/app/res/values-pt-rBR/strings.xml b/tests/app/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0f850500dbe571840d923344964db2a679919593
--- /dev/null
+++ b/tests/app/res/values-pt-rBR/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Detectável"
+ "Iniciar verificação"
+ "Parar verificação"
+ "Olá, operador."
+ "Operador"
+ "Ferramenta do operador que pode ser usada para iniciar a atividade que você escolher"
+ "Olá, fabricante."
+ "Fabricante"
+ "Ferramenta do fabricante que pode ser usada para iniciar a atividade que você escolher"
+
diff --git a/tests/app/res/values-pt-rPT/strings.xml b/tests/app/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e94d5d0175abc5b455fe0995f8cd65c1a59a5967
--- /dev/null
+++ b/tests/app/res/values-pt-rPT/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Detetável"
+ "Iniciar análise"
+ "Parar análise"
+ "Olá, operador!"
+ "Operador"
+ "Símbolo do operador que pode ser utilizado para iniciar uma atividade à escolha"
+ "Olá, fabricante!"
+ "Fabricante"
+ "Símbolo do fabricante que pode ser utilizado para iniciar uma atividade à escolha"
+
diff --git a/tests/app/res/values-pt/strings.xml b/tests/app/res/values-pt/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0f850500dbe571840d923344964db2a679919593
--- /dev/null
+++ b/tests/app/res/values-pt/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Detectável"
+ "Iniciar verificação"
+ "Parar verificação"
+ "Olá, operador."
+ "Operador"
+ "Ferramenta do operador que pode ser usada para iniciar a atividade que você escolher"
+ "Olá, fabricante."
+ "Fabricante"
+ "Ferramenta do fabricante que pode ser usada para iniciar a atividade que você escolher"
+
diff --git a/tests/app/res/values-ro/strings.xml b/tests/app/res/values-ro/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a97dd140402b7aa38a25ac750ea507c39fd54ef5
--- /dev/null
+++ b/tests/app/res/values-ro/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Detectabil"
+ "Începeți scanarea"
+ "Opriți scanarea"
+ "Stimate operator!"
+ "Operator"
+ "Mesaj pentru operator, care poate fi utilizat pentru a începe activitatea dorită"
+ "Stimate producător!"
+ "Producător"
+ "Mesaj pentru producător, care poate fi utilizat pentru a începe activitatea dorită"
+
diff --git a/tests/app/res/values-ru/strings.xml b/tests/app/res/values-ru/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d5c4d0290def5d8e8ad35862d8460a78712b2e85
--- /dev/null
+++ b/tests/app/res/values-ru/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Видимость"
+ "Начать поиск"
+ "Остановить поиск"
+ "Здравствуйте!"
+ "Оператор"
+ "Уловка оператора, побуждающая к совершению действия"
+ "Здравствуйте!"
+ "Производитель"
+ "Уловка производителя, побуждающая к совершению действия"
+
diff --git a/tests/app/res/values-si/strings.xml b/tests/app/res/values-si/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..04c6ec2ac56afdcdc0dc73fa2acc90dfe3296030
--- /dev/null
+++ b/tests/app/res/values-si/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "සොයා ගත හැකි"
+ "ස්කෑන් කිරීම අරඹන්න"
+ "ස්කෑන් කිරීම නවත්වන්න"
+ "ආයුබෝවන් ක්රියාකරු!"
+ "ක්රියාකරු"
+ "කැමැති ක්රියාවක් ඇරඹීමට භාවිත කළ හැකි මෙහෙයුම් අංශය"
+ "ආයුබෝවන් නිෂ්පාදක!"
+ "නිෂ්පාදකයා"
+ "අවශ්ය ක්රියාකාරකමක් කිරීමට භාවිත කළ හැකි නිෂ්පාදක අංශය"
+
diff --git a/tests/app/res/values-sk/strings.xml b/tests/app/res/values-sk/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..53c2a785c1a2b2f5f19708d5c53a0ad46e2ebacf
--- /dev/null
+++ b/tests/app/res/values-sk/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Viditeľné"
+ "Spustiť vyhľadávanie"
+ "Zastaviť vyhľadávanie"
+ "Dobrý deň, operátor!"
+ "Operátor"
+ "Háčik operátora, ktorý je možné použiť na spustenie vybratej činnosti"
+ "Dobrý deň, výrobca!"
+ "Výrobca"
+ "Háčik výrobcu, ktorý je možné použiť na spustenie vybratej činnosti"
+
diff --git a/tests/app/res/values-sl/strings.xml b/tests/app/res/values-sl/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..da186eb640c9e3b750e7ac263517fafcfe7e0144
--- /dev/null
+++ b/tests/app/res/values-sl/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Vidno"
+ "Začni iskanje"
+ "Ustavi iskanje"
+ "Živijo, operater!"
+ "Operater"
+ "Priključitvena točka za operaterja, ki jo je mogoče uporabiti za novo dejavnost"
+ "Živijo, proizvajalec!"
+ "Proizvajalec"
+ "Priključitvena točka za proizvajalca, ki jo je mogoče uporabiti za poljubno dejavnost"
+
diff --git a/tests/app/res/values-sq/strings.xml b/tests/app/res/values-sq/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7de008171d515bb5b8b0f86489f8caee16e4f029
--- /dev/null
+++ b/tests/app/res/values-sq/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "I zbulueshëm"
+ "Nis skanimin"
+ "Ndalo skanimin"
+ "Përshëndetje operator!"
+ "Operatori"
+ "Grepi i operatorit që mund të përdoret për të filluar aktivitetin e zgjedhur"
+ "Përshëndetje prodhues!"
+ "Prodhuesi"
+ "Grepi i prodhuesit që mund të përdoret për të nisur aktivitetin e zgjedhur"
+
diff --git a/tests/app/res/values-sr/strings.xml b/tests/app/res/values-sr/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..dd8b7d937a90dd63a2b5c2bc8fe209693733f05b
--- /dev/null
+++ b/tests/app/res/values-sr/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Видљиво"
+ "Покрени скенирање"
+ "Заустави скенирање"
+ "Здраво, оператеру!"
+ "Мобилни оператер"
+ "Мамац за оператера који може да се користи за покретање жељене активности"
+ "Здраво, произвођачу!"
+ "Произвођач"
+ "Мамац за произвођача који може да се користи за покретање жељене активности"
+
diff --git a/tests/app/res/values-sv/strings.xml b/tests/app/res/values-sv/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e8f8d53ff5c2f53e3d98a127f6e02e6c4a4e6ab2
--- /dev/null
+++ b/tests/app/res/values-sv/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Synlig"
+ "Starta sökning"
+ "Stoppa sökningen"
+ "Hej operatör!"
+ "Operatör"
+ "Operatörsfunktion som kan användas för att starta en valfri aktivitet"
+ "Hej tillverkare!"
+ "Tillverkare"
+ "Tillverkarfunktion som kan användas för att starta en valfri aktivitet"
+
diff --git a/tests/app/res/values-sw/strings.xml b/tests/app/res/values-sw/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bd5a126d6974cea39bb9ea69a7868ff7b73a859e
--- /dev/null
+++ b/tests/app/res/values-sw/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Inaweza kutambulika"
+ "Anza kuchanganua"
+ "Komesha kuchanganua"
+ "Hujambo Mwendeshaji!"
+ "Kiendeshaji"
+ "Kishikilio cha mtengenezaji ambacho inaweza kutumiwa kwa kuanza shughuli ya chaguo"
+ "Hujambo Mtengenezaji!"
+ "Mtengenezaji"
+ "Kishikilio cha mtengenezaji ambacho kinaweza kutumiwa kwa kuanza shughuli ya chaguo"
+
diff --git a/tests/app/res/values-ta/strings.xml b/tests/app/res/values-ta/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3a80158093351f7d696b1dd4f2c732769d53e3a3
--- /dev/null
+++ b/tests/app/res/values-ta/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "கண்டறியப்படலாம்"
+ "ஸ்கேனைத் தொடங்கு"
+ "ஸ்கேனை நிறுத்து"
+ "ஹலோ ஆபரேட்டரே!"
+ "ஆபரேட்டர்"
+ "விரும்பிய செயல்பாட்டைத் தொடங்குவதற்குப் பயன்படுத்தக் கூடிய ஆபரேட்டர் பொறி"
+ "ஹலோ உற்பத்தியாளரே!"
+ "உற்பத்தியாளர்"
+ "விரும்பிய செயல்பாட்டைத் தொடங்குவதற்குப் பயன்படுத்தக் கூடிய உற்பத்தியாளர் பொறி"
+
diff --git a/tests/app/res/values-te/strings.xml b/tests/app/res/values-te/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1ffb2b745260b17ef14e5776fbf7a799f97bd1f0
--- /dev/null
+++ b/tests/app/res/values-te/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "కనుగొనదగినది"
+ "స్కాన్ని ప్రారంభించండి"
+ "స్కాన్ని ఆపివేయండి"
+ "హలో ఆపరేటర్!"
+ "ఆపరేటర్"
+ "ఎంచుకున్న కార్యాచరణను ప్రారంభించడానికి ఉపయోగించగల దాన్ని ఆపరేటర్ నియంత్రించగలరు"
+ "హలో తయారీదారు!"
+ "తయారీదారు"
+ "ఎంచుకున్న కార్యాచరణను ప్రారంభించడానికి ఉపయోగించగల దాన్ని తయారీదారు నియంత్రించగలరు"
+
diff --git a/tests/app/res/values-th/strings.xml b/tests/app/res/values-th/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..249d0f72b65a9f9a2b1cbf6dd047328de00f9a77
--- /dev/null
+++ b/tests/app/res/values-th/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "ค้นพบได้"
+ "เริ่มสแกน"
+ "หยุดสแกน"
+ "สวัสดี โอเปอเรเตอร์"
+ "โอเปอเรเตอร์"
+ "ข้อความของโอเปอเรเตอร์ที่สามารถใช้เริ่มกิจกรรมที่เลือกได้"
+ "สวัสดี ผู้ผลิต"
+ "ผู้ผลิต"
+ "ข้อความของผู้ผลิตที่สามารถใช้เริ่มกิจกรรมที่เลือกได้"
+
diff --git a/tests/app/res/values-tl/strings.xml b/tests/app/res/values-tl/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c64985ebea4dfbddd53dc79af90fd055d3260950
--- /dev/null
+++ b/tests/app/res/values-tl/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Katuklas-tuklas"
+ "Simulan ang pag-ii-scan"
+ "Ihinto ang pag-ii-scan"
+ "Kumusta Operator!"
+ "Operator"
+ "Hook ng operator na maaaring magamit upang simulan ang napiling aktibidad"
+ "Kumusta Manufacturer!"
+ "Manufacturer"
+ "Hook ng manufacturer na maaaring magamit upang simulan ang napiling aktibidad"
+
diff --git a/tests/app/res/values-tr/strings.xml b/tests/app/res/values-tr/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7c9adffa8fea6d4ebe1dbde5a6844922f935ca14
--- /dev/null
+++ b/tests/app/res/values-tr/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Keşfedilebilir"
+ "Taramayı başlat"
+ "Taramayı durdur"
+ "Merhaba Operatör!"
+ "Operatör"
+ "Seçilen etkinliğin başlatılmasında kullanılabilen operatör kancası"
+ "Merhaba Üretici!"
+ "Üretici"
+ "Seçilen etkinliğin başlatılmasında kullanılabilen üretici kancası"
+
diff --git a/tests/app/res/values-uk/strings.xml b/tests/app/res/values-uk/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..30700d8e6fbc82bd57dc536ef1cf62d57564eba6
--- /dev/null
+++ b/tests/app/res/values-uk/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Видимий"
+ "Почати сканування"
+ "Припинити сканування"
+ "Вітаємо, операторе!"
+ "Оператор"
+ "Обробник оператора, за допомогою якого можна вибирати"
+ "Вітаємо, виробнику!"
+ "Виробник"
+ "Обробник виробника, за допомогою якого можна вибирати"
+
diff --git a/tests/app/res/values-ur/strings.xml b/tests/app/res/values-ur/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..34e1e3e5037e0b58f044e8bbaf28eba6ef515e59
--- /dev/null
+++ b/tests/app/res/values-ur/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "قابل دریافت"
+ "اسکین شروع کریں"
+ "اسکین روکیں"
+ "ہیلو آپریٹر!"
+ "آپریٹر"
+ "آپریٹر ہک جس کا استعمال پسند کی سرگرمی شروع کرنے کیلئے کیا جا سکتا ہے"
+ "ہیلو مینوفیکچرر!"
+ "مینوفیکچرر"
+ "مینوفیکچرر ہک جس کا استعمال پسند کی سرگرمی شروع کرنے کیلئے کیا جا سکتا ہے"
+
diff --git a/tests/app/res/values-uz/strings.xml b/tests/app/res/values-uz/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5e8659167da062e2f65fd6ec6435c76d72cf1dce
--- /dev/null
+++ b/tests/app/res/values-uz/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Ko‘rinadi"
+ "Qidiruvni boshlash"
+ "Qidiruvni to‘xtatish"
+ "Salom, operator!"
+ "Operator"
+ "Operatorning tanlangan amalni ishga tushiruvchi hiylasi"
+ "Salom, ishlab chiqaruvchi!"
+ "Ishlab chiqaruvchi"
+ "Ishlab chiqaruvchining tanlangan amalni ishga tushiruvchi hiylasi"
+
diff --git a/tests/app/res/values-vi/strings.xml b/tests/app/res/values-vi/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a060dc1141772298a6e4ebc8d5ec3d5d59131762
--- /dev/null
+++ b/tests/app/res/values-vi/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Có thể phát hiện"
+ "Bắt đầu quét"
+ "Dừng quét"
+ "Xin chào Nhà cung cấp dịch vụ!"
+ "Nhà cung cấp dịch vụ"
+ "Có thể sử dụng mác của nhà cung cấp dịch vụ để bắt đầu hoạt động đã chọn"
+ "Xin chào Nhà sản xuất!"
+ "Nhà sản xuất"
+ "Có thể sử dụng mác của nhà sản xuất để bắt đầu hoạt động đã chọn"
+
diff --git a/tests/app/res/values-zh-rCN/strings.xml b/tests/app/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..de1e8a8c7fe3d34c9252ad790fede11a4c79556c
--- /dev/null
+++ b/tests/app/res/values-zh-rCN/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "可检测到"
+ "开始扫描"
+ "停止扫描"
+ "运营商,您好!"
+ "运营商"
+ "可用于启动所选活动的运营商引子"
+ "制造商,您好!"
+ "制造商"
+ "可用于启动所选 Activity 的制造商挂钩"
+
diff --git a/tests/app/res/values-zh-rHK/strings.xml b/tests/app/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..55170070b6a02dabed80975e55fdbeec184c88be
--- /dev/null
+++ b/tests/app/res/values-zh-rHK/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "可供偵測"
+ "開始掃描"
+ "停止掃描"
+ "流動網絡供應商您好!"
+ "流動網絡供應商"
+ "可用來啟動所選活動的流動網絡供應商勾點"
+ "製造商您好!"
+ "製造商"
+ "可用來啟動所選活動的製造商勾點"
+
diff --git a/tests/app/res/values-zh-rTW/strings.xml b/tests/app/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d3a727919ef29bcd4d82945746a90dc55088e06a
--- /dev/null
+++ b/tests/app/res/values-zh-rTW/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "可供偵測"
+ "開始掃描"
+ "停止掃描"
+ "電信業者你好!"
+ "電信業者"
+ "可用來啟動所選活動的電信業者勾點"
+ "製造商你好!"
+ "製造商"
+ "可用來啟動所選活動的製造商勾點"
+
diff --git a/tests/app/res/values-zu/strings.xml b/tests/app/res/values-zu/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..217fe9d203ec03a2b802560d3d7c8209208b317d
--- /dev/null
+++ b/tests/app/res/values-zu/strings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ "Iyatholakala"
+ "Qala ukuskena"
+ "Misa ukuskena"
+ "Sawubona Opheretha!"
+ "Opharetha"
+ "Ihhuku ye-opharetha ingasetshenziselwa ukuqala umsebenzi owuthandayo"
+ "Sawubona Mkhiqizi!"
+ "Umkhiqizi"
+ "Ihhuku yomkhiqizi engasetshenziselwa ukuqala umsebenzi owuthandayo"
+
diff --git a/tests/app/res/values/strings.xml b/tests/app/res/values/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9fb98f90284c28ef8e7c82be64588871aabae9fb
--- /dev/null
+++ b/tests/app/res/values/strings.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+ Enable
+ Discoverable
+ Start scan
+ Stop scan
+ Hello Operator!
+ Operator
+ Operator hook that can be used to start activity of choice
+ Hello Manufacturer!
+ Manufacturer
+ Manufacturer hook that can be used to start activity of choice
+
diff --git a/tests/app/src/com/android/settings/CreateShortcutTest.java b/tests/app/src/com/android/settings/CreateShortcutTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..4ae9bd7997c61676a1b2695832444bd531731390
--- /dev/null
+++ b/tests/app/src/com/android/settings/CreateShortcutTest.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.Instrumentation;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ShortcutInfo;
+import android.content.pm.ShortcutManager;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Tests for {@link CreateShortcutTest}
+ *
+ m SettingsTests &&
+ adb install \
+ -r -g ${ANDROID_PRODUCT_OUT}/data/app/SettingsTests/SettingsTests.apk &&
+ adb shell am instrument -e class com.android.settings.CreateShortcutTest \
+ -w com.android.settings.tests/android.support.test.runner.AndroidJUnitRunner
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class CreateShortcutTest {
+
+ private static final String SHORTCUT_ID_PREFIX = CreateShortcut.SHORTCUT_ID_PREFIX;
+
+ private Instrumentation mInstrumentation;
+ private Context mContext;
+
+ @Mock ShortcutManager mShortcutManager;
+ @Captor ArgumentCaptor> mListCaptor;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ mContext = mInstrumentation.getTargetContext();
+ }
+
+ @Test
+ public void test_layoutDoesNotHaveCancelButton() {
+ mInstrumentation.startActivitySync(new Intent(Intent.ACTION_CREATE_SHORTCUT)
+ .setClassName(mContext, CreateShortcut.class.getName()));
+ onView(withText(R.string.cancel)).check(doesNotExist());
+ }
+
+ @Test
+ public void createResultIntent() {
+ CreateShortcut orgActivity = (CreateShortcut) mInstrumentation.startActivitySync(
+ new Intent(Intent.ACTION_CREATE_SHORTCUT)
+ .setClassName(mContext, CreateShortcut.class.getName()));
+ CreateShortcut activity = spy(orgActivity);
+ doReturn(mShortcutManager).when(activity).getSystemService(eq(Context.SHORTCUT_SERVICE));
+
+ when(mShortcutManager.createShortcutResultIntent(any(ShortcutInfo.class)))
+ .thenReturn(new Intent().putExtra("d1", "d2"));
+
+ Intent intent = CreateShortcut.getBaseIntent()
+ .setClass(activity, Settings.ManageApplicationsActivity.class);
+ ResolveInfo ri = activity.getPackageManager().resolveActivity(intent, 0);
+ Intent result = activity.createResultIntent(intent, ri, "dummy");
+ assertEquals("d2", result.getStringExtra("d1"));
+ assertNotNull(result.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT));
+
+ ArgumentCaptor infoCaptor = ArgumentCaptor.forClass(ShortcutInfo.class);
+ verify(mShortcutManager, times(1))
+ .createShortcutResultIntent(infoCaptor.capture());
+ String expectedId = SHORTCUT_ID_PREFIX + intent.getComponent().flattenToShortString();
+ assertEquals(expectedId, infoCaptor.getValue().getId());
+ }
+
+ @Test
+ public void shortcutsUpdateTask() {
+ mContext = spy(new ContextWrapper(mInstrumentation.getTargetContext()));
+ doReturn(mShortcutManager).when(mContext).getSystemService(eq(Context.SHORTCUT_SERVICE));
+
+ List pinnedShortcuts = Arrays.asList(
+ makeShortcut("d1"), makeShortcut("d2"),
+ makeShortcut(Settings.ManageApplicationsActivity.class),
+ makeShortcut("d3"),
+ makeShortcut(Settings.SoundSettingsActivity.class));
+ when(mShortcutManager.getPinnedShortcuts()).thenReturn(pinnedShortcuts);
+ new CreateShortcut.ShortcutsUpdateTask(mContext).doInBackground();
+
+ verify(mShortcutManager, times(1)).updateShortcuts(mListCaptor.capture());
+
+ List updates = mListCaptor.getValue();
+ assertEquals(2, updates.size());
+ assertEquals(pinnedShortcuts.get(2).getId(), updates.get(0).getId());
+ assertEquals(pinnedShortcuts.get(4).getId(), updates.get(1).getId());
+ }
+
+ private ShortcutInfo makeShortcut(Class> className) {
+ ComponentName cn = new ComponentName(mContext, className);
+ return makeShortcut(SHORTCUT_ID_PREFIX + cn.flattenToShortString());
+ }
+
+ private ShortcutInfo makeShortcut(String id) {
+ return new ShortcutInfo.Builder(mContext, id).build();
+ }
+}
diff --git a/tests/app/src/com/android/settings/DisplaySettingsTest.java b/tests/app/src/com/android/settings/DisplaySettingsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..888b7fdd2401a38d9a153697c90e9b56f74af575
--- /dev/null
+++ b/tests/app/src/com/android/settings/DisplaySettingsTest.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settings;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.UiDevice;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class DisplaySettingsTest {
+
+ private Instrumentation mInstrumentation;
+ private Context mContext;
+ private UiDevice mDevice;
+
+ @Before
+ public void setUp() {
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ mContext = mInstrumentation.getTargetContext();
+ mDevice = UiDevice.getInstance(mInstrumentation);
+ }
+
+ @Test
+ public void launchBrightnessLevel_shouldNotCrash() {
+ mInstrumentation.startActivitySync(
+ new Intent(mContext, DisplaySettings.class));
+ onView(withText(mContext.getString(R.string.brightness))).perform(click());
+ // should not crash
+ mDevice.pressBack(); // dismiss the brightness dialog
+ }
+}
diff --git a/tests/app/src/com/android/settings/EncryptionInterstitialTest.java b/tests/app/src/com/android/settings/EncryptionInterstitialTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..eb61b00958e47ff4c191ce17461a7164d8736799
--- /dev/null
+++ b/tests/app/src/com/android/settings/EncryptionInterstitialTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.app.Instrumentation.ActivityMonitor;
+import android.app.Instrumentation.ActivityResult;
+import android.content.Context;
+import android.content.Intent;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class EncryptionInterstitialTest {
+
+ private Instrumentation mInstrumentation;
+ private Context mContext;
+ private TestActivityMonitor mActivityMonitor;
+
+ @Before
+ public void setUp() {
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ mContext = mInstrumentation.getTargetContext();
+ mActivityMonitor = new TestActivityMonitor();
+ mInstrumentation.addMonitor(mActivityMonitor);
+ }
+
+ @After
+ public void tearDown() {
+ mInstrumentation.removeMonitor(mActivityMonitor);
+ }
+
+ @Test
+ public void clickYes_shouldRequirePassword() {
+ mInstrumentation.startActivitySync(
+ new Intent(mContext, EncryptionInterstitial.class)
+ .putExtra("extra_unlock_method_intent", new Intent("test.unlock.intent")));
+ onView(withId(R.id.encrypt_require_password)).perform(click());
+
+ mActivityMonitor.waitForActivityWithTimeout(1000);
+ assertEquals(1, mActivityMonitor.getHits());
+
+ assertTrue(mActivityMonitor.mMatchedIntent.getBooleanExtra(
+ EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, false));
+ }
+
+ @Test
+ public void clickNo_shouldNotRequirePassword() {
+ mInstrumentation.startActivitySync(
+ new Intent(mContext, EncryptionInterstitial.class)
+ .putExtra("extra_unlock_method_intent", new Intent("test.unlock.intent")));
+ onView(withId(R.id.encrypt_dont_require_password)).perform(click());
+
+ mActivityMonitor.waitForActivityWithTimeout(1000);
+ assertEquals(1, mActivityMonitor.getHits());
+
+ assertFalse(mActivityMonitor.mMatchedIntent.getBooleanExtra(
+ EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true));
+ }
+
+ private static class TestActivityMonitor extends ActivityMonitor {
+
+ Intent mMatchedIntent = null;
+
+ @Override
+ public ActivityResult onStartActivity(Intent intent) {
+ if ("test.unlock.intent".equals(intent.getAction())) {
+ mMatchedIntent = intent;
+ return new ActivityResult(Activity.RESULT_OK, null);
+ }
+ return null;
+ }
+ }
+}
diff --git a/tests/app/src/com/android/settings/ManagedAccessSettingsLowRamTest.java b/tests/app/src/com/android/settings/ManagedAccessSettingsLowRamTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..95c1dcf8839f7fedee1da267adfefa721ee018f1
--- /dev/null
+++ b/tests/app/src/com/android/settings/ManagedAccessSettingsLowRamTest.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
+import android.app.ActivityManager;
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class ManagedAccessSettingsLowRamTest {
+
+ private Instrumentation mInstrumentation;
+ private Context mTargetContext;
+
+ @Before
+ public void setUp() {
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ mTargetContext = mInstrumentation.getTargetContext();
+ }
+
+ @Test
+ public void testManagedAccessOptionsVisibility() throws Exception {
+ mInstrumentation.startActivitySync(new Intent(mTargetContext,
+ com.android.settings.Settings.SpecialAccessSettingsActivity.class));
+
+ String[] managedServiceLabels = new String[] {"Do Not Disturb access",
+ "VR helper services", "Notification access", "Picture-in-picture"};
+ for (String label : managedServiceLabels) {
+ if (ActivityManager.isLowRamDeviceStatic()) {
+ onView(withText(label)).check(doesNotExist());
+ } else {
+ onView(withText(label)).check(matches(isDisplayed()));
+ }
+ }
+ }
+
+ @Test
+ public void launchNotificationSetting_onlyWorksIfNotLowRam() {
+ final Intent intent = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);
+
+ mInstrumentation.startActivitySync(intent);
+
+ final String label = "This feature is not available on this device";
+ if (ActivityManager.isLowRamDeviceStatic()) {
+ onView(withText(label)).check(matches(isDisplayed()));
+ } else {
+ onView(withText(label)).check(doesNotExist());
+ }
+ }
+
+ @Test
+ public void launchDndSetting_onlyWorksIfNotLowRam() {
+ final Intent intent = new Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
+
+ mInstrumentation.startActivitySync(intent);
+
+ final String label = "This feature is not available on this device";
+ if (ActivityManager.isLowRamDeviceStatic()) {
+ onView(withText(label)).check(matches(isDisplayed()));
+ } else {
+ onView(withText(label)).check(doesNotExist());
+ }
+ }
+
+ @Test
+ public void launchVrSetting_onlyWorksIfNotLowRam() {
+ final Intent intent = new Intent(Settings.ACTION_VR_LISTENER_SETTINGS);
+
+ mInstrumentation.startActivitySync(intent);
+
+ final String label = "This feature is not available on this device";
+ if (ActivityManager.isLowRamDeviceStatic()) {
+ onView(withText(label)).check(matches(isDisplayed()));
+ } else {
+ onView(withText(label)).check(doesNotExist());
+ }
+ }
+
+ @Test
+ public void launchPictureInPictureSetting_onlyWorksIfNotLowRam() {
+ final Intent intent = new Intent(Settings.ACTION_PICTURE_IN_PICTURE_SETTINGS);
+
+ mInstrumentation.startActivitySync(intent);
+
+ final String label = "This feature is not available on this device";
+ if (ActivityManager.isLowRamDeviceStatic()) {
+ onView(withText(label)).check(matches(isDisplayed()));
+ } else {
+ onView(withText(label)).check(doesNotExist());
+ }
+ }
+}
diff --git a/tests/app/src/com/android/settings/SettingsHookTests.java b/tests/app/src/com/android/settings/SettingsHookTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..4dfd4846e50270c01e7fbf48ab836b6032867798
--- /dev/null
+++ b/tests/app/src/com/android/settings/SettingsHookTests.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import com.android.settings.Settings;
+import com.android.settings.tests.Manufacturer;
+import com.android.settings.tests.Operator;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.test.ActivityInstrumentationTestCase2;
+
+import java.util.List;
+
+/**
+ * Tests for the Settings operator/manufacturer hook.
+ *
+ * Running all tests:
+ *
+ * make SettingsTests
+ * adb push SettingsTests.apk /system/app/SettingsTests.apk
+ * adb shell am instrument \
+ * -w com.android.settings.tests/android.test.InstrumentationTestRunner
+ */
+public class SettingsHookTests extends ActivityInstrumentationTestCase2 {
+
+ private static final String PACKAGE_NAME = "com.android.settings.tests";
+
+ private static final String KEY_SETTINGS_ROOT = "parent";
+ private static final String KEY_SETTINGS_OPERATOR = "operator_settings";
+ private static final String KEY_SETTINGS_MANUFACTURER = "manufacturer_settings";
+
+ private static final String INTENT_OPERATOR_HOOK = "com.android.settings.OPERATOR_APPLICATION_SETTING";
+ private static final String INTENT_MANUFACTURER_HOOK = "com.android.settings.MANUFACTURER_APPLICATION_SETTING";
+
+ private Settings mSettings;
+
+ public SettingsHookTests() {
+ super("com.android.settings", Settings.class);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mSettings = getActivity();
+ }
+
+ /**
+ * Test that the operator/manufacturer settings hook test application is
+ * available and that it's installed in the device's system image.
+ */
+ public void testSettingsHookTestAppAvailable() throws Exception {
+ Context context = mSettings.getApplicationContext();
+ PackageManager pm = context.getPackageManager();
+ ApplicationInfo applicationInfo = pm.getApplicationInfo(PACKAGE_NAME, 0);
+ assertTrue((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
+ }
+
+ /**
+ * Test that the operator test activity has registered an intent-filter for
+ * an action named 'android.settings.OPERATOR_APPLICATION_SETTING'.
+ */
+ public void testOperatorIntentFilter() {
+ boolean result = false;
+ Context context = mSettings.getApplicationContext();
+ PackageManager pm = context.getPackageManager();
+ Intent intent = new Intent(INTENT_OPERATOR_HOOK);
+ List list = pm.queryIntentActivities(intent, 0);
+ for (ResolveInfo resolveInfo : list) {
+ if (resolveInfo.activityInfo.packageName.equals(PACKAGE_NAME)) {
+ result = true;
+ }
+ }
+ assertTrue("Intent-filter not found", result);
+ }
+
+ /**
+ * Test that the manufacturer test activity has registered an intent-filter
+ * for an action named 'android.settings.MANUFACTURER_APPLICATION_SETTING'.
+ */
+ public void testManufacturerIntentFilter() {
+ boolean result = false;
+ Context context = mSettings.getApplicationContext();
+ PackageManager pm = context.getPackageManager();
+ Intent intent = new Intent(INTENT_MANUFACTURER_HOOK);
+ List list = pm.queryIntentActivities(intent, 0);
+ for (ResolveInfo resolveInfo : list) {
+ if (resolveInfo.activityInfo.packageName.equals(PACKAGE_NAME)) {
+ result = true;
+ }
+ }
+ assertTrue("Intent-filter not found", result);
+ }
+
+ /**
+ * Test that the operator preference is available in the Settings
+ * application.
+ */
+ public void testOperatorPreferenceAvailable() {
+// TODO: fix this test case to work with fragments
+// PreferenceGroup root = (PreferenceGroup)mSettings.findPreference(KEY_SETTINGS_ROOT);
+// Preference operatorPreference = root.findPreference(KEY_SETTINGS_OPERATOR);
+// assertNotNull(operatorPreference);
+ }
+
+ /**
+ * Test that the manufacturer preference is available in the Settings
+ * application.
+ */
+ public void testManufacturerPreferenceAvailable() {
+// TODO: fix this test case to work with fragments
+// PreferenceGroup root = (PreferenceGroup)mSettings.findPreference(KEY_SETTINGS_ROOT);
+// Preference manufacturerHook = root.findPreference(KEY_SETTINGS_MANUFACTURER);
+// assertNotNull(manufacturerHook);
+ }
+
+}
diff --git a/tests/app/src/com/android/settings/SettingsPreferenceFragmentTest.java b/tests/app/src/com/android/settings/SettingsPreferenceFragmentTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..30fc124dfa62e2d18ea4e99370e960d7d394a27e
--- /dev/null
+++ b/tests/app/src/com/android/settings/SettingsPreferenceFragmentTest.java
@@ -0,0 +1,73 @@
+package com.android.settings;
+
+import android.content.Intent;
+import android.content.Context;
+
+import android.app.Instrumentation;
+import android.os.Bundle;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceGroupAdapter;
+import com.android.settings.accessibility.AccessibilitySettings;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+import static com.google.common.truth.Truth.assertThat;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class SettingsPreferenceFragmentTest {
+
+ private Instrumentation mInstrumentation;
+ private Context mTargetContext;
+
+ @Before
+ public void setUp() throws Exception {
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ mTargetContext = mInstrumentation.getTargetContext();
+ }
+
+ @Test
+ public void testHighlightCaptions() throws InterruptedException {
+ final String prefKey = "captioning_preference_screen";
+ Bundle args = new Bundle();
+ args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, prefKey);
+
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.setClass(mTargetContext, SubSettings.class);
+ intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT,
+ "com.android.settings.accessibility.AccessibilitySettings");
+ intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
+
+ SettingsActivity activity = (SettingsActivity) mInstrumentation.startActivitySync(intent);
+ AccessibilitySettings fragment = (AccessibilitySettings)
+ activity.getFragmentManager().getFragments().get(0);
+
+ // Allow time for highlight from post-delay.
+ Thread.sleep(SettingsPreferenceFragment.DELAY_HIGHLIGHT_DURATION_MILLIS);
+ if (!fragment.mPreferenceHighlighted) {
+ Thread.sleep(SettingsPreferenceFragment.DELAY_HIGHLIGHT_DURATION_MILLIS);
+ }
+
+ int prefPosition = -1;
+ PreferenceGroupAdapter adapter = (PreferenceGroupAdapter)
+ fragment.getListView().getAdapter();
+ for (int n = 0, count = adapter.getItemCount(); n < count; n++) {
+ final Preference preference = adapter.getItem(n);
+ final String preferenceKey = preference.getKey();
+ if (preferenceKey.equals(prefKey)) {
+ prefPosition = n;
+ break;
+ }
+ }
+
+ assertThat(fragment.mAdapter.initialHighlightedPosition).isEqualTo(prefPosition);
+ }
+}
diff --git a/tests/app/src/com/android/settings/applications/DefaultAppSettingsTest.java b/tests/app/src/com/android/settings/applications/DefaultAppSettingsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..bd03bc94077faeaf0066a6bf645ba815e754bfbc
--- /dev/null
+++ b/tests/app/src/com/android/settings/applications/DefaultAppSettingsTest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.applications;
+
+import android.content.Context;
+import android.content.Intent;
+import android.support.test.filters.SmallTest;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObject;
+import android.support.test.uiautomator.UiSelector;
+import android.test.InstrumentationTestCase;
+import android.widget.TextView;
+
+import com.android.settings.R;
+
+import org.junit.Test;
+
+/**
+ * Test for Advanced App preferences.
+ */
+@SmallTest
+public class DefaultAppSettingsTest extends InstrumentationTestCase {
+
+ private UiDevice mDevice;
+ private Context mTargetContext;
+ private String mTargetPackage;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mDevice = UiDevice.getInstance(getInstrumentation());
+ mTargetContext = getInstrumentation().getTargetContext();
+ mTargetPackage = mTargetContext.getPackageName();
+ }
+
+ @Test
+ public void testSelectDefaultHome_shouldLaunchHomePicker() throws Exception {
+ launchDefaultApps();
+ final String titleHomeApp = mTargetContext.getResources().getString(R.string.home_app);
+ mDevice.findObject(new UiSelector().text(titleHomeApp)).click();
+ final UiObject actionBar = mDevice.findObject(new UiSelector().resourceId(
+ "com.android.settings:id/action_bar"));
+ final UiObject title = actionBar.getChild(
+ new UiSelector().className(TextView.class.getName()));
+ assertEquals(titleHomeApp, title.getText());
+ }
+
+ private void launchDefaultApps() throws Exception {
+ final Intent settingsIntent = new Intent(Intent.ACTION_MAIN)
+ .addCategory(Intent.CATEGORY_LAUNCHER)
+ .setPackage(mTargetPackage)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ getInstrumentation().getContext().startActivity(settingsIntent);
+ final String titleApps = mTargetContext.getResources().getString(
+ R.string.app_and_notification_dashboard_title);
+ mDevice.findObject(new UiSelector().text(titleApps)).click();
+ final String titleDefaultApps = mTargetContext.getResources().getString(
+ R.string.app_default_dashboard_title);
+ mDevice.findObject(new UiSelector().text(titleDefaultApps)).click();
+ }
+
+}
diff --git a/tests/app/src/com/android/settings/applications/ExternalSourcesSettingsTest.java b/tests/app/src/com/android/settings/applications/ExternalSourcesSettingsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..82f0e0a8199b6e8aa77d51b7b243685d6c515d92
--- /dev/null
+++ b/tests/app/src/com/android/settings/applications/ExternalSourcesSettingsTest.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.applications;
+
+import static android.app.AppOpsManager.MODE_ALLOWED;
+import static android.app.AppOpsManager.MODE_DEFAULT;
+import static android.app.AppOpsManager.MODE_ERRORED;
+import static android.app.AppOpsManager.OP_REQUEST_INSTALL_PACKAGES;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.UserInfo;
+import android.net.Uri;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.BySelector;
+import android.support.test.uiautomator.Direction;
+
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObject2;
+import android.support.test.uiautomator.Until;
+import android.widget.ListView;
+import android.widget.Switch;
+import android.widget.TextView;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+@LargeTest
+public class ExternalSourcesSettingsTest {
+
+ private static final String TAG = ExternalSourcesSettingsTest.class.getSimpleName();
+ private static final String WM_DISMISS_KEYGUARD_COMMAND = "wm dismiss-keyguard";
+ private static final long START_ACTIVITY_TIMEOUT = 5000;
+
+ private Context mContext;
+ private UiDevice mUiDevice;
+ private PackageManager mPackageManager;
+ private AppOpsManager mAppOpsManager;
+ private List mProfiles;
+ private String mPackageName;
+
+ @Before
+ public void setUp() throws Exception {
+ mContext = InstrumentationRegistry.getTargetContext();
+ mPackageName = InstrumentationRegistry.getContext().getPackageName();
+ mPackageManager = mContext.getPackageManager();
+ mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
+ mProfiles = mContext.getSystemService(UserManager.class).getProfiles(UserHandle.myUserId());
+ resetAppOpModeForAllProfiles();
+ mUiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+ mUiDevice.wakeUp();
+ mUiDevice.executeShellCommand(WM_DISMISS_KEYGUARD_COMMAND);
+ }
+
+ private void resetAppOpModeForAllProfiles() throws Exception {
+ for (UserInfo user : mProfiles) {
+ final int uid = mPackageManager.getPackageUidAsUser(mPackageName, user.id);
+ mAppOpsManager.setMode(OP_REQUEST_INSTALL_PACKAGES, uid, mPackageName, MODE_DEFAULT);
+ }
+ }
+
+ private Intent createManageExternalSourcesListIntent() {
+ final Intent manageExternalSourcesIntent = new Intent();
+ manageExternalSourcesIntent.setAction(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
+ return manageExternalSourcesIntent;
+ }
+
+ private Intent createManageExternalSourcesAppIntent(String packageName) {
+ final Intent intent = createManageExternalSourcesListIntent();
+ intent.setData(Uri.parse("package:" + packageName));
+ return intent;
+ }
+
+ private String getApplicationLabel(String packageName) throws Exception {
+ final ApplicationInfo info = mPackageManager.getApplicationInfo(packageName, 0);
+ return mPackageManager.getApplicationLabel(info).toString();
+ }
+
+ private UiObject2 findAndVerifySwitchState(boolean checked) {
+ final BySelector switchSelector = By.clazz(Switch.class).res("android:id/switch_widget");
+ final UiObject2 switchPref = mUiDevice.wait(Until.findObject(switchSelector),
+ START_ACTIVITY_TIMEOUT);
+ assertNotNull("Switch not shown", switchPref);
+ assertTrue("Switch in invalid state", switchPref.isChecked() == checked);
+ return switchPref;
+ }
+
+ @Test
+ public void testManageExternalSourcesList() throws Exception {
+ final String testAppLabel = getApplicationLabel(mPackageName);
+
+ mContext.startActivity(createManageExternalSourcesListIntent());
+ final BySelector preferenceListSelector = By.clazz(ListView.class).res("android:id/list");
+ final UiObject2 preferenceList = mUiDevice.wait(Until.findObject(preferenceListSelector),
+ START_ACTIVITY_TIMEOUT);
+ assertNotNull("App list not shown", preferenceList);
+
+ final BySelector appLabelTextViewSelector = By.clazz(TextView.class)
+ .res("android:id/title")
+ .text(testAppLabel);
+ List listOfMatchingTextViews;
+ do {
+ listOfMatchingTextViews = preferenceList.findObjects(appLabelTextViewSelector);
+ // assuming the number of profiles will be sufficiently small so that all the entries
+ // for the same package will fit in one screen at some time during the scroll.
+ } while (listOfMatchingTextViews.size() != mProfiles.size() &&
+ preferenceList.scroll(Direction.DOWN, 0.2f));
+ assertEquals("Test app not listed for each profile", mProfiles.size(),
+ listOfMatchingTextViews.size());
+
+ for (UiObject2 matchingObject : listOfMatchingTextViews) {
+ matchingObject.click();
+ findAndVerifySwitchState(true);
+ mUiDevice.pressBack();
+ }
+ }
+
+ private void testAppDetailScreenForAppOp(int appOpMode, int userId) throws Exception {
+ final String testAppLabel = getApplicationLabel(mPackageName);
+ final BySelector appDetailTitleSelector = By.clazz(TextView.class)
+ .res("com.android.settings:id/app_detail_title")
+ .text(testAppLabel);
+
+ mAppOpsManager.setMode(OP_REQUEST_INSTALL_PACKAGES,
+ mPackageManager.getPackageUidAsUser(mPackageName, userId), mPackageName, appOpMode);
+ mContext.startActivityAsUser(createManageExternalSourcesAppIntent(mPackageName),
+ UserHandle.of(userId));
+ mUiDevice.wait(Until.findObject(appDetailTitleSelector), START_ACTIVITY_TIMEOUT);
+ findAndVerifySwitchState(appOpMode == MODE_ALLOWED || appOpMode == MODE_DEFAULT);
+ mUiDevice.pressBack();
+ }
+
+ @Test
+ public void testManageExternalSourcesForApp() throws Exception {
+ // App op MODE_DEFAULT is already tested in #testManageExternalSourcesList
+ for (UserInfo user : mProfiles) {
+ testAppDetailScreenForAppOp(MODE_ALLOWED, user.id);
+ testAppDetailScreenForAppOp(MODE_ERRORED, user.id);
+ }
+ }
+
+ private void testSwitchToggle(int fromAppOp, int toAppOp) throws Exception {
+ final int packageUid = mPackageManager.getPackageUid(mPackageName, 0);
+ final boolean initialState = (fromAppOp == MODE_ALLOWED || fromAppOp == MODE_DEFAULT);
+
+ mAppOpsManager.setMode(OP_REQUEST_INSTALL_PACKAGES, packageUid, mPackageName, fromAppOp);
+ mContext.startActivity(createManageExternalSourcesAppIntent(mPackageName));
+ final UiObject2 switchPref = findAndVerifySwitchState(initialState);
+ switchPref.click();
+ Thread.sleep(1000);
+ assertEquals("Toggling switch did not change app op", toAppOp,
+ mAppOpsManager.checkOpNoThrow(OP_REQUEST_INSTALL_PACKAGES, packageUid,
+ mPackageName));
+ mUiDevice.pressBack();
+ }
+
+ @Test
+ public void testIfSwitchTogglesAppOp() throws Exception {
+ testSwitchToggle(MODE_ALLOWED, MODE_ERRORED);
+ testSwitchToggle(MODE_ERRORED, MODE_ALLOWED);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ mUiDevice.pressHome();
+ resetAppOpModeForAllProfiles();
+ }
+}
diff --git a/tests/app/src/com/android/settings/applications/PackageUtilTest.java b/tests/app/src/com/android/settings/applications/PackageUtilTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..1c064ae88973d13d53af56eed7e85f4aa28f9b3e
--- /dev/null
+++ b/tests/app/src/com/android/settings/applications/PackageUtilTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.applications;
+
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.UserInfo;
+import android.os.UserManager;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static junit.framework.Assert.assertEquals;
+import static org.mockito.Mockito.when;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class PackageUtilTest {
+ private static final String ALL_USERS_APP_NAME = "com.google.allusers.app";
+ private static final String ONE_USER_APP_NAME = "com.google.oneuser.app";
+ private static final int USER1_ID = 1;
+ private static final int USER2_ID = 11;
+
+ @Mock
+ private PackageManager mMockPackageManager;
+ @Mock
+ private UserManager mMockUserManager;
+
+ private InstalledAppDetails.PackageUtil mPackageUtil;
+ private List mUserInfos;
+
+ @Before
+ public void setUp() throws PackageManager.NameNotFoundException {
+ MockitoAnnotations.initMocks(this);
+
+ mUserInfos = new ArrayList<>();
+ mUserInfos.add(new UserInfo(USER1_ID, "lei", 0));
+ mUserInfos.add(new UserInfo(USER2_ID, "yue", 0));
+ when(mMockUserManager.getUsers(true)).thenReturn(mUserInfos);
+
+ ApplicationInfo usersApp = new ApplicationInfo();
+ usersApp.flags = ApplicationInfo.FLAG_INSTALLED;
+
+ when(mMockPackageManager.getApplicationInfoAsUser(
+ ALL_USERS_APP_NAME, PackageManager.GET_META_DATA, USER1_ID))
+ .thenReturn(usersApp);
+ when(mMockPackageManager.getApplicationInfoAsUser(
+ ALL_USERS_APP_NAME, PackageManager.GET_META_DATA, USER2_ID))
+ .thenReturn(usersApp);
+
+ when(mMockPackageManager.getApplicationInfoAsUser(
+ ONE_USER_APP_NAME, PackageManager.GET_META_DATA, USER1_ID))
+ .thenReturn(usersApp);
+
+ when(mMockPackageManager.getApplicationInfoAsUser(
+ ONE_USER_APP_NAME, PackageManager.GET_META_DATA, USER2_ID))
+ .thenThrow(new PackageManager.NameNotFoundException());
+
+ mPackageUtil = new InstalledAppDetails.PackageUtil();
+ }
+
+ @Test
+ public void testCountPackageInUsers_twoUsersInstalled_returnTwo() {
+ assertEquals(2, mPackageUtil.countPackageInUsers(
+ mMockPackageManager, mMockUserManager, ALL_USERS_APP_NAME));
+ }
+
+ @Test
+ public void testCountPackageInUsers_oneUsersInstalled_returnOne() {
+ assertEquals(1, mPackageUtil.countPackageInUsers(
+ mMockPackageManager, mMockUserManager, ONE_USER_APP_NAME));
+ }
+}
diff --git a/tests/app/src/com/android/settings/bluetooth/BluetoothDeviceDetailsRotationTest.java b/tests/app/src/com/android/settings/bluetooth/BluetoothDeviceDetailsRotationTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..5b372ad4b1bc0e4a57073cfd0ba7423a109bddd1
--- /dev/null
+++ b/tests/app/src/com/android/settings/bluetooth/BluetoothDeviceDetailsRotationTest.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import static org.mockito.Mockito.when;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.UiDevice;
+
+import com.android.settings.SettingsActivity;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class BluetoothDeviceDetailsRotationTest {
+ private Context mContext;
+ private UiDevice mUiDevice;
+ private Instrumentation mInstrumentation;
+
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private CachedBluetoothDevice mCachedDevice;
+
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private LocalBluetoothManager mBluetoothManager;
+
+ private String mDeviceAddress;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ mContext = InstrumentationRegistry.getTargetContext();
+ mUiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+
+ mDeviceAddress = "AA:BB:CC:DD:EE:FF";
+ when(mCachedDevice.getAddress()).thenReturn(mDeviceAddress);
+ when(mCachedDevice.getName()).thenReturn("Mock Device");
+
+ BluetoothDeviceDetailsFragment.sTestDataFactory =
+ new BluetoothDeviceDetailsFragment.TestDataFactory() {
+ @Override
+ public CachedBluetoothDevice getDevice(String deviceAddress) {
+ return mCachedDevice;
+ }
+
+ @Override
+ public LocalBluetoothManager getManager(Context context) {
+ return mBluetoothManager;
+ }
+ };
+ }
+
+ @Test
+ public void rotation() {
+ Intent intent = new Intent("android.settings.BLUETOOTH_SETTINGS");
+ SettingsActivity activity = (SettingsActivity) mInstrumentation.startActivitySync(intent);
+ Bundle args = new Bundle(1);
+ args.putString(BluetoothDeviceDetailsFragment.KEY_DEVICE_ADDRESS, mDeviceAddress);
+ activity.startPreferencePanel(null, BluetoothDeviceDetailsFragment.class.getName(), args,
+ 0, null, null, 0);
+ try {
+ mUiDevice.setOrientationLeft();
+ mUiDevice.setOrientationNatural();
+ mUiDevice.setOrientationRight();
+ mUiDevice.setOrientationNatural();
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/tests/app/src/com/android/settings/bluetooth/DevicePickerActivityTest.java b/tests/app/src/com/android/settings/bluetooth/DevicePickerActivityTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..1b855c93b62f1e19848dc317bf030c3ce8507ed6
--- /dev/null
+++ b/tests/app/src/com/android/settings/bluetooth/DevicePickerActivityTest.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class DevicePickerActivityTest {
+
+ private Instrumentation mInstrumentation;
+
+ @Before
+ public void setUp() throws Exception {
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ }
+
+ @Test
+ public void startActivityNoCrash() {
+ mInstrumentation.startActivitySync(
+ new Intent("android.bluetooth.devicepicker.action.LAUNCH"));
+ // No crash
+ }
+}
diff --git a/tests/app/src/com/android/settings/deviceinfo/StorageDashboardFragmentEspressoTest.java b/tests/app/src/com/android/settings/deviceinfo/StorageDashboardFragmentEspressoTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..b43a5ba882d1163de0853650149ea77c1bdd94c1
--- /dev/null
+++ b/tests/app/src/com/android/settings/deviceinfo/StorageDashboardFragmentEspressoTest.java
@@ -0,0 +1,40 @@
+package com.android.settings.deviceinfo;
+
+import android.support.test.espresso.intent.rule.IntentsTestRule;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnitRunner;
+import com.android.settings.R;
+import com.android.settings.Settings.StorageDashboardActivity;
+import com.android.settings.deletionhelper.AutomaticStorageManagerSettings;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.intent.Intents.intended;
+import static android.support.test.espresso.intent.matcher.IntentMatchers.hasExtra;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.equalTo;
+
+@SmallTest
+public class StorageDashboardFragmentEspressoTest {
+
+ public static final String EXTRA_KEY = ":settings:show_fragment";
+
+ @Rule
+ public IntentsTestRule mActivityRule =
+ new IntentsTestRule<>(StorageDashboardActivity.class, true, true);
+
+ @Test
+ public void testStorageManagePreference_canClickTextView() throws InterruptedException {
+ // Click on the actual textbox instead of just somewhere in the preference
+ onView(withText(R.string.storage_menu_manage)).perform(click());
+
+ // Check that it worked by seeing if we switched screens
+ intended(hasExtra(equalTo(EXTRA_KEY),
+ containsString(AutomaticStorageManagerSettings.class.getName())));
+
+ }
+}
diff --git a/tests/app/src/com/android/settings/fingerprint/FingerprintEnrollFinishTest.java b/tests/app/src/com/android/settings/fingerprint/FingerprintEnrollFinishTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..b09d1bf116ee8627170b6b820b895115f49397fa
--- /dev/null
+++ b/tests/app/src/com/android/settings/fingerprint/FingerprintEnrollFinishTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.fingerprint;
+
+import static android.support.test.InstrumentationRegistry.getTargetContext;
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.intent.Intents.intended;
+import static android.support.test.espresso.intent.Intents.intending;
+import static android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.app.Activity;
+import android.app.Instrumentation.ActivityResult;
+import android.content.ComponentName;
+import android.support.test.espresso.intent.rule.IntentsTestRule;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.android.settings.R;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class FingerprintEnrollFinishTest {
+
+ @Rule
+ public IntentsTestRule mActivityRule =
+ new IntentsTestRule<>(FingerprintEnrollFinish.class);
+
+ @Test
+ public void clickAddAnother_shouldLaunchEnrolling() {
+ final ComponentName enrollingComponent = new ComponentName(
+ getTargetContext(),
+ FingerprintEnrollEnrolling.class);
+
+ intending(hasComponent(enrollingComponent))
+ .respondWith(new ActivityResult(Activity.RESULT_CANCELED, null));
+
+ onView(withId(R.id.add_another_button)).perform(click());
+
+ intended(hasComponent(enrollingComponent));
+ assertFalse(mActivityRule.getActivity().isFinishing());
+ }
+
+ @Test
+ public void clickAddAnother_shouldPropagateResults() {
+ final ComponentName enrollingComponent = new ComponentName(
+ getTargetContext(),
+ FingerprintEnrollEnrolling.class);
+
+ intending(hasComponent(enrollingComponent))
+ .respondWith(new ActivityResult(Activity.RESULT_OK, null));
+
+ onView(withId(R.id.add_another_button)).perform(click());
+
+ intended(hasComponent(enrollingComponent));
+ assertTrue(mActivityRule.getActivity().isFinishing());
+ }
+
+ @Test
+ public void clickNext_shouldFinish() {
+ onView(withId(R.id.next_button)).perform(click());
+ assertTrue(mActivityRule.getActivity().isFinishing());
+ }
+}
\ No newline at end of file
diff --git a/tests/app/src/com/android/settings/fuelgauge/PowerUsageSummaryUiTest.java b/tests/app/src/com/android/settings/fuelgauge/PowerUsageSummaryUiTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..6c372c5f5f175070a6cc2cea2ff68370644808f0
--- /dev/null
+++ b/tests/app/src/com/android/settings/fuelgauge/PowerUsageSummaryUiTest.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fuelgauge;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.android.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class PowerUsageSummaryUiTest {
+ private static final String BATTERY_INTENT = "android.intent.action.POWER_USAGE_SUMMARY";
+
+ @Before
+ public void SetUp() {
+ Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ instrumentation.startActivitySync(new Intent(BATTERY_INTENT));
+ }
+
+ @Test
+ public void testClickLastFullCharge_shouldNotCrash() {
+ onView(withText(R.string.battery_last_full_charge)).perform(click());
+ }
+
+ @Test
+ public void testClickScreenUsage_shouldNotCrash() {
+ onView(withText(R.string.device_screen_usage)).perform(click());
+ }
+
+}
diff --git a/tests/app/src/com/android/settings/notification/AppNotificationSettingsTest.java b/tests/app/src/com/android/settings/notification/AppNotificationSettingsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..22e98c71e5e0db8067d610779528688fc3e3d6f9
--- /dev/null
+++ b/tests/app/src/com/android/settings/notification/AppNotificationSettingsTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.notification;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.espresso.matcher.ViewMatchers;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
+import static android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static org.hamcrest.Matchers.allOf;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class AppNotificationSettingsTest {
+
+ private Context mTargetContext;
+ private Instrumentation mInstrumentation;
+
+ @Before
+ public void setUp() {
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ mTargetContext = mInstrumentation.getTargetContext();
+ }
+
+ @Test
+ public void launchNotificationSetting_shouldNotHaveAppInfoLink() {
+ final Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
+ .putExtra(Settings.EXTRA_APP_PACKAGE, mTargetContext.getPackageName());
+
+ mInstrumentation.startActivitySync(intent);
+
+ onView(allOf(withId(android.R.id.button1),
+ withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
+ .check(doesNotExist());
+ }
+
+}
diff --git a/tests/app/src/com/android/settings/notification/SoundSettingsIntegrationTest.java b/tests/app/src/com/android/settings/notification/SoundSettingsIntegrationTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..dff7e611bee9aa61dbb883a29ac1944b6cd8c2e5
--- /dev/null
+++ b/tests/app/src/com/android/settings/notification/SoundSettingsIntegrationTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.notification;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant;
+import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.containsString;
+
+import android.content.Context;
+import android.media.AudioManager;
+import android.support.test.espresso.contrib.RecyclerViewActions;
+import android.support.test.filters.SmallTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import com.android.settings.R;
+import com.android.settings.Settings;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class SoundSettingsIntegrationTest {
+
+ private AudioManager mAudioManager;
+ private final String TRUNCATED_SUMMARY = "Ring volume at";
+
+ @Rule
+ public ActivityTestRule mActivityRule =
+ new ActivityTestRule<>(Settings.class, true);
+
+ @Test
+ public void soundPreferenceShowsCorrectSummaryOnSilentMode() {
+ mAudioManager = (AudioManager) mActivityRule.getActivity().getApplicationContext()
+ .getSystemService(Context.AUDIO_SERVICE);
+ mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
+ onView(withId(R.id.dashboard_container))
+ .perform(RecyclerViewActions.scrollTo(
+ hasDescendant(withText(R.string.sound_settings))));
+ onView(withText(R.string.sound_settings_summary_silent)).check(matches(isDisplayed()));
+ }
+
+ @Test
+ public void soundPreferenceShowsCorrectSummaryOnVibrateMode() {
+ mAudioManager = (AudioManager) mActivityRule.getActivity().getApplicationContext()
+ .getSystemService(Context.AUDIO_SERVICE);
+ mAudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
+ onView(withId(R.id.dashboard_container)).perform(RecyclerViewActions
+ .scrollTo(hasDescendant(withText(R.string.sound_settings))));
+ onView(withText(R.string.sound_settings_summary_vibrate)).check(matches(isDisplayed()));
+ }
+
+ @Test
+ public void soundPreferenceShowsCorrectSummaryOnMaxVolume() {
+ mAudioManager = (AudioManager) mActivityRule.getActivity().getApplicationContext()
+ .getSystemService(Context.AUDIO_SERVICE);
+ mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
+ mAudioManager.setStreamVolume(AudioManager.STREAM_RING,
+ mAudioManager.getStreamMaxVolume(AudioManager.STREAM_RING), 0);
+ onView(withId(R.id.dashboard_container))
+ .perform(RecyclerViewActions.scrollTo(
+ hasDescendant(withText(R.string.sound_settings))));
+ onView(withText(containsString(TRUNCATED_SUMMARY))).check(matches(isDisplayed()));
+ }
+}
\ No newline at end of file
diff --git a/tests/app/src/com/android/settings/notification/ZenModeSettingsIntegrationTest.java b/tests/app/src/com/android/settings/notification/ZenModeSettingsIntegrationTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e7e5e199cbfe33f119cbd8399b14b607090f050d
--- /dev/null
+++ b/tests/app/src/com/android/settings/notification/ZenModeSettingsIntegrationTest.java
@@ -0,0 +1,53 @@
+package com.android.settings.notification;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.UiDevice;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@LargeTest
+public class ZenModeSettingsIntegrationTest {
+ private static final String WM_DISMISS_KEYGUARD_COMMAND = "wm dismiss-keyguard";
+
+ private Context mContext;
+ private UiDevice mUiDevice;
+
+ @Before
+ public void setUp() throws Exception {
+ mContext = InstrumentationRegistry.getTargetContext();
+ mUiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+ mUiDevice.wakeUp();
+ mUiDevice.executeShellCommand(WM_DISMISS_KEYGUARD_COMMAND);
+ }
+
+ @Test
+ public void testAutomaticRulesAppear() {
+ launchZenSettings();
+ onView(withText("Automatic rules")).check(matches(isDisplayed()));
+ onView(withText("Weekend")).check(matches(isDisplayed()));
+ onView(withText("Add more")).check(matches(isDisplayed())).perform(click());
+ onView(withText("Choose rule type")).check(matches(isDisplayed()));
+ }
+
+ private void launchZenSettings() {
+ Intent settingsIntent = new Intent(Settings.ACTION_ZEN_MODE_SETTINGS)
+ .setPackage(mContext.getPackageName())
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(settingsIntent);
+ }
+}
diff --git a/tests/app/src/com/android/settings/password/ChooseLockGenericTest.java b/tests/app/src/com/android/settings/password/ChooseLockGenericTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..40b69a400a00a833608b475e24128d94c388c703
--- /dev/null
+++ b/tests/app/src/com/android/settings/password/ChooseLockGenericTest.java
@@ -0,0 +1,228 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.password;
+
+import static android.support.test.InstrumentationRegistry.getInstrumentation;
+import static android.support.test.InstrumentationRegistry.getTargetContext;
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertTrue;
+
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.ActivityManager.AppTask;
+import android.app.KeyguardManager;
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.Intent;
+import android.support.test.filters.MediumTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry;
+import android.support.test.runner.lifecycle.Stage;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObject;
+import android.support.test.uiautomator.UiSelector;
+import android.text.format.DateUtils;
+import android.view.WindowManager;
+
+import com.android.internal.widget.LockPatternUtils;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Tests for {@link ChooseLockGenericTest}
+ *
+ * m SettingsTests &&
+ * adb install \
+ * -r -g ${ANDROID_PRODUCT_OUT}/data/app/SettingsTests/SettingsTests.apk &&
+ * adb shell am instrument -e class com.android.settings.password.ChooseLockGenericTest \
+ * -w com.android.settings.tests/android.support.test.runner.AndroidJUnitRunner
+ */
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class ChooseLockGenericTest {
+ private static final long TIMEOUT = 5 * DateUtils.SECOND_IN_MILLIS;
+ private static final Intent PHISHING_ATTACK_INTENT = new Intent()
+ .putExtra("confirm_credentials", false)
+ .putExtra("password_confirmed", true);
+
+ private UiDevice mDevice;
+ private Context mTargetContext;
+ private String mSettingPackage;
+
+ @Rule
+ public ActivityTestRule mChooseLockGenericActivityRule =
+ new ActivityTestRule<>(
+ ChooseLockGeneric.class,
+ true /* enable touch at launch */,
+ false /* don't launch at every test */);
+
+ @Before
+ public void setUp() throws Exception {
+ mDevice = UiDevice.getInstance(getInstrumentation());
+ mTargetContext = getInstrumentation().getTargetContext();
+ mSettingPackage = mTargetContext.getPackageName();
+ }
+
+ @Test
+ public void testConfirmLockPasswordShown_deviceWithPassword() throws Throwable {
+ setPassword();
+ try {
+ // GIVEN a PIN password is set on this device at set up.
+ // WHEN ChooseLockGeneric is launched with no extras.
+ mChooseLockGenericActivityRule.launchActivity(null /* No extras */);
+ // THEN ConfirmLockPassword.InternalActivity is shown.
+ final Activity activity = getCurrentActivity();
+ assertThat(isSecureWindow(activity)).isTrue();
+ assertThat(activity)
+ .isInstanceOf(ConfirmLockPassword.InternalActivity.class);
+ } finally {
+ finishAllAppTasks();
+ mDevice.waitForIdle();
+ clearPassword();
+ }
+ }
+
+ @Test
+ public void testConfirmLockPasswordShown_deviceWithPassword_phishingAttack() throws Throwable {
+ setPassword();
+ try {
+ // GIVEN a PIN password is set on this device at set up.
+ // WHEN ChooseLockGeneric is launched with extras to by-pass lock password confirmation.
+ mChooseLockGenericActivityRule.launchActivity(PHISHING_ATTACK_INTENT);
+ // THEN ConfirmLockPassword.InternalActivity is still shown.
+ final Activity activity = getCurrentActivity();
+ assertThat(isSecureWindow(activity)).isTrue();
+ assertThat(activity)
+ .isInstanceOf(ConfirmLockPassword.InternalActivity.class);
+ } finally {
+ finishAllAppTasks();
+ mDevice.waitForIdle();
+ clearPassword();
+ }
+ }
+
+ @Test
+ public void testForFingerprint_inflateLayout() {
+ mChooseLockGenericActivityRule.launchActivity(new Intent()
+ .putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, true));
+
+ assertThat(mChooseLockGenericActivityRule.getActivity().isResumed()).isTrue();
+ }
+
+ private Activity getCurrentActivity() throws Throwable {
+ getInstrumentation().waitForIdleSync();
+ final Activity[] activity = new Activity[1];
+ getInstrumentation().runOnMainSync(() -> {
+ Collection activities = ActivityLifecycleMonitorRegistry.getInstance()
+ .getActivitiesInStage(Stage.RESUMED);
+ activity[0] = activities.iterator().next();
+ });
+ return activity[0];
+ }
+
+ /** Sets a PIN password, 12345, for testing. */
+ private void setPassword() throws Exception {
+ Intent newPasswordIntent = new Intent(getTargetContext(), ChooseLockGeneric.class)
+ .putExtra(LockPatternUtils.PASSWORD_TYPE_KEY,
+ DevicePolicyManager.PASSWORD_QUALITY_NUMERIC)
+ .putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD,
+ "12345")
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ getInstrumentation().getContext().startActivity(newPasswordIntent);
+ mDevice.waitForIdle();
+
+
+ // Ignore any interstitial options
+ UiObject view = new UiObject(new UiSelector()
+ .resourceId(mSettingPackage + ":id/encrypt_dont_require_password"));
+ if (view.waitForExists(TIMEOUT)) {
+ view.click();
+ mDevice.waitForIdle();
+ }
+
+ // Set our PIN
+ view = new UiObject(new UiSelector()
+ .resourceId(mSettingPackage + ":id/password_entry"));
+ assertTrue("password_entry", view.waitForExists(TIMEOUT));
+
+ // Enter it twice to confirm
+ enterTestPin(view);
+ enterTestPin(view);
+
+ mDevice.pressBack();
+
+ assertThat(getTargetContext().getSystemService(KeyguardManager.class).isDeviceSecure())
+ .isTrue();
+ }
+
+ /** Clears the previous set PIN password. */
+ private void clearPassword() throws Exception {
+ Intent newPasswordIntent = new Intent(getTargetContext(), ChooseLockGeneric.class)
+ .putExtra(LockPatternUtils.PASSWORD_TYPE_KEY,
+ DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ getInstrumentation().getContext().startActivity(newPasswordIntent);
+ mDevice.waitForIdle();
+
+ // Enter current PIN
+ UiObject view = new UiObject(
+ new UiSelector().resourceId(mSettingPackage + ":id/password_entry"));
+ if (!view.waitForExists(TIMEOUT)) {
+ // Odd, maybe there is a crash dialog showing; try dismissing it
+ mDevice.pressBack();
+ mDevice.waitForIdle();
+
+ assertTrue("password_entry", view.waitForExists(TIMEOUT));
+ }
+
+ enterTestPin(view);
+
+ mDevice.pressBack();
+
+ assertThat(getTargetContext().getSystemService(KeyguardManager.class).isDeviceSecure())
+ .isFalse();
+ }
+
+ private void finishAllAppTasks() {
+ final ActivityManager activityManager =
+ getTargetContext().getSystemService(ActivityManager.class);
+ final List appTasks = activityManager.getAppTasks();
+ for (ActivityManager.AppTask task : appTasks) {
+ task.finishAndRemoveTask();
+ }
+ }
+
+ private void enterTestPin(UiObject view) throws Exception {
+ mDevice.waitForIdle();
+ view.setText("12345");
+ mDevice.pressEnter();
+ mDevice.waitForIdle();
+ }
+
+ private boolean isSecureWindow(Activity activity) {
+ return (activity.getWindow().getAttributes().flags & WindowManager.LayoutParams.FLAG_SECURE)
+ != 0;
+ }
+}
diff --git a/tests/app/src/com/android/settings/password/ChooseLockPasswordTest.java b/tests/app/src/com/android/settings/password/ChooseLockPasswordTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..36611cf50bf6eaef8eb0ac38a874784c9ae7542f
--- /dev/null
+++ b/tests/app/src/com/android/settings/password/ChooseLockPasswordTest.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2017 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.password;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.pressKey;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static android.support.test.espresso.matcher.ViewMatchers.isEnabled;
+import static android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+
+import static org.hamcrest.CoreMatchers.not;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.os.SystemClock;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.espresso.action.ViewActions;
+import android.support.test.espresso.matcher.ViewMatchers;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.KeyEvent;
+
+import com.android.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class ChooseLockPasswordTest {
+ private Instrumentation mInstrumentation;
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ mContext = mInstrumentation.getTargetContext();
+ }
+
+ @Test
+ public void clearNotVisible_when_activityLaunchedInitially() {
+ mInstrumentation.startActivitySync(new Intent(mContext, ChooseLockPassword.class));
+ onView(withId(R.id.clear_button)).check(matches(
+ withEffectiveVisibility(ViewMatchers.Visibility.GONE)));
+ }
+
+ @Test
+ public void clearNotEnabled_when_nothingEntered() {
+ mInstrumentation.startActivitySync(new Intent(mContext, ChooseLockPassword.class));
+ onView(withId(R.id.password_entry)).perform(ViewActions.typeText("1234"))
+ .perform(pressKey(KeyEvent.KEYCODE_ENTER));
+ onView(withId(R.id.clear_button)).check(matches(isDisplayed()))
+ .check(matches(not(isEnabled())));
+ }
+
+ @Test
+ public void clearEnabled_when_somethingEnteredToConfirm() {
+ mInstrumentation.startActivitySync(new Intent(mContext, ChooseLockPassword.class));
+ onView(withId(R.id.password_entry)).perform(ViewActions.typeText("1234"))
+ .perform(pressKey(KeyEvent.KEYCODE_ENTER))
+ .perform(ViewActions.typeText("1"));
+ // clear should be present if text field contains content
+ onView(withId(R.id.clear_button)).check(matches(isDisplayed()));
+ }
+}
diff --git a/tests/app/src/com/android/settings/password/ConfirmLockPasswordTest.java b/tests/app/src/com/android/settings/password/ConfirmLockPasswordTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..25e7da05edc330d3c9c4a812a536dcd6025f02a2
--- /dev/null
+++ b/tests/app/src/com/android/settings/password/ConfirmLockPasswordTest.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settings.password;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.pressKey;
+import static android.support.test.espresso.action.ViewActions.typeText;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.KeyEvent;
+
+import com.android.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class ConfirmLockPasswordTest {
+
+ private Instrumentation mInstrumentation;
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ mContext = mInstrumentation.getTargetContext();
+ }
+
+ @Test
+ public void enterWrongPin_shouldShowErrorMessage() {
+ mInstrumentation.startActivitySync(
+ new Intent(mContext, ConfirmLockPassword.class));
+ onView(withId(R.id.password_entry)).perform(typeText("1234"))
+ .perform(pressKey(KeyEvent.KEYCODE_ENTER));
+ onView(withId(R.id.errorText)).check(matches(withText(R.string.lockpassword_invalid_pin)));
+ }
+
+ @Test
+ public void enterWrongPin_darkTheme_shouldShowErrorMessage() {
+ mInstrumentation.startActivitySync(
+ new Intent(mContext, ConfirmLockPassword.class)
+ .putExtra(ConfirmDeviceCredentialBaseFragment.DARK_THEME, true));
+ onView(withId(R.id.password_entry)).perform(typeText("1234"))
+ .perform(pressKey(KeyEvent.KEYCODE_ENTER));
+ onView(withId(R.id.errorText)).check(matches(withText(R.string.lockpassword_invalid_pin)));
+ }
+}
diff --git a/tests/app/src/com/android/settings/password/SetupChooseLockPasswordAppTest.java b/tests/app/src/com/android/settings/password/SetupChooseLockPasswordAppTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..3a6c39c5c68ca764b67b016864a7b0f8696037a5
--- /dev/null
+++ b/tests/app/src/com/android/settings/password/SetupChooseLockPasswordAppTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.password;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.action.ViewActions.pressKey;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static android.support.test.espresso.matcher.ViewMatchers.isEnabled;
+import static android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.hamcrest.CoreMatchers.not;
+
+import android.support.test.espresso.action.ViewActions;
+import android.support.test.espresso.matcher.ViewMatchers;
+import android.support.test.filters.MediumTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.KeyEvent;
+
+import com.android.settings.R;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class SetupChooseLockPasswordAppTest {
+
+ @Rule
+ public ActivityTestRule mActivityTestRule =
+ new ActivityTestRule<>(
+ SetupChooseLockPassword.class,
+ true /* enable touch at launch */,
+ false /* don't launch at every test */);
+
+ @Test
+ public void testSkipDialogIsShown() throws Throwable {
+ SetupChooseLockPassword activity = mActivityTestRule.launchActivity(null);
+
+ onView(withId(R.id.cancel_button))
+ .check(matches(withText(R.string.skip_label)))
+ .check(matches(isDisplayed()))
+ .perform(click());
+ onView(withId(android.R.id.button1)).check(matches(isDisplayed())).perform(click());
+
+ assertThat(activity.isFinishing()).named("Is finishing").isTrue();
+ }
+
+ @Test
+ public void clearNotVisible_when_activityLaunchedInitially() {
+ mActivityTestRule.launchActivity(null);
+ onView(withId(R.id.clear_button)).check(matches(
+ withEffectiveVisibility(ViewMatchers.Visibility.GONE)));
+ }
+
+ @Test
+ public void clearNotEnabled_when_nothingEntered() throws Throwable {
+ mActivityTestRule.launchActivity(null);
+ onView(withId(R.id.password_entry)).perform(ViewActions.typeText("1234"))
+ .perform(pressKey(KeyEvent.KEYCODE_ENTER));
+ onView(withId(R.id.clear_button)).check(matches(isDisplayed()))
+ .check(matches(not(isEnabled())));
+ }
+
+ @Test
+ public void clearEnabled_when_somethingEnteredToConfirm() {
+ mActivityTestRule.launchActivity(null);
+ onView(withId(R.id.password_entry)).perform(ViewActions.typeText("1234"))
+ .perform(pressKey(KeyEvent.KEYCODE_ENTER))
+ .perform(ViewActions.typeText("1"));
+ // clear should be present if text field contains content
+ onView(withId(R.id.clear_button)).check(matches(isDisplayed()));
+ }
+}
diff --git a/tests/app/src/com/android/settings/search/SearchFragmentEspressoTest.java b/tests/app/src/com/android/settings/search/SearchFragmentEspressoTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..d342881915579ddbd66d787f6e966d180767f896
--- /dev/null
+++ b/tests/app/src/com/android/settings/search/SearchFragmentEspressoTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.settings.search;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.widget.SearchView;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.matcher.ViewMatchers.hasFocus;
+import static android.support.test.espresso.matcher.ViewMatchers.withClassName;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.core.AllOf.allOf;
+
+import com.android.settings.R;
+
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class SearchFragmentEspressoTest {
+ @Rule
+ public ActivityTestRule mActivityRule =
+ new ActivityTestRule<>(SearchActivity.class, true, true);
+
+ @Test
+ public void test_OpenKeyboardOnSearchLaunch() {
+ onView(allOf(hasFocus(), withId(R.id.search_view)))
+ .check(matches(withClassName(containsString(SearchView.class.getName()))));
+ }
+}
diff --git a/tests/app/src/com/android/settings/tests/BluetoothRequestPermissionTest.java b/tests/app/src/com/android/settings/tests/BluetoothRequestPermissionTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..a2cdafe8aa4c46bd59c26ce36e5d799335b53bb5
--- /dev/null
+++ b/tests/app/src/com/android/settings/tests/BluetoothRequestPermissionTest.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.tests;
+
+import android.app.Activity;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.ListView;
+
+public class BluetoothRequestPermissionTest extends Activity {
+ private static final String TAG = "BluetoothRequestPermissionTest";
+ BluetoothAdapter mAdapter;
+ private ArrayAdapter mMsgAdapter;
+
+ // Discoverable button alternates between 20 second timeout and no timeout.
+ private boolean mDiscoveryWithTimeout = true;
+
+ private class BtOnClickListener implements OnClickListener {
+ final boolean mEnableOnly; // enable or enable + discoverable
+
+ public BtOnClickListener(boolean enableOnly) {
+ mEnableOnly = enableOnly;
+ }
+
+ public void onClick(View v) {
+ requestPermission(mEnableOnly);
+ }
+ }
+
+ private class BtScanOnClickListener implements OnClickListener {
+ public void onClick(View v) {
+ Button scanButton = (Button) v;
+ if (mAdapter.isDiscovering()) {
+ mAdapter.cancelDiscovery();
+ scanButton.setText(R.string.start_scan);
+ } else {
+ mAdapter.startDiscovery();
+ scanButton.setText(R.string.stop_scan);
+ }
+ }
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ setContentView(R.layout.bluetooth_request_permission_test);
+ mAdapter = BluetoothAdapter.getDefaultAdapter();
+
+ Button enable = (Button) findViewById(R.id.enable);
+ enable.setOnClickListener(new BtOnClickListener(true /* enable */));
+
+ Button discoverable = (Button) findViewById(R.id.discoverable);
+ discoverable.setOnClickListener(new BtOnClickListener(false /* enable & discoverable */));
+
+ Button scanButton = (Button) findViewById(R.id.scan);
+ scanButton.setOnClickListener(new BtScanOnClickListener());
+ if (mAdapter.isDiscovering()) {
+ scanButton.setText(R.string.stop_scan);
+ } else {
+ scanButton.setText(R.string.start_scan);
+ }
+
+ mMsgAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1);
+
+ ListView listView = (ListView) findViewById(R.id.msg_container);
+ listView.setAdapter(mMsgAdapter);
+
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
+ filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
+ filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
+ filter.addAction(BluetoothDevice.ACTION_FOUND);
+ registerReceiver(mReceiver, filter);
+ addMsg("Initialized");
+ }
+
+ void requestPermission(boolean enableOnly) {
+ Intent i = new Intent();
+ if (enableOnly) {
+ addMsg("Starting activity to enable bt");
+ i.setAction(BluetoothAdapter.ACTION_REQUEST_ENABLE);
+ } else {
+ addMsg("Starting activity to enable bt + discovery");
+ i.setAction(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
+ // Discoverability duration toggles between 20 seconds and no timeout.
+ int timeout = (mDiscoveryWithTimeout ? 20 : 0);
+ i.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, timeout);
+ mDiscoveryWithTimeout = !mDiscoveryWithTimeout;
+ }
+ startActivityForResult(i, 1);
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode != 1) {
+ Log.e(TAG, "Unexpected onActivityResult " + requestCode + " " + resultCode);
+ return;
+ }
+
+ if (resultCode == Activity.RESULT_CANCELED) {
+ addMsg("Result = RESULT_CANCELED");
+ } else if (resultCode == Activity.RESULT_OK) {
+ addMsg("Result = RESULT_OK (not expected for discovery)");
+ } else {
+ addMsg("Result = " + resultCode);
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ unregisterReceiver(mReceiver);
+ }
+
+ private void addMsg(String msg) {
+ mMsgAdapter.add(msg);
+ Log.d(TAG, "msg");
+ }
+
+ private BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent == null)
+ return;
+ String action = intent.getAction();
+ if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
+ String stateStr = "???";
+ switch (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothDevice.ERROR)) {
+ case BluetoothAdapter.STATE_OFF:
+ stateStr = "off";
+ break;
+ case BluetoothAdapter.STATE_TURNING_ON:
+ stateStr = "turning on";
+ break;
+ case BluetoothAdapter.STATE_ON:
+ stateStr = "on";
+ break;
+ case BluetoothAdapter.STATE_TURNING_OFF:
+ stateStr = "turning off";
+ break;
+ }
+ addMsg("Bluetooth status = " + stateStr);
+ } else if (action.equals(BluetoothDevice.ACTION_FOUND)) {
+ String name = intent.getStringExtra(BluetoothDevice.EXTRA_NAME);
+ addMsg("Found: " + name);
+ } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_STARTED)) {
+ addMsg("Scan started...");
+ } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
+ addMsg("Scan ended");
+ }
+ }
+ };
+}
diff --git a/tests/app/src/com/android/settings/tests/DashboardAdapterTest.java b/tests/app/src/com/android/settings/tests/DashboardAdapterTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..4b8e6cf4bc482b3234a1eea846ab121a34b83919
--- /dev/null
+++ b/tests/app/src/com/android/settings/tests/DashboardAdapterTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.tests;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import com.android.settings.R;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.*;
+import static android.support.test.espresso.matcher.ViewMatchers.Visibility.VISIBLE;
+import static org.hamcrest.core.AllOf.allOf;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class DashboardAdapterTest {
+ @Before
+ public void SetUp() {
+ Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ instrumentation.startActivitySync(new Intent(Settings
+ .ACTION_SETTINGS));
+ }
+
+ @Test
+ public void testTileConsistency_ToggleSuggestionsAndOpenBluetooth_shouldInBluetooth()
+ throws Exception{
+ final Context context = InstrumentationRegistry.getTargetContext();
+
+ onView(allOf(withText(context.getString(R.string.suggestions_title)),
+ withEffectiveVisibility(VISIBLE))).perform(click());
+ onView(allOf(withText(context.getString(R.string.bluetooth_settings)),
+ withEffectiveVisibility(VISIBLE))).perform(click());
+
+ // It should go to Bluetooth sub page, not other page or crash
+ onView(allOf(withText(context.getString(R.string.bluetooth_settings)),
+ withEffectiveVisibility(VISIBLE))).check(matches(isDisplayed()));
+
+ }
+}
diff --git a/tests/app/src/com/android/settings/tests/DrawOverlayDetailsTest.java b/tests/app/src/com/android/settings/tests/DrawOverlayDetailsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..234f8e6b1513303cc54c9dde061a547506d09f62
--- /dev/null
+++ b/tests/app/src/com/android/settings/tests/DrawOverlayDetailsTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.tests;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.support.test.InstrumentationRegistry;
+import org.junit.runner.RunWith;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import org.junit.Test;
+import com.android.settings.R;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.isEnabled;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+import static org.hamcrest.core.IsNot.not;
+import static android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class DrawOverlayDetailsTest {
+ private final static String PACKAGE_SYSTEM_UI = "com.android.systemui";
+
+ @Test
+ public void testSystemUiDrawOverlayDetails_Disabled() throws Exception{
+ Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ instrumentation.startActivitySync(new Intent(android.provider.Settings
+ .ACTION_MANAGE_OVERLAY_PERMISSION));
+
+ final Context targetContext = instrumentation.getTargetContext();
+
+ final PackageManager packageManager = targetContext.getPackageManager();
+ final String appName = (String) packageManager.getApplicationLabel(packageManager
+ .getApplicationInfo(PACKAGE_SYSTEM_UI, PackageManager.GET_META_DATA));
+
+ openActionBarOverflowOrOptionsMenu(targetContext);
+ onView(withText(targetContext.getString(R.string.menu_show_system))).perform(click());
+ onView(withText(appName)).perform(click());
+ onView(withText(targetContext.getString(R.string.permit_draw_overlay))).check(matches
+ (not(isEnabled())));
+ }
+
+}
diff --git a/tests/app/src/com/android/settings/tests/KeepOnScreenTest.java b/tests/app/src/com/android/settings/tests/KeepOnScreenTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..0b1308e6d03055df2e9af49a94fe8238f8566985
--- /dev/null
+++ b/tests/app/src/com/android/settings/tests/KeepOnScreenTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.tests;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.os.BatteryManager;
+import android.provider.Settings;
+import android.support.test.InstrumentationRegistry;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import org.junit.Test;
+import com.android.settings.R;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.matcher.ViewMatchers.*;
+import static junit.framework.Assert.assertEquals;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class KeepOnScreenTest {
+ private static int EXPECTED_FLAG = BatteryManager.BATTERY_PLUGGED_AC
+ | BatteryManager.BATTERY_PLUGGED_USB | BatteryManager.BATTERY_PLUGGED_WIRELESS;
+
+ @Test
+ public void testStayAwake_turnOn_StayAwakeWhileWirelessCharging() throws Exception{
+ Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ instrumentation.startActivitySync(new Intent(android.provider.Settings
+ .ACTION_APPLICATION_DEVELOPMENT_SETTINGS));
+
+ final Context targetContext = instrumentation.getTargetContext();
+ final int prevFlag = Settings.Global.getInt(targetContext.getContentResolver(), Settings
+ .Global.STAY_ON_WHILE_PLUGGED_IN);
+
+ // Turn on "Stay Awake" if needed
+ if (prevFlag == 0) {
+ onView(withText(R.string.keep_screen_on)).perform(click());
+ }
+
+ final int currentFlag = Settings.Global.getInt(targetContext.getContentResolver(), Settings
+ .Global.STAY_ON_WHILE_PLUGGED_IN);
+
+ assertEquals(EXPECTED_FLAG, currentFlag);
+
+ // Since this app doesn't have permission(and shouldn't have) to change global setting, we
+ // can only tearDown in this way
+ if (prevFlag != currentFlag) {
+ onView(withText(R.string.keep_screen_on)).perform(click());
+ }
+ }
+}
diff --git a/tests/app/src/com/android/settings/tests/Manufacturer.java b/tests/app/src/com/android/settings/tests/Manufacturer.java
new file mode 100644
index 0000000000000000000000000000000000000000..692e6a8c287594d37b8c85b56aee0ed73ffb1ad4
--- /dev/null
+++ b/tests/app/src/com/android/settings/tests/Manufacturer.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.tests;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class Manufacturer extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.manufacturer_main);
+ }
+}
diff --git a/tests/app/src/com/android/settings/tests/Operator.java b/tests/app/src/com/android/settings/tests/Operator.java
new file mode 100644
index 0000000000000000000000000000000000000000..8a34363da2a9593b65c565c8c7a6921f44f92ffd
--- /dev/null
+++ b/tests/app/src/com/android/settings/tests/Operator.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.tests;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class Operator extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.operator_main);
+ }
+
+}
diff --git a/tests/app/src/com/android/settings/tests/PrivateVolumeSettingsTest.java b/tests/app/src/com/android/settings/tests/PrivateVolumeSettingsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..6289f1b449af95ccbfc33d49a913d845db17e652
--- /dev/null
+++ b/tests/app/src/com/android/settings/tests/PrivateVolumeSettingsTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.tests;
+
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import com.android.settings.Settings;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class PrivateVolumeSettingsTest {
+ @Test
+ public void test_ManageStorageNotShown() {
+ Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ instrumentation.startActivitySync(
+ new Intent(android.provider.Settings.ACTION_INTERNAL_STORAGE_SETTINGS));
+ onView(withText(com.android.settings.R.string.storage_menu_manage)).check(doesNotExist());
+ }
+}
\ No newline at end of file
diff --git a/tests/app/src/com/android/settings/tests/SettingsLaunchPerformance.java b/tests/app/src/com/android/settings/tests/SettingsLaunchPerformance.java
new file mode 100644
index 0000000000000000000000000000000000000000..225a60b6309ed6b1ad281ae78ef9e57e7cb1303c
--- /dev/null
+++ b/tests/app/src/com/android/settings/tests/SettingsLaunchPerformance.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.tests;
+
+import android.app.Activity;
+import android.test.LaunchPerformanceBase;
+import android.os.Bundle;
+
+import java.util.Map;
+
+/**
+ * Instrumentation class for Settings launch performance testing.
+ */
+public class SettingsLaunchPerformance extends LaunchPerformanceBase {
+
+ public static final String LOG_TAG = "SettingsLaunchPerformance";
+
+ public SettingsLaunchPerformance() {
+ super();
+ }
+
+ @Override
+ public void onCreate(Bundle arguments) {
+ super.onCreate(arguments);
+
+ mIntent.setClassName(getTargetContext(), "com.android.settings.Settings");
+ start();
+ }
+
+ /**
+ * Calls LaunchApp and finish.
+ */
+ @Override
+ public void onStart() {
+ super.onStart();
+ LaunchApp();
+ finish(Activity.RESULT_OK, mResults);
+ }
+}
diff --git a/tests/app/src/com/android/settings/tests/SettingsRestoreAfterCloseTest.java b/tests/app/src/com/android/settings/tests/SettingsRestoreAfterCloseTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..96bc78c9f00b79994a5acfa9d00a879452c09d63
--- /dev/null
+++ b/tests/app/src/com/android/settings/tests/SettingsRestoreAfterCloseTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.tests;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.Until;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class SettingsRestoreAfterCloseTest {
+ private static final String PACKAGE_SETTINGS = "com.android.settings";
+ private static final int TIME_OUT = 2000;
+
+ private boolean mAlwaysFinish;
+
+ @Before
+ public void setUp() throws Exception {
+ // To make sure when we press home button, the activity will be destroyed by OS
+ Context context = InstrumentationRegistry.getContext();
+ mAlwaysFinish = Settings.Global.getInt(
+ context.getContentResolver(), Settings.Global
+ .ALWAYS_FINISH_ACTIVITIES, 0)
+ != 0;
+
+ ActivityManager.getService().setAlwaysFinish(true);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ ActivityManager.getService().setAlwaysFinish(mAlwaysFinish);
+ }
+
+ @Test
+ public void testRtlStability_AppCloseAndReOpen_shouldNotCrash() throws Exception {
+
+ final UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation
+ ());
+ uiDevice.pressHome();
+
+ // Open the settings app
+ startSettingsMainActivity(uiDevice);
+
+ // Press home button
+ uiDevice.pressHome();
+ final String launcherPackage = uiDevice.getLauncherPackageName();
+ uiDevice.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)), TIME_OUT);
+
+ // Open the settings again
+ startSettingsMainActivity(uiDevice);
+ }
+
+ private void startSettingsMainActivity(UiDevice uiDevice) {
+ Context context = InstrumentationRegistry.getContext();
+ context.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS));
+ uiDevice.wait(Until.hasObject(By.pkg(PACKAGE_SETTINGS).depth(0)), TIME_OUT);
+ }
+}
diff --git a/tests/app/src/com/android/settings/users/UserSettingsTest.java b/tests/app/src/com/android/settings/users/UserSettingsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..06e2bdde3f1ac4198c982145beda6824e2bbe133
--- /dev/null
+++ b/tests/app/src/com/android/settings/users/UserSettingsTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.users;
+
+import android.content.Context;
+import android.content.Intent;
+import android.support.test.filters.SmallTest;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObject;
+import android.support.test.uiautomator.UiSelector;
+import android.support.test.uiautomator.UiScrollable;
+import android.test.InstrumentationTestCase;
+
+import com.android.settings.R;
+
+import org.junit.Test;
+
+@SmallTest
+public class UserSettingsTest extends InstrumentationTestCase {
+
+ private static final String USER_AND_ACCOUNTS = "Users & accounts";
+ private static final String USERS = "Users";
+ private static final String EMERGNENCY_INFO = "Emergency information";
+ private static final String ADD_USERS_WHEN_LOCKED = "Add users";
+
+ private UiDevice mDevice;
+ private Context mContext;
+ private String mTargetPackage;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mDevice = UiDevice.getInstance(getInstrumentation());
+ mContext = getInstrumentation().getTargetContext();
+ mTargetPackage = mContext.getPackageName();
+ }
+
+ @Test
+ public void testEmergencyInfoNotExists() throws Exception {
+ launchUserSettings();
+ UiObject emergencyInfoPreference =
+ mDevice.findObject(new UiSelector().text(EMERGNENCY_INFO));
+ assertFalse(emergencyInfoPreference.exists());
+ }
+
+ @Test
+ public void testAddUsersWhenLockedNotExists() throws Exception {
+ launchUserSettings();
+ UiObject addUsersPreference =
+ mDevice.findObject(new UiSelector().text(ADD_USERS_WHEN_LOCKED));
+ assertFalse(addUsersPreference.exists());
+ }
+
+ private void launchSettings() {
+ Intent settingsIntent = new Intent(Intent.ACTION_MAIN)
+ .addCategory(Intent.CATEGORY_LAUNCHER)
+ .setPackage(mTargetPackage)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ getInstrumentation().getContext().startActivity(settingsIntent);
+ }
+
+ private void launchUserSettings() throws Exception {
+ launchSettings();
+ final UiScrollable settings = new UiScrollable(
+ new UiSelector().packageName(mTargetPackage).scrollable(true));
+ final String titleUsersAndAccounts = USER_AND_ACCOUNTS;
+ settings.scrollTextIntoView(titleUsersAndAccounts);
+ mDevice.findObject(new UiSelector().text(titleUsersAndAccounts)).click();
+ mDevice.findObject(new UiSelector().text(USERS)).click();
+ }
+
+}
diff --git a/tests/app/src/com/android/settings/vpn2/CertInstallerHelper.java b/tests/app/src/com/android/settings/vpn2/CertInstallerHelper.java
new file mode 100644
index 0000000000000000000000000000000000000000..fa2638ff9951f0ae3cd72b4900a5aba17adfdcdb
--- /dev/null
+++ b/tests/app/src/com/android/settings/vpn2/CertInstallerHelper.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.vpn2;
+
+import android.os.Environment;
+import android.security.Credentials;
+import android.security.KeyStore;
+import android.util.Log;
+
+import com.android.internal.net.VpnProfile;
+import com.android.org.bouncycastle.asn1.ASN1InputStream;
+import com.android.org.bouncycastle.asn1.ASN1Sequence;
+import com.android.org.bouncycastle.asn1.DEROctetString;
+import com.android.org.bouncycastle.asn1.x509.BasicConstraints;
+
+import junit.framework.Assert;
+
+import libcore.io.Streams;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.KeyStore.PasswordProtection;
+import java.security.KeyStore.PrivateKeyEntry;
+import java.security.PrivateKey;
+import java.security.UnrecoverableEntryException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+
+/**
+ * Certificate installer helper to extract information from a provided file
+ * and install certificates to keystore.
+ */
+public class CertInstallerHelper {
+ private static final String TAG = "CertInstallerHelper";
+ /* Define a password to unlock keystore after it is reset */
+ private static final String CERT_STORE_PASSWORD = "password";
+ private final int mUid = KeyStore.UID_SELF;
+ private PrivateKey mUserKey; // private key
+ private X509Certificate mUserCert; // user certificate
+ private List mCaCerts = new ArrayList();
+ private KeyStore mKeyStore = KeyStore.getInstance();
+
+ /**
+ * Unlock keystore and set password
+ */
+ public CertInstallerHelper() {
+ mKeyStore.reset();
+ mKeyStore.onUserPasswordChanged(CERT_STORE_PASSWORD);
+ }
+
+ private void extractCertificate(String certFile, String password) {
+ InputStream in = null;
+ final byte[] raw;
+ java.security.KeyStore keystore = null;
+ try {
+ // Read .p12 file from SDCARD and extract with password
+ in = new FileInputStream(new File(
+ Environment.getExternalStorageDirectory(), certFile));
+ raw = Streams.readFully(in);
+
+ keystore = java.security.KeyStore.getInstance("PKCS12");
+ PasswordProtection passwordProtection = new PasswordProtection(password.toCharArray());
+ keystore.load(new ByteArrayInputStream(raw), passwordProtection.getPassword());
+
+ // Install certificates and private keys
+ Enumeration aliases = keystore.aliases();
+ if (!aliases.hasMoreElements()) {
+ Assert.fail("key store failed to put in keychain");
+ }
+ ArrayList aliasesList = Collections.list(aliases);
+ // The keystore is initialized for each test case, there will
+ // be only one alias in the keystore
+ Assert.assertEquals(1, aliasesList.size());
+ String alias = aliasesList.get(0);
+ java.security.KeyStore.Entry entry = keystore.getEntry(alias, passwordProtection);
+ Log.d(TAG, "extracted alias = " + alias + ", entry=" + entry.getClass());
+
+ if (entry instanceof PrivateKeyEntry) {
+ Assert.assertTrue(installFrom((PrivateKeyEntry) entry));
+ }
+ } catch (IOException e) {
+ Assert.fail("Failed to read certficate: " + e);
+ } catch (KeyStoreException e) {
+ Log.e(TAG, "failed to extract certificate" + e);
+ } catch (NoSuchAlgorithmException e) {
+ Log.e(TAG, "failed to extract certificate" + e);
+ } catch (CertificateException e) {
+ Log.e(TAG, "failed to extract certificate" + e);
+ } catch (UnrecoverableEntryException e) {
+ Log.e(TAG, "failed to extract certificate" + e);
+ }
+ finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ Log.e(TAG, "close FileInputStream error: " + e);
+ }
+ }
+ }
+ }
+
+ /**
+ * Extract private keys, user certificates and ca certificates
+ */
+ private synchronized boolean installFrom(PrivateKeyEntry entry) {
+ mUserKey = entry.getPrivateKey();
+ mUserCert = (X509Certificate) entry.getCertificate();
+
+ Certificate[] certs = entry.getCertificateChain();
+ Log.d(TAG, "# certs extracted = " + certs.length);
+ mCaCerts = new ArrayList(certs.length);
+ for (Certificate c : certs) {
+ X509Certificate cert = (X509Certificate) c;
+ if (isCa(cert)) {
+ mCaCerts.add(cert);
+ }
+ }
+ Log.d(TAG, "# ca certs extracted = " + mCaCerts.size());
+ return true;
+ }
+
+ private boolean isCa(X509Certificate cert) {
+ try {
+ byte[] asn1EncodedBytes = cert.getExtensionValue("2.5.29.19");
+ if (asn1EncodedBytes == null) {
+ return false;
+ }
+ DEROctetString derOctetString = (DEROctetString)
+ new ASN1InputStream(asn1EncodedBytes).readObject();
+ byte[] octets = derOctetString.getOctets();
+ ASN1Sequence sequence = (ASN1Sequence)
+ new ASN1InputStream(octets).readObject();
+ return BasicConstraints.getInstance(sequence).isCA();
+ } catch (IOException e) {
+ return false;
+ }
+ }
+
+ /**
+ * Extract certificate from the given file, and install it to keystore
+ * @param name certificate name
+ * @param certFile .p12 file which includes certificates
+ * @param password password to extract the .p12 file
+ */
+ public void installCertificate(VpnProfile profile, String certFile, String password) {
+ // extract private keys, certificates from the provided file
+ extractCertificate(certFile, password);
+ // install certificate to the keystore
+ int flags = KeyStore.FLAG_ENCRYPTED;
+ try {
+ if (mUserKey != null) {
+ Log.v(TAG, "has private key");
+ String key = Credentials.USER_PRIVATE_KEY + profile.ipsecUserCert;
+ byte[] value = mUserKey.getEncoded();
+
+ if (!mKeyStore.importKey(key, value, mUid, flags)) {
+ Log.e(TAG, "Failed to install " + key + " as user " + mUid);
+ return;
+ }
+ Log.v(TAG, "install " + key + " as user " + mUid + " is successful");
+ }
+
+ if (mUserCert != null) {
+ String certName = Credentials.USER_CERTIFICATE + profile.ipsecUserCert;
+ byte[] certData = Credentials.convertToPem(mUserCert);
+
+ if (!mKeyStore.put(certName, certData, mUid, flags)) {
+ Log.e(TAG, "Failed to install " + certName + " as user " + mUid);
+ return;
+ }
+ Log.v(TAG, "install " + certName + " as user" + mUid + " is successful.");
+ }
+
+ if (!mCaCerts.isEmpty()) {
+ String caListName = Credentials.CA_CERTIFICATE + profile.ipsecCaCert;
+ X509Certificate[] caCerts = mCaCerts.toArray(new X509Certificate[mCaCerts.size()]);
+ byte[] caListData = Credentials.convertToPem(caCerts);
+
+ if (!mKeyStore.put(caListName, caListData, mUid, flags)) {
+ Log.e(TAG, "Failed to install " + caListName + " as user " + mUid);
+ return;
+ }
+ Log.v(TAG, " install " + caListName + " as user " + mUid + " is successful");
+ }
+ } catch (CertificateEncodingException e) {
+ Log.e(TAG, "Exception while convert certificates to pem " + e);
+ throw new AssertionError(e);
+ } catch (IOException e) {
+ Log.e(TAG, "IOException while convert to pem: " + e);
+ }
+ }
+
+ public int getUid() {
+ return mUid;
+ }
+}
diff --git a/tests/app/src/com/android/settings/vpn2/VpnInfo.java b/tests/app/src/com/android/settings/vpn2/VpnInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..ab7fb0f3d07b82fd92ca7d53fa9441d5261fb139
--- /dev/null
+++ b/tests/app/src/com/android/settings/vpn2/VpnInfo.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.vpn2;
+
+import com.android.internal.net.VpnProfile;
+
+/**
+ * Wrapper for VPN Profile and associated certificate files
+ */
+public class VpnInfo {
+ // VPN Profile
+ private VpnProfile mVpnProfile;
+ // Certificate file in PC12 format for user certificates and private keys
+ private String mCertificateFile = null;
+ // Password to extract certificates from the file
+ private String mPassword = null;
+
+ public VpnInfo(VpnProfile vpnProfile, String certFile, String password) {
+ mVpnProfile = vpnProfile;
+ mCertificateFile = certFile;
+ mPassword = password;
+ }
+
+ public VpnInfo(VpnProfile vpnProfile) {
+ mVpnProfile = vpnProfile;
+ }
+
+ public void setVpnProfile(VpnProfile vpnProfile) {
+ mVpnProfile = vpnProfile;
+ }
+
+ public void setCertificateFile(String certFile) {
+ mCertificateFile = certFile;
+ }
+
+ public void setPassword(String password) {
+ mPassword = password;
+ }
+
+ public VpnProfile getVpnProfile() {
+ return mVpnProfile;
+ }
+
+ public String getCertificateFile() {
+ return mCertificateFile;
+ }
+
+ public String getPassword() {
+ return mPassword;
+ }
+}
diff --git a/tests/app/src/com/android/settings/vpn2/VpnProfileParser.java b/tests/app/src/com/android/settings/vpn2/VpnProfileParser.java
new file mode 100644
index 0000000000000000000000000000000000000000..51c2550eb1d7552e2c182a253d04a90607da2b16
--- /dev/null
+++ b/tests/app/src/com/android/settings/vpn2/VpnProfileParser.java
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.vpn2;
+
+import android.util.Log;
+
+import com.android.internal.net.VpnProfile;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+/**
+ * Parse VPN profiles from an XML file
+ */
+public class VpnProfileParser {
+ private final static String TAG = "VpnProfileParser";
+ private static Map mVpnPool = new HashMap();
+
+ static DefaultHandler mHandler = new DefaultHandler() {
+ boolean name;
+ boolean type;
+ boolean server;
+ boolean username;
+ boolean password;
+ boolean dnsServers;
+ boolean searchDomains;
+ boolean routes;
+ boolean mppe;
+ boolean l2tpSecret;
+ boolean ipsecIdentifier;
+ boolean ipsecSecret;
+ boolean ipsecUserCert;
+ boolean ipsecCaCert;
+ boolean ipsecServerCert;
+ boolean certFile;
+ boolean certFilePassword;
+ VpnProfile profile = null;
+ VpnInfo vpnInfo = null;
+
+
+ @Override
+ public void startElement(String uri, String localName, String tagName,
+ Attributes attributes) throws SAXException {
+ if (tagName.equalsIgnoreCase("vpn")) {
+ //create a new VPN profile
+ profile = new VpnProfile(Long.toHexString(System.currentTimeMillis()));
+ vpnInfo = new VpnInfo(profile);
+ }
+ if (tagName.equalsIgnoreCase("name")) {
+ name = true;
+ }
+ if (tagName.equalsIgnoreCase("type")) {
+ type = true;
+ }
+ if (tagName.equalsIgnoreCase("server")) {
+ server = true;
+ }
+ if (tagName.equalsIgnoreCase("username")) {
+ username = true;
+ }
+ if (tagName.equalsIgnoreCase("password")) {
+ password = true;
+ }
+ if (tagName.equalsIgnoreCase("dnsServers")) {
+ dnsServers = true;
+ }
+ if (tagName.equalsIgnoreCase("searchDomains")) {
+ searchDomains = true;
+ }
+ if (tagName.equalsIgnoreCase("mppe")) {
+ mppe = true;
+ }
+ if (tagName.equalsIgnoreCase("l2tpSecret")) {
+ l2tpSecret = true;
+ }
+ if (tagName.equalsIgnoreCase("ipsecIdentifier")) {
+ ipsecIdentifier = true;
+ }
+ if (tagName.equalsIgnoreCase("ipsecSecret")) {
+ ipsecSecret = true;
+ }
+ if (tagName.equalsIgnoreCase("ipsecUserCert")) {
+ ipsecUserCert = true;
+ }
+ if (tagName.equalsIgnoreCase("ipsecCaCert")) {
+ ipsecCaCert = true;
+ }
+ if (tagName.equalsIgnoreCase("ipsecServerCert")) {
+ ipsecServerCert = true;
+ }
+ if (tagName.equalsIgnoreCase("routes")) {
+ routes = true;
+ }
+ if (tagName.equalsIgnoreCase("cert-file")) {
+ certFile = true;
+ }
+ if (tagName.equalsIgnoreCase("cert-file-password")) {
+ certFilePassword = true;
+ }
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String tagName) throws SAXException {
+ if (tagName.equalsIgnoreCase("vpn")) {
+ mVpnPool.put(profile.type, vpnInfo);
+ }
+ }
+
+ @Override
+ public void characters(char ch[], int start, int length) throws SAXException {
+ String strValue = new String(ch, start, length);
+ if (name) {
+ profile.name = strValue;
+ name = false;
+ }
+ if (type) {
+ int t = getVpnProfileType(strValue);
+ if (t < 0) {
+ throw new SAXException("not a valid VPN type");
+ } else {
+ profile.type = t;
+ }
+ type = false;
+ }
+ if (server) {
+ profile.server = strValue;
+ server = false;
+ }
+ if (username) {
+ profile.username = strValue;
+ username = false;
+ }
+ if (password) {
+ profile.password = strValue;
+ password = false;
+ }
+ if (dnsServers) {
+ profile.dnsServers = strValue;
+ dnsServers = false;
+ }
+ if (searchDomains) {
+ profile.searchDomains = strValue;
+ searchDomains = false;
+ }
+ if (mppe) {
+ profile.mppe = Boolean.valueOf(strValue);
+ mppe = false;
+ }
+ if (l2tpSecret) {
+ profile.l2tpSecret = strValue;
+ l2tpSecret = false;
+ }
+ if (ipsecIdentifier) {
+ profile.ipsecIdentifier = strValue;
+ ipsecIdentifier = false;
+ }
+ if (ipsecSecret) {
+ profile.ipsecSecret = strValue;
+ ipsecSecret = false;
+ }
+ if (ipsecUserCert) {
+ profile.ipsecUserCert = strValue;
+ ipsecUserCert = false;
+ }
+ if (ipsecCaCert) {
+ profile.ipsecCaCert = strValue;
+ ipsecCaCert = false;
+ }
+ if (ipsecServerCert) {
+ profile.ipsecServerCert = strValue;
+ ipsecServerCert = false;
+ }
+ if (routes) {
+ profile.routes = strValue;
+ routes = false;
+ }
+ if (certFile) {
+ vpnInfo.setCertificateFile(strValue);
+ certFile = false;
+ }
+ if (certFilePassword) {
+ vpnInfo.setPassword(strValue);
+ certFilePassword = false;
+ }
+ }
+
+ private int getVpnProfileType(String type) {
+ if (type.equalsIgnoreCase("TYPE_PPTP")) {
+ return VpnProfile.TYPE_PPTP;
+ } else if (type.equalsIgnoreCase("TYPE_L2TP_IPSEC_PSK")) {
+ return VpnProfile.TYPE_L2TP_IPSEC_PSK;
+ } else if (type.equalsIgnoreCase("TYPE_L2TP_IPSEC_RSA")) {
+ return VpnProfile.TYPE_L2TP_IPSEC_RSA;
+ } else if (type.equalsIgnoreCase("TYPE_IPSEC_XAUTH_PSK")) {
+ return VpnProfile.TYPE_IPSEC_XAUTH_PSK;
+ } else if (type.equalsIgnoreCase("TYPE_IPSEC_XAUTH_RSA")) {
+ return VpnProfile.TYPE_IPSEC_XAUTH_RSA;
+ } else if (type.equalsIgnoreCase("TYPE_IPSEC_HYBRID_RSA")) {
+ return VpnProfile.TYPE_IPSEC_HYBRID_RSA;
+ } else {
+ Log.v(TAG, "Invalid VPN type: " + type);
+ return -1;
+ }
+ }
+ };
+
+ public static Map parse(InputStream in) {
+ try {
+ SAXParserFactory factory = SAXParserFactory.newInstance();
+ SAXParser saxParser = factory.newSAXParser();
+ saxParser.parse(in, mHandler);
+ } catch (SAXException e) {
+ Log.e(TAG, "Parse vpn profile exception: " + e.toString());
+ } catch (IOException e) {
+ Log.e(TAG, "Parse vpn profile exception: " + e.toString());
+ } catch (ParserConfigurationException e) {
+ Log.e(TAG, "Parse vpn profile exception: " + e.toString());
+ } finally {
+ return mVpnPool;
+ }
+ }
+}
diff --git a/tests/app/src/com/android/settings/vpn2/VpnTests.java b/tests/app/src/com/android/settings/vpn2/VpnTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..11e82655c69e9cb2561129a064fdea305a229ec1
--- /dev/null
+++ b/tests/app/src/com/android/settings/vpn2/VpnTests.java
@@ -0,0 +1,446 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.vpn2;
+
+import android.content.Context;
+import android.net.IConnectivityManager;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+import android.security.Credentials;
+import android.security.KeyStore;
+import android.security.NetworkSecurityPolicy;
+import android.test.InstrumentationTestCase;
+import android.test.InstrumentationTestRunner;
+import android.test.suitebuilder.annotation.LargeTest;
+import android.util.Log;
+
+import com.android.internal.net.LegacyVpnInfo;
+import com.android.internal.net.VpnConfig;
+import com.android.internal.net.VpnProfile;
+
+import java.net.HttpURLConnection;
+import java.net.URL;
+import junit.framework.Assert;
+
+import libcore.io.Streams;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.UnknownHostException;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Legacy VPN connection tests
+ *
+ * To run the test, use command:
+ * adb shell am instrument -e class com.android.settings.vpn2.VpnTests -e profile foo.xml
+ * -w com.android.settings.tests/android.test.InstrumentationTestRunner
+ *
+ * VPN profiles are saved in an xml file and will be loaded through {@link VpnProfileParser}.
+ * Push the profile (foo.xml) to the external storage, e.g adb push foo.xml /sdcard/ before running
+ * the above command.
+ *
+ * A typical profile looks like the following:
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ * VPN types include: TYPE_PPTP, TYPE_L2TP_IPSEC_PSK, TYPE_L2TP_IPSEC_RSA,
+ * TYPE_IPSEC_XAUTH_PSK, TYPE_IPSEC_XAUTH_RSA, TYPE_IPSEC_HYBRID_RSA
+ */
+public class VpnTests extends InstrumentationTestCase {
+ private static final String TAG = "VpnTests";
+ /* Maximum time to wait for VPN connection */
+ private static final long MAX_CONNECTION_TIME = 5 * 60 * 1000;
+ private static final long VPN_STAY_TIME = 60 * 1000;
+ private static final int MAX_DISCONNECTION_TRIES = 3;
+ private static final String EXTERNAL_SERVER =
+ "http://ip2country.sourceforge.net/ip2c.php?format=JSON";
+ private static final String VPN_INTERFACE = "ppp0";
+ private final IConnectivityManager mService = IConnectivityManager.Stub
+ .asInterface(ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
+ private Map mVpnInfoPool = null;
+ private Context mContext;
+ private CertInstallerHelper mCertHelper = null;
+ private KeyStore mKeyStore = KeyStore.getInstance();
+ private String mPreviousIpAddress = null;
+ private boolean DEBUG = false;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ InputStream in = null;
+ InstrumentationTestRunner mRunner = (InstrumentationTestRunner)getInstrumentation();
+ mContext = mRunner.getContext();
+ Bundle arguments = mRunner.getArguments();
+ String PROFILE_NAME = arguments.getString("profile");
+ Assert.assertNotNull("Push profile to external storage and load with"
+ + "'-e profile '", PROFILE_NAME);
+ File profileFile = new File(Environment.getExternalStorageDirectory(), PROFILE_NAME);
+ in = new FileInputStream(profileFile);
+ mVpnInfoPool = VpnProfileParser.parse(in);
+ Assert.assertNotNull("no VPN profiles are parsed", mVpnInfoPool);
+ if (DEBUG) {
+ Log.v(TAG, "print out the vpn profiles");
+ for (Map.Entry profileEntrySet: mVpnInfoPool.entrySet()) {
+ VpnInfo vpnInfo = profileEntrySet.getValue();
+ printVpnProfile(vpnInfo.getVpnProfile());
+ if (vpnInfo.getCertificateFile() != null) {
+ Log.d(TAG, "certificate file for this vpn is " + vpnInfo.getCertificateFile());
+ }
+ if (vpnInfo.getPassword() != null) {
+ Log.d(TAG, "password for the certificate file is: " + vpnInfo.getPassword());
+ }
+ }
+ }
+ // disconnect existing vpn if there is any
+ LegacyVpnInfo oldVpn = mService.getLegacyVpnInfo(UserHandle.myUserId());
+ if (oldVpn != null) {
+ Log.v(TAG, "disconnect legacy VPN");
+ disconnect();
+ // wait till the legacy VPN is disconnected.
+ int tries = 0;
+ while (tries < MAX_DISCONNECTION_TRIES &&
+ mService.getLegacyVpnInfo(UserHandle.myUserId()) != null) {
+ tries++;
+ Thread.sleep(10 * 1000);
+ Log.v(TAG, "Wait for legacy VPN to be disconnected.");
+ }
+ Assert.assertNull("Failed to disconect VPN",
+ mService.getLegacyVpnInfo(UserHandle.myUserId()));
+ // wait for 30 seconds after the previous VPN is disconnected.
+ sleep(30 * 1000);
+ }
+ // Create CertInstallerHelper to initialize the keystore
+ mCertHelper = new CertInstallerHelper();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ sleep(VPN_STAY_TIME);
+ super.tearDown();
+ }
+
+ private void printVpnProfile(VpnProfile profile) {
+ Log.v(TAG, "profile: ");
+ Log.v(TAG, "key: " + profile.key);
+ Log.v(TAG, "name: " + profile.name);
+ Log.v(TAG, "type: " + profile.type);
+ Log.v(TAG, "server: " + profile.server);
+ Log.v(TAG, "username: " + profile.username);
+ Log.v(TAG, "password: " + profile.password);
+ Log.v(TAG, "dnsServers: " + profile.dnsServers);
+ Log.v(TAG, "searchDomains: " + profile.searchDomains);
+ Log.v(TAG, "routes: " + profile.routes);
+ Log.v(TAG, "mppe: " + profile.mppe);
+ Log.v(TAG, "l2tpSecret: " + profile.l2tpSecret);
+ Log.v(TAG, "ipsecIdentifier: " + profile.ipsecIdentifier);
+ Log.v(TAG, "ipsecSecret: " + profile.ipsecSecret);
+ Log.v(TAG, "ipsecUserCert: " + profile.ipsecUserCert);
+ Log.v(TAG, "ipsecCaCert: " + profile.ipsecCaCert);
+ Log.v(TAG, "ipsecServerCert: " + profile.ipsecServerCert);
+ }
+
+ private void printKeyStore(VpnProfile profile) {
+ // print out the information from keystore
+ String privateKey = "";
+ String userCert = "";
+ String caCert = "";
+ String serverCert = "";
+ if (!profile.ipsecUserCert.isEmpty()) {
+ privateKey = Credentials.USER_PRIVATE_KEY + profile.ipsecUserCert;
+ byte[] value = mKeyStore.get(Credentials.USER_CERTIFICATE + profile.ipsecUserCert);
+ userCert = (value == null) ? null : new String(value, StandardCharsets.UTF_8);
+ }
+ if (!profile.ipsecCaCert.isEmpty()) {
+ byte[] value = mKeyStore.get(Credentials.CA_CERTIFICATE + profile.ipsecCaCert);
+ caCert = (value == null) ? null : new String(value, StandardCharsets.UTF_8);
+ }
+ if (!profile.ipsecServerCert.isEmpty()) {
+ byte[] value = mKeyStore.get(Credentials.USER_CERTIFICATE + profile.ipsecServerCert);
+ serverCert = (value == null) ? null : new String(value, StandardCharsets.UTF_8);
+ }
+ Log.v(TAG, "privateKey: \n" + ((privateKey == null) ? "" : privateKey));
+ Log.v(TAG, "userCert: \n" + ((userCert == null) ? "" : userCert));
+ Log.v(TAG, "caCert: \n" + ((caCert == null) ? "" : caCert));
+ Log.v(TAG, "serverCert: \n" + ((serverCert == null) ? "" : serverCert));
+ }
+
+ /**
+ * Connect legacy VPN
+ */
+ private void connect(VpnProfile profile) throws Exception {
+ try {
+ mService.startLegacyVpn(profile);
+ } catch (IllegalStateException e) {
+ fail(String.format("start legacy vpn: %s failed: %s", profile.name, e.toString()));
+ }
+ }
+
+ /**
+ * Disconnect legacy VPN
+ */
+ private void disconnect() throws Exception {
+ try {
+ mService.prepareVpn(VpnConfig.LEGACY_VPN, VpnConfig.LEGACY_VPN, UserHandle.myUserId());
+ } catch (RemoteException e) {
+ Log.e(TAG, String.format("disconnect VPN exception: %s", e.toString()));
+ }
+ }
+
+ /**
+ * Get external IP address
+ */
+ private String getIpAddress() {
+ String ip = null;
+ HttpURLConnection urlConnection = null;
+ // TODO: Rewrite this test to use an HTTPS URL.
+ // Because this test uses cleartext HTTP, the network security policy of this app needs to
+ // be temporarily relaxed to permit such traffic.
+ NetworkSecurityPolicy networkSecurityPolicy = NetworkSecurityPolicy.getInstance();
+ boolean cleartextTrafficPermittedBeforeTest =
+ networkSecurityPolicy.isCleartextTrafficPermitted();
+ networkSecurityPolicy.setCleartextTrafficPermitted(true);
+ try {
+ URL url = new URL(EXTERNAL_SERVER);
+ urlConnection = (HttpURLConnection) url.openConnection();
+ Log.i(TAG, "Response from httpget: " + urlConnection.getResponseCode());
+
+ InputStream is = urlConnection.getInputStream();
+ String response;
+ try {
+ response = new String(Streams.readFully(is), StandardCharsets.UTF_8);
+ } finally {
+ is.close();
+ }
+
+ JSONObject json_data = new JSONObject(response);
+ ip = json_data.getString("ip");
+ Log.v(TAG, "json_data: " + ip);
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "exception while getting external IP: " + e.toString());
+ } catch (IOException e) {
+ Log.e(TAG, "IOException while getting IP: " + e.toString());
+ } catch (JSONException e) {
+ Log.e(TAG, "exception while creating JSONObject: " + e.toString());
+ } finally {
+ networkSecurityPolicy.setCleartextTrafficPermitted(cleartextTrafficPermittedBeforeTest);
+ if (urlConnection != null) {
+ urlConnection.disconnect();
+ }
+ }
+ return ip;
+ }
+
+ /**
+ * Verify the vpn connection by checking the VPN state and external IP
+ */
+ private void validateVpnConnection(VpnProfile profile) throws Exception {
+ validateVpnConnection(profile, false);
+ }
+
+ /**
+ * Verify the vpn connection by checking the VPN state, external IP or ping test
+ */
+ private void validateVpnConnection(VpnProfile profile, boolean pingTestFlag) throws Exception {
+ LegacyVpnInfo legacyVpnInfo = mService.getLegacyVpnInfo(UserHandle.myUserId());
+ Assert.assertTrue(legacyVpnInfo != null);
+
+ long start = System.currentTimeMillis();
+ while (((System.currentTimeMillis() - start) < MAX_CONNECTION_TIME) &&
+ (legacyVpnInfo.state != LegacyVpnInfo.STATE_CONNECTED)) {
+ Log.v(TAG, "vpn state: " + legacyVpnInfo.state);
+ sleep(10 * 1000);
+ legacyVpnInfo = mService.getLegacyVpnInfo(UserHandle.myUserId());
+ }
+
+ // the vpn state should be CONNECTED
+ Assert.assertTrue(legacyVpnInfo.state == LegacyVpnInfo.STATE_CONNECTED);
+ if (pingTestFlag) {
+ Assert.assertTrue(pingTest(profile.server));
+ } else {
+ String curIpAddress = getIpAddress();
+ // the outgoing IP address should be the same as the VPN server address
+ Assert.assertEquals(profile.server, curIpAddress);
+ }
+ }
+
+ private boolean pingTest(String server) {
+ final long PING_TIMER = 3 * 60 * 1000; // 3 minutes
+ if (server == null || server.isEmpty()) {
+ return false;
+ }
+ long startTime = System.currentTimeMillis();
+ while ((System.currentTimeMillis() - startTime) < PING_TIMER) {
+ try {
+ Log.v(TAG, "Start ping test, ping " + server);
+ Process p = Runtime.getRuntime().exec("ping -c 10 -w 100 " + server);
+ int status = p.waitFor();
+ if (status == 0) {
+ // if any of the ping test is successful, return true
+ return true;
+ }
+ } catch (UnknownHostException e) {
+ Log.e(TAG, "Ping test Fail: Unknown Host");
+ } catch (IOException e) {
+ Log.e(TAG, "Ping test Fail: IOException");
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Ping test Fail: InterruptedException");
+ }
+ }
+ // ping test timeout
+ return false;
+ }
+
+ /**
+ * Install certificates from a file loaded in external stroage on the device
+ * @param profile vpn profile
+ * @param fileName certificate file name
+ * @param password password to extract certificate file
+ */
+ private void installCertificatesFromFile(VpnProfile profile, String fileName, String password)
+ throws Exception {
+ if (profile == null || fileName == null || password == null) {
+ throw new Exception ("vpn profile, certificate file name and password can not be null");
+ }
+
+ int curUid = mContext.getUserId();
+ mCertHelper.installCertificate(profile, fileName, password);
+
+ if (DEBUG) {
+ printKeyStore(profile);
+ }
+ }
+
+ private void sleep(long time) {
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ Log.e(TAG, "interrupted: " + e.toString());
+ }
+ }
+
+ /**
+ * Test PPTP VPN connection
+ */
+ @LargeTest
+ public void testPPTPConnection() throws Exception {
+ mPreviousIpAddress = getIpAddress();
+ VpnInfo curVpnInfo = mVpnInfoPool.get(VpnProfile.TYPE_PPTP);
+ VpnProfile vpnProfile = curVpnInfo.getVpnProfile();
+ connect(vpnProfile);
+ validateVpnConnection(vpnProfile);
+ }
+
+ /**
+ * Test L2TP/IPSec PSK VPN connection
+ */
+ @LargeTest
+ public void testL2tpIpsecPskConnection() throws Exception {
+ mPreviousIpAddress = getIpAddress();
+ VpnInfo curVpnInfo = mVpnInfoPool.get(VpnProfile.TYPE_L2TP_IPSEC_PSK);
+ VpnProfile vpnProfile = curVpnInfo.getVpnProfile();
+ connect(vpnProfile);
+ validateVpnConnection(vpnProfile);
+ }
+
+ /**
+ * Test L2TP/IPSec RSA VPN connection
+ */
+ @LargeTest
+ public void testL2tpIpsecRsaConnection() throws Exception {
+ mPreviousIpAddress = getIpAddress();
+ VpnInfo curVpnInfo = mVpnInfoPool.get(VpnProfile.TYPE_L2TP_IPSEC_RSA);
+ VpnProfile vpnProfile = curVpnInfo.getVpnProfile();
+ if (DEBUG) {
+ printVpnProfile(vpnProfile);
+ }
+ String certFile = curVpnInfo.getCertificateFile();
+ String password = curVpnInfo.getPassword();
+ installCertificatesFromFile(vpnProfile, certFile, password);
+ connect(vpnProfile);
+ validateVpnConnection(vpnProfile);
+ }
+
+ /**
+ * Test IPSec Xauth RSA VPN connection
+ */
+ @LargeTest
+ public void testIpsecXauthRsaConnection() throws Exception {
+ mPreviousIpAddress = getIpAddress();
+ VpnInfo curVpnInfo = mVpnInfoPool.get(VpnProfile.TYPE_IPSEC_XAUTH_RSA);
+ VpnProfile vpnProfile = curVpnInfo.getVpnProfile();
+ if (DEBUG) {
+ printVpnProfile(vpnProfile);
+ }
+ String certFile = curVpnInfo.getCertificateFile();
+ String password = curVpnInfo.getPassword();
+ installCertificatesFromFile(vpnProfile, certFile, password);
+ connect(vpnProfile);
+ validateVpnConnection(vpnProfile);
+ }
+
+ /**
+ * Test IPSec Xauth PSK VPN connection
+ */
+ @LargeTest
+ public void testIpsecXauthPskConnection() throws Exception {
+ VpnInfo curVpnInfo = mVpnInfoPool.get(VpnProfile.TYPE_IPSEC_XAUTH_PSK);
+ VpnProfile vpnProfile = curVpnInfo.getVpnProfile();
+ if (DEBUG) {
+ printVpnProfile(vpnProfile);
+ }
+ connect(vpnProfile);
+ validateVpnConnection(vpnProfile, true);
+ }
+
+ /**
+ * Test IPSec Hybrid RSA VPN connection
+ */
+ @LargeTest
+ public void testIpsecHybridRsaConnection() throws Exception {
+ mPreviousIpAddress = getIpAddress();
+ VpnInfo curVpnInfo = mVpnInfoPool.get(VpnProfile.TYPE_IPSEC_HYBRID_RSA);
+ VpnProfile vpnProfile = curVpnInfo.getVpnProfile();
+ if (DEBUG) {
+ printVpnProfile(vpnProfile);
+ }
+ connect(vpnProfile);
+ validateVpnConnection(vpnProfile);
+ }
+}
diff --git a/tests/robotests/Android.mk b/tests/robotests/Android.mk
new file mode 100644
index 0000000000000000000000000000000000000000..ae0102feaab97b82a0d22a798afb5d1f573dd91e
--- /dev/null
+++ b/tests/robotests/Android.mk
@@ -0,0 +1,43 @@
+#############################################
+# Settings Robolectric test target. #
+#############################################
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+# Include the testing libraries (JUnit4 + Robolectric libs).
+LOCAL_STATIC_JAVA_LIBRARIES := \
+ mockito-robolectric-prebuilt \
+ truth-prebuilt
+
+LOCAL_JAVA_LIBRARIES := \
+ junit \
+ platform-robolectric-prebuilt \
+ sdk_vcurrent \
+ telephony-common
+
+LOCAL_INSTRUMENTATION_FOR := Settings
+LOCAL_MODULE := SettingsRoboTests
+
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+#############################################################
+# Settings runner target to run the previous target. #
+#############################################################
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := RunSettingsRoboTests
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_STATIC_JAVA_LIBRARIES := \
+ SettingsRoboTests
+
+LOCAL_TEST_PACKAGE := Settings
+
+LOCAL_INSTRUMENT_SOURCE_DIRS := $(dir $(LOCAL_PATH))../src
+
+include prebuilts/misc/common/robolectric/run_robotests.mk
\ No newline at end of file
diff --git a/tests/robotests/assets/grandfather_not_implementing_index_provider b/tests/robotests/assets/grandfather_not_implementing_index_provider
new file mode 100644
index 0000000000000000000000000000000000000000..462388941c86fe00f6b1c2dd4f1c92bc1efa6d58
--- /dev/null
+++ b/tests/robotests/assets/grandfather_not_implementing_index_provider
@@ -0,0 +1,15 @@
+com.android.settings.bluetooth.DevicePickerFragment
+com.android.settings.bluetooth.BluetoothDeviceDetailsFragment
+com.android.settings.bluetooth.BluetoothPairingDetail
+com.android.settings.accounts.AccountDetailDashboardFragment
+com.android.settings.fuelgauge.PowerUsageAnomalyDetails
+com.android.settings.fuelgauge.AdvancedPowerUsageDetail
+com.android.settings.deviceinfo.StorageProfileFragment
+com.android.settings.wifi.details.WifiNetworkDetailsFragment
+com.android.settings.wifi.p2p.WifiP2pSettings
+com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionCamera
+com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionLocation
+com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionMicrophone
+com.android.settings.enterprise.ApplicationListFragment$EnterpriseInstalledPackages
+com.android.settings.enterprise.EnterpriseSetDefaultAppsListFragment
+com.android.settings.wifi.tether.WifiTetherSettings
diff --git a/tests/robotests/assets/grandfather_not_implementing_indexable b/tests/robotests/assets/grandfather_not_implementing_indexable
new file mode 100644
index 0000000000000000000000000000000000000000..1a978cdb421f1601587a10a8edb97574694617b9
--- /dev/null
+++ b/tests/robotests/assets/grandfather_not_implementing_indexable
@@ -0,0 +1,93 @@
+com.android.settings.location.LocationMode
+com.android.settings.notification.ZenModePrioritySettings
+com.android.settings.notification.ZenModeVisualInterruptionSettings
+com.android.settings.accessibility.ToggleScreenMagnificationPreferenceFragment
+com.android.settings.deviceinfo.SimStatus
+com.android.settings.deviceinfo.PrivateVolumeForget
+com.android.settings.inputmethod.SpellCheckersSettings
+com.android.settings.inputmethod.KeyboardLayoutPickerFragment
+com.android.settings.notification.ZenModeEventRuleSettings
+com.android.settings.fuelgauge.InactiveApps
+com.android.settings.accessibility.CaptionPropertiesFragment
+com.android.settings.accessibility.AccessibilitySettingsForSetupWizard
+com.android.settings.deviceinfo.ImeiInformation
+com.android.settings.datausage.DataUsageList
+com.android.settings.vpn2.AppManagementFragment
+com.android.settings.display.NightDisplaySettings
+com.android.settings.vpn2.VpnSettings
+com.android.settings.fingerprint.FingerprintSettings$FingerprintSettingsFragment
+com.android.settings.applications.ProcessStatsDetail
+com.android.settings.wifi.WifiInfo
+com.android.settings.applications.VrListenerSettings
+com.android.settings.inputmethod.UserDictionaryList
+com.android.settings.datausage.DataSaverSummary
+com.android.settings.notification.ChannelNotificationSettings
+com.android.settings.datausage.AppDataUsage
+com.android.settings.datausage.DataPlanUsageSummary
+com.android.settings.accessibility.FontSizePreferenceFragmentForSetupWizard
+com.android.settings.applications.ManageDomainUrls
+com.android.settings.applications.WriteSettingsDetails
+com.android.settings.location.LocationSettings
+com.android.settings.applications.ProcessStatsSummary
+com.android.settings.users.RestrictedProfileSettings
+com.android.settings.accounts.ChooseAccountActivity
+com.android.settings.accounts.ManagedProfileSettings
+com.android.settings.accessibility.ToggleAutoclickPreferenceFragment
+com.android.settings.applications.AppLaunchSettings
+com.android.settings.fuelgauge.BatterySaverSettings
+com.android.settings.location.ScanningSettings
+com.android.settings.tts.TextToSpeechSettings
+com.android.settings.applications.ProcessStatsUi
+com.android.settings.notification.ZenModeScheduleRuleSettings
+com.android.settings.datausage.BillingCycleSettings
+com.android.settings.notification.NotificationStation
+com.android.settings.print.PrintJobSettingsFragment
+com.android.settings.accessibility.ToggleScreenReaderPreferenceFragmentForSetupWizard
+com.android.settings.accessibility.ToggleSelectToSpeakPreferenceFragmentForSetupWizard
+com.android.settings.accounts.AccountSyncSettings
+com.android.settings.notification.RedactionInterstitial$RedactionInterstitialFragment
+com.android.settings.inputmethod.InputMethodAndSubtypeEnabler
+com.android.settings.applications.DrawOverlayDetails
+com.android.settings.backup.ToggleBackupSettingFragment
+com.android.settings.users.UserDetailsSettings
+com.android.settings.datausage.UnrestrictedDataAccess
+com.android.settings.accessibility.ToggleScreenMagnificationPreferenceFragmentForSetupWizard
+com.android.settings.fuelgauge.BatteryHistoryDetail
+com.android.settings.applications.RunningServices
+com.android.settings.applications.ConfirmConvertToFbe
+com.android.settings.deviceinfo.PublicVolumeSettings
+com.android.settings.applications.InstalledAppDetails
+com.android.settings.accessibility.ToggleAccessibilityServicePreferenceFragment
+com.android.settings.print.PrintServiceSettingsFragment
+com.android.settings.wfd.WifiDisplaySettings
+com.android.settings.notification.AppNotificationSettings
+com.android.settings.deviceinfo.PrivateVolumeSettings
+com.android.settings.users.AppRestrictionsFragment
+com.android.settings.deviceinfo.PrivateVolumeUnmount
+com.android.settings.notification.ZenAccessSettings
+com.android.settings.accessibility.ToggleFontSizePreferenceFragment
+com.android.settings.applications.PremiumSmsAccess
+com.android.settings.applications.UsageAccessDetails
+com.android.settings.applications.AppStorageSettings
+com.android.settings.notification.NotificationAccessSettings
+com.android.settings.notification.ZenModeSettings
+com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment
+com.android.settings.localepicker.LocaleListEditor
+com.android.settings.qstile.DevelopmentTileConfigActivity$DevelopmentTileConfigFragment
+com.android.settings.applications.ExternalSourcesDetails
+com.android.settings.applications.PictureInPictureSettings
+com.android.settings.applications.PictureInPictureDetails
+com.android.settings.ApnSettings
+com.android.settings.SecuritySettings$SecuritySubSettings
+com.android.settings.PrivacySettings
+com.android.settings.WifiCallingSettings
+com.android.settings.password.SetupChooseLockGeneric$SetupChooseLockGenericFragment
+com.android.settings.SetupRedactionInterstitial$SetupRedactionInterstitialFragment
+com.android.settings.TrustAgentSettings
+com.android.settings.password.ChooseLockGeneric$ChooseLockGenericFragment
+com.android.settings.IccLockSettings
+com.android.settings.TetherSettings
+com.android.settings.ApplicationSettings
+com.android.settings.ApnEditor
+com.android.settings.UserCredentialsSettings
+com.android.settings.TestingSettings
diff --git a/tests/robotests/assets/grandfather_not_implementing_instrumentable b/tests/robotests/assets/grandfather_not_implementing_instrumentable
new file mode 100644
index 0000000000000000000000000000000000000000..64b5c83bd05d13251308a97904d7bcfa93cdd88b
--- /dev/null
+++ b/tests/robotests/assets/grandfather_not_implementing_instrumentable
@@ -0,0 +1,9 @@
+com.android.settings.deletionhelper.ActivationWarningFragment
+com.android.settings.applications.AppOpsCategory
+com.android.settings.inputmethod.UserDictionaryLocalePicker
+com.android.settings.CustomListPreference$CustomListPreferenceDialogFragment
+com.android.settings.password.ChooseLockPassword$SaveAndFinishWorker
+com.android.settings.password.ChooseLockPattern$SaveAndFinishWorker
+com.android.settings.RestrictedListPreference$RestrictedListPreferenceDialogFragment
+com.android.settings.password.ConfirmDeviceCredentialBaseFragment$LastTryDialog
+com.android.settings.password.CredentialCheckResultTracker
diff --git a/tests/robotests/assets/grandfather_not_in_search_index_provider_registry b/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
new file mode 100644
index 0000000000000000000000000000000000000000..948b14ad70c99d0906d90faed1bb1bf0f25ece19
--- /dev/null
+++ b/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
@@ -0,0 +1 @@
+com.android.settings.display.ScreenZoomPreferenceFragmentForSetupWizard
diff --git a/tests/robotests/assets/grandfather_not_sharing_pref_controllers_with_search_provider b/tests/robotests/assets/grandfather_not_sharing_pref_controllers_with_search_provider
new file mode 100644
index 0000000000000000000000000000000000000000..b3290725c98cf53a1746fac525413fd0e0704f13
--- /dev/null
+++ b/tests/robotests/assets/grandfather_not_sharing_pref_controllers_with_search_provider
@@ -0,0 +1 @@
+com.android.settings.fuelgauge.PowerUsageSummary
diff --git a/tests/robotests/assets/whitelist_duplicate_index_key b/tests/robotests/assets/whitelist_duplicate_index_key
new file mode 100644
index 0000000000000000000000000000000000000000..a761f35408663e20e3cc90b32612eba6143ed714
--- /dev/null
+++ b/tests/robotests/assets/whitelist_duplicate_index_key
@@ -0,0 +1,5 @@
+add_users_when_locked
+additional_system_update_settings
+dashboard_tile_placeholder
+screen_zoom
+usage_access
diff --git a/tests/robotests/res/drawable/selectable_card.xml b/tests/robotests/res/drawable/selectable_card.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8d1274a86ca25854791b0d217488f714879c7bd6
--- /dev/null
+++ b/tests/robotests/res/drawable/selectable_card.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/robotests/res/layout-mcc999/fingerprint_enroll_find_sensor.xml b/tests/robotests/res/layout-mcc999/fingerprint_enroll_find_sensor.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cedf5b9eb624a62923e5f78337165cb51efee3c1
--- /dev/null
+++ b/tests/robotests/res/layout-mcc999/fingerprint_enroll_find_sensor.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/robotests/res/layout/preference.xml b/tests/robotests/res/layout/preference.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3f73161ba416727900b95f00cf9dbe9ce133642e
--- /dev/null
+++ b/tests/robotests/res/layout/preference.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/robotests/res/values/config.xml b/tests/robotests/res/values/config.xml
new file mode 100644
index 0000000000000000000000000000000000000000..156e20aef83cb37ae8661f59f644712d2be3eaea
--- /dev/null
+++ b/tests/robotests/res/values/config.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ true
+
\ No newline at end of file
diff --git a/tests/robotests/res/values/themes.xml b/tests/robotests/res/values/themes.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b91df657ce02d75d0b769ac96316271a8be62a6f
--- /dev/null
+++ b/tests/robotests/res/values/themes.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/robotests/src/android/app/admin/PasswordMetrics.java b/tests/robotests/src/android/app/admin/PasswordMetrics.java
new file mode 100644
index 0000000000000000000000000000000000000000..a46130661b0cc51a92c3fc8abc3dece937df1508
--- /dev/null
+++ b/tests/robotests/src/android/app/admin/PasswordMetrics.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.admin;
+
+import android.annotation.NonNull;
+
+/**
+ * Stub implementation of framework's PasswordMetrics for Robolectric tests. Otherwise Robolectric
+ * is throwing ClassNotFoundError.
+ *
+ * TODO: Remove this class when Robolectric supports O
+ */
+public class PasswordMetrics {
+
+ // Maximum allowed number of repeated or ordered characters in a sequence before we'll
+ // consider it a complex PIN/password.
+ public static final int MAX_ALLOWED_SEQUENCE = 3;
+
+ public int length = 0;
+ public int letters = 0;
+ public int upperCase = 0;
+ public int lowerCase = 0;
+ public int numeric = 0;
+ public int symbols = 0;
+ public int nonLetter = 0;
+
+ public static int maxLengthSequence(@NonNull String string) {
+ // Stub implementation
+ return 1;
+ }
+
+ public static PasswordMetrics computeForPassword(@NonNull String password) {
+ return new PasswordMetrics();
+ }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/android/bluetooth/BluetoothCodecConfig.java b/tests/robotests/src/android/bluetooth/BluetoothCodecConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..40b76df759cda90bcdb1b75de661898028363113
--- /dev/null
+++ b/tests/robotests/src/android/bluetooth/BluetoothCodecConfig.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bluetooth;
+
+/**
+ * A placeholder class to prevent ClassNotFound exceptions caused by lack of visibility.
+ */
+public class BluetoothCodecConfig {
+}
diff --git a/tests/robotests/src/android/content/om/IOverlayManager.java b/tests/robotests/src/android/content/om/IOverlayManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..d4f6d10b9f7fa3e44cc137d1bd92c96951cf4375
--- /dev/null
+++ b/tests/robotests/src/android/content/om/IOverlayManager.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package android.content.om;
+
+import android.os.IBinder;
+
+public class IOverlayManager {
+
+ public static class Stub {
+ public static IOverlayManager asInterface(IBinder b) {
+ return null;
+ }
+ }
+}
diff --git a/tests/robotests/src/android/content/om/OverlayInfo.java b/tests/robotests/src/android/content/om/OverlayInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..cfd3adc050527f6ddf083d16d79e5c1190cc7538
--- /dev/null
+++ b/tests/robotests/src/android/content/om/OverlayInfo.java
@@ -0,0 +1,18 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package android.content.om;
+
+public class OverlayInfo {
+}
diff --git a/tests/robotests/src/android/net/NetworkBadging.java b/tests/robotests/src/android/net/NetworkBadging.java
new file mode 100644
index 0000000000000000000000000000000000000000..f2af08b0590f32ac10527d2816003ede6d0ab418
--- /dev/null
+++ b/tests/robotests/src/android/net/NetworkBadging.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.net;
+
+import android.annotation.IntDef;
+import android.annotation.Nullable;
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Implementation for {@link android.net.NetworkBadging}.
+ *
+ *
Can be removed once Robolectric supports Android O.
+ */
+public class NetworkBadging {
+ @IntDef({BADGING_NONE, BADGING_SD, BADGING_HD, BADGING_4K})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Badging {}
+
+ public static final int BADGING_NONE = 0;
+ public static final int BADGING_SD = 10;
+ public static final int BADGING_HD = 20;
+ public static final int BADGING_4K = 30;
+
+ private static Drawable drawable;
+
+ public static Drawable getWifiIcon(
+ int signalLevel, @NetworkBadging.Badging int badging, @Nullable Resources.Theme theme) {
+ return new ColorDrawable(Color.GREEN);
+ }
+}
diff --git a/tests/robotests/src/android/net/NetworkScorerAppData.java b/tests/robotests/src/android/net/NetworkScorerAppData.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7da4d1ccd54b4a19d58a2292a13e0c721734a5e
--- /dev/null
+++ b/tests/robotests/src/android/net/NetworkScorerAppData.java
@@ -0,0 +1,130 @@
+package android.net;
+
+import android.annotation.Nullable;
+import android.content.ComponentName;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Objects;
+
+/**
+ * Holds metadata about a discovered network scorer/recommendation application.
+ *
+ * TODO: delete this class once robolectric supports Android O
+ */
+public final class NetworkScorerAppData implements Parcelable {
+ /** UID of the scorer app. */
+ public final int packageUid;
+ private final ComponentName mRecommendationService;
+ /** User visible label in Settings for the recommendation service. */
+ private final String mRecommendationServiceLabel;
+ /**
+ * The {@link ComponentName} of the Activity to start before enabling the "connect to open
+ * wifi networks automatically" feature.
+ */
+ private final ComponentName mEnableUseOpenWifiActivity;
+ /**
+ * The {@link android.app.NotificationChannel} ID used by {@link #mRecommendationService} to
+ * post open network notifications.
+ */
+ private final String mNetworkAvailableNotificationChannelId;
+
+ public NetworkScorerAppData(int packageUid, ComponentName recommendationServiceComp,
+ String recommendationServiceLabel, ComponentName enableUseOpenWifiActivity,
+ String networkAvailableNotificationChannelId) {
+ this.packageUid = packageUid;
+ this.mRecommendationService = recommendationServiceComp;
+ this.mRecommendationServiceLabel = recommendationServiceLabel;
+ this.mEnableUseOpenWifiActivity = enableUseOpenWifiActivity;
+ this.mNetworkAvailableNotificationChannelId = networkAvailableNotificationChannelId;
+ }
+
+ protected NetworkScorerAppData(Parcel in) {
+ packageUid = in.readInt();
+ mRecommendationService = ComponentName.readFromParcel(in);
+ mRecommendationServiceLabel = in.readString();
+ mEnableUseOpenWifiActivity = ComponentName.readFromParcel(in);
+ mNetworkAvailableNotificationChannelId = in.readString();
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(packageUid);
+ ComponentName.writeToParcel(mRecommendationService, dest);
+ dest.writeString(mRecommendationServiceLabel);
+ ComponentName.writeToParcel(mEnableUseOpenWifiActivity, dest);
+ dest.writeString(mNetworkAvailableNotificationChannelId);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final Creator CREATOR =
+ new Creator() {
+ @Override
+ public NetworkScorerAppData createFromParcel(Parcel in) {
+ return new NetworkScorerAppData(in);
+ }
+
+ @Override
+ public NetworkScorerAppData[] newArray(int size) {
+ return new NetworkScorerAppData[size];
+ }
+ };
+
+ public String getRecommendationServicePackageName() {
+ return mRecommendationService.getPackageName();
+ }
+
+ public ComponentName getRecommendationServiceComponent() {
+ return mRecommendationService;
+ }
+
+ @Nullable
+ public ComponentName getEnableUseOpenWifiActivity() {
+ return mEnableUseOpenWifiActivity;
+ }
+
+ @Nullable
+ public String getRecommendationServiceLabel() {
+ return mRecommendationServiceLabel;
+ }
+
+ @Nullable
+ public String getNetworkAvailableNotificationChannelId() {
+ return mNetworkAvailableNotificationChannelId;
+ }
+
+ @Override
+ public String toString() {
+ return "NetworkScorerAppData{" +
+ "packageUid=" + packageUid +
+ ", mRecommendationService=" + mRecommendationService +
+ ", mRecommendationServiceLabel=" + mRecommendationServiceLabel +
+ ", mEnableUseOpenWifiActivity=" + mEnableUseOpenWifiActivity +
+ ", mNetworkAvailableNotificationChannelId=" +
+ mNetworkAvailableNotificationChannelId +
+ '}';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ NetworkScorerAppData that = (NetworkScorerAppData) o;
+ return packageUid == that.packageUid &&
+ Objects.equals(mRecommendationService, that.mRecommendationService) &&
+ Objects.equals(mRecommendationServiceLabel, that.mRecommendationServiceLabel) &&
+ Objects.equals(mEnableUseOpenWifiActivity, that.mEnableUseOpenWifiActivity) &&
+ Objects.equals(mNetworkAvailableNotificationChannelId,
+ that.mNetworkAvailableNotificationChannelId);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(packageUid, mRecommendationService, mRecommendationServiceLabel,
+ mEnableUseOpenWifiActivity, mNetworkAvailableNotificationChannelId);
+ }
+}
diff --git a/tests/robotests/src/android/net/wifi/WifiNetworkScoreCache.java b/tests/robotests/src/android/net/wifi/WifiNetworkScoreCache.java
new file mode 100644
index 0000000000000000000000000000000000000000..7995e07007ef0e90995bf1c02b623c48184c6bca
--- /dev/null
+++ b/tests/robotests/src/android/net/wifi/WifiNetworkScoreCache.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.net.wifi;
+
+/**
+ * Empty class def for {@link android.net.wifi.WifiNetworkScoreCache}.
+ *
+ *
Can be removed once Robolectric supports Android O.
+ */
+public class WifiNetworkScoreCache {
+
+}
diff --git a/tests/robotests/src/android/print/PrintServicesLoader.java b/tests/robotests/src/android/print/PrintServicesLoader.java
new file mode 100644
index 0000000000000000000000000000000000000000..e4975edb81330b150a9520f73e3f170217ceee58
--- /dev/null
+++ b/tests/robotests/src/android/print/PrintServicesLoader.java
@@ -0,0 +1,19 @@
+package android.print;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.content.Loader;
+import android.printservice.PrintServiceInfo;
+import com.android.internal.util.Preconditions;
+
+import java.util.List;
+
+/**
+ * A placeholder class to prevent ClassNotFound exceptions caused by lack of visibility.
+ */
+public class PrintServicesLoader extends Loader> {
+ public PrintServicesLoader(@NonNull PrintManager printManager, @NonNull Context context,
+ int selectionFlags) {
+ super(Preconditions.checkNotNull(context));
+ }
+}
diff --git a/tests/robotests/src/android/service/oemlock/OemLockManager.java b/tests/robotests/src/android/service/oemlock/OemLockManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..c168089be4b3fc8aadff46f6798c0771326fa7e6
--- /dev/null
+++ b/tests/robotests/src/android/service/oemlock/OemLockManager.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.oemlock;
+
+/**
+ * Make OemLockManager available to Robolectric.
+ */
+public class OemLockManager {
+ public void setOemUnlockAllowedByCarrier(boolean allowed, byte[] signature) {}
+
+ public boolean isOemUnlockAllowedByCarrier() {
+ return true;
+ }
+
+ public void setOemUnlockAllowedByUser(boolean allowed) {}
+
+ public boolean isOemUnlockAllowedByUser() {
+ return false;
+ }
+
+ public boolean isOemUnlockAllowed() {
+ return false;
+ }
+
+ public boolean isDeviceOemUnlocked() {
+ return false;
+ }
+}
diff --git a/tests/robotests/src/android/util/IconDrawableFactory.java b/tests/robotests/src/android/util/IconDrawableFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..9d0d7df2601f3976d35f7ed96bf40d1876ed70f2
--- /dev/null
+++ b/tests/robotests/src/android/util/IconDrawableFactory.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.util;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageItemInfo;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+
+/**
+ * This class is only needed to get around Robolectric issue.
+ */
+public class IconDrawableFactory {
+
+ public static IconDrawableFactory newInstance(Context context) {
+ return new IconDrawableFactory();
+ }
+
+ public Drawable getBadgedIcon(ApplicationInfo appInfo) {
+ return getBadgedIcon(appInfo, 0);
+ }
+
+ public Drawable getBadgedIcon(ApplicationInfo appInfo, int userId) {
+ return getBadgedIcon(appInfo, appInfo, userId);
+ }
+
+ public Drawable getBadgedIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo, int userId) {
+ return new ColorDrawable(0);
+ }
+}
diff --git a/tests/robotests/src/com/android/ims/ImsManager.java b/tests/robotests/src/com/android/ims/ImsManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..a4d97b5a64b53d86b4173623fbbf921e924a51fc
--- /dev/null
+++ b/tests/robotests/src/com/android/ims/ImsManager.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.ims;
+
+import android.content.Context;
+
+/**
+ * Fake test class to com.android.ims.ImsManager
+ */
+public class ImsManager {
+
+ public static boolean wfcEnabledByPlatform;
+ public static boolean wfcProvisioned;
+
+ public static boolean isWfcEnabledByPlatform(Context context) {
+ return wfcEnabledByPlatform;
+ }
+
+ public static boolean isWfcProvisionedOnDevice(Context context) {
+ return wfcProvisioned;
+ }
+
+ public static int getWfcMode(Context context, boolean roaming) {
+ return 0;
+ }
+
+ public static boolean isWfcEnabledByUser(Context context) {
+ return false;
+ }
+}
diff --git a/tests/robotests/src/com/android/internal/app/LocalePickerWithRegion.java b/tests/robotests/src/com/android/internal/app/LocalePickerWithRegion.java
new file mode 100644
index 0000000000000000000000000000000000000000..9edda45cfe7fea708cde7a486423a5bab2caf7c1
--- /dev/null
+++ b/tests/robotests/src/com/android/internal/app/LocalePickerWithRegion.java
@@ -0,0 +1,11 @@
+package com.android.internal.app;
+
+/**
+ * A placeholder class to prevent ClassNotFound exceptions caused by lack of visibility.
+ */
+public class LocalePickerWithRegion {
+
+ public interface LocaleSelectedListener {
+ void onLocaleSelected(LocaleStore.LocaleInfo locale);
+ }
+}
diff --git a/tests/robotests/src/com/android/internal/app/NightDisplayController.java b/tests/robotests/src/com/android/internal/app/NightDisplayController.java
new file mode 100644
index 0000000000000000000000000000000000000000..bc2a0ca1ff46cfaed74b69d13af2987c74cba1d6
--- /dev/null
+++ b/tests/robotests/src/com/android/internal/app/NightDisplayController.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.internal.app;
+
+/**
+ * Fake controller to make robolectric test compile. Should be removed when Robolectric supports
+ * API 25.
+ */
+public class NightDisplayController {
+
+ public static final int AUTO_MODE_CUSTOM = 1;
+ public static final int COLOR_MODE_NATURAL = 0;
+
+ public static final int AUTO_MODE_TWILIGHT = 2;
+ public static final int COLOR_MODE_BOOSTED = 1;
+ public static final int COLOR_MODE_SATURATED = 2;
+ private int mColorMode;
+
+ public void setColorMode(int colorMode) {
+ mColorMode = colorMode;
+ }
+
+ public int getColorMode() {
+ return mColorMode;
+ }
+
+ public interface Callback {
+ }
+}
diff --git a/tests/robotests/src/com/android/internal/hardware/AmbientDisplayConfiguration.java b/tests/robotests/src/com/android/internal/hardware/AmbientDisplayConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..3dcf6ab6d04c355eda35f7275f49c0136770a6c5
--- /dev/null
+++ b/tests/robotests/src/com/android/internal/hardware/AmbientDisplayConfiguration.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.hardware;
+
+import android.content.Context;
+
+/**
+ * Fake controller to make robolectric test compile. Should be removed when Robolectric supports
+ * API 25.
+ */
+public class AmbientDisplayConfiguration {
+
+ public AmbientDisplayConfiguration(Context context) {}
+
+ public boolean pulseOnPickupAvailable() {
+ return false;
+ }
+
+ public boolean pulseOnPickupEnabled(int user) {
+ return true;
+ }
+
+ public boolean pulseOnPickupCanBeModified(int user) {
+ return true;
+ }
+
+ public boolean pulseOnDoubleTapAvailable() {
+ return true;
+ }
+
+ public boolean pulseOnDoubleTapEnabled(int user) {
+ return true;
+ }
+
+ public boolean pulseOnNotificationEnabled(int user) {
+ return true;
+ }
+
+ public boolean pulseOnNotificationAvailable() {
+ return true;
+ }
+
+ public boolean alwaysOnEnabled(int user) {
+ return true;
+ }
+
+ public boolean alwaysOnAvailable() {
+ return true;
+ }
+
+ public boolean alwaysOnAvailableForUser(int user) {
+ return true;
+ }
+
+ public boolean available() {
+ return true;
+ }
+
+ public boolean enabled(int user) {
+ return true;
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/DeviceAdminAddTest.java b/tests/robotests/src/com/android/settings/DeviceAdminAddTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..cd891bee95e6901c4fbf46ff98cfefbc40c746ac
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/DeviceAdminAddTest.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settings;
+
+import android.content.Context;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+import org.robolectric.annotation.Config;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.verify;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class DeviceAdminAddTest {
+
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private Context mContext;
+ private FakeFeatureFactory mFeatureFactory;
+ private DeviceAdminAdd mDeviceAdminAdd;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ FakeFeatureFactory.setupForTest(mContext);
+ mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
+ mDeviceAdminAdd = Robolectric.buildActivity(DeviceAdminAdd.class).get();
+ }
+
+ @Test
+ public void logSpecialPermissionChange() {
+ mDeviceAdminAdd.logSpecialPermissionChange(true, "app");
+ verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class),
+ eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_ALLOW), eq("app"));
+
+ mDeviceAdminAdd.logSpecialPermissionChange(false, "app");
+ verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class),
+ eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_DENY), eq("app"));
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/DeviceInfoSettingsTest.java b/tests/robotests/src/com/android/settings/DeviceInfoSettingsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c5a18339a762f1dab4296cf65b0e5f5e919e961b
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/DeviceInfoSettingsTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.Build;
+import android.os.UserManager;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.dashboard.SummaryLoader;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.XmlTestUtils;
+import com.android.settings.testutils.shadow.ShadowUtils;
+import com.android.settingslib.DeviceInfoUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.List;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(
+ manifest = TestConfig.MANIFEST_PATH,
+ sdk = TestConfig.SDK_VERSION,
+ shadows = ShadowUtils.class
+)
+public class DeviceInfoSettingsTest {
+
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private Context mContext;
+ @Mock
+ private PreferenceScreen mScreen;
+ @Mock
+ private UserManager mUserManager;
+ @Mock
+ private SummaryLoader mSummaryLoader;
+
+ private DeviceInfoSettings mSettings;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+ mSettings = spy(new DeviceInfoSettings());
+ doReturn(mScreen).when(mSettings).getPreferenceScreen();
+ }
+
+ @Test
+ public void getPrefXml_shouldReturnDeviceInfoXml() {
+ assertThat(mSettings.getPreferenceScreenResId()).isEqualTo(R.xml.device_info_settings);
+ }
+
+ @Test
+ public void getSummary_shouldReturnDeviceModel() {
+ final SummaryLoader.SummaryProvider mProvider = DeviceInfoSettings.SUMMARY_PROVIDER_FACTORY
+ .createSummaryProvider(null, mSummaryLoader);
+
+ mProvider.setListening(true);
+
+ verify(mSummaryLoader).setSummary(mProvider, Build.MODEL + DeviceInfoUtils.getMsvSuffix());
+ }
+
+ @Test
+ public void testNonIndexableKeys_existInXmlLayout() {
+ final Context context = RuntimeEnvironment.application;
+ final List niks = DeviceInfoSettings.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(context);
+ final int xmlId = (new DeviceInfoSettings()).getPreferenceScreenResId();
+
+ final List keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);
+
+ assertThat(keys).containsAllIn(niks);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/DisplaySettingsTest.java b/tests/robotests/src/com/android/settings/DisplaySettingsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..4b345c0c308a6943bb65a7ca581b8e62643b3fca
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/DisplaySettingsTest.java
@@ -0,0 +1,43 @@
+package com.android.settings;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.XmlTestUtils;
+import com.android.settings.testutils.shadow.ShadowPowerManagerWrapper;
+import com.android.settingslib.core.AbstractPreferenceController;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class DisplaySettingsTest {
+
+ @Test
+ @Config(shadows = ShadowPowerManagerWrapper.class)
+ public void testPreferenceControllers_getPreferenceKeys_existInPreferenceScreen() {
+ final Context context = RuntimeEnvironment.application;
+// PowerManager wrapper = mock(PowerManager.class);
+// doReturn(wrapper).when(context).getSystemService(Context.POWER_SERVICE);
+ final DisplaySettings fragment = new DisplaySettings();
+ final List preferenceScreenKeys = XmlTestUtils.getKeysFromPreferenceXml(context,
+ fragment.getPreferenceScreenResId());
+ final List preferenceKeys = new ArrayList<>();
+
+ for (AbstractPreferenceController controller : fragment.getPreferenceControllers(context)) {
+ preferenceKeys.add(controller.getPreferenceKey());
+ }
+ // Nightmode is currently hidden
+ preferenceKeys.remove("night_mode");
+
+ assertThat(preferenceScreenKeys).containsAllIn(preferenceKeys);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/EncryptionAndCredentialTest.java b/tests/robotests/src/com/android/settings/EncryptionAndCredentialTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a3875e81286b186cc67601600a9999136579b3b
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/EncryptionAndCredentialTest.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settings;
+
+import static android.app.admin.DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE;
+import static android.app.admin.DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE;
+import static com.android.settings.EncryptionAndCredential.SEARCH_INDEX_DATA_PROVIDER;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.os.UserManager;
+import android.provider.SearchIndexableResource;
+
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class EncryptionAndCredentialTest {
+
+ @Mock
+ private UserManager mUserManager;
+ @Mock
+ private DevicePolicyManager mDevicePolicyManager;
+
+ private ShadowApplication mApplication;
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mApplication = ShadowApplication.getInstance();
+ mApplication.setSystemService(Context.DEVICE_POLICY_SERVICE, mDevicePolicyManager);
+ mApplication.setSystemService(Context.USER_SERVICE, mUserManager);
+ mContext = mApplication.getApplicationContext();
+ }
+
+ @Test
+ public void getMetricsCategory_shouldReturnEncryptionAndCredential() {
+ EncryptionAndCredential fragment = new EncryptionAndCredential();
+ assertThat(fragment.getMetricsCategory()).isEqualTo(MetricsEvent.ENCRYPTION_AND_CREDENTIAL);
+ }
+
+ // Search provider tests
+ @Test
+ public void getXmlResourcesToIndex_shouldReturnAllXmls() {
+ final List index =
+ SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(
+ mContext, true /* enabled */);
+
+ assertThat(index).hasSize(3);
+ }
+
+ @Test
+ public void getNonIndexableKeys_pageIsDisabled_shouldReturnAllKeysAsNonIndexable() {
+ when(mUserManager.isAdminUser()).thenReturn(false);
+
+ final List index =
+ SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(mContext, true /* enabled */);
+ final List expectedKeys = new ArrayList<>();
+ for (SearchIndexableResource res : index) {
+ expectedKeys.addAll(((BaseSearchIndexProvider) SEARCH_INDEX_DATA_PROVIDER)
+ .getNonIndexableKeysFromXml(mContext, res.xmlResId));
+ }
+ final List keys = SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
+
+ assertThat(keys).containsExactlyElementsIn(expectedKeys);
+ }
+
+ @Test
+ public void getNonIndexableKeys_deviceEncrypted_shouldReturnUnencryptedKeys() {
+ when(mUserManager.isAdminUser()).thenReturn(true);
+ when(mDevicePolicyManager.getStorageEncryptionStatus()).thenReturn(
+ ENCRYPTION_STATUS_ACTIVE);
+
+ final List expectedKeys = new ArrayList<>();
+ expectedKeys.addAll(((BaseSearchIndexProvider) SEARCH_INDEX_DATA_PROVIDER)
+ .getNonIndexableKeysFromXml(mContext, R.xml.security_settings_unencrypted));
+ final List keys = SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
+
+ assertThat(keys).containsExactlyElementsIn(expectedKeys);
+ }
+
+ @Test
+ public void getNonIndexableKeys_deviceNotEncrypted_shouldReturnEncryptedKeys() {
+ when(mUserManager.isAdminUser()).thenReturn(true);
+ when(mDevicePolicyManager.getStorageEncryptionStatus())
+ .thenReturn(ENCRYPTION_STATUS_INACTIVE);
+
+ final List expectedKeys = new ArrayList<>();
+ expectedKeys.addAll(((BaseSearchIndexProvider) SEARCH_INDEX_DATA_PROVIDER)
+ .getNonIndexableKeysFromXml(mContext, R.xml.security_settings_encrypted));
+ final List keys = SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
+
+ assertThat(keys).containsExactlyElementsIn(expectedKeys);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/HelpTrampolineTest.java b/tests/robotests/src/com/android/settings/HelpTrampolineTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e10b878d31a7db338628fb47d648bf86e14543b5
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/HelpTrampolineTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+
+import android.content.Intent;
+
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.ShadowHelpUtils;
+
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowActivity;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.robolectric.Shadows.shadowOf;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
+ shadows = {
+ ShadowHelpUtils.class
+ })
+public class HelpTrampolineTest {
+
+ @After
+ public void tearDown() {
+ ShadowHelpUtils.reset();
+ }
+
+ @Test
+ public void launchHelp_noExtra_shouldDoNothing() {
+ final Intent intent = new Intent().setClassName(
+ RuntimeEnvironment.application.getPackageName(), HelpTrampoline.class.getName());
+
+ Robolectric.buildActivity(HelpTrampoline.class).withIntent(intent).create().get();
+
+ assertThat(ShadowHelpUtils.isGetHelpIntentCalled()).isFalse();
+ }
+
+ @Test
+ public void launchHelp_hasExtra_shouldLaunchHelp() {
+ final Intent intent = new Intent().setClassName(
+ RuntimeEnvironment.application.getPackageName(), HelpTrampoline.class.getName())
+ .putExtra(Intent.EXTRA_TEXT, "help_url_upgrading");
+ final ShadowActivity shadow = shadowOf(Robolectric.buildActivity(HelpTrampoline.class)
+ .withIntent(intent).create().get());
+ final Intent launchedIntent = shadow.getNextStartedActivity();
+
+ assertThat(ShadowHelpUtils.isGetHelpIntentCalled()).isTrue();
+ assertThat(launchedIntent).isNotNull();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/LegalSettingsTest.java b/tests/robotests/src/com/android/settings/LegalSettingsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..3d50c6366aa5eaffc3df29840f200fbe7b515111
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/LegalSettingsTest.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings;
+
+import android.content.Context;
+
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.XmlTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.List;
+
+import static com.google.common.truth.Truth.assertThat;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class LegalSettingsTest {
+
+ @Test
+ public void testNonIndexableKeys_existInXmlLayout() {
+ final Context context = RuntimeEnvironment.application;
+ final List niks = LegalSettings.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(context);
+
+ final List keys = XmlTestUtils.getKeysFromPreferenceXml(context,
+ R.xml.about_legal);
+
+ assertThat(keys).containsAllIn(niks);
+ }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/LicenseHtmlGeneratorFromXmlTest.java b/tests/robotests/src/com/android/settings/LicenseHtmlGeneratorFromXmlTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..ea4b2726aed2c714d692ba172e2db6ba66bebe41
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/LicenseHtmlGeneratorFromXmlTest.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+import org.xmlpull.v1.XmlPullParserException;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class LicenseHtmlGeneratorFromXmlTest {
+ private static final String VAILD_XML_STRING =
+ "\n" +
+ "\n" +
+ "/file0\n" +
+ "/file1\n" +
+ "\n" +
+ "";
+
+ private static final String INVAILD_XML_STRING =
+ "\n" +
+ "\n" +
+ "/file0\n" +
+ "/file1\n" +
+ "\n" +
+ "";
+
+ private static final String EXPECTED_HTML_STRING =
+ "\n" +
+ "\n" +
+ "" +
+ "\n" +
+ "