From 11ac41d9b6eddc4733e782984c312fd482a616f3 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 7 Mar 2023 15:44:29 -0500 Subject: [PATCH 01/12] Don't show NLSes with excessively long component names Test: install test app with long CN Test: ServiceListingTest Bug: 260570119 Change-Id: I3ffd02f6cf6bf282e7fc264fd070ed3add4d8571 Merged-In: I3ffd02f6cf6bf282e7fc264fd070ed3add4d8571 --- .../notification/NotificationAccessSettings.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/com/android/settings/notification/NotificationAccessSettings.java b/src/com/android/settings/notification/NotificationAccessSettings.java index 9df548c53bb..71e58e40b55 100644 --- a/src/com/android/settings/notification/NotificationAccessSettings.java +++ b/src/com/android/settings/notification/NotificationAccessSettings.java @@ -57,6 +57,9 @@ import java.util.List; @SearchIndexable public class NotificationAccessSettings extends EmptyTextSettings { private static final String TAG = "NotifAccessSettings"; + + private static final int MAX_CN_LENGTH = 500; + private static final ManagedServiceSettings.Config CONFIG = new ManagedServiceSettings.Config.Builder() .setTag(TAG) @@ -91,6 +94,12 @@ public class NotificationAccessSettings extends EmptyTextSettings { .setNoun(CONFIG.noun) .setSetting(CONFIG.setting) .setTag(CONFIG.tag) + .setValidator(info -> { + if (info.getComponentName().flattenToString().length() > MAX_CN_LENGTH) { + return false; + } + return true; + }) .build(); mServiceListing.addCallback(this::updateList); setPreferenceScreen(getPreferenceManager().createPreferenceScreen(mContext)); From cc53f44d493906392dd21c2c2e72130b234b10e2 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Tue, 28 Mar 2023 19:27:01 +0000 Subject: [PATCH 02/12] Revert "Disallow screenshot on Wi-Fi QR code settings" This reverts commit 950837b20f418df7a0583f5fa78df00a74a88c31. Reason for revert: The security issue is downgraded to NSI, remove the screenshot protection to rollback the original design. Change-Id: Iecaf7e4e19dc3452a7d2aeaf32bf38619e760c76 --- .../settings/wifi/dpp/WifiDppConfiguratorActivity.java | 2 -- .../wifi/dpp/WifiDppConfiguratorActivityTest.java | 10 ---------- 2 files changed, 12 deletions(-) diff --git a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java index 6c9d4980f44..e6f0b31f384 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java +++ b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java @@ -28,7 +28,6 @@ import android.os.UserManager; import android.provider.Settings; import android.util.EventLog; import android.util.Log; -import android.view.WindowManager; import androidx.annotation.VisibleForTesting; import androidx.fragment.app.FragmentTransaction; @@ -100,7 +99,6 @@ public class WifiDppConfiguratorActivity extends WifiDppBaseActivity implements @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); if (savedInstanceState != null) { String qrCode = savedInstanceState.getString(KEY_QR_CODE); diff --git a/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java b/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java index 88fa83afbf7..d8605ded829 100644 --- a/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java +++ b/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java @@ -16,10 +16,6 @@ package com.android.settings.wifi.dpp; -import static android.view.WindowManager.LayoutParams.FLAG_SECURE; - -import static com.google.common.truth.Truth.assertThat; - import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -76,12 +72,6 @@ public class WifiDppConfiguratorActivityTest { Robolectric.setupActivity(WifiDppConfiguratorActivity.class); } - @Test - public void launchActivity_shouldAddFlagSecure() { - assertThat(mActivity.getWindow().getAttributes().flags & FLAG_SECURE) - .isEqualTo(FLAG_SECURE); - } - @Test public void handleIntent_isGuestUser_shouldFinish() { when(mUserManager.isGuestUser()).thenReturn(true); From ac1796011aeafa35c6f1657ec81b5d2f799a835c Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 28 Mar 2023 17:50:06 -0700 Subject: [PATCH 03/12] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I99912ab2402e8f08b599c8ad69252ba0c413f687 --- res/values-my/arrays.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values-my/arrays.xml b/res/values-my/arrays.xml index af9822b834e..6c554a59a0a 100644 --- a/res/values-my/arrays.xml +++ b/res/values-my/arrays.xml @@ -296,7 +296,7 @@ "မျက်နှာပြင်ကို ဖွင့်ပါ" "အကောင့်များကို ရယူပါ" "နောက်ခံမှာ အလုပ်လုပ်ပါ" - "အများသုံးစွဲနိုင်မှု အသံ" + "အများသုံးနိုင်မှု အသံ" "တည်နေရာ" @@ -363,7 +363,7 @@ "မျက်နှာပြင်ကို ဖွင့်ပါ" "အကောင့်များကို ရယူပါ" "နောက်ခံမှာ အလုပ်လုပ်ပါ" - "အများသုံးစွဲနိုင်မှု အသံ" + "အများသုံးနိုင်မှု အသံ" "အတို" From 71ac923b9e8a02bdb7fb5fe10a85ba5feee18f70 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 28 Mar 2023 17:51:47 -0700 Subject: [PATCH 04/12] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I9b2e5e99dedd51de896dc2a34814e0ef8b658595 --- res/values-ar/strings.xml | 4 ++-- res/values-da/strings.xml | 14 +++++------ res/values-en-rAU/strings.xml | 2 +- res/values-en-rCA/strings.xml | 10 ++++---- res/values-en-rGB/strings.xml | 2 +- res/values-en-rIN/strings.xml | 2 +- res/values-es/strings.xml | 2 +- res/values-et/strings.xml | 2 +- res/values-fr-rCA/strings.xml | 14 +++++------ res/values-fr/strings.xml | 2 +- res/values-gu/strings.xml | 2 +- res/values-hi/strings.xml | 4 ++-- res/values-in/strings.xml | 4 ++-- res/values-it/strings.xml | 2 +- res/values-ml/strings.xml | 4 ++-- res/values-mr/strings.xml | 28 +++++++++++----------- res/values-my/strings.xml | 44 +++++++++++++++++------------------ res/values-nb/strings.xml | 6 ++--- res/values-ne/strings.xml | 6 ++--- res/values-or/strings.xml | 2 +- res/values-vi/strings.xml | 2 +- res/values-zh-rCN/strings.xml | 4 ++-- 22 files changed, 81 insertions(+), 81 deletions(-) diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 03d4b16cf18..aba9ba05c57 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -2453,8 +2453,8 @@ "عند تفعيل ميزة \"التكبير\"، يمكنك تكبير حجم المحتوى على الشاشة.\n\n""للتكبير""، يمكنك تفعيل ميزة \"التكبير\" والنقر بعد ذلك على أي مكان في الشاشة.\n"
  • "يمكنك سحب إصبعين أو أكثر للتمرير."
  • \n
  • "يمكنك ضمّ إصبعين أو أكثر لتعديل حجم المحتوى."
\n\n"للتكبير مؤقتًا""، يمكنك تفعيل ميزة التكبير والنقر مع الاستمرار على أي مكان في الشاشة.\n"
  • "يمكنك السحب للتنقّل داخل الشاشة."
  • \n
  • "يمكنك رفع إصبعك للتصغير."
\n\n"لن يكون بإمكانك التكبير على لوحة المفاتيح أو شريط التنقل."
"الصفحة %1$d من %2$d" "الفتح باستخدام زر \"أدوات تسهيل الاستخدام\"" - "اضغط مع الاستمرار على مفتاحَي مستوى الصوت لفتح الميزة" - "انقر على الشاشة ثلاث مرات لفتحها" + "اضغط مع الاستمرار على مفتاحَي مستوى الصوت لتفعيل الميزة" + "انقر على الشاشة ثلاث مرات لتفعيلها" "استخدام إيماءة للفتح" "استخدام إيماءة تسهيل الاستخدام" "لاستخدام هذه الميزة، انقر على زر أدوات تمكين الوصول %s في أسفل الشاشة.\n\nللتبديل بين الميزات، انقر مع الاستمرار على زر أدوات تمكين الوصول." diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index d4fd7c4373f..7415d965c6d 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -477,8 +477,8 @@ "Ansigt og fingeraftryk er tilføjet" "Når du konfigurerer ansigtslås og oplåsning med fingeraftryk, beder din telefon om dit fingeraftryk, hvis du er iført en maske eller befinder dig et mørkt sted" "Muligheder for oplåsning" - "Lås din telefon op" - "Verificer din identitet i apps" + "Låse din telefon op" + "Verificere din identitet i apps" "Anvend ansigtsgenkendelse" "Anvend fingeraftryk" "Anvend ansigtsgenkendelse eller fingeraftryk" @@ -4351,15 +4351,15 @@ "Tilføj link" "En app kan bekræfte links, så de automatisk åbnes i appen." - %d bekræftet link - %d bekræftede links + %d verificeret link + %d verificerede links - Dette link er bekræftet og åbnes automatisk i denne app. - Disse links er bekræftede og åbnes automatisk i denne app. + Dette link er verificeret og åbnes automatisk i denne app. + Disse links er verificerede og åbnes automatisk i denne app. "OK" - "Vis liste over bekræftede links" + "Vis liste over verificerede links" "Søger efter andre understøttede links…" "Annuller" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index d2856646f0d..9315b0469ce 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -2965,7 +2965,7 @@ "System usage for %s" "App usage for %s" "Total: less than a min." - "Background: less than a min." + "Background: less than a min" "Total: %s" "Background: %s" "Battery usage data is approximate and doesn\'t measure usage when phone is charging" diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml index 9ccaccc7478..91fc35632a5 100644 --- a/res/values-en-rCA/strings.xml +++ b/res/values-en-rCA/strings.xml @@ -2358,7 +2358,7 @@ "Page %1$d of %2$d" "Use accessibility button to open" "Hold volume keys to open" - "Triple tap screen to open" + "Triple-tap screen to open" "Use gesture to open" "Use accessibility gesture" "To use this feature, tap the accessibility button %s on the bottom of your screen.\n\nTo switch between features, touch & hold the accessibility button." @@ -3061,7 +3061,7 @@ "Certificate not installed" "Allow ""^1"" to install certificates on this device?" "These certificates will verify you by sharing your device’s unique ID with the apps and URLs below" - "Don’t allow" + "Don\'t allow" "Allow" "Show more" "Certificate management app" @@ -3930,7 +3930,7 @@ "Show sensitive work profile content when locked" "Show all notification content" "Show sensitive content only when unlocked" - "Don’t show notifications at all" + "Don\'t show notifications at all" "How do you want the lock screen to display?" "Lock screen" "Show all work notification content" @@ -4927,8 +4927,8 @@ "Emergency SOS, medical info, alerts" "Gesture navigation" "To go Home, swipe up from the bottom of the screen. To switch apps, swipe up from the bottom, hold, then release. To go back, swipe from either the left or right edge." - "3-button navigation" - "Go back, Home, and switch apps with buttons at the bottom of your screen." + "Three-button navigation" + "Go back, Home and switch apps with buttons at the bottom of your screen." "system navigation, 2 button navigation, 3 button navigation, gesture navigation, swipe" "Not supported by your default home app, %s" "Switch default home app" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 4f4ebfd8b8d..51e007a395a 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -2965,7 +2965,7 @@ "System usage for %s" "App usage for %s" "Total: less than a min." - "Background: less than a min." + "Background: less than a min" "Total: %s" "Background: %s" "Battery usage data is approximate and doesn\'t measure usage when phone is charging" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 9907bd83259..a0c42da4dd7 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -2965,7 +2965,7 @@ "System usage for %s" "App usage for %s" "Total: less than a min." - "Background: less than a min." + "Background: less than a min" "Total: %s" "Background: %s" "Battery usage data is approximate and doesn\'t measure usage when phone is charging" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 162d10c8aae..95f52565915 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -3929,7 +3929,7 @@ "Notificaciones sensibles del perfil de trabajo" "Mostrar contenido sensible del perfil de trabajo en la pantalla de bloqueo" "Mostrar todo el contenido de las notificaciones" - "Mostrar contenido sensible solo al desbloquear" + "Mostrar contenido sensible solo tras desbloqueo" "No mostrar ninguna notificación" "¿Cómo quieres que se muestren las notificaciones en la pantalla de bloqueo?" "Pantalla de bloqueo" diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 3cb753163d4..d631a46df64 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -2362,7 +2362,7 @@ "Kasutage avamiseks liigutust" "Juurdepääsuliigutuse kasutamine" "Selle funktsiooni kasutamiseks puudutage ekraanikuva allosas juurdepääsetavuse nuppu %s.\n\nFunktsioonide vahel vahetamiseks puudutage juurdepääsetavuse nuppu pikalt." - "Selle funktsiooni kasutamiseks puudutage ekraanikuval juurdepääsetavuse nuppu" + "Selle funktsiooni kasutamiseks puudutage ekraanikuval juurdepääsetavuse nuppu." "Selle funktsiooni kasutamiseks vajutage pikalt mõlemat helitugevuse klahvi." "Suurenduse käivitamiseks ja peatamiseks puudutage ekraani kolm korda." "Selle funktsiooni kasutamiseks pühkige ekraanikuva allosast kahe sõrmega üles.\n\nFunktsioonide vahel vahetamiseks pühkige kahe sõrmega üles ja hoidke sõrmi ekraanil." diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 6f6377a551e..5ef261bc4b7 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -1931,14 +1931,14 @@ "Informations de sécurité" "Vous n\'avez pas de connexion Internet. Pour consulter ces renseignements maintenant, accédez à %s sur un ordinateur connecté à Internet." "Chargement en cours..." - "Définir un mot de passe" + "Définissez un mot de passe" "Définir un mot de passe professionnel" - "Définir un NIP" + "Définissez un NIP" "Définir un NIP professionnel" "Définir un schéma" "Définir un mot de schéma professionnel" "Pour util. empr. digit., config. m. de passe" - "Pour utiliser empreinte digitale, configurer un schéma" + "Pour utiliser votre empreinte, configurez un schéma" "Pour votre sécurité, définissez un NIP" "Pour util. empr. digit., config. NIP" "Entrer de nouveau votre mot de passe" @@ -2307,7 +2307,7 @@ "Préférences de sous-titres" "À propos des préférences de sous-titres" "En savoir plus sur les préférences de sous-titres" - "Zoom" + "Agrandissement" "Raccourci de l\'agrandissement" "Agrandir l\'entrée" "La loupe suit le texte lorsque vous tapez" @@ -2357,14 +2357,14 @@ "When magnification is turned on, you can zoom in on your screen.\n\n""Pour effectuer un zoom,"", activez cette fonction, puis touchez une zone de l\'écran.\n"
  • "Glissez deux doigts ou plus sur l\'écran pour le faire défiler"
  • \n
  • "Pincez deux doigts ou plus pour ajuster le zoom"
\n\n"Pour zoomer temporairement l\'écran"", touchez le bouton d\'accessibilité, puis maintenez le doigt sur ailleurs sur l\'écran.\n"
  • "Glissez votre doigt sur l\'écran à l\'endroit désiré"
  • \n
  • "Relevez le doigt pour zoomer vers l\'arrière"
\n\n"On ne peut pas zoomer sur le clavier ou la barre de navigation."
"Page %1$d sur %2$d" "Utiliser le bouton d\'accessibilité pour ouvrir" - "Maintenez enf. les touches de volume pour l\'ouvrir" + "Maintenez les touches de volume enfoncées pour l\'ouvrir" "Touchez l\'écran trois fois pour l\'ouvrir" "Utiliser un geste pour activer le service" "Utiliser le geste d\'accessibilité" "Pour utiliser cette fonctionnalité, touchez le bouton d\'accessibilité %s dans le bas de l\'écran.\n\nPour basculer entre les fonctionnalités, maintenez le doigt sur le bouton d\'accessibilité." "Pour utiliser cette fonctionnalité, touchez le bouton d\'accessibilité sur votre écran." - "Pour utiliser cette fonctionnalité, maintenez enfoncées les deux touches de volume." - "Pour démarrer et arrêter l\'agrandissement, touchez trois fois n\'importe où sur l\'écran." + "Pour utiliser cette fonctionnalité, maintenez les deux touches de volume enfoncées." + "Pour démarrer et arrêter l\'agrandissement, touchez l\'écran trois fois n\'importe où." "Pour utiliser cette fonctionnalité, balayez l\'écran de bas en haut avec deux doigts.\n\nPour basculer entre les fonctionnalités, balayez l\'écran vers le haut avec deux doigts et maintenez-les-y." "Pour utiliser cette fonctionnalité, balayez l\'écran de bas en haut avec trois doigts.\n\nPour basculer entre les fonctionnalités, balayez l\'écran vers le haut avec trois doigts et maintenez-les-y." "Pour utiliser une fonctionnalité d\'accessibilité, balayez l\'écran de bas en haut avec deux doigts.\n\nPour basculer entre les fonctionnalités, balayez l\'écran vers le haut avec deux doigts et maintenez-les-y." diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index ab3a2a22c95..3e4daef76f2 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -2387,7 +2387,7 @@ "Appuyer de manière prolongée sur les deux boutons de volume" "Appuyer trois fois sur l\'écran" "appuyer trois fois sur l\'écran" - "Appuyez rapidement {0,number,integer} fois sur l\'écran. Ce raccourci peut ralentir votre appareil." + "Appuyer rapidement {0,number,integer} fois sur l\'écran. Ce raccourci peut ralentir votre appareil." "Paramètres avancés" "Le bouton Accessibilité est défini sur %1$s. Pour utiliser la loupe, appuyez de manière prolongée sur le bouton Accessibilité, puis sélectionnez la loupe." "Le geste d\'accessibilité est défini sur %1$s. Pour utiliser la loupe, balayez l\'écran de bas en haut avec deux doigts et maintenez la pression, puis sélectionnez la loupe." diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index f2a1d2521a7..d5f61f0642c 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -481,7 +481,7 @@ "ઍપનો ઉપયોગ કરનારા એ તમે જ છો તેની ચકાસણી કરો" "ચહેરાનો ઉપયોગ કરીને" "ફિંગરપ્રિન્ટનો ઉપયોગ કરીને" - "ચહેરા કે ફિંગરપ્રિન્ટનો ઉપયોગ કરીને" + "ફેસ કે ફિંગરપ્રિન્ટનો ઉપયોગ કરીને" "તમારા માતાપિતાને ફોન પાછો આપો" "ઓકે" "સ્ક્રીન લૉક છોડી દઈએ?" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index b1830ef3068..ed0c332b872 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -4834,7 +4834,7 @@ "इंटेंट मिटाएं" "फ़ुल स्क्रीन इंटेंट" "कार्रवाइयां" - "शीर्षक" + "टाइटल" "रिमोट इनपुट" "आपके मुताबिक दिखाई दे" "कुछ और" @@ -5145,7 +5145,7 @@ %1$d पासवर्ड
"अपने-आप, भरना, अपने-आप भरने वाला, पासवर्ड" - "<b>पक्का करें कि आपको इस ऐप्लिकेशन पर भरोसा है</b> <br/> <br/> <xliff:g id=app_name example=Google ऑटोमैटिक भरना,>%1$s</xliff:g> ऑटोमैटिक भरी जा सकने वाली चीज़ें तय करने के लिए आपकी स्क्रीन पर मौजूद चीज़ों का इस्तेमाल करता है." + "<b>पक्का करें कि आपको इस ऐप्लिकेशन पर भरोसा है</b> <br/> <br/> <xliff:g id=app_name example=Google की मदद से, जानकारी अपने-आप भरने की सुविधा,>%1$s</xliff:g> ऑटोमैटिक भरी जा सकने वाली चीज़ें तय करने के लिए आपकी स्क्रीन पर मौजूद चीज़ों का इस्तेमाल करती है." "ऑटोमैटिक भरने की सुविधा" "लॉग की गई जानकारी का लेवल" "हर सेशन में ज़्यादा से ज़्यादा इतने अनुरोध शामिल कर सकते हैं" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 984fcf193ee..da20b5cc0dc 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -477,8 +477,8 @@ "Wajah dan sidik jari ditambahkan" "Saat Anda menyiapkan Buka dengan Wajah dan Buka dengan Sidik Jari, ponsel akan meminta sidik jari saat Anda memakai masker atau berada di area yang gelap" "Cara membuka kunci" - "Buka kunci ponsel" - "Verifikasi diri Anda di aplikasi" + "Membuka kunci ponsel" + "Memverifikasi diri Anda di aplikasi" "Menggunakan wajah" "Menggunakan sidik jari" "Menggunakan wajah atau sidik jari" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 074bfa5a628..a0f2528f289 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -622,7 +622,7 @@ - "Blocco schermo" + "Scegli blocco schermo" "Scegli un blocco schermo" "Scegli un nuovo blocco schermo" "Scegli un blocco per le app di lavoro" diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index 63d482034de..b45a2ec935e 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -2954,7 +2954,7 @@ "ഓണാക്കുക" "ബാറ്ററി ലാഭിക്കൽ ഉപയോഗിക്കുക" - "ഓട്ടോമാറ്റിക്കായി ഓണാക്കുക" + "സ്വയമേവ ഓണാക്കുക" "ഒരിക്കലും" "%1$s ബാറ്ററിയിൽ" "ബാറ്ററി ശതമാനം" @@ -4263,7 +4263,7 @@ "%1$s, %2$s എന്നിവർക്ക്" "%d-മിനിറ്റ് സമയത്തിനുള്ളിൽ അതേ വ്യക്തി രണ്ടാമത്തെ തവണ വിളിക്കുകയാണെങ്കിൽ" "ഇഷ്ടാനുസൃതം" - "ഓട്ടോമാറ്റിക്കായി ഓണാക്കുക" + "സ്വയമേവ ഓണാക്കുക" "ഒരിക്കലും" "എല്ലാ രാത്രിയും" "ശനിയാഴ്‌ചയും ഞായറാഴ്‌ചയും അല്ലാത്ത ദിവസങ്ങളിലെ രാത്രികൾ" diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index de123f60d98..0e3b7bb9b29 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -823,7 +823,7 @@ "कनेक्शन व्यवस्थापित करा, डिव्हाइस नाव आणि शोधयोग्यता सेट करा" "%1$s सह पेअर करायचे?" "ब्लूटूथ पेअरिंग कोड" - "पेअरिंग कोड टाइप करा नंतर Return किंवा Enter दाबा" + "पेअरिंग कोड टाइप करा नंतर Return किंवा एंटर प्रेस करा" "पिन मध्ये अक्षरे किंवा प्रतीके आहेत" "सामान्यतः 0000 किंवा 1234" "16 अंक असणे आवश्यक आहे" @@ -832,7 +832,7 @@ "यासह जोडण्यासाठी:<br><b>%1$s</b><br><br>हे ही पासकी दर्शवत असल्याचे सुनिश्चित करा:<br><b>%2$s</b>" "समन्वित सेटशी पेअर करण्याचे कंफर्म करा" "यावरून:<br><b>%1$s</b><br><br>हे डिव्हाइस जोडायचे?" - "यासह जोडण्यासाठी:<br><b>%1$s</b><br><br>यावर टाइप करा:<br><b>%2$s</b>, नंतर Return किंवा Enter दाबा." + "यासह जोडण्यासाठी:<br><b>%1$s</b><br><br>यावर टाइप करा:<br><b>%2$s</b>, नंतर Return किंवा एंटर प्रेस करा." "तुमच्या संपर्क आणि कॉल इतिहासातील अ‍ॅक्सेसची अनुमती द्या" "%1$s सह कनेक्ट करणे शक्य झाले नाही." @@ -1991,7 +1991,7 @@ "अनलॉक पॅटर्न बदला" "अनलॉक पिन बदला" "अनलॉक पॅटर्न ड्रॉ करा" - "मदतीसाठी मेनू दाबा." + "मदतीसाठी मेनू प्रेस करा." "पूर्ण झाल्यावर बोट सोडा" "कमीत कमी %d बिंदू कनेक्ट करा. पुन्हा प्रयत्न करा." "पॅटर्न रेकॉर्ड झाला" @@ -2204,7 +2204,7 @@ "वाक्यांमधील प्रथम अक्षर कॅपिटलाइझ करा" "स्वयं-विरामचिन्हे घाला" "वास्तविक कीबोर्ड सेटिंग्ज" - "\".\" घालण्यासाठी Space की दोनदा दाबा" + "\".\" घालण्यासाठी Space की दोनदा प्रेस करा" "पासवर्ड दाखवा" "तुम्ही टाइप कराल त्‍याप्रमाणे वर्ण थोडक्‍यात डिस्प्ले करा" "हा शब्दलेखन तपासक तुम्ही पासवर्ड आणि क्रेडिट कार्ड नंबर यासारख्या वैयक्तिक डेटासह, टाइप करता तो सर्व मजकूर संकलित करण्यात सक्षम होऊ शकतो. हा %1$s ॲपवरून येतो. हा शब्दलेखन तपासक वापरायचा?" @@ -2231,7 +2231,7 @@ "कनेक्ट केले असताना गेम नियंत्रकाला व्हायब्रेशन पाठवा" "किबोर्ड लेआउट निवडा" "किबोर्ड लेआउट सेट करा" - "स्विच करण्यासाठी, Control-Spacebar दाबा" + "स्विच करण्यासाठी, Control-Spacebar प्रेस करा" "डीफॉल्ट" "किबोर्ड लेआउट" "वैयक्तिक शब्दकोश" @@ -2364,7 +2364,7 @@ "ॲक्सेसिबिलिटी जेश्चर वापरा" "हे वैशिष्ट्य वापरण्यासाठी, तुमच्या स्क्रीनच्या तळाशी असलेले ॲक्सेसिबिलिटी बटणावर %s टॅप करा.\n\nवैशिष्टयांदरम्यान स्विच करण्यासाठी ॲक्सेसिबिलिटी बटणाला स्पर्श करा आणि धरून ठेवा." "हे वैशिष्ट्य वापरण्यासाठी, तुमच्या स्क्रीनवरील अ‍ॅक्सेसिबिलिटी बटणावर टॅप करा." - "हे वैशिष्ट्य वापरण्यासाठी, दोन्ही व्हॉल्यूम की दाबा आणि धरून ठेवा." + "हे वैशिष्ट्य वापरण्यासाठी, दोन्ही व्हॉल्यूम की प्रेस करून धरून ठेवा." "मॅग्निफिकेशन सुरू करण्यासाठी आणि थांबवण्यासाठी तुमच्या स्क्रीनवर कुठेही तीनदा टॅप करा." "हे वैशिष्ट्य वापरण्यासाठी, दोन बोटांनी स्क्रीनच्या तळापासून वर स्वाइप करा.\n\nवैशिष्ट्यांदरम्यान स्विच करण्यासाठी दोन बोटांनी वर स्वाइप करा आणि धरून ठेवा." "हे वैशिष्ट्य वापरण्यासाठी, तीन बोटांनी स्क्रीनच्या तळापासून वर स्वाइप करा.\n\nवैशिष्ट्यांदरम्यान स्विच करण्यासाठी तीन बोटांनी वर स्वाइप करा आणि धरून ठेवा." @@ -2385,7 +2385,7 @@ "%1$s बद्दल अधिक जाणून घ्या" "व्हॉल्यूम की दाबून ठेवा" "व्हॉल्यूम की दाबून ठेवा" - "दोन्ही व्हॉल्यूम की दाबा आणि धरून ठेवा" + "दोन्ही व्हॉल्यूम की प्रेस करून धरून ठेवा" "स्क्रीनवर तीन वेळा टॅप करा" "स्क्रीनवर तीन वेळा टॅप करा" "स्क्रीनवर झटपट {0,number,integer} वेळा टॅप करा. हा शॉर्टकट तुमच्या डिव्हाइसचा वेग कमी करू शकताे" @@ -2612,7 +2612,7 @@ "स्क्रीन पहा आणि नियंत्रित करा" "ते स्क्रीनवरील सर्व आशय वाचू शकते आणि इतर ॲप्सवर आशय प्रदर्शित करू शकते." "पहा आणि क्रिया करा" - "हे तुम्ही ॲप किंवा हार्डवेअर सेन्सर कसे वापरता ते ट्रॅक करू शकते आणि इतर ॲप्ससोबत तुमच्या वतीने संवाद साधू शकते." + "हे तुमचा ॲप किंवा हार्डवेअर सेन्सरसोबतचा परस्‍परसंवाद ट्रॅक करू शकते आणि इतर ॲप्ससोबत तुमच्या वतीने संवाद साधू शकते." "अनुमती द्या" "नकार द्या" "थांबा" @@ -4629,7 +4629,7 @@ "या स्रोतातून परवानगी द्या" "कॅमेर्‍यासाठी दोनदा वळवा" "तुमचे मनगट दोनदा वळवून कॅमेरा अ‍ॅप उघडा" - "कॅमेर्‍यासाठी पॉवर बटण दोनदा दाबा" + "कॅमेर्‍यासाठी पॉवर बटण दोनदा प्रेस करा" "तुमची स्क्रीन अनलॉक न करता कॅमेरा द्रुतपणे उघडा" "डिस्प्ले आकार" "सर्व आणखी मोठे किंवा लहान करा" @@ -4914,7 +4914,7 @@ "तुमचे टॅबलेट नियंत्रित करण्यासाठी जलद जेश्चर" "तुमचे डिव्हाइस नियंत्रित करण्यासाठी जलद जेश्चर" "कॅमेरा झटपट उघडा" - "कॅमेरा झटपट उघडण्यासाठी, पॉवर बटण दोनदा दाबा. कोणत्याही स्क्रीनवरून कार्य करते." + "कॅमेरा झटपट उघडण्यासाठी, पॉवर बटण दोनदा प्रेस करा. कोणत्याही स्क्रीनवरून कार्य करते." "कॅमेरा पटकन उघडा" "सेल्फीसाठी कॅमेरा फ्लिप करा" @@ -4979,7 +4979,7 @@ "आणीबाणी SOS" "आणीबाणी SOS वापरा" "%1$s द्वारे व्यवस्थापित केलेले" - "खालील कृती सुरू करण्यासाठी पॉवर बटण झटपट पाच वेळा दाबा" + "खालील कृती सुरू करण्यासाठी पॉवर बटण झटपट पाच वेळा प्रेस करा" "काउंटडाउन अलार्म प्ले करा" "आणीबाणी SOS सुरू होत असताना मोठ्ठा आवाज करा" "मदतीसाठी सूचित करा" @@ -5239,7 +5239,7 @@ "फोनची बॅटरी लाइफ सुधारा" "रिंग होणे थांबवा" - "यासाठी पॉवर आणि व्हॉल्यूम अप एकत्र दाबा" + "यासाठी पॉवर आणि व्हॉल्यूम अप एकत्र प्रेस करा" "रिंग होण्‍यास प्रतिबंध करण्‍यासाठी शॉर्टकट" "व्हायब्रेट" "म्यूट करा" @@ -5542,8 +5542,8 @@ "पॉवर बटण धरून ठेवून Assistant ट्रिगर करा" "पॉवर आणि आणीबाणीशी संबंधित मेनू:\nपॉवर आणि व्‍हॉल्‍यूम जास्त ही बटणे एकाच वेळी प्रेस करा." "रिंग होणे थांबवणे:\nव्‍हॉल्‍यूम मेनूमध्ये शॉर्टकट उपलब्ध आहे." - "दाबून धरून ठेवण्याचा कालावधी" - "किती वेळासाठी पॉवर बटण दाबून धरून ठेवायचे हे निवडून संवेदनशीलता अ‍ॅडजस्ट करा" + "प्रेस करून धरून ठेवण्याचा कालावधी" + "किती वेळासाठी पॉवर बटण प्रेस करून धरून ठेवायचे हे निवडून संवेदनशीलता अ‍ॅडजस्ट करा" "कमी वेळासाठी" "जास्त वेळासाठी" "वॉलेट दाखवा" diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 7f6b905deed..549cd192086 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -2282,8 +2282,8 @@ "အက်ပ်" "နောက်ဆုံး အကြိမ် အသုံးပြုခဲ့" "အသုံးပြုအချိန်" - "အများ သုံးစွဲနိုင်မှု" - "အများ သုံးစွဲနိုင်မှု ဆက်တင်များ" + "အများသုံးနိုင်မှု" + "အများသုံးနိုင်မှု ဆက်တင်များ" "ဖန်သားပြင်၊ ပြန်လှန်တုံ့ပြန်မှု၊ အသံ" "မြင်ကွင်း ဆက်တင်များ" "သင့်လိုအပ်ချက်များနှင့် ကိုက်ညီမှုရှိစေရန် ဤစက်ပစ္စည်းကို စိတ်ကြိုက်ပြင်ဆင်နိုင်သည်။ အများသုံးနိုင်သည့် ဤဝန်ဆောင်မှုများကို ဆက်တင်များထဲ၌ နောက်ပိုင်းတွင် ပြောင်းလဲနိုင်သည်။" @@ -2323,9 +2323,9 @@ "ဖန်သားပြင် တစ်စိတ်တစ်ပိုင်းကို ချဲ့ပါ" "ဖန်သားပြင်အပြည့်နှင့် ဖန်သားပြင် တစ်စိတ်တစ်ပိုင်းကြား ပြောင်းပါ" "ရွေးချယ်စရာနှစ်ခုလုံးကြား ရွှေ့ရန် ပြောင်းသည့်ခလုတ်ကို တို့ပါ" - "အများသုံးစွဲနိုင်မှု ခလုတ်သို့ ပြောင်းမလား။" + "အများသုံးနိုင်မှု ခလုတ်သို့ ပြောင်းမလား။" "သင့်ဖန်သားပြင်၏တစ်စိတ်တစ်ပိုင်းကို ချဲ့ရန် သုံးချက်တို့ခြင်းသည် စာရိုက်ခြင်းနှင့် အခြားအရာများကို နှောင့်နှေးစေသည်။\n\nအများသုံးစွဲနိုင်မှုခလုတ်သည် သင့်ဖန်သားပြင်ပေါ်ရှိ အခြားအက်ပ်များတွင် ပေါ်သည်။ ချဲ့ရန် ၎င်းကိုတို့ပါ။" - "အများသုံးစွဲနိုင်မှု ခလုတ်သို့ ပြောင်းရန်" + "အများသုံးနိုင်မှု ခလုတ်သို့ ပြောင်းရန်" "သုံးချက်တို့ခြင်းကို သုံးရန်" "၎င်းသည် သင့်ကီးဘုတ်ကို နှေးသွားစေနိုင်သည်" "သင်၏ဖန်သားပြင် တစ်စိတ်တစ်ပိုင်းကို ချဲ့ရန် သုံးချက်တို့သောအခါ ကီးဘုတ်တွင် ပြဿနာများကို တွေ့နိုင်သည်။\n\nဤသို့မဖြစ်စေရန် ချဲ့သည့်ဖြတ်လမ်းအတွက် သုံးချက်တို့ခြင်းမှ အခြားပုံစံတစ်ခုသို့ ပြောင်းနိုင်သည်။\n""ဆက်တင်ပြောင်းရန်" @@ -2360,7 +2360,7 @@ "အသံခလုတ်များကို နှိပ်၍ဖွင့်ခြင်း" "ဖွင့်ရန် သုံးချက်တို့ခြင်း" "ဖွင့်ရန် လက်ဟန်ကို အသုံးပြုပါ" - "အများသုံးစွဲနိုင်မှု လက်ဟန်ကို သုံးပါ" + "အများသုံးနိုင်မှု လက်ဟန်ကို သုံးပါ" "ဤဝန်ဆောင်မှု အသုံးပြုရန် သင့်ဖန်သားပြင် အောက်ခြေရှိ သုံးနိုင်မှုခလုတ် %s ကို တို့ပါ။\n\nဝန်ဆောင်မှုများအကြား ပြောင်းရန် သုံးနိုင်မှုခလုတ်ကို ဖိထားပါ။" "ဤဝန်ဆောင်မှုကိုသုံးရန် သင့်ဖန်သားပြင်ပေါ်ရှိ သုံးနိုင်မှုခလုတ်ကို တို့ပါ။" "ဤဝန်ဆောင်မှု အသုံးပြုရန် အသံခလုတ် နှစ်ခုလုံးကို နှိပ်ထားပါ။" @@ -2371,12 +2371,12 @@ "အများသုံးနိုင်သည့် ဝန်ဆောင်မှုတစ်ခု အသုံးပြုရန် လက် ၃ ချောင်းဖြင့် ဖန်သားပြင်အောက်ခြေမှ အပေါ်သို့ပွတ်ဆွဲပါ။\n\nဝန်ဆောင်မှုများအကြား ပြောင်းရန် လက် ၃ ချောင်းဖြင့် အပေါ်သို့ပွတ်ဆွဲပြီး ဖိထားပါ။" "ရပါပြီ" "%1$s ဖြတ်လမ်းလင့်ခ်" - "အများသုံးစွဲနိုင်မှု ခလုတ်" - "အများသုံးစွဲနိုင်မှု လက်ဟန်" + "အများသုံးနိုင်မှု ခလုတ်" + "အများသုံးနိုင်မှု လက်ဟန်" "လက် ၂ ချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပါ" "လက် ၃ ချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပါ" "သုံးနိုင်မှုခလုတ်ကို တို့ခြင်း" - "အများသုံးစွဲနိုင်မှု လက်ဟန်ကို သုံးပါ" + "အများသုံးနိုင်မှု လက်ဟန်ကို သုံးပါ" "သင့်ဖန်သားပြင်အောက်ခြေရှိ အများသုံးစွဲနိုင်မှုခလုတ် %s ကိုတို့ပါ။\n\nဝန်ဆောင်မှုများအကြား ပြောင်းလဲရန် အများသုံးစွဲနိုင်မှုခလုတ်ကို ထိပြီး နှိပ်ထားပါ။" "လက် ၂ ချောင်းဖြင့် ဖန်သားပြင်အောက်ခြေမှ အပေါ်သို့ပွတ်ဆွဲပါ။\n\nဝန်ဆောင်မှုများအကြား ပြောင်းရန် လက် ၂ ချောင်းဖြင့် အပေါ်သို့ပွတ်ဆွဲပြီး ဖိထားပါ။" "လက် ၃ ချောင်းဖြင့် ဖန်သားပြင်အောက်ခြေမှ အပေါ်သို့ပွတ်ဆွဲပါ။\n\nဝန်ဆောင်မှုများအကြား ပြောင်းရန် လက် ၃ ချောင်းဖြင့် အပေါ်သို့ပွတ်ဆွဲပြီး ဖိထားပါ။" @@ -2389,20 +2389,20 @@ "ဖန်သားပြင်ကို သုံးချက်တို့ရန်" "ဖန်သားပြင်ကို {0,number,integer} ကြိမ် အမြန်တို့ပါ။ ဤဖြတ်လမ်းလင့်ခ်သည် သင့်စက်ကို နှေးသွားစေနိုင်သည်" "အဆင့်မြင့်" - "အများသုံးစွဲနိုင်မှု ခလုတ်ကို %1$s အဖြစ် သတ်မှတ်ထားသည်။ ပုံကြီးချဲ့ခြင်းကို အသုံးပြုရန် အများသုံးစွဲနိုင်မှု ခလုတ်ကို ထိထားပြီးနောက် ပုံကြီးချဲ့ခြင်းကို ရွေးပါ။" - "အများသုံးစွဲနိုင်မှု လက်ဟန်ကို %1$s အဖြစ် သတ်မှတ်ထားသည်။ ပုံကြီးချဲ့ခြင်းကို အသုံးပြုရန် မျက်နှာပြင်၏ အောက်ခြေမှနေ၍ အပေါ်သို့ လက်နှစ်ချောင်းဖြင့် ပွတ်ဆွဲပြီး ဖိထားပါ။ ထို့နောက် ပုံကြီးချဲ့ခြင်းကို ရွေးပါ။" + "အများသုံးနိုင်မှု ခလုတ်ကို %1$s အဖြစ် သတ်မှတ်ထားသည်။ ပုံကြီးချဲ့ခြင်းကို အသုံးပြုရန် အများသုံးနိုင်မှု ခလုတ်ကို ထိထားပြီးနောက် ပုံကြီးချဲ့ခြင်းကို ရွေးပါ။" + "အများသုံးနိုင်မှု လက်ဟန်ကို %1$s အဖြစ် သတ်မှတ်ထားသည်။ ပုံကြီးချဲ့ခြင်းကို အသုံးပြုရန် မျက်နှာပြင်၏ အောက်ခြေမှနေ၍ အပေါ်သို့ လက်နှစ်ချောင်းဖြင့် ပွတ်ဆွဲပြီး ဖိထားပါ။ ထို့နောက် ပုံကြီးချဲ့ခြင်းကို ရွေးပါ။" "အသံခလုတ် ဖြတ်လမ်း" "ဖြတ်လမ်း ဝန်ဆောင်မှု" "ဖြတ်လမ်းလင့်ခ် ဆက်တင်များ" "လော့ခ်မျက်နှာပြင်မှ ဖြတ်လမ်းလင့်ခ်" "ဝန်ဆောင်မှု ဖြတ်လမ်းလင့်ခ်အား လော့ခ်ချထားစဉ် ဖန်သားပြင်တွင် ဖွင့်ခွင့်ပြုသည်။ အသံခလုတ်နှစ်ခုလုံးကို စက္ကန့်အနည်းငယ် ဖိထားပါ။" - "အများသုံးစွဲနိုင်မှု ခလုတ်" - "အများသုံးစွဲနိုင်မှု ခလုတ်နှင့် လက်ဟန်" + "အများသုံးနိုင်မှု ခလုတ်" + "အများသုံးနိုင်မှု ခလုတ်နှင့် လက်ဟန်" "အများသုံးနိုင်သည့် ဝန်ဆောင်မှုများကို မည်သည့်ဖန်သားပြင်မှမဆို အမြန်သုံးနိုင်သည်" - "အများသုံးစွဲနိုင်မှု ခလုတ် အကြောင်း" - "အများသုံးစွဲနိုင်မှု ခလုတ်နှင့် လက်ဟန် အကြောင်း" - "အများသုံးစွဲနိုင်မှု ခလုတ်နှင့် လက်ဟန် အကြောင်း ပိုမိုလေ့လာရန်" - "အများသုံးစွဲနိုင်မှု ခလုတ်ကို သုံးနေသည်။ ခလုတ် ၃ ခုဖြင့် လမ်းညွှန်ခြင်းဖြင့် ဤလက်ဟန်ကို မရနိုင်ပါ။" + "အများသုံးနိုင်မှု ခလုတ် အကြောင်း" + "အများသုံးနိုင်မှု ခလုတ်နှင့် လက်ဟန် အကြောင်း" + "အများသုံးနိုင်မှု ခလုတ်နှင့် လက်ဟန် အကြောင်း ပိုမိုလေ့လာရန်" + "အများသုံးနိုင်မှု ခလုတ်ကို သုံးနေသည်။ ခလုတ် ၃ ခုဖြင့် လမ်းညွှန်ခြင်းဖြင့် ဤလက်ဟန်ကို မရနိုင်ပါ။" "အများသုံးစွဲနိုင်မှုဆိုင်ရာ ဝန်ဆောင်မှုများကို အမြန်သုံးသည်" "စတင်ရန်"\n"၁။ သုံးနိုင်မှု ဆက်တင်များသို့ သွားပါ\n၂။ ဝန်ဆောင်မှုတစ်ခုရွေးပြီး ဖြတ်လမ်းလင့်ခ်ကို တို့ပါ\n၃။ ဝန်ဆောင်မှုသုံးရန် အသုံးပြုလိုသည့် ခလုတ် (သို့) လက်ဟန်ကို ရွေးပါ" "စတင်ရန်"\n"၁။ သုံးနိုင်မှု ဆက်တင်များသို့ သွားပါ\n၂။ ဝန်ဆောင်မှုတစ်ခုရွေးပြီး ဖြတ်လမ်းလင့်ခ်ကို တို့ပါ\n၃။ ဝန်ဆောင်မှုသုံးမည့် ခလုတ်ကို ရွေးပါ" @@ -2434,8 +2434,8 @@ "၁ မိနစ်" "၂ မိနစ်" "လုပ်ရန်အချိန် (အသုံးလွယ်မှုအချိန်ကုန်ခြင်း)" - "လုပ်ရန်အချိန် အကြောင်း (အများသုံးစွဲနိုင်မှု အချိန်ကုန်သွားခြင်း)" - "လုပ်ဆောင်ရန် လိုအပ်ချိန် (အများသုံးစွဲနိုင်မှု အချိန်ကုန်သွားခြင်း) အကြောင်း ပိုမိုလေ့လာရန်" + "လုပ်ရန်အချိန် အကြောင်း (အများသုံးနိုင်မှု အချိန်ကုန်သွားခြင်း)" + "လုပ်ဆောင်ရန် လိုအပ်ချိန် (အများသုံးနိုင်မှု အချိန်ကုန်သွားခြင်း) အကြောင်း ပိုမိုလေ့လာရန်" "တစ်ခုခုလုပ်ဆောင်ရန် အချိန်" "ဤအချိန်ကိုက်ခြင်းသတ်မှတ်ချက်ကို အက်ပ်တိုင်းက မပံ့ပိုးပါ" "တစ်ခုခုလုပ်ဆောင်ရန်ပြောသည့် ယာယီမက်ဆေ့ဂျ်များ မည်မျှကြာပြရမည်ကို ရွေးနိုင်သည်" @@ -2503,7 +2503,7 @@ "နောက်ထပ် ရွေးစရာများ" "စာတန်းအရွယ်အစားနှင့် ပုံစံကို ဖတ်ရလွယ်ကူစေရန် စိတ်ကြိုက်လုပ်နိုင်သည်" "ဤစာတန်းသတ်မှတ်ချက်များကို မီဒီယာအက်ပ်တိုင်းက မပံ့ပိုးနိုင်ပါ" - "အများသုံးစွဲနိုင်မှု ခလုတ်" + "အများသုံးနိုင်မှု ခလုတ်" "လက် ၂ ချောင်းကို အသုံးပြု၍ အောက်ခြေမှ ပွတ်ဆွဲပါ" "အသံအတိုးအလျှော့ခလုတ်များကို ဖိထားခြင်း" "ဖန်သားပြင်ကို သုံးချက် တို့ပါ" @@ -2532,7 +2532,7 @@ "ပိတ်" "အလုပ်မလုပ်ပါ။ အချက်အလက်များအတွက် တို့ပါ။" "ဤဝန်ဆောင်မှု ချွတ်ယွင်းနေသည်။" - "အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်များ" + "အများသုံးနိုင်မှု ဖြတ်လမ်းလင့်ခ်များ" "အမြန်ဆက်တင်များတွင်ပြပါ" "အနီ-အစိမ်း" "အနီ-အစိမ်း" @@ -2606,8 +2606,8 @@ "%1$s အား သင့်စက်ပစ္စည်းကို အပြည့်အဝ ထိန်းချုပ်ခွင့်ပေးလိုပါသလား။" "%1$s ကလုပ်ဆောင်ရန်များ-" "အပလီကေးရှင်းသည် ခွင့်ပြုချက်တောင်းခံမှုကို ပိတ်လိုက်ခြင်းကြောင့်၊ သင့်တုန့်ပြန်မှုကို အချိန်ညှိချက်များ အတည်မပြုနိုင်ပါ။" - "%1$s က ဤကိရိယာကို အပြည့်အဝ ထိန်းချုပ်ခွင့် တောင်းဆိုနေသည်။ ဤဝန်ဆောင်မှုက ဖန်သားပြင်ရှိအရာများကို ဖတ်နိုင်ပြီး အများသုံးစွဲနိုင်မှု လိုအပ်ချက်များသုံး၍ အသုံးပြုသူများကိုယ်စား လုပ်ဆောင်နိုင်သည်။ ဤထိန်းချုပ်မှု အဆင့်သည် အက်ပ်အများစုအတွက် မသင့်လျော်ပါ။" - "အများသုံးစွဲနိုင်မှု လိုအပ်ချက်များအတွက် အထောက်အကူပြုသည့် အက်ပ်များကို အပြည့်အဝထိန်းချုပ်ခြင်းသည် သင့်လျော်သော်လည်း အက်ပ်အများစုအတွက် မသင့်လျော်ပါ။" + "%1$s က ဤကိရိယာကို အပြည့်အဝ ထိန်းချုပ်ခွင့် တောင်းဆိုနေသည်။ ဤဝန်ဆောင်မှုက ဖန်သားပြင်ရှိအရာများကို ဖတ်နိုင်ပြီး အများသုံးနိုင်မှု လိုအပ်ချက်များသုံး၍ အသုံးပြုသူများကိုယ်စား လုပ်ဆောင်နိုင်သည်။ ဤထိန်းချုပ်မှု အဆင့်သည် အက်ပ်အများစုအတွက် မသင့်လျော်ပါ။" + "အများသုံးနိုင်မှု လိုအပ်ချက်များအတွက် အထောက်အကူပြုသည့် အက်ပ်များကို အပြည့်အဝထိန်းချုပ်ခြင်းသည် သင့်လျော်သော်လည်း အက်ပ်အများစုအတွက် မသင့်လျော်ပါ။" "ဖန်သားပြင်ကို ကြည့်ရှုထိန်းချုပ်ခြင်း" "၎င်းသည် မျက်နှာပြင်ပေါ်ရှိ အကြောင်းအရာအားလုံးကို ဖတ်နိုင်ပြီး အခြားအက်ပ်များအပေါ်တွင် အကြောင်းအရာကို ဖော်ပြနိုင်သည်။" "လုပ်ဆောင်ချက်များကို ကြည့်ရှုဆောင်ရွက်ခြင်း" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index e55419a0b46..dd1e7fcaeb0 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -477,8 +477,8 @@ "Ansikt og fingeravtrykk er lagt til" "Når du konfigurerer ansiktslås og opplåsing med fingeravtrykk, blir du bedt om å bruke fingeravtrykk når du bruker munnbind eller er i et dårlig belyst område." "Måter å låse opp på" - "Lås opp telefonen" - "Bekreft at det er deg, i apper" + "Låse opp telefonen" + "Bekrefte at det er deg, i apper" "Med ansiktet" "Med fingeravtrykket" "Med ansiktet eller fingeravtrykket" @@ -1775,7 +1775,7 @@ \n\n"Du er logget på disse kontoene nå:\n" \n\n"Det er andre brukere til stede på denne enheten.\n"
  • "musikk"
  • \n
  • "bilder"
  • \n
  • "andre brukerdata"
  • -
  • "e-SIM-kort"
  • +
  • "eSIM-kort"
  • \n\n"Dette sier ikke opp mobilabonnementet ditt." \n\n"For å slette musikk, bilder og andre brukerdata må ""USB-lagringen"" tømmes." \n\n"For å slette musikk, bilder og andre brukerdata må ""SD-kortet"" tømmes." diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index 74ef52a1b42..404051d170d 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -481,7 +481,7 @@ "एपहरू चलाउँदा आफ्नो पहिचान पुष्टि गर्नुहोस्" "अनुहार प्रयोग गरेर" "फिंगरप्रिन्ट प्रयोग गरेर" - "अनुहार वा फिङ्गरप्रिन्ट प्रयोग गरेर" + "अनुहार वा फिंगरप्रिन्ट प्रयोग गरेर" "यो फोन आफ्नो अभिभावकलाई देऊ" "ठिक छ" "स्क्रिन लक सेटअप छाड्ने हो?" @@ -2603,7 +2603,7 @@ "सायन" "पहेँलो" "म्याजेन्टा" - "%1$s लाई आफ्नो डिभाइस पूर्ण रूपमा नियन्त्रण गर्न दिने हो?" + "%1$sलाई आफ्नो डिभाइस पूर्ण रूपमा नियन्त्रण गर्न दिने हो?" "%1$s लाई आवश्यक:" "एपले अनुमति अनुरोधलाई अस्पष्ट मानिरहेको हुनाले, सेटिङहरूलले तपाईंको प्रतिक्रियालाई प्रमाणित गर्न सक्दैनन्।" "%1$s ले यो डिभाइस पूर्ण रूपमा नियन्त्रण गर्ने अनुमति माग्दै छ। यो सेवाले स्क्रिनमा भएका जानकारी पढ्न तथा पहुँचसम्बन्धी आवश्यकता भएका प्रयोगकर्ताहरूका तर्फबाट कारबाही गर्न सक्छ। धेरैजसो एपका हकमा यो स्तरको नियन्त्रण उपयुक्त हुँदैन।" @@ -2613,7 +2613,7 @@ "कारबाहीहरू हेर्नुहोस् र तिनमा कार्य गर्नुहोस्" "यसले कुनै एप वा हार्डवेयर सेन्सरसँग तपाईंले गर्ने अन्तर्क्रियाको ट्र्याक गर्न सक्छ र तपाईंका तर्फबाट एपहरूसँग अन्तर्क्रिया गर्न सक्छ।" "अनुमति दिनुहोस्" - "इन्कार गर्नु⋯" + "नदिनुहोस्" "रोक्नुहोस्" "रद्द गर्नु⋯" "%1$s बन्द गर्ने हो?" diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml index cc44b5c8b24..a55476088e4 100644 --- a/res/values-or/strings.xml +++ b/res/values-or/strings.xml @@ -680,7 +680,7 @@ "ପାଟର୍ନ" "PIN" "ପାସୱାର୍ଡ" - "ଥରେ ସ୍କ୍ରିନ ଲକ ସେଟ କରିବା ପରେ, ସେଟିଂସ ଓ ସୁରକ୍ଷାରେ ଆପଣ ଆପଣଙ୍କ ଟିପଚିହ୍ନକୁ ମଧ୍ୟ ସେଟ ଅପ କରିପାରିବେ।" + "ସ୍କ୍ରିନ ଲକ ସେଟ ଅପ କରିବା ପରେ, ସେଟିଂସ ଓ ସୁରକ୍ଷାରେ ଆପଣ ଆପଣଙ୍କ ଟିପଚିହ୍ନକୁ ମଧ୍ୟ ସେଟ ଅପ କରିପାରିବେ।" "ସ୍କ୍ରୀନ ଲକକୁ ବନ୍ଦ କର" "ସ୍କ୍ରିନ୍ ଲକ୍ ଡିଲିଟ୍ କରିବେ?" "ପ୍ରୋଫାଇଲ୍‌ ସୁରକ୍ଷା କାଢ଼ିଦେବେ?" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 2c40d2470c8..91ccd85cfaf 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -2296,7 +2296,7 @@ "Màu sắc và chuyển động" "Giảm bớt độ sáng màn hình" "Điều khiển tương tác" - "Điều khiển thời gian" + "Điều khiển có hẹn giờ" "Điều khiển hệ thống" "Ứng dụng đã tải xuống" "Thử nghiệm" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 5972abb45e0..d55cbbf2112 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -622,7 +622,7 @@ - "选择屏幕锁定方式" + "选择屏幕解锁方式" "选择一种屏幕锁定方式" "选择新的屏幕锁定方式" "为工作应用选择一种锁定方式" @@ -630,7 +630,7 @@ "保护您的平板电脑" "保护您的设备" "为手机启用保护功能" - "为提升安全性,请设置备用的锁屏方式" + "为提升安全性,请设置备用的屏幕解锁方式" "启用设备保护功能可防止他人在未经您允许的情况下使用此平板电脑。请选择您要使用的屏幕锁定方式。" "启用设备保护功能可防止他人在未经您允许的情况下使用此设备。请选择您要使用的屏幕锁定方式。" "启用设备保护功能可防止他人在未经您允许的情况下使用此手机。请选择您要使用的屏幕锁定方式。" From 113326ed83931189001c242972fe64928d1cd251 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 28 Mar 2023 17:54:17 -0700 Subject: [PATCH 05/12] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I278cdc816710d5eb2cf8fa3997d55aee0e3efa73 --- res/values-my/arrays.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values-my/arrays.xml b/res/values-my/arrays.xml index 55993e4d99f..89e253e6e5f 100644 --- a/res/values-my/arrays.xml +++ b/res/values-my/arrays.xml @@ -290,7 +290,7 @@ "မျက်နှာပြင်ကို ဖွင့်ပါ" "အကောင့်များကို ရယူပါ" "နောက်ခံမှာ အလုပ်လုပ်ပါ" - "အများသုံးစွဲနိုင်မှု အသံ" + "အများသုံးနိုင်မှု အသံ"
    "တည်နေရာ" @@ -357,7 +357,7 @@ "မျက်နှာပြင်ကို ဖွင့်ပါ" "အကောင့်များကို ရယူပါ" "နောက်ခံမှာ အလုပ်လုပ်ပါ" - "အများသုံးစွဲနိုင်မှု အသံ" + "အများသုံးနိုင်မှု အသံ" "အတို" From bc45b9f125e5512b4ba8c15c4338a5491984f990 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 28 Mar 2023 17:58:08 -0700 Subject: [PATCH 06/12] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: If406f25ee072b3c2a778d2e007abecc99f06caf6 --- res/values-ar/strings.xml | 10 ++++---- res/values-cs/strings.xml | 6 ++--- res/values-da/strings.xml | 14 +++++------ res/values-en-rAU/strings.xml | 2 +- res/values-en-rCA/strings.xml | 10 ++++---- res/values-en-rGB/strings.xml | 2 +- res/values-en-rIN/strings.xml | 2 +- res/values-es-rUS/strings.xml | 2 +- res/values-es/strings.xml | 4 ++-- res/values-et/strings.xml | 2 +- res/values-eu/strings.xml | 2 +- res/values-fr-rCA/strings.xml | 16 ++++++------- res/values-fr/strings.xml | 2 +- res/values-gl/strings.xml | 6 ++--- res/values-gu/strings.xml | 2 +- res/values-hi/strings.xml | 4 ++-- res/values-hy/strings.xml | 6 ++--- res/values-in/strings.xml | 4 ++-- res/values-it/strings.xml | 2 +- res/values-ka/strings.xml | 2 +- res/values-ml/strings.xml | 4 ++-- res/values-mr/strings.xml | 28 +++++++++++----------- res/values-my/strings.xml | 44 +++++++++++++++++------------------ res/values-nb/strings.xml | 6 ++--- res/values-ne/strings.xml | 6 ++--- res/values-or/strings.xml | 2 +- res/values-sk/strings.xml | 2 +- res/values-uk/strings.xml | 6 ++--- res/values-vi/strings.xml | 2 +- res/values-zh-rCN/strings.xml | 4 ++-- res/values-zh-rHK/strings.xml | 4 ++-- 31 files changed, 99 insertions(+), 109 deletions(-) diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 08f5eef3eee..5cbcec69f5b 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -2575,8 +2575,8 @@ "عند تفعيل ميزة \"التكبير\"، يمكنك تكبير حجم المحتوى على الشاشة.\n\n""للتكبير""، يمكنك تفعيل ميزة \"التكبير\" والنقر بعد ذلك على أي مكان في الشاشة.\n"
    • "يمكنك سحب إصبعين أو أكثر للتمرير."
    • \n
    • "يمكنك ضمّ إصبعين أو أكثر لتعديل حجم المحتوى."
    \n\n"للتكبير مؤقتًا""، يمكنك تفعيل ميزة التكبير والنقر مع الاستمرار على أي مكان في الشاشة.\n"
    • "يمكنك السحب للتنقّل داخل الشاشة."
    • \n
    • "يمكنك رفع إصبعك للتصغير."
    \n\n"لن يكون بإمكانك التكبير على لوحة المفاتيح أو شريط التنقل."
    "الصفحة %1$d من %2$d" "الفتح باستخدام زر \"أدوات تسهيل الاستخدام\"" - "اضغط مع الاستمرار على مفتاحَي مستوى الصوت لفتح الميزة" - "انقر على الشاشة ثلاث مرات لفتحها" + "اضغط مع الاستمرار على مفتاحَي مستوى الصوت لتفعيل الميزة" + "انقر على الشاشة ثلاث مرات لتفعيلها" "استخدام إيماءة للفتح" "استخدام إيماءة تسهيل الاستخدام" "لاستخدام هذه الميزة، انقر على زر أدوات تمكين الوصول %s في أسفل الشاشة.\n\nللتبديل بين الميزات، انقر مع الاستمرار على زر أدوات تمكين الوصول." @@ -6279,10 +6279,8 @@ "اختيار شاشة استراحة" "إظهار معلومات إضافية" "يتم عرض الوقت أو الطقس أو غير ذلك من المعلومات على شاشة الاستراحة." - - - - + "عرض زر إدارة المنزل آليًّا" + "عرض زر إدارة المنزل آليًّا من شاشة الاستراحة" "إعدادات إضافية" "اختيار شاشة الاستراحة" "اختَر ما تريد أن يظهر على شاشتك عندما يكون جهازك اللوحي في حالة إرساء. قد يستهلك جهازك قدرًا أكبر من الطاقة عند استخدام شاشة الاستراحة." diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 8ba1dba0b35..16ae14e7b8c 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -6103,10 +6103,8 @@ "Vyberte spořič obrazovky" "Zobrazovat další informace" "Zobrazovat na spořiči obrazovky informace jako čas, počasí atd." - - - - + "Zobrazit ovládání domácnosti" + "Zobrazit tlačítko ovládání domácnosti ze spořiče obrazovky" "Další nastavení" "Vyberte spořič obrazovky" "Určete, co chcete vídat na obrazovce, když je tablet v doku. Při používání spořiče obrazovky může mít zařízení vyšší spotřebu energie." diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index dc95b684651..3bdaa1bd1f3 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -549,8 +549,8 @@ "Ansigt og fingeraftryk er tilføjet" "Når du konfigurerer ansigtslås og oplåsning med fingeraftryk, beder din telefon om dit fingeraftryk, hvis du er iført en maske eller befinder dig et mørkt sted" "Muligheder for oplåsning" - "Lås din telefon op" - "Verificer din identitet i apps" + "Låse din telefon op" + "Verificere din identitet i apps" "Anvend ansigtsgenkendelse" "Anvend fingeraftryk" "Anvend ansigtsgenkendelse eller fingeraftryk" @@ -4506,15 +4506,15 @@ "Tilføj link" "En app kan bekræfte links, så de automatisk åbnes i appen." - %d bekræftet link - %d bekræftede links + %d verificeret link + %d verificerede links - Dette link er bekræftet og åbnes automatisk i denne app. - Disse links er bekræftede og åbnes automatisk i denne app. + Dette link er verificeret og åbnes automatisk i denne app. + Disse links er verificerede og åbnes automatisk i denne app. "OK" - "Vis liste over bekræftede links" + "Vis liste over verificerede links" "Søger efter andre understøttede links…" "Annuller" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index bf20edef4d9..55dfbe8a6a1 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -3099,7 +3099,7 @@ "System usage for %s" "App usage for %s" "Total: less than a min." - "Background: less than a min." + "Background: less than a min" "Total: %s" "Background: %s" "Battery usage data is approximate and doesn\'t measure usage when phone is charging" diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml index 4cdb068ac97..7468605a3da 100644 --- a/res/values-en-rCA/strings.xml +++ b/res/values-en-rCA/strings.xml @@ -2480,7 +2480,7 @@ "Page %1$d of %2$d" "Use accessibility button to open" "Hold volume keys to open" - "Triple tap screen to open" + "Triple-tap screen to open" "Use gesture to open" "Use accessibility gesture" "To use this feature, tap the accessibility button %s on the bottom of your screen.\n\nTo switch between features, touch & hold the accessibility button." @@ -3202,7 +3202,7 @@ "Certificate not installed" "Allow ""^1"" to install certificates on this device?" "These certificates will verify you by sharing your device’s unique ID with the apps and URLs below" - "Don’t allow" + "Don\'t allow" "Allow" "Show more" "Certificate management app" @@ -4084,7 +4084,7 @@ "Show sensitive work profile content when locked" "Show all notification content" "Show sensitive content only when unlocked" - "Don’t show notifications at all" + "Don\'t show notifications at all" "How do you want the lock screen to display?" "Lock screen" "Show all work notification content" @@ -5087,8 +5087,8 @@ "Emergency SOS, medical info, alerts" "Gesture navigation" "To go Home, swipe up from the bottom of the screen. To switch apps, swipe up from the bottom, hold, then release. To go back, swipe from either the left or right edge." - "3-button navigation" - "Go back, Home, and switch apps with buttons at the bottom of your screen." + "Three-button navigation" + "Go back, Home and switch apps with buttons at the bottom of your screen." "system navigation, 2 button navigation, 3 button navigation, gesture navigation, swipe" "Not supported by your default home app, %s" "Switch default home app" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 97d126aa080..0f25697fb18 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -3099,7 +3099,7 @@ "System usage for %s" "App usage for %s" "Total: less than a min." - "Background: less than a min." + "Background: less than a min" "Total: %s" "Background: %s" "Battery usage data is approximate and doesn\'t measure usage when phone is charging" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index d6ba8cadc1f..802ae887c57 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -3099,7 +3099,7 @@ "System usage for %s" "App usage for %s" "Total: less than a min." - "Background: less than a min." + "Background: less than a min" "Total: %s" "Background: %s" "Battery usage data is approximate and doesn\'t measure usage when phone is charging" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 3515bad42e4..b866753523e 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -2048,7 +2048,7 @@ "Establecer un PIN" "Establecer un PIN de trabajo" "Establecer un patrón" - "Para mayor seguridad, establece un patrón para desbloquear el dispositivo" + "Para mayor seguridad, establece un patrón para desbloquear el dispositivo." "Establecer un patrón de trabajo" "Configura la contraseña de respaldo" "Para usar tu huella, configura un patrón" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 8c819dd72da..9707a7bb998 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -4083,7 +4083,7 @@ "Notificaciones sensibles del perfil de trabajo" "Mostrar contenido sensible del perfil de trabajo en la pantalla de bloqueo" "Mostrar todo el contenido de las notificaciones" - "Mostrar contenido sensible solo al desbloquear" + "Mostrar contenido sensible solo tras desbloqueo" "No mostrar ninguna notificación" "¿Cómo quieres que se muestren las notificaciones en la pantalla de bloqueo?" "Pantalla de bloqueo" @@ -4969,7 +4969,7 @@ "Desactivar ahora" "No se está utilizando la optimización de la batería" "Uso de batería de las aplicaciones" - "Configurar el uso de batería de las aplicaciones" + "Configura el uso de batería de las aplicaciones" "Sin restricciones" "Optimizado" "Restringido" diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 8a4f972c533..4c7e7162c5c 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -2484,7 +2484,7 @@ "Kasutage avamiseks liigutust" "Juurdepääsuliigutuse kasutamine" "Selle funktsiooni kasutamiseks puudutage ekraanikuva allosas juurdepääsetavuse nuppu %s.\n\nFunktsioonide vahel vahetamiseks puudutage juurdepääsetavuse nuppu pikalt." - "Selle funktsiooni kasutamiseks puudutage ekraanikuval juurdepääsetavuse nuppu" + "Selle funktsiooni kasutamiseks puudutage ekraanikuval juurdepääsetavuse nuppu." "Selle funktsiooni kasutamiseks vajutage pikalt mõlemat helitugevuse klahvi." "Suurenduse käivitamiseks ja peatamiseks puudutage ekraani kolm korda." "Selle funktsiooni kasutamiseks pühkige ekraanikuva allosast kahe sõrmega üles.\n\nFunktsioonide vahel vahetamiseks pühkige kahe sõrmega üles ja hoidke sõrmi ekraanil." diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index 275d34d8196..a1ce2f59dcc 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -522,7 +522,7 @@ "Altxatu hatza dardara sumatzen duzunean" "Joan argi gutxiagoko toki batera eta saiatu berriro" "Gehieneko saiakera kopurua agortu duzu" - "Erlojuaren bidez telefonoa desblokeatzea" + "Erloju bidez desblokeatzea" "Aurpegi eta hatz-marka bidez desblokeatzeko eginbideak konfiguratzen badituzu, telefonoak hatz-marka eskatuko dizu inoiz maskara bat jantzita edo argi gutxirekin telefonoa aurpegiaren bidez desblokeatzen saiatuz gero.\n\nAurpegia edo hatz-marka ezagutzen ez bada, erlojuaren bidez desblokea dezakezu telefonoa." "Aurpegi eta hatz-marka bidez desblokeatzeko eginbideak konfiguratzen badituzu, tabletak hatz-marka eskatuko dizu inoiz maskara bat jantzita edo argi gutxirekin tableta aurpegiaren bidez desblokeatzen saiatuz gero.\n\nAurpegia edo hatz-marka ezagutzen ez bada, erlojuaren bidez desblokea dezakezu tableta." "Hatz-marka ezagutzen ez bada, erlojuaren bidez desblokea dezakezu telefonoa." diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 553402fec7e..2c0159a41eb 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -2043,15 +2043,15 @@ "Informations de sécurité" "Vous n\'avez pas de connexion Internet. Pour consulter ces renseignements maintenant, accédez à %s sur un ordinateur connecté à Internet." "Chargement en cours..." - "Définir un mot de passe" + "Définissez un mot de passe" "Définir un mot de passe professionnel" - "Définir un NIP" + "Définissez un NIP" "Définir un NIP professionnel" "Définir un schéma" - "Pour renforcer la sécurité, définir un schéma pour déverrouiller l\'appareil" + "Pour renforcer la sécurité, définissez un schéma pour déverrouiller l\'appareil" "Définir un mot de schéma professionnel" "Pour util. empr. digit., config. m. de passe" - "Pour utiliser empreinte digitale, configurer un schéma" + "Pour utiliser votre empreinte, configurez un schéma" "Pour votre sécurité, définissez un NIP" "Pour util. empr. digit., config. NIP" "Entrer de nouveau votre mot de passe" @@ -2428,7 +2428,7 @@ "Préférences de sous-titres" "À propos des préférences de sous-titres" "En savoir plus sur les préférences de sous-titres" - "Zoom" + "Agrandissement" "Raccourci de l\'agrandissement" "Agrandir l\'entrée" "La loupe suit le texte lorsque vous tapez" @@ -2479,14 +2479,14 @@ "When magnification is turned on, you can zoom in on your screen.\n\n""Pour effectuer un zoom,"", activez cette fonction, puis touchez une zone de l\'écran.\n"
    • "Glissez deux doigts ou plus sur l\'écran pour le faire défiler"
    • \n
    • "Pincez deux doigts ou plus pour ajuster le zoom"
    \n\n"Pour zoomer temporairement l\'écran"", touchez le bouton d\'accessibilité, puis maintenez le doigt sur ailleurs sur l\'écran.\n"
    • "Glissez votre doigt sur l\'écran à l\'endroit désiré"
    • \n
    • "Relevez le doigt pour zoomer vers l\'arrière"
    \n\n"On ne peut pas zoomer sur le clavier ou la barre de navigation."
    "Page %1$d sur %2$d" "Utiliser le bouton d\'accessibilité pour ouvrir" - "Maintenez enf. les touches de volume pour l\'ouvrir" + "Maintenez les touches de volume enfoncées pour l\'ouvrir" "Touchez l\'écran trois fois pour l\'ouvrir" "Utiliser un geste pour activer le service" "Utiliser le geste d\'accessibilité" "Pour utiliser cette fonctionnalité, touchez le bouton d\'accessibilité %s dans le bas de l\'écran.\n\nPour basculer entre les fonctionnalités, maintenez le doigt sur le bouton d\'accessibilité." "Pour utiliser cette fonctionnalité, touchez le bouton d\'accessibilité sur votre écran." - "Pour utiliser cette fonctionnalité, maintenez enfoncées les deux touches de volume." - "Pour démarrer et arrêter l\'agrandissement, touchez trois fois n\'importe où sur l\'écran." + "Pour utiliser cette fonctionnalité, maintenez les deux touches de volume enfoncées." + "Pour démarrer et arrêter l\'agrandissement, touchez l\'écran trois fois n\'importe où." "Pour utiliser cette fonctionnalité, balayez l\'écran de bas en haut avec deux doigts.\n\nPour basculer entre les fonctionnalités, balayez l\'écran vers le haut avec deux doigts et maintenez-les-y." "Pour utiliser cette fonctionnalité, balayez l\'écran de bas en haut avec trois doigts.\n\nPour basculer entre les fonctionnalités, balayez l\'écran vers le haut avec trois doigts et maintenez-les-y." "Pour utiliser une fonctionnalité d\'accessibilité, balayez l\'écran de bas en haut avec deux doigts.\n\nPour basculer entre les fonctionnalités, balayez l\'écran vers le haut avec deux doigts et maintenez-les-y." diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 50327977100..529c7032fcd 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -2509,7 +2509,7 @@ "Appuyer de manière prolongée sur les deux boutons de volume" "Appuyer trois fois sur l\'écran" "appuyer trois fois sur l\'écran" - "Appuyez rapidement {0,number,integer} fois sur l\'écran. Ce raccourci peut ralentir votre appareil." + "Appuyer rapidement {0,number,integer} fois sur l\'écran. Ce raccourci peut ralentir votre appareil." "Paramètres avancés" "Le bouton Accessibilité est défini sur %1$s. Pour utiliser la loupe, appuyez de manière prolongée sur le bouton Accessibilité, puis sélectionnez la loupe." "Le geste d\'accessibilité est défini sur %1$s. Pour utiliser la loupe, balayez l\'écran de bas en haut avec deux doigts et maintenez la pression, puis sélectionnez la loupe." diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index ab167e30b77..c51bc3e0707 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -5927,10 +5927,8 @@ "Escolle un protector de pantalla" "Mostrar información adicional" "Mostra a hora, o tempo ou outra información no protector de pantalla" - - - - + "Mostrar controis domóticos" + "Mostra o botón dos controis domóticos no protector de pantalla" "Máis opcións de configuración" "Escolle o protector de pantalla" "Escolle o que aparecerá na pantalla cando a tableta estea na súa base. Pode que o dispositivo utilice máis enerxía se se usa un protector de pantalla." diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index e4279eb5243..d20fd6094ff 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -553,7 +553,7 @@ "ઍપનો ઉપયોગ કરનારા એ તમે જ છો તેની ચકાસણી કરો" "ચહેરાનો ઉપયોગ કરીને" "ફિંગરપ્રિન્ટનો ઉપયોગ કરીને" - "ચહેરા કે ફિંગરપ્રિન્ટનો ઉપયોગ કરીને" + "ફેસ કે ફિંગરપ્રિન્ટનો ઉપયોગ કરીને" "તમારા માતાપિતાને ટૅબ્લેટ પાછું આપો" "તમારા માતાપિતાને ડિવાઇસ પાછું આપો" "તમારા માતાપિતાને ફોન પાછો આપો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 127743ea99a..7c3fb9cd0ee 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -4994,7 +4994,7 @@ "इंटेंट मिटाएं" "फ़ुल स्क्रीन इंटेंट" "कार्रवाइयां" - "शीर्षक" + "टाइटल" "रिमोट इनपुट" "आपके मुताबिक दिखाई दे" "कुछ और" @@ -5305,7 +5305,7 @@ %1$d पासवर्ड
    "अपने-आप, भरना, अपने-आप भरने वाला, पासवर्ड" - "<b>पक्का करें कि आपको इस ऐप्लिकेशन पर भरोसा है</b> <br/> <br/> <xliff:g id=app_name example=Google ऑटोमैटिक भरना,>%1$s</xliff:g> ऑटोमैटिक भरी जा सकने वाली चीज़ें तय करने के लिए आपकी स्क्रीन पर मौजूद चीज़ों का इस्तेमाल करता है." + "<b>पक्का करें कि आपको इस ऐप्लिकेशन पर भरोसा है</b> <br/> <br/> <xliff:g id=app_name example=Google की मदद से, जानकारी अपने-आप भरने की सुविधा,>%1$s</xliff:g> ऑटोमैटिक भरी जा सकने वाली चीज़ें तय करने के लिए आपकी स्क्रीन पर मौजूद चीज़ों का इस्तेमाल करती है." "ऑटोमैटिक भरने की सुविधा" "लॉग की गई जानकारी का लेवल" "हर सेशन में ज़्यादा से ज़्यादा इतने अनुरोध शामिल कर सकते हैं" diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index 2f49e2ca14b..5af62cc25bc 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -5927,10 +5927,8 @@ "Ընտրեք էկրանապահ" "Ցույց տալ լրացուցիչ տեղեկություններ" "Ցուցադրել ժամը, եղանակը և այլ տեղեկություններ էկրանապահին" - - - - + "Ցույց տալ տան կառավարման տարրերը" + "Ցուցադրել տան կառավարման տարրերի կոճակը էկրանապահից" "Այլ կարգավորումներ" "Ընտրեք ձեր էկրանապահը" "Ընտրեք, թե ինչ եք ուզում տեսնել ձեր սարքի էկրանին, երբ ձեր պլանշետը դոկ-կայանում է։ Ձեր սարքը կարող է ավելի շատ էներգիա ծախսել, երբ էկրանապահ է օգտագործվում։" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 8b621d51f62..ea95fa83af2 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -549,8 +549,8 @@ "Wajah dan sidik jari ditambahkan" "Saat Anda menyiapkan Buka dengan Wajah dan Buka dengan Sidik Jari, ponsel akan meminta sidik jari saat Anda memakai masker atau berada di area yang gelap" "Cara membuka kunci" - "Buka kunci ponsel" - "Verifikasi diri Anda di aplikasi" + "Membuka kunci ponsel" + "Memverifikasi diri Anda di aplikasi" "Menggunakan wajah" "Menggunakan sidik jari" "Menggunakan wajah atau sidik jari" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 83f08141d2b..25e9a16ce04 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -719,7 +719,7 @@ - "Blocco schermo" + "Scegli blocco schermo" "Scegli un blocco schermo" "Scegli un nuovo blocco schermo" "Scegli un blocco per le app di lavoro" diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml index de42d60319e..5a98597f6d5 100644 --- a/res/values-ka/strings.xml +++ b/res/values-ka/strings.xml @@ -522,7 +522,7 @@ "აიღეთ თითი მას შემდეგ, რაც ვიბრაციას იგრძნობთ" "გადადით სადმე ნაკლებად კაშკაშა განათებით და განმეორებით ცადეთ" "თქვენ მიაღწიეთ მცდელობათა მაქსიმალურ რაოდენობას" - "საათის განბლოკვა" + "საათით განბლოკვა" "სახით და ანაბეჭდით განბლოკვას რომ დააყენებთ, ტელეფონი მოგთხოვთ თითის ანაბეჭდს, როცა პირბადეს ატარებთ ან ბნელ სივრცეში ხართ.\n\nშეგიძლიათ განბლოკოთ თქვენი საათით, როდესაც თქვენი სახის ან თითის ანაბეჭდის ამოცნობა ვერ ხერხდება." "სახით და ანაბეჭდით განბლოკვას რომ დააყენებთ, ტელეფონი მოგთხოვთ თითის ანაბეჭდს, როცა პირბადეს ატარებთ ან ბნელ სივრცეში ხართ.\n\nშეგიძლიათ განბლოკოთ თქვენი საათით, როდესაც თქვენი სახის ან თითის ანაბეჭდის ამოცნობა ვერ ხერხდება." "შეგიძლიათ განბლოკოთ თქვენი საათით, როდესაც თქვენი თითის ანაბეჭდის ამოცნობა ვერ ხერხდება." diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index e25bb7bfbd0..78f2e399cbd 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -3085,7 +3085,7 @@ "ഓണാക്കുക" "ബാറ്ററി ലാഭിക്കൽ ഉപയോഗിക്കുക" - "ഓട്ടോമാറ്റിക്കായി ഓണാക്കുക" + "സ്വയമേവ ഓണാക്കുക" "ഒരിക്കലും" "%1$s ബാറ്ററിയിൽ" "ബാറ്ററി ശതമാനം" @@ -4418,7 +4418,7 @@ "%1$s, %2$s എന്നിവർക്ക്" "%d-മിനിറ്റ് സമയത്തിനുള്ളിൽ അതേ വ്യക്തി രണ്ടാമത്തെ തവണ വിളിക്കുകയാണെങ്കിൽ" "ഇഷ്ടാനുസൃതം" - "ഓട്ടോമാറ്റിക്കായി ഓണാക്കുക" + "സ്വയമേവ ഓണാക്കുക" "ഒരിക്കലും" "എല്ലാ രാത്രിയും" "ശനിയാഴ്‌ചയും ഞായറാഴ്‌ചയും അല്ലാത്ത ദിവസങ്ങളിലെ രാത്രികൾ" diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index d2d30791f52..14ca04ed37c 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -926,7 +926,7 @@ "कनेक्शन व्यवस्थापित करा, डिव्हाइस नाव आणि शोधयोग्यता सेट करा" "%1$s सह पेअर करायचे?" "ब्लूटूथ पेअरिंग कोड" - "पेअरिंग कोड टाइप करा नंतर Return किंवा Enter दाबा" + "पेअरिंग कोड टाइप करा नंतर Return किंवा एंटर प्रेस करा" "पिन मध्ये अक्षरे किंवा प्रतीके आहेत" "सामान्यतः 0000 किंवा 1234" "16 अंक असणे आवश्यक आहे" @@ -935,7 +935,7 @@ "यासह जोडण्यासाठी:<br><b>%1$s</b><br><br>हे ही पासकी दर्शवत असल्याचे सुनिश्चित करा:<br><b>%2$s</b>" "समन्वित सेटशी पेअर करण्याचे कंफर्म करा" "यावरून:<br><b>%1$s</b><br><br>हे डिव्हाइस जोडायचे?" - "यासह जोडण्यासाठी:<br><b>%1$s</b><br><br>यावर टाइप करा:<br><b>%2$s</b>, नंतर Return किंवा Enter दाबा." + "यासह जोडण्यासाठी:<br><b>%1$s</b><br><br>यावर टाइप करा:<br><b>%2$s</b>, नंतर Return किंवा एंटर प्रेस करा." "तुमच्या संपर्क आणि कॉल इतिहासातील अ‍ॅक्सेसची अनुमती द्या" "%1$s सह कनेक्ट करणे शक्य झाले नाही." @@ -2109,7 +2109,7 @@ "अनलॉक पॅटर्न बदला" "अनलॉक पिन बदला" "अनलॉक पॅटर्न ड्रॉ करा" - "मदतीसाठी मेनू दाबा." + "मदतीसाठी मेनू प्रेस करा." "पूर्ण झाल्यावर बोट सोडा" "कमीत कमी %d बिंदू कनेक्ट करा. पुन्हा प्रयत्न करा." "पॅटर्न रेकॉर्ड झाला" @@ -2324,7 +2324,7 @@ "वाक्यांमधील प्रथम अक्षर कॅपिटलाइझ करा" "स्वयं-विरामचिन्हे घाला" "वास्तविक कीबोर्ड सेटिंग्ज" - "\".\" घालण्यासाठी Space की दोनदा दाबा" + "\".\" घालण्यासाठी Space की दोनदा प्रेस करा" "पासवर्ड दाखवा" "तुम्ही टाइप कराल त्‍याप्रमाणे वर्ण थोडक्‍यात डिस्प्ले करा" "हा शब्दलेखन तपासक तुम्ही पासवर्ड आणि क्रेडिट कार्ड नंबर यासारख्या वैयक्तिक डेटासह, टाइप करता तो सर्व मजकूर संकलित करण्यात सक्षम होऊ शकतो. हा %1$s ॲपवरून येतो. हा शब्दलेखन तपासक वापरायचा?" @@ -2351,7 +2351,7 @@ "कनेक्ट केले असताना गेम नियंत्रकाला व्हायब्रेशन पाठवा" "किबोर्ड लेआउट निवडा" "किबोर्ड लेआउट सेट करा" - "स्विच करण्यासाठी, Control-Spacebar दाबा" + "स्विच करण्यासाठी, Control-Spacebar प्रेस करा" "डीफॉल्ट" "किबोर्ड लेआउट" "वैयक्तिक शब्दकोश" @@ -2485,7 +2485,7 @@ "ॲक्सेसिबिलिटी जेश्चर वापरा" "हे वैशिष्ट्य वापरण्यासाठी, तुमच्या स्क्रीनच्या तळाशी असलेले ॲक्सेसिबिलिटी बटणावर %s टॅप करा.\n\nवैशिष्टयांदरम्यान स्विच करण्यासाठी ॲक्सेसिबिलिटी बटणाला स्पर्श करा आणि धरून ठेवा." "हे वैशिष्ट्य वापरण्यासाठी, तुमच्या स्क्रीनवरील अ‍ॅक्सेसिबिलिटी बटणावर टॅप करा." - "हे वैशिष्ट्य वापरण्यासाठी, दोन्ही व्हॉल्यूम की दाबा आणि धरून ठेवा." + "हे वैशिष्ट्य वापरण्यासाठी, दोन्ही व्हॉल्यूम की प्रेस करून धरून ठेवा." "मॅग्निफिकेशन सुरू करण्यासाठी आणि थांबवण्यासाठी तुमच्या स्क्रीनवर कुठेही तीनदा टॅप करा." "हे वैशिष्ट्य वापरण्यासाठी, दोन बोटांनी स्क्रीनच्या तळापासून वर स्वाइप करा.\n\nवैशिष्ट्यांदरम्यान स्विच करण्यासाठी दोन बोटांनी वर स्वाइप करा आणि धरून ठेवा." "हे वैशिष्ट्य वापरण्यासाठी, तीन बोटांनी स्क्रीनच्या तळापासून वर स्वाइप करा.\n\nवैशिष्ट्यांदरम्यान स्विच करण्यासाठी तीन बोटांनी वर स्वाइप करा आणि धरून ठेवा." @@ -2506,7 +2506,7 @@ "%1$s बद्दल अधिक जाणून घ्या" "व्हॉल्यूम की दाबून ठेवा" "व्हॉल्यूम की दाबून ठेवा" - "दोन्ही व्हॉल्यूम की दाबा आणि धरून ठेवा" + "दोन्ही व्हॉल्यूम की प्रेस करून धरून ठेवा" "स्क्रीनवर तीन वेळा टॅप करा" "स्क्रीनवर तीन वेळा टॅप करा" "स्क्रीनवर झटपट {0,number,integer} वेळा टॅप करा. हा शॉर्टकट तुमच्या डिव्हाइसचा वेग कमी करू शकताे" @@ -2733,7 +2733,7 @@ "स्क्रीन पहा आणि नियंत्रित करा" "ते स्क्रीनवरील सर्व आशय वाचू शकते आणि इतर ॲप्सवर आशय प्रदर्शित करू शकते." "पहा आणि क्रिया करा" - "हे तुम्ही ॲप किंवा हार्डवेअर सेन्सर कसे वापरता ते ट्रॅक करू शकते आणि इतर ॲप्ससोबत तुमच्या वतीने संवाद साधू शकते." + "हे तुमचा ॲप किंवा हार्डवेअर सेन्सरसोबतचा परस्‍परसंवाद ट्रॅक करू शकते आणि इतर ॲप्ससोबत तुमच्या वतीने संवाद साधू शकते." "अनुमती द्या" "नकार द्या" "थांबा" @@ -4783,7 +4783,7 @@ "या स्रोतातून परवानगी द्या" "कॅमेर्‍यासाठी दोनदा वळवा" "तुमचे मनगट दोनदा वळवून कॅमेरा अ‍ॅप उघडा" - "कॅमेर्‍यासाठी पॉवर बटण दोनदा दाबा" + "कॅमेर्‍यासाठी पॉवर बटण दोनदा प्रेस करा" "तुमची स्क्रीन अनलॉक न करता कॅमेरा द्रुतपणे उघडा" "डिस्प्ले आकार" "सर्व आणखी मोठे किंवा लहान करा" @@ -5073,7 +5073,7 @@ "तुमचे टॅबलेट नियंत्रित करण्यासाठी जलद जेश्चर" "तुमचे डिव्हाइस नियंत्रित करण्यासाठी जलद जेश्चर" "कॅमेरा झटपट उघडा" - "कॅमेरा झटपट उघडण्यासाठी, पॉवर बटण दोनदा दाबा. कोणत्याही स्क्रीनवरून कार्य करते." + "कॅमेरा झटपट उघडण्यासाठी, पॉवर बटण दोनदा प्रेस करा. कोणत्याही स्क्रीनवरून कार्य करते." "कॅमेरा पटकन उघडा" "सेल्फीसाठी कॅमेरा फ्लिप करा" @@ -5138,7 +5138,7 @@ "आणीबाणी SOS" "आणीबाणी SOS वापरा" "%1$s द्वारे व्यवस्थापित केलेले" - "खालील कृती सुरू करण्यासाठी पॉवर बटण झटपट पाच वेळा दाबा" + "खालील कृती सुरू करण्यासाठी पॉवर बटण झटपट पाच वेळा प्रेस करा" "काउंटडाउन अलार्म प्ले करा" "आणीबाणी SOS सुरू होत असताना मोठ्ठा आवाज करा" "मदतीसाठी सूचित करा" @@ -5398,7 +5398,7 @@ "फोनची बॅटरी लाइफ सुधारा" "रिंग होणे थांबवा" - "यासाठी पॉवर आणि व्हॉल्यूम अप एकत्र दाबा" + "यासाठी पॉवर आणि व्हॉल्यूम अप एकत्र प्रेस करा" "रिंग होण्‍यास प्रतिबंध करण्‍यासाठी शॉर्टकट" "व्हायब्रेट" "म्यूट करा" @@ -5702,8 +5702,8 @@ "वापरण्यासाठी सर्वप्रथम स्क्रीन लॉक सेट करा" "पॉवर मेनू:\nपॉवर बटण आणि व्‍हॉल्‍यूम जास्‍त बटण एकाचवेळी प्रेस करा" "रिंग होणे थांबवा:\nशॉर्टकटसाठी व्‍हॉल्‍यूम बटण प्रेस करा" - "दाबून धरून ठेवण्याचा कालावधी" - "किती वेळासाठी पॉवर बटण दाबून धरून ठेवायचे हे निवडून संवेदनशीलता अ‍ॅडजस्ट करा" + "प्रेस करून धरून ठेवण्याचा कालावधी" + "किती वेळासाठी पॉवर बटण प्रेस करून धरून ठेवायचे हे निवडून संवेदनशीलता अ‍ॅडजस्ट करा" "कमी वेळासाठी" "जास्त वेळासाठी" "वॉलेट दाखवा" diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 6ad9b902efb..bdfdb04d157 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -2403,8 +2403,8 @@ "အက်ပ်" "နောက်ဆုံး အကြိမ် အသုံးပြုခဲ့" "အသုံးပြုအချိန်" - "အများ သုံးစွဲနိုင်မှု" - "အများ သုံးစွဲနိုင်မှု ဆက်တင်များ" + "အများသုံးနိုင်မှု" + "အများသုံးနိုင်မှု ဆက်တင်များ" "ဖန်သားပြင်၊ ပြန်လှန်တုံ့ပြန်မှု၊ အသံ" "မြင်ကွင်း ဆက်တင်များ" "သင့်လိုအပ်ချက်များနှင့် ကိုက်ညီမှုရှိစေရန် ဤစက်ပစ္စည်းကို စိတ်ကြိုက်ပြင်ဆင်နိုင်သည်။ အများသုံးနိုင်သည့် ဤဝန်ဆောင်မှုများကို ဆက်တင်များထဲ၌ နောက်ပိုင်းတွင် ပြောင်းလဲနိုင်သည်။" @@ -2444,9 +2444,9 @@ "ဖန်သားပြင် တစ်စိတ်တစ်ပိုင်းကို ချဲ့ပါ" "ဖန်သားပြင်အပြည့်နှင့် ဖန်သားပြင် တစ်စိတ်တစ်ပိုင်းကြား ပြောင်းပါ" "ရွေးချယ်စရာနှစ်ခုလုံးကြား ရွှေ့ရန် ပြောင်းသည့်ခလုတ်ကို တို့ပါ" - "အများသုံးစွဲနိုင်မှု ခလုတ်သို့ ပြောင်းမလား။" + "အများသုံးနိုင်မှု ခလုတ်သို့ ပြောင်းမလား။" "သင့်ဖန်သားပြင်၏တစ်စိတ်တစ်ပိုင်းကို ချဲ့ရန် သုံးချက်တို့ခြင်းသည် စာရိုက်ခြင်းနှင့် အခြားအရာများကို နှောင့်နှေးစေသည်။\n\nအများသုံးစွဲနိုင်မှုခလုတ်သည် သင့်ဖန်သားပြင်ပေါ်ရှိ အခြားအက်ပ်များတွင် ပေါ်သည်။ ချဲ့ရန် ၎င်းကိုတို့ပါ။" - "အများသုံးစွဲနိုင်မှု ခလုတ်သို့ ပြောင်းရန်" + "အများသုံးနိုင်မှု ခလုတ်သို့ ပြောင်းရန်" "သုံးချက်တို့ခြင်းကို သုံးရန်" "၎င်းသည် သင့်ကီးဘုတ်ကို နှေးသွားစေနိုင်သည်" "သင်၏ဖန်သားပြင် တစ်စိတ်တစ်ပိုင်းကို ချဲ့ရန် သုံးချက်တို့သောအခါ ကီးဘုတ်တွင် ပြဿနာများကို တွေ့နိုင်သည်။\n\nဤသို့မဖြစ်စေရန် ချဲ့သည့်ဖြတ်လမ်းအတွက် သုံးချက်တို့ခြင်းမှ အခြားပုံစံတစ်ခုသို့ ပြောင်းနိုင်သည်။\n""ဆက်တင်ပြောင်းရန်" @@ -2482,7 +2482,7 @@ "အသံခလုတ်များကို နှိပ်၍ဖွင့်ခြင်း" "ဖွင့်ရန် သုံးချက်တို့ခြင်း" "ဖွင့်ရန် လက်ဟန်ကို အသုံးပြုပါ" - "အများသုံးစွဲနိုင်မှု လက်ဟန်ကို သုံးပါ" + "အများသုံးနိုင်မှု လက်ဟန်ကို သုံးပါ" "ဤဝန်ဆောင်မှု အသုံးပြုရန် သင့်ဖန်သားပြင် အောက်ခြေရှိ သုံးနိုင်မှုခလုတ် %s ကို တို့ပါ။\n\nဝန်ဆောင်မှုများအကြား ပြောင်းရန် သုံးနိုင်မှုခလုတ်ကို ဖိထားပါ။" "ဤဝန်ဆောင်မှုကိုသုံးရန် သင့်ဖန်သားပြင်ပေါ်ရှိ သုံးနိုင်မှုခလုတ်ကို တို့ပါ။" "ဤဝန်ဆောင်မှု အသုံးပြုရန် အသံခလုတ် နှစ်ခုလုံးကို နှိပ်ထားပါ။" @@ -2493,12 +2493,12 @@ "အများသုံးနိုင်သည့် ဝန်ဆောင်မှုတစ်ခု အသုံးပြုရန် လက် ၃ ချောင်းဖြင့် ဖန်သားပြင်အောက်ခြေမှ အပေါ်သို့ပွတ်ဆွဲပါ။\n\nဝန်ဆောင်မှုများအကြား ပြောင်းရန် လက် ၃ ချောင်းဖြင့် အပေါ်သို့ပွတ်ဆွဲပြီး ဖိထားပါ။" "ရပါပြီ" "%1$s ဖြတ်လမ်းလင့်ခ်" - "အများသုံးစွဲနိုင်မှု ခလုတ်" - "အများသုံးစွဲနိုင်မှု လက်ဟန်" + "အများသုံးနိုင်မှု ခလုတ်" + "အများသုံးနိုင်မှု လက်ဟန်" "လက် ၂ ချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပါ" "လက် ၃ ချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပါ" "သုံးနိုင်မှုခလုတ်ကို တို့ခြင်း" - "အများသုံးစွဲနိုင်မှု လက်ဟန်ကို သုံးပါ" + "အများသုံးနိုင်မှု လက်ဟန်ကို သုံးပါ" "သင့်ဖန်သားပြင်အောက်ခြေရှိ အများသုံးစွဲနိုင်မှုခလုတ် %s ကိုတို့ပါ။\n\nဝန်ဆောင်မှုများအကြား ပြောင်းလဲရန် အများသုံးစွဲနိုင်မှုခလုတ်ကို ထိပြီး နှိပ်ထားပါ။" "လက် ၂ ချောင်းဖြင့် ဖန်သားပြင်အောက်ခြေမှ အပေါ်သို့ပွတ်ဆွဲပါ။\n\nဝန်ဆောင်မှုများအကြား ပြောင်းရန် လက် ၂ ချောင်းဖြင့် အပေါ်သို့ပွတ်ဆွဲပြီး ဖိထားပါ။" "လက် ၃ ချောင်းဖြင့် ဖန်သားပြင်အောက်ခြေမှ အပေါ်သို့ပွတ်ဆွဲပါ။\n\nဝန်ဆောင်မှုများအကြား ပြောင်းရန် လက် ၃ ချောင်းဖြင့် အပေါ်သို့ပွတ်ဆွဲပြီး ဖိထားပါ။" @@ -2511,20 +2511,20 @@ "ဖန်သားပြင်ကို သုံးချက်တို့ရန်" "ဖန်သားပြင်ကို {0,number,integer} ကြိမ် အမြန်တို့ပါ။ ဤဖြတ်လမ်းလင့်ခ်သည် သင့်စက်ကို နှေးသွားစေနိုင်သည်" "အဆင့်မြင့်" - "အများသုံးစွဲနိုင်မှု ခလုတ်ကို %1$s အဖြစ် သတ်မှတ်ထားသည်။ ပုံကြီးချဲ့ခြင်းကို အသုံးပြုရန် အများသုံးစွဲနိုင်မှု ခလုတ်ကို ထိထားပြီးနောက် ပုံကြီးချဲ့ခြင်းကို ရွေးပါ။" - "အများသုံးစွဲနိုင်မှု လက်ဟန်ကို %1$s အဖြစ် သတ်မှတ်ထားသည်။ ပုံကြီးချဲ့ခြင်းကို အသုံးပြုရန် မျက်နှာပြင်၏ အောက်ခြေမှနေ၍ အပေါ်သို့ လက်နှစ်ချောင်းဖြင့် ပွတ်ဆွဲပြီး ဖိထားပါ။ ထို့နောက် ပုံကြီးချဲ့ခြင်းကို ရွေးပါ။" + "အများသုံးနိုင်မှု ခလုတ်ကို %1$s အဖြစ် သတ်မှတ်ထားသည်။ ပုံကြီးချဲ့ခြင်းကို အသုံးပြုရန် အများသုံးနိုင်မှု ခလုတ်ကို ထိထားပြီးနောက် ပုံကြီးချဲ့ခြင်းကို ရွေးပါ။" + "အများသုံးနိုင်မှု လက်ဟန်ကို %1$s အဖြစ် သတ်မှတ်ထားသည်။ ပုံကြီးချဲ့ခြင်းကို အသုံးပြုရန် မျက်နှာပြင်၏ အောက်ခြေမှနေ၍ အပေါ်သို့ လက်နှစ်ချောင်းဖြင့် ပွတ်ဆွဲပြီး ဖိထားပါ။ ထို့နောက် ပုံကြီးချဲ့ခြင်းကို ရွေးပါ။" "အသံခလုတ် ဖြတ်လမ်း" "ဖြတ်လမ်း ဝန်ဆောင်မှု" "ဖြတ်လမ်းလင့်ခ် ဆက်တင်များ" "လော့ခ်မျက်နှာပြင်မှ ဖြတ်လမ်းလင့်ခ်" "ဝန်ဆောင်မှု ဖြတ်လမ်းလင့်ခ်အား လော့ခ်ချထားစဉ် ဖန်သားပြင်တွင် ဖွင့်ခွင့်ပြုသည်။ အသံခလုတ်နှစ်ခုလုံးကို စက္ကန့်အနည်းငယ် ဖိထားပါ။" - "အများသုံးစွဲနိုင်မှု ခလုတ်" - "အများသုံးစွဲနိုင်မှု ခလုတ်နှင့် လက်ဟန်" + "အများသုံးနိုင်မှု ခလုတ်" + "အများသုံးနိုင်မှု ခလုတ်နှင့် လက်ဟန်" "အများသုံးနိုင်သည့် ဝန်ဆောင်မှုများကို မည်သည့်ဖန်သားပြင်မှမဆို အမြန်သုံးနိုင်သည်" - "အများသုံးစွဲနိုင်မှု ခလုတ် အကြောင်း" - "အများသုံးစွဲနိုင်မှု ခလုတ်နှင့် လက်ဟန် အကြောင်း" - "အများသုံးစွဲနိုင်မှု ခလုတ်နှင့် လက်ဟန် အကြောင်း ပိုမိုလေ့လာရန်" - "အများသုံးစွဲနိုင်မှု ခလုတ်ကို သုံးနေသည်။ ခလုတ် ၃ ခုဖြင့် လမ်းညွှန်ခြင်းဖြင့် ဤလက်ဟန်ကို မရနိုင်ပါ။" + "အများသုံးနိုင်မှု ခလုတ် အကြောင်း" + "အများသုံးနိုင်မှု ခလုတ်နှင့် လက်ဟန် အကြောင်း" + "အများသုံးနိုင်မှု ခလုတ်နှင့် လက်ဟန် အကြောင်း ပိုမိုလေ့လာရန်" + "အများသုံးနိုင်မှု ခလုတ်ကို သုံးနေသည်။ ခလုတ် ၃ ခုဖြင့် လမ်းညွှန်ခြင်းဖြင့် ဤလက်ဟန်ကို မရနိုင်ပါ။" "အများသုံးစွဲနိုင်မှုဆိုင်ရာ ဝန်ဆောင်မှုများကို အမြန်သုံးသည်" "စတင်ရန်"\n"၁။ သုံးနိုင်မှု ဆက်တင်များသို့ သွားပါ\n၂။ ဝန်ဆောင်မှုတစ်ခုရွေးပြီး ဖြတ်လမ်းလင့်ခ်ကို တို့ပါ\n၃။ ဝန်ဆောင်မှုသုံးရန် အသုံးပြုလိုသည့် ခလုတ် (သို့) လက်ဟန်ကို ရွေးပါ" "စတင်ရန်"\n"၁။ သုံးနိုင်မှု ဆက်တင်များသို့ သွားပါ\n၂။ ဝန်ဆောင်မှုတစ်ခုရွေးပြီး ဖြတ်လမ်းလင့်ခ်ကို တို့ပါ\n၃။ ဝန်ဆောင်မှုသုံးမည့် ခလုတ်ကို ရွေးပါ" @@ -2556,8 +2556,8 @@ "၁ မိနစ်" "၂ မိနစ်" "လုပ်ရန်အချိန် (အသုံးလွယ်မှုအချိန်ကုန်ခြင်း)" - "လုပ်ရန်အချိန် အကြောင်း (အများသုံးစွဲနိုင်မှု အချိန်ကုန်သွားခြင်း)" - "လုပ်ဆောင်ရန် လိုအပ်ချိန် (အများသုံးစွဲနိုင်မှု အချိန်ကုန်သွားခြင်း) အကြောင်း ပိုမိုလေ့လာရန်" + "လုပ်ရန်အချိန် အကြောင်း (အများသုံးနိုင်မှု အချိန်ကုန်သွားခြင်း)" + "လုပ်ဆောင်ရန် လိုအပ်ချိန် (အများသုံးနိုင်မှု အချိန်ကုန်သွားခြင်း) အကြောင်း ပိုမိုလေ့လာရန်" "တစ်ခုခုလုပ်ဆောင်ရန် အချိန်" "ဤအချိန်ကိုက်ခြင်းသတ်မှတ်ချက်ကို အက်ပ်တိုင်းက မပံ့ပိုးပါ" "တစ်ခုခုလုပ်ဆောင်ရန်ပြောသည့် ယာယီမက်ဆေ့ဂျ်များ မည်မျှကြာပြရမည်ကို ရွေးနိုင်သည်" @@ -2625,7 +2625,7 @@ "နောက်ထပ် ရွေးစရာများ" "စာတန်းအရွယ်အစားနှင့် ပုံစံကို ဖတ်ရလွယ်ကူစေရန် စိတ်ကြိုက်လုပ်နိုင်သည်" "ဤစာတန်းသတ်မှတ်ချက်များကို မီဒီယာအက်ပ်တိုင်းက မပံ့ပိုးနိုင်ပါ" - "အများသုံးစွဲနိုင်မှု ခလုတ်" + "အများသုံးနိုင်မှု ခလုတ်" "လက် ၂ ချောင်းကို အသုံးပြု၍ အောက်ခြေမှ ပွတ်ဆွဲပါ" "အသံအတိုးအလျှော့ခလုတ်များကို ဖိထားခြင်း" "ဖန်သားပြင်ကို သုံးချက် တို့ပါ" @@ -2654,7 +2654,7 @@ "ပိတ်" "အလုပ်မလုပ်ပါ။ အချက်အလက်များအတွက် တို့ပါ။" "ဤဝန်ဆောင်မှု ချွတ်ယွင်းနေသည်။" - "အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်များ" + "အများသုံးနိုင်မှု ဖြတ်လမ်းလင့်ခ်များ" "အမြန်ဆက်တင်များတွင်ပြပါ" "အနီ-အစိမ်း" "အနီ-အစိမ်း" @@ -2728,8 +2728,8 @@ "%1$s အား သင့်စက်ပစ္စည်းကို အပြည့်အဝ ထိန်းချုပ်ခွင့်ပေးလိုပါသလား။" "%1$s ကလုပ်ဆောင်ရန်များ-" "အပလီကေးရှင်းသည် ခွင့်ပြုချက်တောင်းခံမှုကို ပိတ်လိုက်ခြင်းကြောင့်၊ သင့်တုန့်ပြန်မှုကို အချိန်ညှိချက်များ အတည်မပြုနိုင်ပါ။" - "%1$s က ဤကိရိယာကို အပြည့်အဝ ထိန်းချုပ်ခွင့် တောင်းဆိုနေသည်။ ဤဝန်ဆောင်မှုက ဖန်သားပြင်ရှိအရာများကို ဖတ်နိုင်ပြီး အများသုံးစွဲနိုင်မှု လိုအပ်ချက်များသုံး၍ အသုံးပြုသူများကိုယ်စား လုပ်ဆောင်နိုင်သည်။ ဤထိန်းချုပ်မှု အဆင့်သည် အက်ပ်အများစုအတွက် မသင့်လျော်ပါ။" - "အများသုံးစွဲနိုင်မှု လိုအပ်ချက်များအတွက် အထောက်အကူပြုသည့် အက်ပ်များကို အပြည့်အဝထိန်းချုပ်ခြင်းသည် သင့်လျော်သော်လည်း အက်ပ်အများစုအတွက် မသင့်လျော်ပါ။" + "%1$s က ဤကိရိယာကို အပြည့်အဝ ထိန်းချုပ်ခွင့် တောင်းဆိုနေသည်။ ဤဝန်ဆောင်မှုက ဖန်သားပြင်ရှိအရာများကို ဖတ်နိုင်ပြီး အများသုံးနိုင်မှု လိုအပ်ချက်များသုံး၍ အသုံးပြုသူများကိုယ်စား လုပ်ဆောင်နိုင်သည်။ ဤထိန်းချုပ်မှု အဆင့်သည် အက်ပ်အများစုအတွက် မသင့်လျော်ပါ။" + "အများသုံးနိုင်မှု လိုအပ်ချက်များအတွက် အထောက်အကူပြုသည့် အက်ပ်များကို အပြည့်အဝထိန်းချုပ်ခြင်းသည် သင့်လျော်သော်လည်း အက်ပ်အများစုအတွက် မသင့်လျော်ပါ။" "ဖန်သားပြင်ကို ကြည့်ရှုထိန်းချုပ်ခြင်း" "၎င်းသည် မျက်နှာပြင်ပေါ်ရှိ အကြောင်းအရာအားလုံးကို ဖတ်နိုင်ပြီး အခြားအက်ပ်များအပေါ်တွင် အကြောင်းအရာကို ဖော်ပြနိုင်သည်။" "လုပ်ဆောင်ချက်များကို ကြည့်ရှုဆောင်ရွက်ခြင်း" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 996dce91f0d..cdb47f21920 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -549,8 +549,8 @@ "Ansikt og fingeravtrykk er lagt til" "Når du konfigurerer ansiktslås og opplåsing med fingeravtrykk, blir du bedt om å bruke fingeravtrykk når du bruker munnbind eller er i et dårlig belyst område." "Måter å låse opp på" - "Lås opp telefonen" - "Bekreft at det er deg, i apper" + "Låse opp telefonen" + "Bekrefte at det er deg, i apper" "Med ansiktet" "Med fingeravtrykket" "Med ansiktet eller fingeravtrykket" @@ -1886,7 +1886,7 @@ \n\n"Du er logget på disse kontoene nå:\n" \n\n"Det er andre brukere til stede på denne enheten.\n"
  • "musikk"
  • \n
  • "bilder"
  • \n
  • "andre brukerdata"
  • -
  • "e-SIM-kort"
  • +
  • "eSIM-kort"
  • \n\n"Dette sier ikke opp mobilabonnementet ditt." \n\n"For å slette musikk, bilder og andre brukerdata må ""USB-lagringen"" tømmes." \n\n"For å slette musikk, bilder og andre brukerdata må ""SD-kortet"" tømmes." diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index 3caad02dbf5..339f9bf6d9b 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -553,7 +553,7 @@ "एपहरू चलाउँदा आफ्नो पहिचान पुष्टि गर्नुहोस्" "अनुहार प्रयोग गरेर" "फिंगरप्रिन्ट प्रयोग गरेर" - "अनुहार वा फिङ्गरप्रिन्ट प्रयोग गरेर" + "अनुहार वा फिंगरप्रिन्ट प्रयोग गरेर" "यो ट्याब्लेट आफ्नो अभिभावकलाई दिनुहोस्" "यो डिभाइस आफ्नो अभिभावकलाई दिनुहोस्" "यो फोन आफ्नो अभिभावकलाई देऊ" @@ -2725,7 +2725,7 @@ "सायन" "पहेँलो" "म्याजेन्टा" - "%1$s लाई आफ्नो डिभाइस पूर्ण रूपमा नियन्त्रण गर्न दिने हो?" + "%1$sलाई आफ्नो डिभाइस पूर्ण रूपमा नियन्त्रण गर्न दिने हो?" "%1$s लाई आवश्यक:" "एपले अनुमति अनुरोधलाई अस्पष्ट मानिरहेको हुनाले, सेटिङहरूलले तपाईंको प्रतिक्रियालाई प्रमाणित गर्न सक्दैनन्।" "%1$s ले यो डिभाइस पूर्ण रूपमा नियन्त्रण गर्ने अनुमति माग्दै छ। यो सेवाले स्क्रिनमा भएका जानकारी पढ्न तथा पहुँचसम्बन्धी आवश्यकता भएका प्रयोगकर्ताहरूका तर्फबाट कारबाही गर्न सक्छ। धेरैजसो एपका हकमा यो स्तरको नियन्त्रण उपयुक्त हुँदैन।" @@ -2735,7 +2735,7 @@ "कारबाहीहरू हेर्नुहोस् र तिनमा कार्य गर्नुहोस्" "यसले कुनै एप वा हार्डवेयर सेन्सरसँग तपाईंले गर्ने अन्तर्क्रियाको ट्र्याक गर्न सक्छ र तपाईंका तर्फबाट एपहरूसँग अन्तर्क्रिया गर्न सक्छ।" "अनुमति दिनुहोस्" - "इन्कार गर्नु⋯" + "नदिनुहोस्" "रोक्नुहोस्" "रद्द गर्नु⋯" "%1$s बन्द गर्ने हो?" diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml index 8819d02d65a..9cc24d09d4c 100644 --- a/res/values-or/strings.xml +++ b/res/values-or/strings.xml @@ -783,7 +783,7 @@ "ପାଟର୍ନ" "PIN" "ପାସୱାର୍ଡ" - "ଥରେ ସ୍କ୍ରିନ ଲକ ସେଟ କରିବା ପରେ, ସେଟିଂସ ଓ ସୁରକ୍ଷାରେ ଆପଣ ଆପଣଙ୍କ ଟିପଚିହ୍ନକୁ ମଧ୍ୟ ସେଟ ଅପ କରିପାରିବେ।" + "ସ୍କ୍ରିନ ଲକ ସେଟ ଅପ କରିବା ପରେ, ସେଟିଂସ ଓ ସୁରକ୍ଷାରେ ଆପଣ ଆପଣଙ୍କ ଟିପଚିହ୍ନକୁ ମଧ୍ୟ ସେଟ ଅପ କରିପାରିବେ।" "ସ୍କ୍ରୀନ ଲକକୁ ବନ୍ଦ କର" "ସ୍କ୍ରିନ୍ ଲକ୍ ଡିଲିଟ୍ କରିବେ?" "ପ୍ରୋଫାଇଲ୍‌ ସୁରକ୍ଷା କାଢ଼ିଦେବେ?" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 70ed8b90f42..e3ed2ba6054 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -530,7 +530,7 @@ "Keď zacítite vibráciu, zdvihnite prst" "Prejdite na miesto s jemnejším osvetlením a skúste to znova" "Dosiahli ste maximálny počet pokusov" - "odomknutie hodinkami" + "Odomknutie hodinkami" "Keď si nastavíte odomknutie tvárou aj odtlačkom prsta a budete sa nachádzať v tmavom prostredí alebo mať rúško, telefón vás požiada o odtlačok prsta.\n\nHodinkami môžete odomknúť, keď nebude rozpoznaná vaša tvár alebo odtlačok prsta." "Keď si nastavíte odomknutie tvárou aj odtlačkom prsta a budete sa nachádzať v tmavom prostredí alebo mať rúško, tablet vás požiada o odtlačok prsta.\n\nAk nebude rozpoznaná vaša tvár alebo odtlačok prsta, môžete zariadenie odomknúť hodinkami." "Hodinkami môžete odomknúť, keď nebude rozpoznaný váš odtlačok prsta." diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 6d552f44056..488a98deda4 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -6103,10 +6103,8 @@ "Виберіть заставку" "Показувати додаткову інформацію" "Відображення часу, погоди чи іншої інформації на заставці" - - - - + "Показувати елементи керування домом" + "Показувати кнопку керування домом на заставці" "Інші налаштування" "Виберіть заставку" "Виберіть, що має відображатися на екрані, коли планшет у док-станції. Із заставкою ваш пристрій може споживати більше енергії." diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 90bd7fe2c33..09a6318e880 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -2417,7 +2417,7 @@ "Màu sắc và chuyển động" "Giảm bớt độ sáng màn hình" "Điều khiển tương tác" - "Điều khiển thời gian" + "Điều khiển có hẹn giờ" "Điều khiển hệ thống" "Ứng dụng đã tải xuống" "Thử nghiệm" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 5088b72deb3..2196aeb303a 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -719,7 +719,7 @@ - "选择屏幕锁定方式" + "选择屏幕解锁方式" "选择一种屏幕锁定方式" "选择新的屏幕锁定方式" "为工作应用选择一种锁定方式" @@ -727,7 +727,7 @@ "保护您的平板电脑" "保护您的设备" "为手机启用保护功能" - "为提升安全性,请设置备用的锁屏方式" + "为提升安全性,请设置备用的屏幕解锁方式" "启用设备保护功能可防止他人在未经您允许的情况下使用此平板电脑。请选择您要使用的屏幕锁定方式。" "启用设备保护功能可防止他人在未经您允许的情况下使用此设备。请选择您要使用的屏幕锁定方式。" "启用设备保护功能可防止他人在未经您允许的情况下使用此手机。请选择您要使用的屏幕锁定方式。" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index cdcd1c6e337..a771a8de87c 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -5928,8 +5928,8 @@ "選擇螢幕保護程式" "顯示其他資訊" "在螢幕保護程式顯示時間、天氣或其他資訊" - "顯示居家控制系統" - "在螢幕保護程式中顯示居家控制系統按鈕" + "顯示智能家居" + "在螢幕保護程式中顯示智能家居按鈕" "更多設定" "選擇螢幕保護程式" "選擇平板電腦放上插座時螢幕上顯示的內容。如果裝置使用螢幕保護程式,可能會比較耗電。" From 3abf4d9d5f0662064819979948422db2c2cecec7 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Wed, 29 Mar 2023 18:11:05 +0800 Subject: [PATCH 07/12] Restrict DataUsageSummary for guest user - Don't show DataUsageSummary if the user is a guest Bug: 262243574 Test: manual test make RunSettingsRoboTests ROBOTEST_FILTER=DataUsageSummaryTest Change-Id: I94d0fd18a81dc0f0adba544340e648d58c5d3358 --- .../settings/datausage/DataUsageSummary.java | 16 +++++++ .../datausage/DataUsageSummaryTest.java | 48 ++++++++++++++++--- 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java index fabf0596b77..ec68babb3bf 100644 --- a/src/com/android/settings/datausage/DataUsageSummary.java +++ b/src/com/android/settings/datausage/DataUsageSummary.java @@ -19,6 +19,7 @@ import android.app.settings.SettingsEnums; import android.content.Context; import android.net.NetworkTemplate; import android.os.Bundle; +import android.os.UserManager; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.text.BidiFormatter; @@ -27,6 +28,8 @@ import android.text.SpannableString; import android.text.TextUtils; import android.text.format.Formatter; import android.text.style.RelativeSizeSpan; +import android.util.EventLog; +import android.util.Log; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; @@ -83,6 +86,12 @@ public class DataUsageSummary extends DataUsageBaseFragment implements DataUsage public void onCreate(Bundle icicle) { super.onCreate(icicle); Context context = getContext(); + if (isGuestUser(context)) { + Log.e(TAG, "This setting isn't available due to user restriction."); + EventLog.writeEvent(0x534e4554, "262243574", -1 /* UID */, "Guest user"); + finish(); + return; + } if (!isSimHardwareVisible(context)) { finish(); @@ -282,4 +291,11 @@ public class DataUsageSummary extends DataUsageBaseFragment implements DataUsage updateState(); mSummaryController.updateState(mSummaryPreference); } + + private static boolean isGuestUser(Context context) { + if (context == null) return false; + final UserManager userManager = context.getSystemService(UserManager.class); + if (userManager == null) return false; + return userManager.isGuestUser(); + } } diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java index 68d49fc6352..4ac73877c21 100644 --- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java +++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java @@ -31,13 +31,14 @@ import android.app.usage.NetworkStatsManager; import android.content.Context; import android.content.res.Resources; import android.net.NetworkPolicyManager; +import android.os.UserManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import androidx.fragment.app.FragmentActivity; +import androidx.test.core.app.ApplicationProvider; import com.android.settings.R; - import com.android.settings.testutils.shadow.ShadowDashboardFragment; import com.android.settings.testutils.shadow.ShadowDataUsageUtils; import com.android.settings.testutils.shadow.ShadowUserManager; @@ -45,13 +46,15 @@ import com.android.settings.testutils.shadow.ShadowUtils; import org.junit.Before; import org.junit.Ignore; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; +import org.mockito.Spy; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; @@ -66,16 +69,22 @@ import org.robolectric.shadows.ShadowTelephonyManager; }) @RunWith(RobolectricTestRunner.class) public class DataUsageSummaryTest { - + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Spy + Context mContext = ApplicationProvider.getApplicationContext(); + @Mock + private UserManager mUserManager; @Mock private NetworkPolicyManager mNetworkPolicyManager; @Mock private NetworkStatsManager mNetworkStatsManager; private TelephonyManager mTelephonyManager; - private Context mContext; private Resources mResources; private FragmentActivity mActivity; + private DataUsageSummary mDataUsageSummary; + /** * This set up is contrived to get a passing test so that the build doesn't block without tests. * These tests should be updated as code gets refactored to improve testability. @@ -83,12 +92,13 @@ public class DataUsageSummaryTest { @Before public void setUp() { - MockitoAnnotations.initMocks(this); + doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); + doReturn(false).when(mUserManager).isGuestUser(); + ShadowApplication shadowContext = ShadowApplication.getInstance(); ShadowUserManager.getShadow().setIsAdminUser(true); shadowContext.setSystemService(Context.NETWORK_POLICY_SERVICE, mNetworkPolicyManager); - mContext = spy(RuntimeEnvironment.application); mTelephonyManager = mContext.getSystemService(TelephonyManager.class); final ShadowTelephonyManager shadowTelephonyManager = Shadows.shadowOf(mTelephonyManager); shadowTelephonyManager.setTelephonyManagerForSubscriptionId( @@ -101,6 +111,12 @@ public class DataUsageSummaryTest { doReturn(true).when(mResources).getBoolean(R.bool.config_show_sim_info); doReturn(mNetworkStatsManager).when(mActivity).getSystemService(NetworkStatsManager.class); + + mDataUsageSummary = spy(new DataUsageSummary()); + doReturn(mContext).when(mDataUsageSummary).getContext(); + doNothing().when(mDataUsageSummary).enableProxySubscriptionManager(any()); + doReturn(true).when(mDataUsageSummary).removePreference(anyString()); + doNothing().when(mDataUsageSummary).addWifiSection(); } @Test @@ -201,4 +217,22 @@ public class DataUsageSummaryTest { verify(dataUsageSummary).addWifiSection(); verify(dataUsageSummary, never()).addMobileSection(anyInt()); } + + @Test + public void onCreate_isNotGuestUser_shouldNotFinish() { + doReturn(false).when(mUserManager).isGuestUser(); + + mDataUsageSummary.onCreate(null); + + verify(mDataUsageSummary, never()).finish(); + } + + @Test + public void onCreate_isGuestUser_shouldFinish() { + doReturn(true).when(mUserManager).isGuestUser(); + + mDataUsageSummary.onCreate(null); + + verify(mDataUsageSummary).finish(); + } } From 7effe64c18db1a2f99858f1c3fe4c5b02ed7dd0b Mon Sep 17 00:00:00 2001 From: Wesley Wang Date: Thu, 30 Mar 2023 12:05:57 +0800 Subject: [PATCH 08/12] Remove unused listener - Remove OnMainSwitchChangeListener and it's interface since the callback will duplicate with setCheck() method, cause the toggle on event come with twice while on and off, in futher to casue some duplicate work or error metrics logging Bug: 218405966 Test: make SettingsRoboTests Change-Id: If20ed6488d21443b9c623e8fe4de383a84ea673a --- ...atterySaverButtonPreferenceController.java | 19 ++---------- ...rySaverButtonPreferenceControllerTest.java | 31 ------------------- 2 files changed, 2 insertions(+), 48 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java index 274817e3819..73ec42bad82 100644 --- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java +++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java @@ -22,9 +22,7 @@ import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.os.PowerManager; -import android.provider.Settings; import android.provider.SettingsSlicesContract; -import android.widget.Switch; import androidx.preference.PreferenceScreen; @@ -36,15 +34,13 @@ import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; import com.android.settingslib.fuelgauge.BatterySaverUtils; import com.android.settingslib.widget.MainSwitchPreference; -import com.android.settingslib.widget.OnMainSwitchChangeListener; - /** * Controller to update the battery saver button */ public class BatterySaverButtonPreferenceController extends - TogglePreferenceController implements OnMainSwitchChangeListener, LifecycleObserver, - OnStart, OnStop, BatterySaverReceiver.BatterySaverListener { + TogglePreferenceController implements LifecycleObserver, OnStart, OnStop, + BatterySaverReceiver.BatterySaverListener { private static final long SWITCH_ANIMATION_DURATION = 350L; private final BatterySaverReceiver mBatterySaverReceiver; @@ -96,20 +92,9 @@ public class BatterySaverButtonPreferenceController extends public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); mPreference = screen.findPreference(getPreferenceKey()); - mPreference.addOnSwitchChangeListener(this); mPreference.updateStatus(isChecked()); } - @Override - public void onSwitchChanged(Switch switchView, boolean isChecked) { - // Cancel preference's check state once it's first time launch - if (isChecked && (Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.LOW_POWER_WARNING_ACKNOWLEDGED, 0) == 0)) { - mPreference.setChecked(false); - } - setChecked(isChecked); - } - @Override public boolean isChecked() { return mPowerManager.isPowerSaveMode(); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceControllerTest.java index 9a7ef409f95..7398e5ce024 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceControllerTest.java @@ -26,7 +26,6 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.os.PowerManager; -import android.provider.Settings; import android.provider.SettingsSlicesContract; import androidx.preference.PreferenceScreen; @@ -72,24 +71,6 @@ public class BatterySaverButtonPreferenceControllerTest { .isEqualTo(SettingsSlicesContract.AUTHORITY); } - @Test - public void onSwitchChanged_isCheckedButNotAcked_preferenceIsUnchecked() { - setLowPowerWarningAcked(/* acked= */ 0); - - mController.onSwitchChanged(/* switchView= */ null, /* isChecked= */ true); - - assertThat(mPreference.isChecked()).isFalse(); - } - - @Test - public void onSwitchChanged_isCheckedAndAcked_setPowerSaveMode() { - setLowPowerWarningAcked(/* acked= */ 1); - - mController.onSwitchChanged(/* switchView= */ null, /* isChecked= */ true); - - verify(mPowerManager).setPowerSaveModeEnabled(true); - } - @Test public void updateState_lowPowerOn_preferenceIsChecked() { when(mPowerManager.isPowerSaveMode()).thenReturn(true); @@ -140,16 +121,4 @@ public class BatterySaverButtonPreferenceControllerTest { public void isPublicSlice_returnsTrue() { assertThat(mController.isPublicSlice()).isTrue(); } - - // 0 means not acked, 1 means acked. - private void setLowPowerWarningAcked(int acked) { - Settings.Secure.putInt( - mContext.getContentResolver(), - Settings.Secure.LOW_POWER_WARNING_ACKNOWLEDGED, - acked); - Settings.Secure.putInt( - mContext.getContentResolver(), - Settings.Secure.EXTRA_LOW_POWER_WARNING_ACKNOWLEDGED, - acked); - } } From 23359bc0e999e8b1a3d8ea69e02c8472cbcd55f1 Mon Sep 17 00:00:00 2001 From: tom hsu Date: Wed, 29 Mar 2023 21:28:25 +0800 Subject: [PATCH 09/12] Unify Tick Preference from Physic keyboard and Regional preference - Also change icon color from colorAccentPrimaryVarient to colorAccentPrimary Bug: b/272398108 Bug: b/264476709 Test: Manual test. Change-Id: Ide602c6fb9501b832df646692ec618be8a76e7b9 --- res/drawable/ic_check_24dp.xml | 2 +- res/layout/preference_check_icon.xml | 2 +- .../NewKeyboardLayoutPickerController.java | 25 +++---- .../NumberingSystemItemController.java | 7 +- .../RegionalPreferencesFragment.java | 7 +- .../TickButtonPreference.java | 69 ------------------- .../TickButtonPreference.java} | 30 ++++---- .../NumberingSystemItemControllerTest.java | 2 + 8 files changed, 42 insertions(+), 102 deletions(-) delete mode 100644 src/com/android/settings/regionalpreferences/TickButtonPreference.java rename src/com/android/settings/{inputmethod/KeyboardLayoutPreference.java => widget/TickButtonPreference.java} (61%) diff --git a/res/drawable/ic_check_24dp.xml b/res/drawable/ic_check_24dp.xml index 5801e701e0a..52389013d32 100644 --- a/res/drawable/ic_check_24dp.xml +++ b/res/drawable/ic_check_24dp.xml @@ -18,7 +18,7 @@ android:height="24dp" android:viewportWidth="24.0" android:viewportHeight="24.0" - android:tint="?androidprv:attr/colorAccentPrimaryVariant"> + android:tint="?androidprv:attr/colorAccent"> diff --git a/res/layout/preference_check_icon.xml b/res/layout/preference_check_icon.xml index 5652ac65997..1b759fcc045 100644 --- a/res/layout/preference_check_icon.xml +++ b/res/layout/preference_check_icon.xml @@ -15,7 +15,7 @@ --> mPreferenceMap; + private final Map mPreferenceMap; private Fragment mParent; private int mInputDeviceId; @@ -102,16 +103,15 @@ public class NewKeyboardLayoutPickerController extends BasePreferenceController @Override public boolean handlePreferenceTreeClick(Preference preference) { - - if (!(preference instanceof KeyboardLayoutPreference)) { + if (!(preference instanceof TickButtonPreference)) { return false; } - final KeyboardLayoutPreference pref = (KeyboardLayoutPreference) preference; - pref.setCheckMark(true); + final TickButtonPreference pref = (TickButtonPreference) preference; + pref.setSelected(true); if (mPreviousSelection != null && !mPreviousSelection.equals(preference.getKey())) { - KeyboardLayoutPreference preSelectedPref = mScreen.findPreference(mPreviousSelection); - preSelectedPref.setCheckMark(false); + TickButtonPreference preSelectedPref = mScreen.findPreference(mPreviousSelection); + preSelectedPref.setSelected(false); } setLayout(pref); mPreviousSelection = preference.getKey(); @@ -140,12 +140,13 @@ public class NewKeyboardLayoutPickerController extends BasePreferenceController return; } for (KeyboardLayout layout : mKeyboardLayouts) { - final KeyboardLayoutPreference pref; + final TickButtonPreference pref; + pref = new TickButtonPreference(mScreen.getContext()); + pref.setTitle(layout.getLabel()); + if (mLayout.equals(layout.getLabel())) { - pref = new KeyboardLayoutPreference(mScreen.getContext(), layout.getLabel(), true); + pref.setSelected(true); mPreviousSelection = layout.getDescriptor(); - } else { - pref = new KeyboardLayoutPreference(mScreen.getContext(), layout.getLabel(), false); } pref.setKey(layout.getDescriptor()); mScreen.addPreference(pref); @@ -153,7 +154,7 @@ public class NewKeyboardLayoutPickerController extends BasePreferenceController } } - private void setLayout(KeyboardLayoutPreference preference) { + private void setLayout(TickButtonPreference preference) { mIm.setKeyboardLayoutForInputDevice( mInputDeviceIdentifier, mUserId, diff --git a/src/com/android/settings/regionalpreferences/NumberingSystemItemController.java b/src/com/android/settings/regionalpreferences/NumberingSystemItemController.java index 8e2d735ce08..8b851b86eb0 100644 --- a/src/com/android/settings/regionalpreferences/NumberingSystemItemController.java +++ b/src/com/android/settings/regionalpreferences/NumberingSystemItemController.java @@ -34,6 +34,7 @@ import com.android.internal.app.LocaleStore; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.SubSettingLauncher; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.widget.TickButtonPreference; import java.util.Locale; @@ -138,7 +139,7 @@ public class NumberingSystemItemController extends BasePreferenceController { String key = supportedLocale.getUnicodeLocaleType( ExtensionTypes.NUMBERING_SYSTEM); pref.setKey(key == null ? RegionalPreferencesDataUtils.DEFAULT_VALUE : key); - pref.setTickEnable(isSameNumberingSystem(targetLocale, supportedLocale)); + pref.setSelected(isSameNumberingSystem(targetLocale, supportedLocale)); screen.addPreference(pref); } } @@ -162,7 +163,7 @@ public class NumberingSystemItemController extends BasePreferenceController { TickButtonPreference pref = (TickButtonPreference) mPreferenceScreen.getPreference(i); Log.i(TAG, "[onPreferenceClick] key is " + pref.getKey()); if (pref.getKey().equals(preference.getKey())) { - pref.setTickEnable(true); + pref.setSelected(true); Locale updatedLocale = saveNumberingSystemToLocale( Locale.forLanguageTag(mSelectedLanguage), pref.getKey()); @@ -176,7 +177,7 @@ public class NumberingSystemItemController extends BasePreferenceController { mParentFragment.setArguments(bundle); continue; } - pref.setTickEnable(false); + pref.setSelected(false); } } diff --git a/src/com/android/settings/regionalpreferences/RegionalPreferencesFragment.java b/src/com/android/settings/regionalpreferences/RegionalPreferencesFragment.java index 03bc8ac5d57..ea9b7b39073 100644 --- a/src/com/android/settings/regionalpreferences/RegionalPreferencesFragment.java +++ b/src/com/android/settings/regionalpreferences/RegionalPreferencesFragment.java @@ -29,6 +29,7 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.widget.TickButtonPreference; /** A fragment to include each kind of regional preferences. */ public class RegionalPreferencesFragment extends SettingsPreferenceFragment { @@ -63,7 +64,7 @@ public class RegionalPreferencesFragment extends SettingsPreferenceFragment { TickButtonPreference pref = (TickButtonPreference) mPreferenceScreen.getPreference(i); Log.i(TAG, "[onPreferenceClick] key is " + pref.getKey()); if (pref.getKey().equals(preference.getKey())) { - pref.setTickEnable(true); + pref.setSelected(true); RegionalPreferencesDataUtils.savePreference( getPrefContext(), mType, @@ -72,7 +73,7 @@ public class RegionalPreferencesFragment extends SettingsPreferenceFragment { ? null : preference.getKey()); continue; } - pref.setTickEnable(false); + pref.setSelected(false); } return true; } @@ -115,7 +116,7 @@ public class RegionalPreferencesFragment extends SettingsPreferenceFragment { String value = RegionalPreferencesDataUtils.getDefaultUnicodeExtensionData( getPrefContext(), mType); pref.setKey(item); - pref.setTickEnable(!value.isEmpty() && item.equals(value)); + pref.setSelected(!value.isEmpty() && item.equals(value)); mPreferenceScreen.addPreference(pref); } return super.onCreateView(inflater, container, savedInstanceState); diff --git a/src/com/android/settings/regionalpreferences/TickButtonPreference.java b/src/com/android/settings/regionalpreferences/TickButtonPreference.java deleted file mode 100644 index c01521f548d..00000000000 --- a/src/com/android/settings/regionalpreferences/TickButtonPreference.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2022 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.regionalpreferences; - -import android.content.Context; -import android.view.View; - -import androidx.preference.PreferenceViewHolder; - -import com.android.settings.R; -import com.android.settingslib.widget.TwoTargetPreference; - -/** A preference with tick button */ -public class TickButtonPreference extends TwoTargetPreference { - private static final String TAG = TickButtonPreference.class.getSimpleName(); - private boolean mIsTickEnabled; - private View mWidgetFrame; - private View mDivider; - - public TickButtonPreference(Context context) { - super(context, null); - } - - /** Set this preference to be selected. */ - public void setTickEnable(boolean isEnable) { - mIsTickEnabled = isEnable; - if (mWidgetFrame != null) { - mWidgetFrame.setVisibility(isEnable ? View.VISIBLE : View.INVISIBLE); - } - } - - /** Check if this preference is selected. */ - public boolean isTickEnabled() { - return mIsTickEnabled; - } - - @Override - public void onBindViewHolder(PreferenceViewHolder holder) { - super.onBindViewHolder(holder); - mDivider = holder.findViewById(R.id.two_target_divider); - mWidgetFrame = holder.findViewById(android.R.id.widget_frame); - if (mDivider != null) { - mDivider.setVisibility(View.GONE); - } - if (mWidgetFrame != null) { - mWidgetFrame.setVisibility(mIsTickEnabled ? View.VISIBLE : View.INVISIBLE); - } - } - - @Override - protected int getSecondTargetResId() { - super.getSecondTargetResId(); - return R.layout.preference_widget_tick; - } -} diff --git a/src/com/android/settings/inputmethod/KeyboardLayoutPreference.java b/src/com/android/settings/widget/TickButtonPreference.java similarity index 61% rename from src/com/android/settings/inputmethod/KeyboardLayoutPreference.java rename to src/com/android/settings/widget/TickButtonPreference.java index f9f858b6bc8..c55da2c1077 100644 --- a/src/com/android/settings/inputmethod/KeyboardLayoutPreference.java +++ b/src/com/android/settings/widget/TickButtonPreference.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2023 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. @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settings.inputmethod; +package com.android.settings.widget; import android.content.Context; import android.view.View; @@ -25,29 +25,33 @@ import androidx.preference.PreferenceViewHolder; import com.android.settings.R; -public class KeyboardLayoutPreference extends Preference { - +/** A preference with tick icon. */ +public class TickButtonPreference extends Preference { private ImageView mCheckIcon; - private boolean mIsMark; + private boolean mIsSelected = false; - public KeyboardLayoutPreference(Context context, String layoutName, boolean defaultMark) { + public TickButtonPreference(Context context) { super(context); setWidgetLayoutResource(R.layout.preference_check_icon); - setTitle(layoutName); - mIsMark = defaultMark; } @Override public void onBindViewHolder(PreferenceViewHolder holder) { super.onBindViewHolder(holder); - mCheckIcon = (ImageView) holder.findViewById(R.id.keyboard_check_icon); - setCheckMark(mIsMark); + mCheckIcon = (ImageView) holder.findViewById(R.id.check_icon); + setSelected(mIsSelected); } - public void setCheckMark(boolean isMark) { + /** Set icon state.*/ + public void setSelected(boolean isSelected) { if (mCheckIcon != null) { - mCheckIcon.setVisibility(isMark ? View.VISIBLE : View.INVISIBLE); - mIsMark = isMark; + mCheckIcon.setVisibility(isSelected ? View.VISIBLE : View.INVISIBLE); } + mIsSelected = isSelected; + } + + /** Return state of presenting icon. */ + public boolean isSelected() { + return mIsSelected; } } diff --git a/tests/unit/src/com/android/settings/regionalpreferences/NumberingSystemItemControllerTest.java b/tests/unit/src/com/android/settings/regionalpreferences/NumberingSystemItemControllerTest.java index 5ec33db8095..708987efc7d 100644 --- a/tests/unit/src/com/android/settings/regionalpreferences/NumberingSystemItemControllerTest.java +++ b/tests/unit/src/com/android/settings/regionalpreferences/NumberingSystemItemControllerTest.java @@ -33,6 +33,8 @@ import androidx.preference.PreferenceScreen; import androidx.test.annotation.UiThreadTest; import androidx.test.core.app.ApplicationProvider; +import com.android.settings.widget.TickButtonPreference; + import org.junit.After; import org.junit.Before; import org.junit.Test; From 56e07c25b3b150622f205902f90f248c8dda5076 Mon Sep 17 00:00:00 2001 From: Yanting Yang Date: Thu, 30 Mar 2023 18:51:31 +0800 Subject: [PATCH 10/12] Fix the potential DOS issue for the Settings Apps page The usage access permission of Settings app could be turned off by starting the activity with USAGE_ACCESS_SETTINGS. Once the Settings app loses the usage access permission, it will crash the Apps page which depends on the usage to show recent apps. And this symptom will persist even with device reboot. To fix this vulnerability, we can add a package check in onCreate() to avoid someone trying to start USAGE_ACCESS_SETTINGS with the Settings package from third party apps. Bug: 264260808 Test: Manually verify solution with the repro steps and also test the normal visiting behavior. Change-Id: If7cb0880e706369504e432b1f1104d06b1fcfa26 Change-Id: I70871aed763d14a79e474547c77c20a9677af6ff --- .../android/settings/applications/UsageAccessDetails.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/com/android/settings/applications/UsageAccessDetails.java b/src/com/android/settings/applications/UsageAccessDetails.java index 8085b691c5b..4adb6c17953 100644 --- a/src/com/android/settings/applications/UsageAccessDetails.java +++ b/src/com/android/settings/applications/UsageAccessDetails.java @@ -30,6 +30,8 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.provider.Settings; +import android.text.TextUtils; +import android.util.Log; import androidx.annotation.VisibleForTesting; import androidx.appcompat.app.AlertDialog; @@ -46,6 +48,7 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; public class UsageAccessDetails extends AppInfoWithHeader implements OnPreferenceChangeListener, OnPreferenceClickListener { + private static final String TAG = UsageAccessDetails.class.getSimpleName(); private static final String KEY_APP_OPS_PREFERENCE_SCREEN = "app_ops_preference_screen"; private static final String KEY_APP_OPS_SETTINGS_SWITCH = "app_ops_settings_switch"; private static final String KEY_APP_OPS_SETTINGS_DESC = "app_ops_settings_description"; @@ -65,6 +68,11 @@ public class UsageAccessDetails extends AppInfoWithHeader implements OnPreferenc super.onCreate(savedInstanceState); Context context = getActivity(); + if (TextUtils.equals(mPackageName, context.getPackageName())) { + Log.w(TAG, "Unsupported app package."); + finish(); + } + mUsageBridge = new AppStateUsageBridge(context, mState, null); mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); mDpm = context.getSystemService(DevicePolicyManager.class); From ff11b8e3071f44e0993a6e5a02e97e66a0f8273f Mon Sep 17 00:00:00 2001 From: Zaiyue Xue Date: Mon, 27 Feb 2023 16:29:04 +0800 Subject: [PATCH 11/12] Exclude screen on time in battery usage page when the device is in charging. Bug: 265751163 Fix: 265751163 Test: manual Change-Id: I4ed71e1d6fad56a7cbfc9cd47ed4d791f45261ce --- Android.bp | 1 + AndroidManifest.xml | 1 + .../BatteryUsageBroadcastReceiver.java | 21 ++- .../BatteryUsageContentProvider.java | 33 ++++- .../fuelgauge/batteryusage/ConvertUtils.java | 33 +++++ .../batteryusage/DataProcessManager.java | 57 ++++++-- .../fuelgauge/batteryusage/DataProcessor.java | 80 +++++++++-- .../fuelgauge/batteryusage/DatabaseUtils.java | 106 ++++++++++++-- .../batteryusage/db/BatteryEventDao.java | 50 +++++++ .../batteryusage/db/BatteryEventEntity.java | 133 ++++++++++++++++++ .../batteryusage/db/BatteryStateDatabase.java | 10 +- .../settings/fuelgauge/protos/Android.bp | 24 ++-- .../fuelgauge/protos/battery_event.proto | 17 +++ .../BatteryUsageContentProviderTest.java | 23 +++ .../batteryusage/ConvertUtilsTest.java | 26 ++++ .../batteryusage/DataProcessManagerTest.java | 2 +- .../batteryusage/DataProcessorTest.java | 94 ++++++++++++- .../batteryusage/DatabaseUtilsTest.java | 23 +++ .../batteryusage/db/BatteryEventDaoTest.java | 80 +++++++++++ .../db/BatteryEventEntityTest.java | 47 +++++++ 20 files changed, 809 insertions(+), 52 deletions(-) create mode 100644 src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventDao.java create mode 100644 src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventEntity.java create mode 100644 src/com/android/settings/fuelgauge/protos/battery_event.proto create mode 100644 tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventDaoTest.java create mode 100644 tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventEntityTest.java diff --git a/Android.bp b/Android.bp index ea2c983ae3f..4d07913b11a 100644 --- a/Android.bp +++ b/Android.bp @@ -81,6 +81,7 @@ android_library { "jsr305", "net-utils-framework-common", "app-usage-event-protos-lite", + "battery-event-protos-lite", "settings-contextual-card-protos-lite", "settings-log-bridge-protos-lite", "settings-telephony-protos-lite", diff --git a/AndroidManifest.xml b/AndroidManifest.xml index ccf002a8e1d..21b3fa4a5b3 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -3110,6 +3110,7 @@ + diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java index a437877df47..07a97dcc25e 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java @@ -30,6 +30,8 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.fuelgauge.BatteryStatus; import java.time.Duration; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** A {@link BatteryUsageBroadcastReceiver} for battery usage data requesting. */ public final class BatteryUsageBroadcastReceiver extends BroadcastReceiver { @@ -37,7 +39,10 @@ public final class BatteryUsageBroadcastReceiver extends BroadcastReceiver { /** An intent action to request Settings to clear cache data. */ public static final String ACTION_CLEAR_BATTERY_CACHE_DATA = "com.android.settings.battery.action.CLEAR_BATTERY_CACHE_DATA"; - /** An intent action to request Settings to clear cache data. */ + /** An intent action for power is plugging. */ + public static final String ACTION_BATTERY_PLUGGING = + "com.android.settings.battery.action.ACTION_BATTERY_PLUGGING"; + /** An intent action for power is unplugging. */ public static final String ACTION_BATTERY_UNPLUGGING = "com.android.settings.battery.action.ACTION_BATTERY_UNPLUGGING"; @@ -49,6 +54,8 @@ public final class BatteryUsageBroadcastReceiver extends BroadcastReceiver { @VisibleForTesting boolean mFetchBatteryUsageData = false; + private final ExecutorService mExecutor = Executors.newSingleThreadExecutor(); + @Override public void onReceive(Context context, Intent intent) { if (intent == null || intent.getAction() == null) { @@ -70,7 +77,11 @@ public final class BatteryUsageBroadcastReceiver extends BroadcastReceiver { tryToFetchUsageData(context); } break; + case ACTION_BATTERY_PLUGGING: + sendBatteryEventData(context, BatteryEventType.POWER_CONNECTED); + break; case ACTION_BATTERY_UNPLUGGING: + sendBatteryEventData(context, BatteryEventType.POWER_DISCONNECTED); // Only when fullChargeIntentAction is ACTION_POWER_DISCONNECTED, // ACTION_BATTERY_UNPLUGGING will be considered as the full charge event and then // start usage events fetching. @@ -106,4 +117,12 @@ public final class BatteryUsageBroadcastReceiver extends BroadcastReceiver { mFetchBatteryUsageData = true; BatteryUsageDataLoader.enqueueWork(context, /*isFullChargeStart=*/ true); } + + private void sendBatteryEventData(Context context, BatteryEventType batteryEventType) { + final long timestamp = System.currentTimeMillis(); + final Intent intent = BatteryUtils.getBatteryIntent(context); + final int batteryLevel = BatteryStatus.getBatteryLevel(intent); + mExecutor.execute(() -> DatabaseUtils.sendBatteryEventData(context, + ConvertUtils.convertToBatteryEvent(timestamp, batteryEventType, batteryLevel))); + } } diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProvider.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProvider.java index 42937e5688a..1b2d4cd0406 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProvider.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProvider.java @@ -31,6 +31,8 @@ import androidx.annotation.VisibleForTesting; import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventDao; import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity; +import com.android.settings.fuelgauge.batteryusage.db.BatteryEventDao; +import com.android.settings.fuelgauge.batteryusage.db.BatteryEventEntity; import com.android.settings.fuelgauge.batteryusage.db.BatteryState; import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDao; import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDatabase; @@ -52,6 +54,7 @@ public class BatteryUsageContentProvider extends ContentProvider { private static final int BATTERY_STATE_CODE = 1; private static final int APP_USAGE_LATEST_TIMESTAMP_CODE = 2; private static final int APP_USAGE_EVENT_CODE = 3; + private static final int BATTERY_EVENT_CODE = 4; private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); @@ -68,11 +71,16 @@ public class BatteryUsageContentProvider extends ContentProvider { DatabaseUtils.AUTHORITY, /*path=*/ DatabaseUtils.APP_USAGE_EVENT_TABLE, /*code=*/ APP_USAGE_EVENT_CODE); + sUriMatcher.addURI( + DatabaseUtils.AUTHORITY, + /*path=*/ DatabaseUtils.BATTERY_EVENT_TABLE, + /*code=*/ BATTERY_EVENT_CODE); } private Clock mClock; private BatteryStateDao mBatteryStateDao; private AppUsageEventDao mAppUsageEventDao; + private BatteryEventDao mBatteryEventDao; @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) public void setClock(Clock clock) { @@ -88,6 +96,7 @@ public class BatteryUsageContentProvider extends ContentProvider { mClock = Clock.systemUTC(); mBatteryStateDao = BatteryStateDatabase.getInstance(getContext()).batteryStateDao(); mAppUsageEventDao = BatteryStateDatabase.getInstance(getContext()).appUsageEventDao(); + mBatteryEventDao = BatteryStateDatabase.getInstance(getContext()).batteryEventDao(); Log.w(TAG, "create content provider from " + getCallingPackage()); return true; } @@ -107,6 +116,8 @@ public class BatteryUsageContentProvider extends ContentProvider { return getAppUsageEvents(uri); case APP_USAGE_LATEST_TIMESTAMP_CODE: return getAppUsageLatestTimestamp(uri); + case BATTERY_EVENT_CODE: + return getBatteryEvents(uri); default: throw new IllegalArgumentException("unknown URI: " + uri); } @@ -138,6 +149,14 @@ public class BatteryUsageContentProvider extends ContentProvider { Log.e(TAG, "insert() from:" + uri + " error:" + e); return null; } + case BATTERY_EVENT_CODE: + try { + mBatteryEventDao.insert(BatteryEventEntity.create(contentValues)); + return uri; + } catch (RuntimeException e) { + Log.e(TAG, "insert() from:" + uri + " error:" + e); + return null; + } default: throw new IllegalArgumentException("unknown URI: " + uri); } @@ -190,7 +209,6 @@ public class BatteryUsageContentProvider extends ContentProvider { } Log.w(TAG, "query app usage events in " + (mClock.millis() - timestamp) + "/ms"); return cursor; - } private Cursor getAppUsageLatestTimestamp(Uri uri) { @@ -210,6 +228,19 @@ public class BatteryUsageContentProvider extends ContentProvider { return cursor; } + private Cursor getBatteryEvents(Uri uri) { + final long queryTimestamp = getQueryTimestamp(uri); + final long timestamp = mClock.millis(); + Cursor cursor = null; + try { + cursor = mBatteryEventDao.getAllAfter(queryTimestamp); + } catch (RuntimeException e) { + Log.e(TAG, "query() from:" + uri + " error:" + e); + } + Log.w(TAG, "query app usage events in " + (mClock.millis() - timestamp) + "/ms"); + return cursor; + } + // If URI contains query parameter QUERY_KEY_USERID, use the value directly. // Otherwise, return null. private List getQueryUserIds(Uri uri) { diff --git a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java index fcf934ff8e3..c6c548f0dce 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java +++ b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java @@ -38,6 +38,7 @@ import androidx.annotation.VisibleForTesting; import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity; +import com.android.settings.fuelgauge.batteryusage.db.BatteryEventEntity; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -125,6 +126,15 @@ public final class ConvertUtils { return values; } + /** Converts {@link BatteryEvent} to content values */ + public static ContentValues convertBatteryEventToContentValues(final BatteryEvent event) { + final ContentValues values = new ContentValues(); + values.put(BatteryEventEntity.KEY_TIMESTAMP, event.getTimestamp()); + values.put(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE, event.getType().getNumber()); + values.put(BatteryEventEntity.KEY_BATTERY_LEVEL, event.getBatteryLevel()); + return values; + } + /** Gets the encoded string from {@link BatteryInformation} instance. */ public static String convertBatteryInformationToString( final BatteryInformation batteryInformation) { @@ -237,6 +247,29 @@ public final class ConvertUtils { return eventBuilder.build(); } + /** Converts to {@link BatteryEvent} from {@link BatteryEventType} */ + public static BatteryEvent convertToBatteryEvent( + long timestamp, BatteryEventType type, int batteryLevel) { + final BatteryEvent.Builder eventBuilder = BatteryEvent.newBuilder(); + eventBuilder.setTimestamp(timestamp); + eventBuilder.setType(type); + eventBuilder.setBatteryLevel(batteryLevel); + return eventBuilder.build(); + } + + /** Converts to {@link BatteryEvent} from {@link Cursor} */ + public static BatteryEvent convertToBatteryEventFromCursor(final Cursor cursor) { + final BatteryEvent.Builder eventBuilder = BatteryEvent.newBuilder(); + eventBuilder.setTimestamp(getLongFromCursor(cursor, BatteryEventEntity.KEY_TIMESTAMP)); + eventBuilder.setType( + BatteryEventType.forNumber( + getIntegerFromCursor( + cursor, BatteryEventEntity.KEY_BATTERY_EVENT_TYPE))); + eventBuilder.setBatteryLevel( + getIntegerFromCursor(cursor, BatteryEventEntity.KEY_BATTERY_LEVEL)); + return eventBuilder.build(); + } + /** Converts UTC timestamp to local time string for logging only, so use the US locale for * better readability in debugging. */ public static String utcToLocalTimeForLogging(long timestamp) { diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessManager.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessManager.java index 1f25ae0fa8a..6b007de8c61 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessManager.java +++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessManager.java @@ -72,6 +72,8 @@ public class DataProcessManager { private final Handler mHandler; private final DataProcessor.UsageMapAsyncResponse mCallbackFunction; + private final List mAppUsageEventList = new ArrayList<>(); + private final List mBatteryEventList = new ArrayList<>(); private Context mContext; private UserManager mUserManager; @@ -84,12 +86,12 @@ public class DataProcessManager { private boolean mIsCurrentBatteryHistoryLoaded = false; private boolean mIsCurrentAppUsageLoaded = false; private boolean mIsDatabaseAppUsageLoaded = false; + private boolean mIsBatteryEventLoaded = false; // Used to identify whether screen-on time data should be shown in the UI. private boolean mShowScreenOnTime = true; // Used to identify whether battery level data should be shown in the UI. private boolean mShowBatteryLevel = true; - private List mAppUsageEventList = new ArrayList<>(); /** * The indexed {@link AppUsagePeriod} list data for each corresponding time slot. *

    {@code Long} stands for the userId.

    @@ -146,6 +148,8 @@ public class DataProcessManager { loadDatabaseAppUsageList(); // Loads the latest app usage list from the service. loadCurrentAppUsageList(); + // Loads the battery event list from database. + loadBatteryEventList(); } else { // If there is no battery level data, only load the battery history data from service // and show it as the app list directly. @@ -174,6 +178,11 @@ public class DataProcessManager { return mIsDatabaseAppUsageLoaded; } + @VisibleForTesting + boolean getIsBatteryEventLoaded() { + return mIsBatteryEventLoaded; + } + @VisibleForTesting boolean getIsCurrentBatteryHistoryLoaded() { return mIsCurrentBatteryHistoryLoaded; @@ -290,7 +299,7 @@ public class DataProcessManager { return null; } final long startTime = System.currentTimeMillis(); - // Loads the current battery usage data from the battery stats service. + // Loads the app usage data from the database. final List appUsageEventList = DatabaseUtils.getAppUsageEventForUsers( mContext, Calendar.getInstance(), getCurrentUserIds(), @@ -314,6 +323,35 @@ public class DataProcessManager { }.execute(); } + private void loadBatteryEventList() { + new AsyncTask>() { + @Override + protected List doInBackground(Void... voids) { + final long startTime = System.currentTimeMillis(); + // Loads the battery event data from the database. + final List batteryEventList = + DatabaseUtils.getBatteryEvents( + mContext, Calendar.getInstance(), mRawStartTimestamp); + Log.d(TAG, String.format("execute loadBatteryEventList size=%d in %d/ms", + batteryEventList.size(), (System.currentTimeMillis() - startTime))); + return batteryEventList; + } + + @Override + protected void onPostExecute( + final List batteryEventList) { + if (batteryEventList == null || batteryEventList.isEmpty()) { + Log.d(TAG, "batteryEventList is null or empty"); + } else { + mBatteryEventList.clear(); + mBatteryEventList.addAll(batteryEventList); + } + mIsBatteryEventLoaded = true; + tryToProcessAppUsageData(); + } + }.execute(); + } + private void loadAndApplyBatteryMapFromServiceOnly() { new AsyncTask() { @Override @@ -344,9 +382,8 @@ public class DataProcessManager { } private void tryToProcessAppUsageData() { - // Only when all app usage events has been loaded, start processing app usage data to an - // intermediate result for further use. - if (!mIsCurrentAppUsageLoaded || !mIsDatabaseAppUsageLoaded) { + // Ignore processing the data if any required data is not loaded. + if (!mIsCurrentAppUsageLoaded || !mIsDatabaseAppUsageLoaded || !mIsBatteryEventLoaded) { return; } processAppUsageData(); @@ -360,16 +397,16 @@ public class DataProcessManager { } // Generates the indexed AppUsagePeriod list data for each corresponding time slot for // further use. - mAppUsagePeriodMap = DataProcessor.generateAppUsagePeriodMap( - mRawStartTimestamp, mHourlyBatteryLevelsPerDay, mAppUsageEventList); + mAppUsagePeriodMap = DataProcessor.generateAppUsagePeriodMap(mRawStartTimestamp, + mHourlyBatteryLevelsPerDay, mAppUsageEventList, mBatteryEventList); } private void tryToGenerateFinalDataAndApplyCallback() { - // Only when both battery history data and app usage events data has been loaded, start the - // final data processing. + // Ignore processing the data if any required data is not loaded. if (!mIsCurrentBatteryHistoryLoaded || !mIsCurrentAppUsageLoaded - || !mIsDatabaseAppUsageLoaded) { + || !mIsDatabaseAppUsageLoaded + || !mIsBatteryEventLoaded) { return; } generateFinalDataAndApplyCallback(); diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java index 38d4e69c66e..6270eb3f8a1 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java +++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java @@ -94,6 +94,14 @@ public final class DataProcessor { @VisibleForTesting static final int SELECTED_INDEX_ALL = BatteryChartViewModel.SELECTED_INDEX_ALL; + @VisibleForTesting + static final Comparator APP_USAGE_EVENT_TIMESTAMP_COMPARATOR = + Comparator.comparing(AppUsageEvent::getTimestamp); + + @VisibleForTesting + static final Comparator BATTERY_EVENT_TIMESTAMP_COMPARATOR = + Comparator.comparing(BatteryEvent::getTimestamp); + @VisibleForTesting static boolean sDebug = false; @@ -110,8 +118,6 @@ public final class DataProcessor { public static final String CURRENT_TIME_BATTERY_HISTORY_PLACEHOLDER = "CURRENT_TIME_BATTERY_HISTORY_PLACEHOLDER"; - public static final Comparator TIMESTAMP_COMPARATOR = - Comparator.comparing(AppUsageEvent::getTimestamp); /** A callback listener when battery usage loading async task is executed. */ public interface UsageMapAsyncResponse { @@ -266,14 +272,16 @@ public final class DataProcessor { generateAppUsagePeriodMap( final long rawStartTimestamp, final List hourlyBatteryLevelsPerDay, - final List appUsageEventList) { + final List appUsageEventList, + final List batteryEventList) { if (appUsageEventList.isEmpty()) { Log.w(TAG, "appUsageEventList is empty"); return null; } - // Sorts the appUsageEventList in ascending order based on the timestamp before - // distribution. - Collections.sort(appUsageEventList, TIMESTAMP_COMPARATOR); + // Sorts the appUsageEventList and batteryEventList in ascending order based on the + // timestamp before distribution. + Collections.sort(appUsageEventList, APP_USAGE_EVENT_TIMESTAMP_COMPARATOR); + Collections.sort(batteryEventList, BATTERY_EVENT_TIMESTAMP_COMPARATOR); final Map>>>> resultMap = new ArrayMap<>(); @@ -309,8 +317,8 @@ public final class DataProcessor { // The value could be null when there is no data in the hourly slot. dailyMap.put( hourlyIndex, - buildAppUsagePeriodList( - hourlyAppUsageEventList, startTimestamp, endTimestamp)); + buildAppUsagePeriodList(hourlyAppUsageEventList, batteryEventList, + startTimestamp, endTimestamp)); } } return resultMap; @@ -717,7 +725,8 @@ public final class DataProcessor { @VisibleForTesting @Nullable static Map>> buildAppUsagePeriodList( - final List allAppUsageEvents, final long startTime, final long endTime) { + final List allAppUsageEvents, final List batteryEventList, + final long startTime, final long endTime) { if (allAppUsageEvents.isEmpty()) { return null; } @@ -763,12 +772,14 @@ public final class DataProcessor { usageEvents.addAll(deviceEvents); // Sorts the usageEvents in ascending order based on the timestamp before computing the // period. - Collections.sort(usageEvents, TIMESTAMP_COMPARATOR); + Collections.sort(usageEvents, APP_USAGE_EVENT_TIMESTAMP_COMPARATOR); // A package might have multiple instances. Computes the usage period per instance id // and then merges them into the same user-package map. final List usagePeriodList = - buildAppUsagePeriodListPerInstance(usageEvents, startTime, endTime); + excludePowerConnectedTimeFromAppUsagePeriodList( + buildAppUsagePeriodListPerInstance(usageEvents, startTime, endTime), + batteryEventList); if (!usagePeriodList.isEmpty()) { addToUsagePeriodMap(allUsagePeriods, usagePeriodList, eventUserId, packageName); } @@ -836,6 +847,53 @@ public final class DataProcessor { return usagePeriodList; } + @VisibleForTesting + static List excludePowerConnectedTimeFromAppUsagePeriodList( + final List usagePeriodList, + final List batteryEventList) { + final List resultList = new ArrayList<>(); + for (AppUsagePeriod inputPeriod : usagePeriodList) { + long lastStartTime = inputPeriod.getStartTime(); + for (BatteryEvent batteryEvent : batteryEventList) { + if (batteryEvent.getTimestamp() < inputPeriod.getStartTime()) { + // Because the batteryEventList has been sorted, here is to mark the power + // connection state when the usage period starts. If power is connected when + // the usage period starts, the starting period will be ignored; otherwise it + // will be added. + if (batteryEvent.getType() == BatteryEventType.POWER_CONNECTED) { + lastStartTime = 0; + } else if (batteryEvent.getType() == BatteryEventType.POWER_DISCONNECTED) { + lastStartTime = inputPeriod.getStartTime(); + } + continue; + } + if (batteryEvent.getTimestamp() > inputPeriod.getEndTime()) { + // Because the batteryEventList has been sorted, if any event is already after + // the end time, all the following events should be able to drop directly. + break; + } + + if (batteryEvent.getType() == BatteryEventType.POWER_CONNECTED + && lastStartTime != 0) { + resultList.add(AppUsagePeriod.newBuilder() + .setStartTime(lastStartTime) + .setEndTime(batteryEvent.getTimestamp()) + .build()); + lastStartTime = 0; + } else if (batteryEvent.getType() == BatteryEventType.POWER_DISCONNECTED) { + lastStartTime = batteryEvent.getTimestamp(); + } + } + if (lastStartTime != 0) { + resultList.add(AppUsagePeriod.newBuilder() + .setStartTime(lastStartTime) + .setEndTime(inputPeriod.getEndTime()) + .build()); + } + } + return resultList; + } + @VisibleForTesting static long getScreenOnTime( final Map>> appUsageMap, diff --git a/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java b/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java index ef1434cb4a0..84a39bb811f 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java +++ b/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java @@ -64,10 +64,12 @@ public final class DatabaseUtils { /** An authority name of the battery content provider. */ public static final String AUTHORITY = "com.android.settings.battery.usage.provider"; - /** A table name for battery usage history. */ - public static final String BATTERY_STATE_TABLE = "BatteryState"; /** A table name for app usage events. */ public static final String APP_USAGE_EVENT_TABLE = "AppUsageEvent"; + /** A table name for battery events. */ + public static final String BATTERY_EVENT_TABLE = "BatteryEvent"; + /** A table name for battery usage history. */ + public static final String BATTERY_STATE_TABLE = "BatteryState"; /** A path name for app usage latest timestamp query. */ public static final String APP_USAGE_LATEST_TIMESTAMP_PATH = "appUsageLatestTimestamp"; /** A class name for battery usage data provider. */ @@ -84,13 +86,6 @@ public final class DatabaseUtils { */ public static final long USAGE_QUERY_BUFFER_HOURS = Duration.ofHours(3).toMillis(); - /** A content URI to access battery usage states data. */ - public static final Uri BATTERY_CONTENT_URI = - new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(AUTHORITY) - .appendPath(BATTERY_STATE_TABLE) - .build(); /** A content URI to access app usage events data. */ public static final Uri APP_USAGE_EVENT_URI = new Uri.Builder() @@ -98,6 +93,20 @@ public final class DatabaseUtils { .authority(AUTHORITY) .appendPath(APP_USAGE_EVENT_TABLE) .build(); + /** A content URI to access battery events data. */ + public static final Uri BATTERY_EVENT_URI = + new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(AUTHORITY) + .appendPath(BATTERY_EVENT_TABLE) + .build(); + /** A content URI to access battery usage states data. */ + public static final Uri BATTERY_CONTENT_URI = + new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(AUTHORITY) + .appendPath(BATTERY_STATE_TABLE) + .build(); // For testing only. @VisibleForTesting @@ -106,6 +115,8 @@ public final class DatabaseUtils { static Supplier sFakeAppUsageEventSupplier; @VisibleForTesting static Supplier sFakeAppUsageLatestTimestampSupplier; + @VisibleForTesting + static Supplier sFakeBatteryEventSupplier; private DatabaseUtils() { } @@ -176,6 +187,32 @@ public final class DatabaseUtils { return appUsageEventList; } + /** Returns the battery event data since the query timestamp in battery event table. */ + public static List getBatteryEvents( + Context context, + final Calendar calendar, + final long rawStartTimestamp) { + final long startTime = System.currentTimeMillis(); + final long sixDaysAgoTimestamp = getTimestampSixDaysAgo(calendar); + final long queryTimestamp = Math.max(rawStartTimestamp, sixDaysAgoTimestamp); + Log.d(TAG, "getBatteryEvents for timestamp: " + queryTimestamp); + // Builds the content uri everytime to avoid cache. + final Uri batteryEventUri = + new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(AUTHORITY) + .appendPath(BATTERY_EVENT_TABLE) + .appendQueryParameter( + QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp)) + .build(); + + final List batteryEventList = + loadBatteryEventsFromContentProvider(context, batteryEventUri); + Log.d(TAG, String.format("getBatteryEvents size=%d in %d/ms", batteryEventList.size(), + (System.currentTimeMillis() - startTime))); + return batteryEventList; + } + /** Long: for timestamp and String: for BatteryHistEntry.getKey() */ public static Map> getHistoryMapSinceLastFullCharge( Context context, Calendar calendar) { @@ -210,8 +247,9 @@ public final class DatabaseUtils { try { final BatteryStateDatabase database = BatteryStateDatabase .getInstance(context.getApplicationContext()); - database.batteryStateDao().clearAll(); database.appUsageEventDao().clearAll(); + database.batteryEventDao().clearAll(); + database.batteryStateDao().clearAll(); } catch (RuntimeException e) { Log.e(TAG, "clearAll() failed", e); } @@ -226,8 +264,9 @@ public final class DatabaseUtils { .getInstance(context.getApplicationContext()); final long earliestTimestamp = Clock.systemUTC().millis() - Duration.ofDays(DATA_RETENTION_INTERVAL_DAY).toMillis(); - database.batteryStateDao().clearAllBefore(earliestTimestamp); database.appUsageEventDao().clearAllBefore(earliestTimestamp); + database.batteryEventDao().clearAllBefore(earliestTimestamp); + database.batteryStateDao().clearAllBefore(earliestTimestamp); } catch (RuntimeException e) { Log.e(TAG, "clearAllBefore() failed", e); } @@ -292,6 +331,23 @@ public final class DatabaseUtils { return valuesList; } + static ContentValues sendBatteryEventData( + final Context context, final BatteryEvent batteryEvent) { + final long startTime = System.currentTimeMillis(); + ContentValues contentValues = ConvertUtils.convertBatteryEventToContentValues(batteryEvent); + final ContentResolver resolver = context.getContentResolver(); + try { + resolver.insert(BATTERY_EVENT_URI, contentValues); + Log.d(TAG, "insert() battery event data into database: " + batteryEvent.toString()); + } catch (Exception e) { + Log.e(TAG, "insert() battery event data into database error:\n" + e); + } + Log.d(TAG, String.format("sendBatteryEventData() in %d/ms", + (System.currentTimeMillis() - startTime))); + clearMemory(); + return contentValues; + } + static List sendBatteryEntryData( final Context context, final List batteryEntryList, @@ -392,6 +448,8 @@ public final class DatabaseUtils { public static void dump(Context context, PrintWriter writer) { writeString(context, writer, "BatteryLevelChanged", Intent.ACTION_BATTERY_LEVEL_CHANGED); + writeString(context, writer, "BatteryPlugging", + BatteryUsageBroadcastReceiver.ACTION_BATTERY_PLUGGING); writeString(context, writer, "BatteryUnplugging", BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING); writeString(context, writer, "ClearBatteryCacheData", @@ -475,6 +533,32 @@ public final class DatabaseUtils { return appUsageEventList; } + private static List loadBatteryEventsFromContentProvider( + Context context, Uri batteryEventUri) { + final List batteryEventList = new ArrayList<>(); + context = getParentContext(context); + if (context == null) { + return batteryEventList; + } + try (Cursor cursor = sFakeBatteryEventSupplier != null + ? sFakeBatteryEventSupplier.get() + : context.getContentResolver().query(batteryEventUri, null, null, null)) { + if (cursor == null || cursor.getCount() == 0) { + return batteryEventList; + } + // Loads and recovers all AppUsageEvent data from cursor. + while (cursor.moveToNext()) { + batteryEventList.add(ConvertUtils.convertToBatteryEventFromCursor(cursor)); + } + try { + cursor.close(); + } catch (Exception e) { + Log.e(TAG, "cursor.close() failed", e); + } + } + return batteryEventList; + } + private static Map> loadHistoryMapFromContentProvider( Context context, Uri batteryStateUri) { context = DatabaseUtils.getParentContext(context); diff --git a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventDao.java b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventDao.java new file mode 100644 index 00000000000..a638d094519 --- /dev/null +++ b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventDao.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2023 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.batteryusage.db; + +import android.database.Cursor; + +import androidx.room.Dao; +import androidx.room.Insert; +import androidx.room.OnConflictStrategy; +import androidx.room.Query; + +import java.util.List; + +/** Data access object for accessing {@link BatteryEventEntity} in the database. */ +@Dao +public interface BatteryEventDao { + /** Inserts a {@link BatteryEventEntity} data into the database. */ + @Insert(onConflict = OnConflictStrategy.REPLACE) + void insert(BatteryEventEntity event); + + /** Gets all recorded data. */ + @Query("SELECT * FROM BatteryEventEntity ORDER BY timestamp DESC") + List getAll(); + + /** Gets the {@link Cursor} of all recorded data after a specific timestamp. */ + @Query("SELECT * FROM BatteryEventEntity WHERE timestamp > :timestamp ORDER BY timestamp DESC") + Cursor getAllAfter(long timestamp); + + /** Deletes all recorded data before a specific timestamp. */ + @Query("DELETE FROM BatteryEventEntity WHERE timestamp <= :timestamp") + void clearAllBefore(long timestamp); + + /** Clears all recorded data in the database. */ + @Query("DELETE FROM BatteryEventEntity") + void clearAll(); +} diff --git a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventEntity.java b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventEntity.java new file mode 100644 index 00000000000..66cadda4530 --- /dev/null +++ b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventEntity.java @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2023 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.batteryusage.db; + +import android.content.ContentValues; + +import androidx.room.Entity; +import androidx.room.PrimaryKey; + +import com.android.settings.fuelgauge.batteryusage.ConvertUtils; + +import com.google.errorprone.annotations.CanIgnoreReturnValue; + +import java.util.Locale; + +/** A {@link Entity} class to save battery events into database. */ +@Entity +public class BatteryEventEntity { + /** Keys for accessing {@link ContentValues}. */ + public static final String KEY_TIMESTAMP = "timestamp"; + public static final String KEY_BATTERY_EVENT_TYPE = "batteryEventType"; + public static final String KEY_BATTERY_LEVEL = "batteryLevel"; + + @PrimaryKey(autoGenerate = true) + private long mId; + + public final long timestamp; + public final int batteryEventType; + public final int batteryLevel; + + public BatteryEventEntity( + final long timestamp, + final int batteryEventType, + final int batteryLevel) { + this.timestamp = timestamp; + this.batteryEventType = batteryEventType; + this.batteryLevel = batteryLevel; + } + + /** Sets the auto-generated content ID. */ + public void setId(long id) { + this.mId = id; + } + + /** Gets the auto-generated content ID. */ + public long getId() { + return mId; + } + + @Override + public String toString() { + final String recordAtDateTime = ConvertUtils.utcToLocalTimeForLogging(timestamp); + final StringBuilder builder = new StringBuilder() + .append("\nBatteryEvent{") + .append(String.format(Locale.US, + "\n\ttimestamp=%s|batteryEventType=%d|batteryLevel=%d", + recordAtDateTime, batteryEventType, batteryLevel)) + .append("\n}"); + return builder.toString(); + } + + /** Creates new {@link BatteryEventEntity} from {@link ContentValues}. */ + public static BatteryEventEntity create(ContentValues contentValues) { + Builder builder = BatteryEventEntity.newBuilder(); + if (contentValues.containsKey(KEY_TIMESTAMP)) { + builder.setTimestamp(contentValues.getAsLong(KEY_TIMESTAMP)); + } + if (contentValues.containsKey(KEY_BATTERY_EVENT_TYPE)) { + builder.setBatteryEventType(contentValues.getAsInteger(KEY_BATTERY_EVENT_TYPE)); + } + if (contentValues.containsKey(KEY_BATTERY_LEVEL)) { + builder.setBatteryLevel(contentValues.getAsInteger(KEY_BATTERY_LEVEL)); + } + return builder.build(); + } + + /** Creates a new {@link Builder} instance. */ + public static Builder newBuilder() { + return new Builder(); + } + + /** A convenience builder class to improve readability. */ + public static class Builder { + private long mTimestamp; + private int mBatteryEventType; + private int mBatteryLevel; + + /** Sets the timestamp. */ + @CanIgnoreReturnValue + public Builder setTimestamp(final long timestamp) { + mTimestamp = timestamp; + return this; + } + + /** Sets the battery event type. */ + @CanIgnoreReturnValue + public Builder setBatteryEventType(final int batteryEventType) { + mBatteryEventType = batteryEventType; + return this; + } + + /** Sets the battery level. */ + @CanIgnoreReturnValue + public Builder setBatteryLevel(final int batteryLevel) { + mBatteryLevel = batteryLevel; + return this; + } + + /** Builds the {@link BatteryEventEntity}. */ + public BatteryEventEntity build() { + return new BatteryEventEntity( + mTimestamp, + mBatteryEventType, + mBatteryLevel); + } + + private Builder() {} + } +} diff --git a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDatabase.java b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDatabase.java index 4c8df7e0ad5..466a7ca4740 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDatabase.java +++ b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDatabase.java @@ -25,24 +25,26 @@ import androidx.room.RoomDatabase; /** A {@link RoomDatabase} for battery usage states history. */ @Database( - entities = {BatteryState.class, AppUsageEventEntity.class}, + entities = {AppUsageEventEntity.class, BatteryEventEntity.class, BatteryState.class}, version = 1) public abstract class BatteryStateDatabase extends RoomDatabase { private static final String TAG = "BatteryStateDatabase"; private static BatteryStateDatabase sBatteryStateDatabase; - /** Provides DAO for battery state table. */ - public abstract BatteryStateDao batteryStateDao(); /** Provides DAO for app usage event table. */ public abstract AppUsageEventDao appUsageEventDao(); + /** Provides DAO for battery event table. */ + public abstract BatteryEventDao batteryEventDao(); + /** Provides DAO for battery state table. */ + public abstract BatteryStateDao batteryStateDao(); /** Gets or creates an instance of {@link RoomDatabase}. */ public static BatteryStateDatabase getInstance(Context context) { if (sBatteryStateDatabase == null) { sBatteryStateDatabase = Room.databaseBuilder( - context, BatteryStateDatabase.class, "battery-usage-db-v7") + context, BatteryStateDatabase.class, "battery-usage-db-v8") // Allows accessing data in the main thread for dumping bugreport. .allowMainThreadQueries() .fallbackToDestructiveMigration() diff --git a/src/com/android/settings/fuelgauge/protos/Android.bp b/src/com/android/settings/fuelgauge/protos/Android.bp index 2c63af40a09..3af2aef0796 100644 --- a/src/com/android/settings/fuelgauge/protos/Android.bp +++ b/src/com/android/settings/fuelgauge/protos/Android.bp @@ -7,6 +7,22 @@ package { default_applicable_licenses: ["packages_apps_Settings_license"], } +java_library { + name: "app-usage-event-protos-lite", + proto: { + type: "lite", + }, + srcs: ["app_usage_event.proto"], +} + +java_library { + name: "battery-event-protos-lite", + proto: { + type: "lite", + }, + srcs: ["battery_event.proto"], +} + java_library { name: "fuelgauge-usage-state-protos-lite", proto: { @@ -14,11 +30,3 @@ java_library { }, srcs: ["fuelgauge_usage_state.proto"], } - -java_library { - name: "app-usage-event-protos-lite", - proto: { - type: "lite", - }, - srcs: ["app_usage_event.proto"], -} \ No newline at end of file diff --git a/src/com/android/settings/fuelgauge/protos/battery_event.proto b/src/com/android/settings/fuelgauge/protos/battery_event.proto new file mode 100644 index 00000000000..80ccb3b24f4 --- /dev/null +++ b/src/com/android/settings/fuelgauge/protos/battery_event.proto @@ -0,0 +1,17 @@ +syntax = "proto2"; + +option java_multiple_files = true; +option java_package = "com.android.settings.fuelgauge.batteryusage"; +option java_outer_classname = "BatteryEventProto"; + +enum BatteryEventType { + UNKNOWN_EVENT = 0; + POWER_CONNECTED = 1; + POWER_DISCONNECTED = 2; +} + +message BatteryEvent { + optional int64 timestamp = 1; + optional BatteryEventType type = 2; + optional int32 battery_level = 3; +} diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java index e5547c59b5c..05a6f2bc89c 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java @@ -31,6 +31,7 @@ import android.net.Uri; import androidx.test.core.app.ApplicationProvider; import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity; +import com.android.settings.fuelgauge.batteryusage.db.BatteryEventEntity; import com.android.settings.fuelgauge.batteryusage.db.BatteryState; import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDatabase; import com.android.settings.testutils.BatteryTestUtils; @@ -353,6 +354,28 @@ public final class BatteryUsageContentProviderTest { assertThat(entities.get(0).taskRootPackageName).isEqualTo("com.android.settings2"); } + @Test + public void insert_batteryEvent_returnsExpectedResult() { + mProvider.onCreate(); + ContentValues values = new ContentValues(); + values.put(BatteryEventEntity.KEY_TIMESTAMP, 10001L); + values.put(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE, + BatteryEventType.POWER_CONNECTED.getNumber()); + values.put(BatteryEventEntity.KEY_BATTERY_LEVEL, 66); + + final Uri uri = mProvider.insert(DatabaseUtils.BATTERY_EVENT_URI, values); + + assertThat(uri).isEqualTo(DatabaseUtils.BATTERY_EVENT_URI); + // Verifies the AppUsageEventEntity content. + final List entities = + BatteryStateDatabase.getInstance(mContext).batteryEventDao().getAll(); + assertThat(entities).hasSize(1); + assertThat(entities.get(0).timestamp).isEqualTo(10001L); + assertThat(entities.get(0).batteryEventType).isEqualTo( + BatteryEventType.POWER_CONNECTED.getNumber()); + assertThat(entities.get(0).batteryLevel).isEqualTo(66); + } + @Test public void delete_throwsUnsupportedOperationException() { assertThrows( diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java index fe1bff6ce00..6b8073b68ee 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java @@ -39,6 +39,7 @@ import android.os.RemoteException; import android.os.UserHandle; import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity; +import com.android.settings.fuelgauge.batteryusage.db.BatteryEventEntity; import org.junit.Before; import org.junit.Test; @@ -194,6 +195,22 @@ public final class ConvertUtilsTest { .isEqualTo("com.android.settings2"); } + @Test + public void convertBatteryEventToContentValues_normalCase_returnsExpectedContentValues() { + final BatteryEvent batteryEvent = + BatteryEvent.newBuilder() + .setTimestamp(10001L) + .setType(BatteryEventType.POWER_CONNECTED) + .setBatteryLevel(66) + .build(); + final ContentValues values = + ConvertUtils.convertBatteryEventToContentValues(batteryEvent); + assertThat(values.getAsLong(BatteryEventEntity.KEY_TIMESTAMP)).isEqualTo(10001L); + assertThat(values.getAsInteger(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE)).isEqualTo( + BatteryEventType.POWER_CONNECTED.getNumber()); + assertThat(values.getAsInteger(BatteryEventEntity.KEY_BATTERY_LEVEL)).isEqualTo(66); + } + @Test public void convertToBatteryHistEntry_returnsExpectedResult() { final int expectedType = 3; @@ -405,6 +422,15 @@ public final class ConvertUtilsTest { assertThat(appUsageEvent.getInstanceId()).isEqualTo(0); } + @Test + public void convertToBatteryEvent_normalCase_returnsExpectedResult() { + final BatteryEvent batteryEvent = ConvertUtils.convertToBatteryEvent( + 666L, BatteryEventType.POWER_DISCONNECTED, 88); + assertThat(batteryEvent.getTimestamp()).isEqualTo(666L); + assertThat(batteryEvent.getType()).isEqualTo(BatteryEventType.POWER_DISCONNECTED); + assertThat(batteryEvent.getBatteryLevel()).isEqualTo(88); + } + @Test public void getLocale_nullContext_returnDefaultLocale() { assertThat(ConvertUtils.getLocale(/*context=*/ null)) diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java index aab91e0a590..753a7f7a1d0 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java @@ -183,7 +183,7 @@ public final class DataProcessManagerTest { assertThat(dataProcessManager.getIsCurrentBatteryHistoryLoaded()).isTrue(); assertThat(dataProcessManager.getShowScreenOnTime()).isTrue(); final List appUsageEventList = dataProcessManager.getAppUsageEventList(); - Collections.sort(appUsageEventList, DataProcessor.TIMESTAMP_COMPARATOR); + Collections.sort(appUsageEventList, DataProcessor.APP_USAGE_EVENT_TIMESTAMP_COMPARATOR); assertThat(appUsageEventList.size()).isEqualTo(6); assertAppUsageEvent( appUsageEventList.get(0), AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 1); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java index aa1547216d2..66e48c09246 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java @@ -250,7 +250,7 @@ public final class DataProcessorTest { final Map>>>> periodMap = DataProcessor.generateAppUsagePeriodMap( - 14400000L, hourlyBatteryLevelsPerDay, appUsageEventList); + 14400000L, hourlyBatteryLevelsPerDay, appUsageEventList, new ArrayList<>()); assertThat(periodMap).hasSize(3); // Day 1 @@ -288,7 +288,7 @@ public final class DataProcessorTest { hourlyBatteryLevelsPerDay.add( new BatteryLevelData.PeriodBatteryLevelData(new ArrayList<>(), new ArrayList<>())); assertThat(DataProcessor.generateAppUsagePeriodMap( - 0L, hourlyBatteryLevelsPerDay, new ArrayList<>())).isNull(); + 0L, hourlyBatteryLevelsPerDay, new ArrayList<>(), new ArrayList<>())).isNull(); } @Test @@ -1669,7 +1669,8 @@ public final class DataProcessorTest { /*instanceId=*/ 4, packageName2)); final Map>> appUsagePeriodMap = - DataProcessor.buildAppUsagePeriodList(appUsageEvents, 0, 5); + DataProcessor.buildAppUsagePeriodList( + appUsageEvents, new ArrayList<>(), 0, 5); assertThat(appUsagePeriodMap).hasSize(2); final Map> userMap1 = appUsagePeriodMap.get(1L); @@ -1693,7 +1694,7 @@ public final class DataProcessorTest { @Test public void buildAppUsagePeriodList_emptyEventList_returnNull() { assertThat(DataProcessor.buildAppUsagePeriodList( - new ArrayList<>(), 0, 1)).isNull(); + new ArrayList<>(), new ArrayList<>(), 0, 1)).isNull(); } @Test @@ -1705,7 +1706,7 @@ public final class DataProcessorTest { AppUsageEventType.DEVICE_SHUTDOWN, /*timestamp=*/ 2)); assertThat(DataProcessor.buildAppUsagePeriodList( - appUsageEvents, 0, 3)).isNull(); + appUsageEvents, new ArrayList<>(), 0, 3)).isNull(); } @Test @@ -1765,6 +1766,89 @@ public final class DataProcessorTest { assertAppUsagePeriod(appUsagePeriodList.get(6), 1000000, 1100000); } + @Test + public void excludePowerConnectedTime_startEndNotCharging_returnExpectedResult() { + final List appUsagePeriodList = List.of( + AppUsagePeriod.newBuilder().setStartTime(100).setEndTime(200).build()); + final List batteryEventList = List.of( + BatteryEvent.newBuilder().setTimestamp(50).setType( + BatteryEventType.POWER_DISCONNECTED).build(), + BatteryEvent.newBuilder().setTimestamp(166).setType( + BatteryEventType.POWER_CONNECTED).build(), + BatteryEvent.newBuilder().setTimestamp(188).setType( + BatteryEventType.POWER_DISCONNECTED).build(), + BatteryEvent.newBuilder().setTimestamp(280).setType( + BatteryEventType.POWER_CONNECTED).build()); + + final List resultList = + DataProcessor.excludePowerConnectedTimeFromAppUsagePeriodList( + appUsagePeriodList, batteryEventList); + + assertThat(resultList).hasSize(2); + assertAppUsagePeriod(resultList.get(0), 100, 166); + assertAppUsagePeriod(resultList.get(1), 188, 200); + } + + @Test + public void excludePowerConnectedTime_startEndInCharging_returnExpectedResult() { + final List appUsagePeriodList = List.of( + AppUsagePeriod.newBuilder().setStartTime(100).setEndTime(200).build()); + final List batteryEventList = List.of( + BatteryEvent.newBuilder().setTimestamp(50).setType( + BatteryEventType.POWER_DISCONNECTED).build(), + BatteryEvent.newBuilder().setTimestamp(80).setType( + BatteryEventType.POWER_CONNECTED).build(), + BatteryEvent.newBuilder().setTimestamp(120).setType( + BatteryEventType.POWER_DISCONNECTED).build(), + BatteryEvent.newBuilder().setTimestamp(150).setType( + BatteryEventType.POWER_CONNECTED).build(), + BatteryEvent.newBuilder().setTimestamp(160).setType( + BatteryEventType.POWER_DISCONNECTED).build(), + BatteryEvent.newBuilder().setTimestamp(180).setType( + BatteryEventType.POWER_CONNECTED).build()); + + final List resultList = + DataProcessor.excludePowerConnectedTimeFromAppUsagePeriodList( + appUsagePeriodList, batteryEventList); + + assertThat(resultList).hasSize(2); + assertAppUsagePeriod(resultList.get(0), 120, 150); + assertAppUsagePeriod(resultList.get(1), 160, 180); + } + + @Test + public void excludePowerConnectedTime_wholePeriodNotCharging_returnExpectedResult() { + final List appUsagePeriodList = List.of( + AppUsagePeriod.newBuilder().setStartTime(100).setEndTime(200).build()); + final List batteryEventList = List.of( + BatteryEvent.newBuilder().setTimestamp(50).setType( + BatteryEventType.POWER_DISCONNECTED).build(), + BatteryEvent.newBuilder().setTimestamp(80).setType( + BatteryEventType.POWER_CONNECTED).build()); + + final List resultList = + DataProcessor.excludePowerConnectedTimeFromAppUsagePeriodList( + appUsagePeriodList, batteryEventList); + + assertThat(resultList).isEmpty(); + } + + @Test + public void excludePowerConnectedTime_wholePeriodInCharging_returnExpectedResult() { + final List appUsagePeriodList = List.of( + AppUsagePeriod.newBuilder().setStartTime(100).setEndTime(200).build()); + final List batteryEventList = List.of( + BatteryEvent.newBuilder().setTimestamp(50).setType( + BatteryEventType.POWER_DISCONNECTED).build()); + + final List resultList = + DataProcessor.excludePowerConnectedTimeFromAppUsagePeriodList( + appUsagePeriodList, batteryEventList); + + assertThat(resultList).hasSize(1); + assertAppUsagePeriod(resultList.get(0), 100, 200); + } + @Test public void getScreenOnTime_returnExpectedResult() { final long userId = 1; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java index 0cb3d1d50d4..20799d403d3 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java @@ -36,6 +36,7 @@ import android.os.UserHandle; import android.os.UserManager; import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity; +import com.android.settings.fuelgauge.batteryusage.db.BatteryEventEntity; import com.android.settings.testutils.BatteryTestUtils; import org.junit.Before; @@ -136,6 +137,28 @@ public final class DatabaseUtilsTest { verifyNoMoreInteractions(mMockContentResolver); } + @Test + public void sendBatteryEventData_returnsExpectedList() { + final BatteryEvent batteryEvent = + BatteryEvent.newBuilder() + .setTimestamp(10001L) + .setType(BatteryEventType.POWER_CONNECTED) + .setBatteryLevel(66) + .build(); + + final ContentValues contentValues = + DatabaseUtils.sendBatteryEventData(mContext, batteryEvent); + + assertThat(contentValues.getAsInteger(BatteryEventEntity.KEY_TIMESTAMP)) + .isEqualTo(10001L); + assertThat(contentValues.getAsInteger(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE)) + .isEqualTo(BatteryEventType.POWER_CONNECTED.getNumber()); + assertThat(contentValues.getAsInteger(BatteryEventEntity.KEY_BATTERY_LEVEL)) + .isEqualTo(66); + // Verifies the inserted ContentValues into content provider. + verify(mMockContentResolver).insert(DatabaseUtils.BATTERY_EVENT_URI, contentValues); + } + @Test public void sendBatteryEntryData_nullBatteryIntent_returnsNullValue() { doReturn(null).when(mContext).registerReceiver(any(), any()); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventDaoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventDaoTest.java new file mode 100644 index 00000000000..941f444e552 --- /dev/null +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventDaoTest.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2022 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.batteryusage.db; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.database.Cursor; + +import androidx.test.core.app.ApplicationProvider; + +import com.android.settings.testutils.BatteryTestUtils; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link BatteryEventDao}. */ +@RunWith(RobolectricTestRunner.class) +public final class BatteryEventDaoTest { + private Context mContext; + private BatteryStateDatabase mDatabase; + private BatteryEventDao mBatteryEventDao; + + @Before + public void setUp() { + mContext = ApplicationProvider.getApplicationContext(); + mDatabase = BatteryTestUtils.setUpBatteryStateDatabase(mContext); + mBatteryEventDao = mDatabase.batteryEventDao(); + } + + @After + public void closeDb() { + mDatabase.close(); + BatteryStateDatabase.setBatteryStateDatabase(/*database=*/ null); + } + + @Test + public void getAllAfter_returnExpectedResult() { + mBatteryEventDao.insert(BatteryEventEntity.newBuilder() + .setTimestamp(100L) + .setBatteryEventType(1) + .setBatteryLevel(66) + .build()); + mBatteryEventDao.insert(BatteryEventEntity.newBuilder() + .setTimestamp(200L) + .setBatteryEventType(2) + .setBatteryLevel(88) + .build()); + + final Cursor cursor = mBatteryEventDao.getAllAfter(160L); + assertThat(cursor.getCount()).isEqualTo(1); + cursor.moveToFirst(); + assertThat(cursor.getLong(cursor.getColumnIndex(BatteryEventEntity.KEY_TIMESTAMP))) + .isEqualTo(200L); + assertThat(cursor.getInt(cursor.getColumnIndex(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE))) + .isEqualTo(2); + assertThat(cursor.getInt(cursor.getColumnIndex(BatteryEventEntity.KEY_BATTERY_LEVEL))) + .isEqualTo(88); + + mBatteryEventDao.clearAll(); + assertThat(mBatteryEventDao.getAll()).isEmpty(); + } +} diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventEntityTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventEntityTest.java new file mode 100644 index 00000000000..a34d6515982 --- /dev/null +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventEntityTest.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2023 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.batteryusage.db; + +import static com.google.common.truth.Truth.assertThat; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link BatteryEventEntity}. */ +@RunWith(RobolectricTestRunner.class) +public final class BatteryEventEntityTest { + + @Test + public void testBuilder_returnsExpectedResult() { + final long timestamp = 10001L; + final int batteryEventType = 1; + final int batteryLevel = 66; + + BatteryEventEntity entity = BatteryEventEntity + .newBuilder() + .setTimestamp(timestamp) + .setBatteryEventType(batteryEventType) + .setBatteryLevel(batteryLevel) + .build(); + + // Verifies the app relative information. + assertThat(entity.timestamp).isEqualTo(timestamp); + assertThat(entity.batteryEventType).isEqualTo(batteryEventType); + assertThat(entity.batteryLevel).isEqualTo(batteryLevel); + } +} From 705872ada6e5d6e09189925e0a52facccac7e759 Mon Sep 17 00:00:00 2001 From: Yanting Yang Date: Thu, 30 Mar 2023 20:51:09 +0800 Subject: [PATCH 12/12] Fix checkcolor_hook error of Settings Bug: 276273674 Test: verify with repo upload Change-Id: Ia5ba89bb1b491785b953ba7909b3fa7528a0a636 --- color-check-baseline.xml | 240 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) diff --git a/color-check-baseline.xml b/color-check-baseline.xml index 911a95b5001..2fd63fc8307 100644 --- a/color-check-baseline.xml +++ b/color-check-baseline.xml @@ -1565,6 +1565,22 @@ column="5"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +