summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/ActivityThread.java4
-rw-r--r--core/java/android/app/ContextImpl.java13
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java56
-rw-r--r--core/java/android/appwidget/AppWidgetHost.java54
-rw-r--r--core/java/android/content/pm/PackageManager.java3
-rw-r--r--core/java/android/os/Debug.java4
-rw-r--r--core/java/android/os/RecoverySystem.java99
-rw-r--r--core/java/android/os/storage/StorageManager.java2
-rw-r--r--core/java/android/provider/AlarmClock.java22
-rwxr-xr-xcore/java/android/provider/Settings.java2
-rw-r--r--core/java/android/text/format/Formatter.java60
-rw-r--r--core/java/android/webkit/WebViewLibraryLoader.java13
-rw-r--r--core/java/com/android/internal/util/NotificationColorUtil.java4
-rw-r--r--core/jni/android/opengl/util.cpp29
-rw-r--r--core/res/AndroidManifest.xml1
-rw-r--r--core/res/res/layout-land/time_picker_material.xml2
-rw-r--r--core/res/res/values-af/strings.xml3
-rw-r--r--core/res/res/values-am/strings.xml3
-rw-r--r--core/res/res/values-ar/strings.xml3
-rw-r--r--core/res/res/values-az/strings.xml3
-rw-r--r--core/res/res/values-b+sr+Latn/strings.xml3
-rw-r--r--core/res/res/values-be/strings.xml3
-rw-r--r--core/res/res/values-bg/strings.xml3
-rw-r--r--core/res/res/values-bn/strings.xml3
-rw-r--r--core/res/res/values-bs/strings.xml3
-rw-r--r--core/res/res/values-ca/strings.xml3
-rw-r--r--core/res/res/values-cs/strings.xml3
-rw-r--r--core/res/res/values-da/strings.xml3
-rw-r--r--core/res/res/values-de/strings.xml3
-rw-r--r--core/res/res/values-el/strings.xml3
-rw-r--r--core/res/res/values-en-rAU/strings.xml3
-rw-r--r--core/res/res/values-en-rGB/strings.xml3
-rw-r--r--core/res/res/values-en-rIN/strings.xml3
-rw-r--r--core/res/res/values-es-rUS/strings.xml3
-rw-r--r--core/res/res/values-es/strings.xml3
-rw-r--r--core/res/res/values-et/strings.xml3
-rw-r--r--core/res/res/values-eu/strings.xml3
-rw-r--r--core/res/res/values-fa/strings.xml3
-rw-r--r--core/res/res/values-fi/strings.xml3
-rw-r--r--core/res/res/values-fr-rCA/strings.xml3
-rw-r--r--core/res/res/values-fr/strings.xml3
-rw-r--r--core/res/res/values-gl/strings.xml3
-rw-r--r--core/res/res/values-gu/strings.xml3
-rw-r--r--core/res/res/values-hi/strings.xml3
-rw-r--r--core/res/res/values-hr/strings.xml3
-rw-r--r--core/res/res/values-hu/strings.xml9
-rw-r--r--core/res/res/values-hy/strings.xml3
-rw-r--r--core/res/res/values-in/strings.xml3
-rw-r--r--core/res/res/values-is/strings.xml3
-rw-r--r--core/res/res/values-it/strings.xml3
-rw-r--r--core/res/res/values-iw/strings.xml3
-rw-r--r--core/res/res/values-ja/strings.xml3
-rw-r--r--core/res/res/values-ka/strings.xml3
-rw-r--r--core/res/res/values-kk/strings.xml3
-rw-r--r--core/res/res/values-km/strings.xml3
-rw-r--r--core/res/res/values-kn/strings.xml3
-rw-r--r--core/res/res/values-ko/strings.xml3
-rw-r--r--core/res/res/values-ky/strings.xml3
-rw-r--r--core/res/res/values-lo/strings.xml3
-rw-r--r--core/res/res/values-lt/strings.xml3
-rw-r--r--core/res/res/values-lv/strings.xml3
-rw-r--r--core/res/res/values-mcc404/config.xml2
-rw-r--r--core/res/res/values-mcc724/config.xml23
-rw-r--r--core/res/res/values-mk/strings.xml3
-rw-r--r--core/res/res/values-ml/strings.xml3
-rw-r--r--core/res/res/values-mn/strings.xml3
-rw-r--r--core/res/res/values-mr/strings.xml3
-rw-r--r--core/res/res/values-ms/strings.xml3
-rw-r--r--core/res/res/values-my/strings.xml3
-rw-r--r--core/res/res/values-nb/strings.xml3
-rw-r--r--core/res/res/values-ne/strings.xml3
-rw-r--r--core/res/res/values-nl/strings.xml3
-rw-r--r--core/res/res/values-pa/strings.xml3
-rw-r--r--core/res/res/values-pl/strings.xml3
-rw-r--r--core/res/res/values-pt-rBR/strings.xml3
-rw-r--r--core/res/res/values-pt-rPT/strings.xml3
-rw-r--r--core/res/res/values-pt/strings.xml3
-rw-r--r--core/res/res/values-ro/strings.xml3
-rw-r--r--core/res/res/values-ru/strings.xml3
-rw-r--r--core/res/res/values-si/strings.xml3
-rw-r--r--core/res/res/values-sk/strings.xml3
-rw-r--r--core/res/res/values-sl/strings.xml3
-rw-r--r--core/res/res/values-sq/strings.xml3
-rw-r--r--core/res/res/values-sr/strings.xml3
-rw-r--r--core/res/res/values-sv/strings.xml3
-rw-r--r--core/res/res/values-sw/strings.xml3
-rw-r--r--core/res/res/values-ta/strings.xml3
-rw-r--r--core/res/res/values-te/strings.xml3
-rw-r--r--core/res/res/values-th/strings.xml3
-rw-r--r--core/res/res/values-tl/strings.xml3
-rw-r--r--core/res/res/values-tr/strings.xml3
-rw-r--r--core/res/res/values-uk/strings.xml3
-rw-r--r--core/res/res/values-ur/strings.xml3
-rw-r--r--core/res/res/values-uz/strings.xml3
-rw-r--r--core/res/res/values-vi/strings.xml3
-rw-r--r--core/res/res/values-zh-rCN/strings.xml3
-rw-r--r--core/res/res/values-zh-rHK/strings.xml3
-rw-r--r--core/res/res/values-zh-rTW/strings.xml3
-rw-r--r--core/res/res/values-zu/strings.xml3
-rw-r--r--core/res/res/values/config.xml3
-rw-r--r--core/res/res/values/strings.xml44
-rw-r--r--core/res/res/values/symbols.xml13
-rw-r--r--core/tests/coretests/src/android/database/DatabasePerformanceTests.java1354
-rw-r--r--core/tests/coretests/src/android/text/format/FormatterTest.java94
-rw-r--r--core/tests/utiltests/Android.mk1
-rw-r--r--legacy-test/Android.mk13
-rw-r--r--legacy-test/src/android/test/suitebuilder/annotation/package.html (renamed from test-runner/src/android/test/suitebuilder/annotation/package.html)0
-rw-r--r--legacy-test/src/com/android/internal/util/Predicates.java127
-rw-r--r--legacy-test/tests/com/android/internal/util/PredicatesTest.java74
-rw-r--r--libs/hwui/tests/unit/SkiaBehaviorTests.cpp2
-rw-r--r--media/java/android/media/AudioAttributes.java1
-rw-r--r--media/java/android/media/AudioSystem.java6
-rw-r--r--media/java/android/media/AudioTrack.java22
-rw-r--r--media/java/android/media/session/MediaSession.java78
-rw-r--r--native/webview/Android.mk19
-rw-r--r--native/webview/OWNERS4
-rw-r--r--native/webview/loader/Android.mk40
-rw-r--r--native/webview/loader/loader.cpp259
-rw-r--r--packages/BackupRestoreConfirmation/res/values-da/strings.xml2
-rw-r--r--packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java3
-rw-r--r--packages/MtpDocumentsProvider/res/values-af/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-am/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-ar/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-az/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-b+sr+Latn/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-be/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-bg/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-bn/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-bs/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-ca/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-cs/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-da/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-de/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-el/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-en-rAU/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-en-rGB/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-en-rIN/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-es-rUS/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-es/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-et/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-eu/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-fa/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-fi/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-fr-rCA/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-fr/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-gl/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-gu/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-hi/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-hr/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-hu/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-hy/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-in/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-is/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-it/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-iw/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-ja/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-ka/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-kk/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-km/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-kn/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-ko/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-ky/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-lo/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-lt/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-lv/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-mk/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-ml/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-mn/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-mr/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-ms/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-my/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-nb/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-ne/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-nl/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-pa/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-pl/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-pt-rBR/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-pt-rPT/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-pt/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-ro/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-ru/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-si/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-sk/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-sl/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-sq/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-sr/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-sv/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-sw/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-ta/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-te/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-th/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-tl/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-tr/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-uk/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-ur/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-uz/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-vi/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-zh-rCN/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-zh-rHK/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-zh-rTW/strings.xml25
-rw-r--r--packages/MtpDocumentsProvider/res/values-zu/strings.xml25
-rw-r--r--packages/SettingsLib/res/values-tr/strings.xml12
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java16
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java12
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java3
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java13
-rw-r--r--packages/SystemUI/colorextraction/src/com/google/android/colorextraction/types/Tonal.java11
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml6
-rw-r--r--packages/SystemUI/res/values-mcc311-mnc480/config.xml26
-rw-r--r--packages/SystemUI/res/values-uz/strings.xml2
-rw-r--r--packages/SystemUI/src/com/android/systemui/SystemUIApplication.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSFragment.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java5
-rw-r--r--services/core/java/com/android/server/ContextHubSystemService.java15
-rw-r--r--services/core/java/com/android/server/StorageManagerService.java18
-rw-r--r--services/core/java/com/android/server/TextServicesManagerService.java7
-rw-r--r--services/core/java/com/android/server/am/ActivityStarter.java48
-rw-r--r--services/core/java/com/android/server/am/KeyguardController.java40
-rw-r--r--services/core/java/com/android/server/notification/AlertRateLimiter.java35
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java243
-rw-r--r--services/core/java/com/android/server/notification/NotificationUsageStats.java30
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java51
-rw-r--r--services/core/java/com/android/server/trust/TrustManagerService.java2
-rw-r--r--services/core/java/com/android/server/wm/AppWindowContainerController.java10
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java7
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java13
-rw-r--r--services/net/java/android/net/ip/IpManager.java11
-rw-r--r--services/tests/notification/src/com/android/server/notification/AlertRateLimiterTest.java72
-rw-r--r--services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java39
-rw-r--r--services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java97
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java20
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java33
-rw-r--r--telecomm/java/android/telecom/Call.java13
-rw-r--r--telephony/java/android/telephony/CarrierConfigManager.java36
-rw-r--r--telephony/java/com/android/ims/ImsConfig.java7
-rw-r--r--telephony/java/com/android/internal/telephony/NetworkScanResult.java4
-rw-r--r--telephony/java/com/android/internal/telephony/gsm/SmsCbConstants.java4
-rw-r--r--telephony/java/com/android/internal/telephony/gsm/SmsMessage.java12
-rw-r--r--test-runner/src/android/test/InstrumentationTestRunner.java22
-rw-r--r--test-runner/src/android/test/TestCase.java47
-rw-r--r--test-runner/src/android/test/TestCaseUtil.java44
-rw-r--r--test-runner/src/android/test/TestPrinter.java28
-rw-r--r--test-runner/src/android/test/TestRunner.java725
-rw-r--r--test-runner/src/android/test/suitebuilder/AssignableFrom.java4
-rw-r--r--test-runner/src/android/test/suitebuilder/TestPredicates.java65
-rw-r--r--test-runner/src/android/test/suitebuilder/annotation/HasAnnotation.java44
-rw-r--r--test-runner/src/android/test/suitebuilder/annotation/HasClassAnnotation.java41
-rw-r--r--test-runner/src/android/test/suitebuilder/annotation/HasMethodAnnotation.java41
-rw-r--r--test-runner/tests/src/android/test/TestCaseUtilTest.java40
-rw-r--r--test-runner/tests/src/android/test/suitebuilder/TestPredicatesTest.java (renamed from test-runner/tests/src/android/test/suitebuilder/annotation/HasAnnotationTest.java)25
-rw-r--r--test-runner/tests/src/android/test/suitebuilder/annotation/HasClassAnnotationTest.java57
-rw-r--r--test-runner/tests/src/android/test/suitebuilder/annotation/HasMethodAnnotationTest.java56
-rw-r--r--tests/StatusBar/AndroidManifest.xml1
-rw-r--r--tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java36
-rw-r--r--tests/net/java/android/net/util/SharedLogTest.java28
-rw-r--r--wifi/java/android/net/wifi/WifiConfiguration.java9
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pManager.java22
263 files changed, 3945 insertions, 3230 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index f868d475fc7b..250a408bf904 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -2361,13 +2361,13 @@ public final class ActivityThread {
memInfo.nativeSwappablePss, memInfo.nativeSharedDirty,
memInfo.nativePrivateDirty, memInfo.nativeSharedClean,
memInfo.nativePrivateClean, memInfo.hasSwappedOutPss ?
- memInfo.nativeSwappedOut : memInfo.nativeSwappedOutPss,
+ memInfo.nativeSwappedOutPss : memInfo.nativeSwappedOut,
nativeMax, nativeAllocated, nativeFree);
printRow(pw, HEAP_FULL_COLUMN, "Dalvik Heap", memInfo.dalvikPss,
memInfo.dalvikSwappablePss, memInfo.dalvikSharedDirty,
memInfo.dalvikPrivateDirty, memInfo.dalvikSharedClean,
memInfo.dalvikPrivateClean, memInfo.hasSwappedOutPss ?
- memInfo.dalvikSwappedOut : memInfo.dalvikSwappedOutPss,
+ memInfo.dalvikSwappedOutPss : memInfo.dalvikSwappedOut,
dalvikMax, dalvikAllocated, dalvikFree);
} else {
printRow(pw, HEAP_COLUMN, "", "Pss", "Private",
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 318c7ac31522..9c9d6556598c 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -63,6 +63,7 @@ import android.os.ServiceManager;
import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
+import android.os.UserManager;
import android.os.storage.IStorageManager;
import android.os.storage.StorageManager;
import android.system.ErrnoException;
@@ -370,13 +371,6 @@ class ContextImpl extends Context {
return getSharedPreferences(file, mode);
}
- private boolean isBuggy() {
- // STOPSHIP: fix buggy apps
- if (SystemProperties.getBoolean("fw.ignore_buggy", false)) return false;
- if ("com.google.android.tts".equals(getApplicationInfo().packageName)) return true;
- return false;
- }
-
@Override
public SharedPreferences getSharedPreferences(File file, int mode) {
SharedPreferencesImpl sp;
@@ -387,9 +381,8 @@ class ContextImpl extends Context {
checkMode(mode);
if (getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.O) {
if (isCredentialProtectedStorage()
- && !getSystemService(StorageManager.class).isUserKeyUnlocked(
- UserHandle.myUserId())
- && !isBuggy()) {
+ && !getSystemService(UserManager.class)
+ .isUserUnlockingOrUnlocked(UserHandle.myUserId())) {
throw new IllegalStateException("SharedPreferences in credential encrypted "
+ "storage are not available until after user is unlocked");
}
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index ff9425ebd155..14162afdb25d 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -55,7 +55,6 @@ import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.ContactsContract.Directory;
-import android.provider.Settings;
import android.security.Credentials;
import android.service.restrictions.RestrictionsReceiver;
import android.telephony.TelephonyManager;
@@ -3135,6 +3134,14 @@ public class DevicePolicyManager {
public static final int WIPE_RESET_PROTECTION_DATA = 0x0002;
/**
+ * Flag for {@link #wipeData(int)}: also erase the device's eUICC data.
+ *
+ * TODO(b/35851809): make this public.
+ * @hide
+ */
+ public static final int WIPE_EUICC = 0x0004;
+
+ /**
* Ask that all user data be wiped. If called as a secondary user, the user will be removed and
* other users will remain unaffected. Calling from the primary user will cause the device to
* reboot, erasing all device data - including all the secondary users and their data - while
@@ -6417,34 +6424,35 @@ public class DevicePolicyManager {
}
/**
- * Called by device owners to update {@link Settings.Global} settings. Validation that the value
- * of the setting is in the correct form for the setting type should be performed by the caller.
+ * Called by device owners to update {@link android.provider.Settings.Global} settings.
+ * Validation that the value of the setting is in the correct form for the setting type should
+ * be performed by the caller.
* <p>
* The settings that can be updated with this method are:
* <ul>
- * <li>{@link Settings.Global#ADB_ENABLED}</li>
- * <li>{@link Settings.Global#AUTO_TIME}</li>
- * <li>{@link Settings.Global#AUTO_TIME_ZONE}</li>
- * <li>{@link Settings.Global#DATA_ROAMING}</li>
- * <li>{@link Settings.Global#USB_MASS_STORAGE_ENABLED}</li>
- * <li>{@link Settings.Global#WIFI_SLEEP_POLICY}</li>
- * <li>{@link Settings.Global#STAY_ON_WHILE_PLUGGED_IN} This setting is only available from
- * {@link android.os.Build.VERSION_CODES#M} onwards and can only be set if
+ * <li>{@link android.provider.Settings.Global#ADB_ENABLED}</li>
+ * <li>{@link android.provider.Settings.Global#AUTO_TIME}</li>
+ * <li>{@link android.provider.Settings.Global#AUTO_TIME_ZONE}</li>
+ * <li>{@link android.provider.Settings.Global#DATA_ROAMING}</li>
+ * <li>{@link android.provider.Settings.Global#USB_MASS_STORAGE_ENABLED}</li>
+ * <li>{@link android.provider.Settings.Global#WIFI_SLEEP_POLICY}</li>
+ * <li>{@link android.provider.Settings.Global#STAY_ON_WHILE_PLUGGED_IN} This setting is only
+ * available from {@link android.os.Build.VERSION_CODES#M} onwards and can only be set if
* {@link #setMaximumTimeToLock} is not used to set a timeout.</li>
- * <li>{@link Settings.Global#WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN}</li> This setting is only
- * available from {@link android.os.Build.VERSION_CODES#M} onwards.</li>
+ * <li>{@link android.provider.Settings.Global#WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN}</li> This
+ * setting is only available from {@link android.os.Build.VERSION_CODES#M} onwards.</li>
* </ul>
* <p>
* Changing the following settings has no effect as of {@link android.os.Build.VERSION_CODES#M}:
* <ul>
- * <li>{@link Settings.Global#BLUETOOTH_ON}. Use
+ * <li>{@link android.provider.Settings.Global#BLUETOOTH_ON}. Use
* {@link android.bluetooth.BluetoothAdapter#enable()} and
* {@link android.bluetooth.BluetoothAdapter#disable()} instead.</li>
- * <li>{@link Settings.Global#DEVELOPMENT_SETTINGS_ENABLED}</li>
- * <li>{@link Settings.Global#MODE_RINGER}. Use
+ * <li>{@link android.provider.Settings.Global#DEVELOPMENT_SETTINGS_ENABLED}</li>
+ * <li>{@link android.provider.Settings.Global#MODE_RINGER}. Use
* {@link android.media.AudioManager#setRingerMode(int)} instead.</li>
- * <li>{@link Settings.Global#NETWORK_PREFERENCE}</li>
- * <li>{@link Settings.Global#WIFI_ON}. Use
+ * <li>{@link android.provider.Settings.Global#NETWORK_PREFERENCE}</li>
+ * <li>{@link android.provider.Settings.Global#WIFI_ON}. Use
* {@link android.net.wifi.WifiManager#setWifiEnabled(boolean)} instead.</li>
* </ul>
*
@@ -6465,19 +6473,19 @@ public class DevicePolicyManager {
}
/**
- * Called by profile or device owners to update {@link Settings.Secure} settings. Validation
- * that the value of the setting is in the correct form for the setting type should be performed
- * by the caller.
+ * Called by profile or device owners to update {@link android.provider.Settings.Secure}
+ * settings. Validation that the value of the setting is in the correct form for the setting
+ * type should be performed by the caller.
* <p>
* The settings that can be updated by a profile or device owner with this method are:
* <ul>
- * <li>{@link Settings.Secure#DEFAULT_INPUT_METHOD}</li>
- * <li>{@link Settings.Secure#SKIP_FIRST_USE_HINTS}</li>
+ * <li>{@link android.provider.Settings.Secure#DEFAULT_INPUT_METHOD}</li>
+ * <li>{@link android.provider.Settings.Secure#SKIP_FIRST_USE_HINTS}</li>
* </ul>
* <p>
* A device owner can additionally update the following settings:
* <ul>
- * <li>{@link Settings.Secure#LOCATION_MODE}</li>
+ * <li>{@link android.provider.Settings.Secure#LOCATION_MODE}</li>
* </ul>
*
* <strong>Note: Starting from Android O, apps should no longer call this method with the
diff --git a/core/java/android/appwidget/AppWidgetHost.java b/core/java/android/appwidget/AppWidgetHost.java
index c1ff580cbce7..37360bad73c7 100644
--- a/core/java/android/appwidget/AppWidgetHost.java
+++ b/core/java/android/appwidget/AppWidgetHost.java
@@ -16,15 +16,13 @@
package android.appwidget;
-import java.lang.ref.WeakReference;
-import java.util.List;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.IntentSender;
+import android.content.pm.PackageManager;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
@@ -42,6 +40,9 @@ import android.widget.RemoteViews.OnClickHandler;
import com.android.internal.appwidget.IAppWidgetHost;
import com.android.internal.appwidget.IAppWidgetService;
+import java.lang.ref.WeakReference;
+import java.util.List;
+
/**
* AppWidgetHost provides the interaction with the AppWidget service for apps,
* like the home screen, that want to embed AppWidgets in their UI.
@@ -55,6 +56,7 @@ public class AppWidgetHost {
final static Object sServiceLock = new Object();
static IAppWidgetService sService;
+ static boolean sServiceInitialized = false;
private DisplayMetrics mDisplayMetrics;
private String mContextOpPackageName;
@@ -160,15 +162,21 @@ public class AppWidgetHost {
mHandler = new UpdateHandler(looper);
mCallbacks = new Callbacks(mHandler);
mDisplayMetrics = context.getResources().getDisplayMetrics();
- bindService();
+ bindService(context);
}
- private static void bindService() {
+ private static void bindService(Context context) {
synchronized (sServiceLock) {
- if (sService == null) {
- IBinder b = ServiceManager.getService(Context.APPWIDGET_SERVICE);
- sService = IAppWidgetService.Stub.asInterface(b);
+ if (sServiceInitialized) {
+ return;
}
+ sServiceInitialized = true;
+ if (!context.getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_APP_WIDGETS)) {
+ return;
+ }
+ IBinder b = ServiceManager.getService(Context.APPWIDGET_SERVICE);
+ sService = IAppWidgetService.Stub.asInterface(b);
}
}
@@ -177,6 +185,9 @@ public class AppWidgetHost {
* becomes visible, i.e. from onStart() in your Activity.
*/
public void startListening() {
+ if (sService == null) {
+ return;
+ }
final int[] idsToUpdate;
synchronized (mViews) {
int N = mViews.size();
@@ -215,6 +226,9 @@ public class AppWidgetHost {
* no longer visible, i.e. from onStop() in your Activity.
*/
public void stopListening() {
+ if (sService == null) {
+ return;
+ }
try {
sService.stopListening(mContextOpPackageName, mHostId);
}
@@ -229,6 +243,9 @@ public class AppWidgetHost {
* @return a appWidgetId
*/
public int allocateAppWidgetId() {
+ if (sService == null) {
+ return -1;
+ }
try {
return sService.allocateAppWidgetId(mContextOpPackageName, mHostId);
}
@@ -258,6 +275,9 @@ public class AppWidgetHost {
*/
public final void startAppWidgetConfigureActivityForResult(@NonNull Activity activity,
int appWidgetId, int intentFlags, int requestCode, @Nullable Bundle options) {
+ if (sService == null) {
+ return;
+ }
try {
IntentSender intentSender = sService.createAppWidgetConfigIntentSender(
mContextOpPackageName, appWidgetId, intentFlags);
@@ -278,10 +298,10 @@ public class AppWidgetHost {
* Gets a list of all the appWidgetIds that are bound to the current host
*/
public int[] getAppWidgetIds() {
+ if (sService == null) {
+ return new int[0];
+ }
try {
- if (sService == null) {
- bindService();
- }
return sService.getAppWidgetIdsForHost(mContextOpPackageName, mHostId);
} catch (RemoteException e) {
throw new RuntimeException("system server dead?", e);
@@ -292,6 +312,9 @@ public class AppWidgetHost {
* Stop listening to changes for this AppWidget.
*/
public void deleteAppWidgetId(int appWidgetId) {
+ if (sService == null) {
+ return;
+ }
synchronized (mViews) {
mViews.remove(appWidgetId);
try {
@@ -312,6 +335,9 @@ public class AppWidgetHost {
* </ul>
*/
public void deleteHost() {
+ if (sService == null) {
+ return;
+ }
try {
sService.deleteHost(mContextOpPackageName, mHostId);
}
@@ -329,6 +355,9 @@ public class AppWidgetHost {
* </ul>
*/
public static void deleteAllHosts() {
+ if (sService == null) {
+ return;
+ }
try {
sService.deleteAllHosts();
}
@@ -343,6 +372,9 @@ public class AppWidgetHost {
*/
public final AppWidgetHostView createView(Context context, int appWidgetId,
AppWidgetProviderInfo appWidget) {
+ if (sService == null) {
+ return null;
+ }
AppWidgetHostView view = onCreateView(context, appWidgetId, appWidget);
view.setOnClickHandler(mOnClickHandler);
view.setAppWidget(appWidgetId, appWidget);
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 6bc7d42a14b2..712d37f00bfb 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -1490,6 +1490,9 @@ public abstract class PackageManager {
*/
public static final int MOVE_FAILED_3RD_PARTY_NOT_ALLOWED_ON_INTERNAL = -9;
+ /** @hide */
+ public static final int MOVE_FAILED_LOCKED_USER = -10;
+
/**
* Flag parameter for {@link #movePackage} to indicate that
* the package should be moved to internal storage if its
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index fa854b078292..f243f377cb56 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -699,6 +699,7 @@ public final class Debug
dest.writeInt(dalvikPrivateClean);
dest.writeInt(dalvikSharedClean);
dest.writeInt(dalvikSwappedOut);
+ dest.writeInt(dalvikSwappedOutPss);
dest.writeInt(nativePss);
dest.writeInt(nativeSwappablePss);
dest.writeInt(nativePrivateDirty);
@@ -706,6 +707,7 @@ public final class Debug
dest.writeInt(nativePrivateClean);
dest.writeInt(nativeSharedClean);
dest.writeInt(nativeSwappedOut);
+ dest.writeInt(nativeSwappedOutPss);
dest.writeInt(otherPss);
dest.writeInt(otherSwappablePss);
dest.writeInt(otherPrivateDirty);
@@ -726,6 +728,7 @@ public final class Debug
dalvikPrivateClean = source.readInt();
dalvikSharedClean = source.readInt();
dalvikSwappedOut = source.readInt();
+ dalvikSwappedOutPss = source.readInt();
nativePss = source.readInt();
nativeSwappablePss = source.readInt();
nativePrivateDirty = source.readInt();
@@ -733,6 +736,7 @@ public final class Debug
nativePrivateClean = source.readInt();
nativeSharedClean = source.readInt();
nativeSwappedOut = source.readInt();
+ nativeSwappedOutPss = source.readInt();
otherPss = source.readInt();
otherSwappablePss = source.readInt();
otherPrivateDirty = source.readInt();
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java
index db9f28b77288..6f458e084a42 100644
--- a/core/java/android/os/RecoverySystem.java
+++ b/core/java/android/os/RecoverySystem.java
@@ -22,20 +22,26 @@ import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.annotation.SystemService;
+import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.UserManager;
+import android.provider.Settings;
+import android.telephony.euicc.EuiccManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.Display;
import android.view.WindowManager;
+import com.android.internal.logging.MetricsLogger;
+
import libcore.io.Streams;
-import java.io.ByteArrayInputStream;
import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@@ -46,22 +52,19 @@ import java.io.InputStream;
import java.io.RandomAccessFile;
import java.security.GeneralSecurityException;
import java.security.PublicKey;
-import java.security.Signature;
import java.security.SignatureException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
import java.util.Locale;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
-import com.android.internal.logging.MetricsLogger;
-
import sun.security.pkcs.PKCS7;
import sun.security.pkcs.SignerInfo;
@@ -84,11 +87,19 @@ public class RecoverySystem {
/** Send progress to listeners no more often than this (in ms). */
private static final long PUBLISH_PROGRESS_INTERVAL_MS = 500;
+ private static final long DEFAULT_EUICC_WIPING_TIMEOUT_MILLIS = 30000L; // 30 s
+
+ private static final long MIN_EUICC_WIPING_TIMEOUT_MILLIS = 5000L; // 5 s
+
+ private static final long MAX_EUICC_WIPING_TIMEOUT_MILLIS = 60000L; // 60 s
+
/** Used to communicate with recovery. See bootable/recovery/recovery.cpp. */
private static final File RECOVERY_DIR = new File("/cache/recovery");
private static final File LOG_FILE = new File(RECOVERY_DIR, "log");
private static final File LAST_INSTALL_FILE = new File(RECOVERY_DIR, "last_install");
private static final String LAST_PREFIX = "last_";
+ private static final String ACTION_WIPE_EUICC_DATA =
+ "com.android.internal.action.WIPE_EUICC_DATA";
/**
* The recovery image uses this file to identify the location (i.e. blocks)
@@ -673,18 +684,26 @@ public class RecoverySystem {
*/
public static void rebootWipeUserData(Context context) throws IOException {
rebootWipeUserData(context, false /* shutdown */, context.getPackageName(),
- false /* force */);
+ false /* force */, false /* wipeEuicc */);
}
/** {@hide} */
public static void rebootWipeUserData(Context context, String reason) throws IOException {
- rebootWipeUserData(context, false /* shutdown */, reason, false /* force */);
+ rebootWipeUserData(context, false /* shutdown */, reason, false /* force */,
+ false /* wipeEuicc */);
}
/** {@hide} */
public static void rebootWipeUserData(Context context, boolean shutdown)
throws IOException {
- rebootWipeUserData(context, shutdown, context.getPackageName(), false /* force */);
+ rebootWipeUserData(context, shutdown, context.getPackageName(), false /* force */,
+ false /* wipeEuicc */);
+ }
+
+ /** {@hide} */
+ public static void rebootWipeUserData(Context context, boolean shutdown, String reason,
+ boolean force) throws IOException {
+ rebootWipeUserData(context, shutdown, reason, force, false /* wipeEuicc */);
}
/**
@@ -701,6 +720,7 @@ public class RecoverySystem {
* @param reason the reason for the wipe that is visible in the logs
* @param force whether the {@link UserManager.DISALLOW_FACTORY_RESET} user restriction
* should be ignored
+ * @param wipeEuicc whether wipe the euicc data
*
* @throws IOException if writing the recovery command file
* fails, or if the reboot itself fails.
@@ -709,7 +729,7 @@ public class RecoverySystem {
* @hide
*/
public static void rebootWipeUserData(Context context, boolean shutdown, String reason,
- boolean force) throws IOException {
+ boolean force, boolean wipeEuicc) throws IOException {
UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
if (!force && um.hasUserRestriction(UserManager.DISALLOW_FACTORY_RESET)) {
throw new SecurityException("Wiping data is not allowed for this user.");
@@ -731,6 +751,10 @@ public class RecoverySystem {
// Block until the ordered broadcast has completed.
condition.block();
+ if (wipeEuicc) {
+ wipeEuiccData(context);
+ }
+
String shutdownArg = null;
if (shutdown) {
shutdownArg = "--shutdown_after";
@@ -745,6 +769,61 @@ public class RecoverySystem {
bootCommand(context, shutdownArg, "--wipe_data", reasonArg, localeArg);
}
+ private static void wipeEuiccData(Context context) {
+ EuiccManager euiccManager = (EuiccManager) context.getSystemService(
+ Context.EUICC_SERVICE);
+ if (euiccManager != null && euiccManager.isEnabled()) {
+ CountDownLatch euiccFactoryResetLatch = new CountDownLatch(1);
+
+ BroadcastReceiver euiccWipeFinishReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (ACTION_WIPE_EUICC_DATA.equals(intent.getAction())) {
+ if (getResultCode() != EuiccManager.EMBEDDED_SUBSCRIPTION_RESULT_OK) {
+ int detailedCode = intent.getIntExtra(
+ EuiccManager.EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE, 0);
+ Log.e(TAG, "Error wiping euicc data, Detailed code = "
+ + detailedCode);
+ } else {
+ Log.d(TAG, "Successfully wiped euicc data.");
+ }
+ euiccFactoryResetLatch.countDown();
+ }
+ }
+ };
+
+ Intent intent = new Intent(ACTION_WIPE_EUICC_DATA);
+ intent.setPackage("android");
+ PendingIntent callbackIntent = PendingIntent.getBroadcastAsUser(
+ context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT, UserHandle.SYSTEM);
+ IntentFilter filterConsent = new IntentFilter();
+ filterConsent.addAction(ACTION_WIPE_EUICC_DATA);
+ HandlerThread euiccHandlerThread = new HandlerThread("euiccWipeFinishReceiverThread");
+ euiccHandlerThread.start();
+ Handler euiccHandler = new Handler(euiccHandlerThread.getLooper());
+ context.registerReceiver(euiccWipeFinishReceiver, filterConsent, null, euiccHandler);
+ euiccManager.eraseSubscriptions(callbackIntent);
+ try {
+ long waitingTimeMillis = Settings.Global.getLong(
+ context.getContentResolver(),
+ Settings.Global.EUICC_WIPING_TIMEOUT_MILLIS,
+ DEFAULT_EUICC_WIPING_TIMEOUT_MILLIS);
+ if (waitingTimeMillis < MIN_EUICC_WIPING_TIMEOUT_MILLIS) {
+ waitingTimeMillis = MIN_EUICC_WIPING_TIMEOUT_MILLIS;
+ } else if (waitingTimeMillis > MAX_EUICC_WIPING_TIMEOUT_MILLIS) {
+ waitingTimeMillis = MAX_EUICC_WIPING_TIMEOUT_MILLIS;
+ }
+ if (!euiccFactoryResetLatch.await(waitingTimeMillis, TimeUnit.MILLISECONDS)) {
+ Log.e(TAG, "Timeout wiping eUICC data.");
+ }
+ context.unregisterReceiver(euiccWipeFinishReceiver);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ Log.e(TAG, "Wiping eUICC data interrupted", e);
+ }
+ }
+ }
+
/** {@hide} */
public static void rebootPromptAndWipeUserData(Context context, String reason)
throws IOException {
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index f2aa113ea28e..71f5ff775ea0 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -118,6 +118,8 @@ public class StorageManager {
public static final String PROP_SDCARDFS = "persist.sys.sdcardfs";
/** {@hide} */
public static final String PROP_VIRTUAL_DISK = "persist.sys.virtual_disk";
+ /** {@hide} */
+ public static final String PROP_ADOPTABLE_FBE = "persist.sys.adoptable_fbe";
/** {@hide} */
public static final String UUID_PRIVATE_INTERNAL = null;
diff --git a/core/java/android/provider/AlarmClock.java b/core/java/android/provider/AlarmClock.java
index d921ed409d6c..f9030124cc63 100644
--- a/core/java/android/provider/AlarmClock.java
+++ b/core/java/android/provider/AlarmClock.java
@@ -82,7 +82,8 @@ public final class AlarmClock {
* If neither of the above are given then:
* <ul>
* <li>If exactly one active alarm exists, it is dismissed.
- * <li>If more than one active alarm exists, the user is prompted to choose the alarm to dismiss.
+ * <li>If more than one active alarm exists, the user is prompted to choose the alarm to
+ * dismiss.
* </ul>
* </p><p>
* If the extra {@link #EXTRA_ALARM_SEARCH_MODE} is used, and the search results contain two or
@@ -104,8 +105,7 @@ public final class AlarmClock {
* @see #EXTRA_ALARM_SEARCH_MODE
*/
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
- public static final String ACTION_DISMISS_ALARM =
- "android.intent.action.DISMISS_ALARM";
+ public static final String ACTION_DISMISS_ALARM = "android.intent.action.DISMISS_ALARM";
/**
* Activity Action: Snooze a currently ringing alarm.
@@ -124,8 +124,7 @@ public final class AlarmClock {
* @see #EXTRA_ALARM_SNOOZE_DURATION
*/
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
- public static final String ACTION_SNOOZE_ALARM =
- "android.intent.action.SNOOZE_ALARM";
+ public static final String ACTION_SNOOZE_ALARM = "android.intent.action.SNOOZE_ALARM";
/**
* Activity Action: Set a timer.
@@ -155,6 +154,16 @@ public final class AlarmClock {
public static final String ACTION_SET_TIMER = "android.intent.action.SET_TIMER";
/**
+ * Activity Action: Dismiss timers.
+ * <p>
+ * Dismiss all currently expired timers. If there are no expired timers, then this is a no-op.
+ * </p>
+ * @hide
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_DISMISS_TIMER = "android.intent.action.DISMISS_TIMER";
+
+ /**
* Activity Action: Show the timers.
* <p>
* This action opens the timers page.
@@ -200,8 +209,7 @@ public final class AlarmClock {
* @see #ALARM_SEARCH_MODE_LABEL
* @see #ACTION_DISMISS_ALARM
*/
- public static final String EXTRA_ALARM_SEARCH_MODE =
- "android.intent.extra.alarm.SEARCH_MODE";
+ public static final String EXTRA_ALARM_SEARCH_MODE = "android.intent.extra.alarm.SEARCH_MODE";
/**
* Search for the alarm that is most closely matched by the search parameters
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index c7ae91a7796c..bc0534a353b3 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -10681,7 +10681,7 @@ public final class Settings {
/**
* The maximum allowed notification enqueue rate in Hertz.
*
- * Should be a float, and includes both posts and updates.
+ * Should be a float, and includes updates only.
* @hide
*/
public static final String MAX_NOTIFICATION_ENQUEUE_RATE = "max_notification_enqueue_rate";
diff --git a/core/java/android/text/format/Formatter.java b/core/java/android/text/format/Formatter.java
index b67ac9840d60..e5bc32bb4f0a 100644
--- a/core/java/android/text/format/Formatter.java
+++ b/core/java/android/text/format/Formatter.java
@@ -20,6 +20,9 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Resources;
+import android.icu.text.MeasureFormat;
+import android.icu.util.Measure;
+import android.icu.util.MeasureUnit;
import android.net.NetworkUtils;
import android.text.BidiFormatter;
import android.text.TextUtils;
@@ -51,9 +54,13 @@ public final class Formatter {
}
}
+ private static Locale localeFromContext(@NonNull Context context) {
+ return context.getResources().getConfiguration().getLocales().get(0);
+ }
+
/* Wraps the source string in bidi formatting characters in RTL locales */
private static String bidiWrap(@NonNull Context context, String source) {
- final Locale locale = context.getResources().getConfiguration().locale;
+ final Locale locale = localeFromContext(context);
if (TextUtils.getLayoutDirectionFromLocale(locale) == View.LAYOUT_DIRECTION_RTL) {
return BidiFormatter.getInstance(true /* RTL*/).unicodeWrap(source);
} else {
@@ -197,7 +204,7 @@ public final class Formatter {
/**
* Returns elapsed time for the given millis, in the following format:
- * 1 day 5 hrs; will include at most two units, can go down to seconds precision.
+ * 1 day, 5 hr; will include at most two units, can go down to seconds precision.
* @param context the application context
* @param millis the elapsed time in milli seconds
* @return the formatted elapsed time
@@ -221,44 +228,38 @@ public final class Formatter {
}
int seconds = (int)secondsLong;
+ final Locale locale = localeFromContext(context);
+ final MeasureFormat measureFormat = MeasureFormat.getInstance(
+ locale, MeasureFormat.FormatWidth.SHORT);
if (days >= 2) {
days += (hours+12)/24;
- return context.getString(com.android.internal.R.string.durationDays, days);
+ return measureFormat.format(new Measure(days, MeasureUnit.DAY));
} else if (days > 0) {
- if (hours == 1) {
- return context.getString(com.android.internal.R.string.durationDayHour, days, hours);
- }
- return context.getString(com.android.internal.R.string.durationDayHours, days, hours);
+ return measureFormat.formatMeasures(
+ new Measure(days, MeasureUnit.DAY),
+ new Measure(hours, MeasureUnit.HOUR));
} else if (hours >= 2) {
hours += (minutes+30)/60;
- return context.getString(com.android.internal.R.string.durationHours, hours);
+ return measureFormat.format(new Measure(hours, MeasureUnit.HOUR));
} else if (hours > 0) {
- if (minutes == 1) {
- return context.getString(com.android.internal.R.string.durationHourMinute, hours,
- minutes);
- }
- return context.getString(com.android.internal.R.string.durationHourMinutes, hours,
- minutes);
+ return measureFormat.formatMeasures(
+ new Measure(hours, MeasureUnit.HOUR),
+ new Measure(minutes, MeasureUnit.MINUTE));
} else if (minutes >= 2) {
minutes += (seconds+30)/60;
- return context.getString(com.android.internal.R.string.durationMinutes, minutes);
+ return measureFormat.format(new Measure(minutes, MeasureUnit.MINUTE));
} else if (minutes > 0) {
- if (seconds == 1) {
- return context.getString(com.android.internal.R.string.durationMinuteSecond, minutes,
- seconds);
- }
- return context.getString(com.android.internal.R.string.durationMinuteSeconds, minutes,
- seconds);
- } else if (seconds == 1) {
- return context.getString(com.android.internal.R.string.durationSecond, seconds);
+ return measureFormat.formatMeasures(
+ new Measure(minutes, MeasureUnit.MINUTE),
+ new Measure(seconds, MeasureUnit.SECOND));
} else {
- return context.getString(com.android.internal.R.string.durationSeconds, seconds);
+ return measureFormat.format(new Measure(seconds, MeasureUnit.SECOND));
}
}
/**
* Returns elapsed time for the given millis, in the following format:
- * 1 day 5 hrs; will include at most two units, can go down to minutes precision.
+ * 1 day, 5 hr; will include at most two units, can go down to minutes precision.
* @param context the application context
* @param millis the elapsed time in milli seconds
* @return the formatted elapsed time
@@ -267,10 +268,11 @@ public final class Formatter {
public static String formatShortElapsedTimeRoundingUpToMinutes(Context context, long millis) {
long minutesRoundedUp = (millis + MILLIS_PER_MINUTE - 1) / MILLIS_PER_MINUTE;
- if (minutesRoundedUp == 0) {
- return context.getString(com.android.internal.R.string.durationMinutes, 0);
- } else if (minutesRoundedUp == 1) {
- return context.getString(com.android.internal.R.string.durationMinute, 1);
+ if (minutesRoundedUp == 0 || minutesRoundedUp == 1) {
+ final Locale locale = localeFromContext(context);
+ final MeasureFormat measureFormat = MeasureFormat.getInstance(
+ locale, MeasureFormat.FormatWidth.SHORT);
+ return measureFormat.format(new Measure(minutesRoundedUp, MeasureUnit.MINUTE));
}
return formatShortElapsedTime(context, minutesRoundedUp * MILLIS_PER_MINUTE);
diff --git a/core/java/android/webkit/WebViewLibraryLoader.java b/core/java/android/webkit/WebViewLibraryLoader.java
index e385a4832a0c..6f9e8ece4b13 100644
--- a/core/java/android/webkit/WebViewLibraryLoader.java
+++ b/core/java/android/webkit/WebViewLibraryLoader.java
@@ -215,12 +215,10 @@ class WebViewLibraryLoader {
return WebViewFactory.LIBLOAD_ADDRESS_SPACE_NOT_RESERVED;
}
- String[] args = getWebViewNativeLibraryPaths(packageInfo);
- int result = nativeLoadWithRelroFile(args[0] /* path32 */,
- args[1] /* path64 */,
- CHROMIUM_WEBVIEW_NATIVE_RELRO_32,
- CHROMIUM_WEBVIEW_NATIVE_RELRO_64,
- clazzLoader);
+ final String libraryFileName =
+ WebViewFactory.getWebViewLibrary(packageInfo.applicationInfo);
+ int result = nativeLoadWithRelroFile(libraryFileName, CHROMIUM_WEBVIEW_NATIVE_RELRO_32,
+ CHROMIUM_WEBVIEW_NATIVE_RELRO_64, clazzLoader);
if (result != WebViewFactory.LIBLOAD_SUCCESS) {
Log.w(LOGTAG, "failed to load with relro file, proceeding without");
} else if (DEBUG) {
@@ -317,7 +315,6 @@ class WebViewLibraryLoader {
static native boolean nativeReserveAddressSpace(long addressSpaceToReserve);
static native boolean nativeCreateRelroFile(String lib32, String lib64,
String relro32, String relro64);
- static native int nativeLoadWithRelroFile(String lib32, String lib64,
- String relro32, String relro64,
+ static native int nativeLoadWithRelroFile(String lib, String relro32, String relro64,
ClassLoader clazzLoader);
}
diff --git a/core/java/com/android/internal/util/NotificationColorUtil.java b/core/java/com/android/internal/util/NotificationColorUtil.java
index 5c9f1c63bea5..2778d93a5388 100644
--- a/core/java/com/android/internal/util/NotificationColorUtil.java
+++ b/core/java/com/android/internal/util/NotificationColorUtil.java
@@ -557,7 +557,7 @@ public class NotificationColorUtil {
}
public static boolean satisfiesTextContrast(int backgroundColor, int foregroundColor) {
- return NotificationColorUtil.calculateContrast(backgroundColor, foregroundColor) >= 4.5;
+ return NotificationColorUtil.calculateContrast(foregroundColor, backgroundColor) >= 4.5;
}
/**
@@ -636,7 +636,7 @@ public class NotificationColorUtil {
*/
public static double calculateContrast(@ColorInt int foreground, @ColorInt int background) {
if (Color.alpha(background) != 255) {
- throw new IllegalArgumentException("background can not be translucent: #"
+ Log.wtf(TAG, "background can not be translucent: #"
+ Integer.toHexString(background));
}
if (Color.alpha(foreground) < 255) {
diff --git a/core/jni/android/opengl/util.cpp b/core/jni/android/opengl/util.cpp
index 1370e610398d..7c1ca8142c7f 100644
--- a/core/jni/android/opengl/util.cpp
+++ b/core/jni/android/opengl/util.cpp
@@ -49,27 +49,6 @@ void mx4transform(float x, float y, float z, float w, const float* pM, float* pD
pDest[3] = pM[3 + 4 * 0] * x + pM[3 + 4 * 1] * y + pM[3 + 4 * 2] * z + pM[3 + 4 * 3] * w;
}
-class MallocHelper {
-public:
- MallocHelper() {
- mData = 0;
- }
-
- ~MallocHelper() {
- if (mData != 0) {
- free(mData);
- }
- }
-
- void* alloc(size_t size) {
- mData = malloc(size);
- return mData;
- }
-
-private:
- void* mData;
-};
-
#if 0
static
void
@@ -85,10 +64,7 @@ print_poly(const char* label, Poly* pPoly) {
static
int visibilityTest(float* pWS, float* pPositions, int positionsLength,
unsigned short* pIndices, int indexCount) {
- MallocHelper mallocHelper;
int result = POLY_CLIP_OUT;
- float* pTransformed = 0;
- int transformedIndexCount = 0;
if ( indexCount < 3 ) {
return POLY_CLIP_OUT;
@@ -116,8 +92,9 @@ int visibilityTest(float* pWS, float* pPositions, int positionsLength,
return -1;
}
- transformedIndexCount = maxIndex - minIndex + 1;
- pTransformed = (float*) mallocHelper.alloc(transformedIndexCount * 4 * sizeof(float));
+ int transformedIndexCount = maxIndex - minIndex + 1;
+ std::unique_ptr<float[]> holder{new float[transformedIndexCount * 4]};
+ float* pTransformed = holder.get();
if (pTransformed == 0 ) {
return -2;
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 395250cb66f8..747f5b8ccf0c 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -303,6 +303,7 @@
<protected-broadcast android:name="com.android.server.WifiManager.action.DEVICE_IDLE" />
<protected-broadcast android:name="com.android.server.action.REMOTE_BUGREPORT_SHARING_ACCEPTED" />
<protected-broadcast android:name="com.android.server.action.REMOTE_BUGREPORT_SHARING_DECLINED" />
+ <protected-broadcast android:name="com.android.server.action.WIPE_EUICC_DATA" />
<protected-broadcast android:name="com.android.server.usb.ACTION_OPEN_IN_APPS" />
<protected-broadcast android:name="com.android.server.am.DELETE_DUMPHEAP" />
<protected-broadcast android:name="com.android.server.net.action.SNOOZE_WARNING" />
diff --git a/core/res/res/layout-land/time_picker_material.xml b/core/res/res/layout-land/time_picker_material.xml
index 863efef5c661..d83ccb23f64f 100644
--- a/core/res/res/layout-land/time_picker_material.xml
+++ b/core/res/res/layout-land/time_picker_material.xml
@@ -17,6 +17,7 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layoutDirection="ltr"
android:layout_width="match_parent"
android:layout_height="wrap_content">
@@ -30,6 +31,7 @@
<LinearLayout
android:id="@+id/time_layout"
+ android:layoutDirection="ltr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="@dimen/timepicker_radial_picker_top_margin"
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index cfe87e78690f..05613b76fb05 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Geen stem- of nooddiens nie"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Word tydelik nie deur die selnetwerk by jou ligging aangebied nie"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Kan netwerk nie bereik nie"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Om die opvangs te verbeter, probeer die tipe verander wat gekies is by Stelsel &gt; Netwerk en internet &gt; Mobiele netwerke &gt; Voorkeurnetwerktipe."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Opletberigte"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Oproepaanstuur"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Noodterugbel-modus"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 0e904ad85d82..f8070a623714 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ምንም የድምፅ እና የድንገተኛ አደጋ ጥሪ አገልግሎት የለም"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"ለጊዜው በአካባቢዎ ባለው የተንቀሳቃሽ ስልክ አውታረ መረብ አይቀርብም"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"አውታረ መረብ ላይ መድረስ አይቻልም"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ቅበላን ለማሻሻል የተመረጠውን ዓይነት በሥርዓት &gt; አውታረ መረቦች እና በይነመረብ &gt; የተንቀሳቃሽ ስልክ አውታረ መረቦች &gt; ተመራጭ የአውታረ መረብ ዓይነት ላይ ለመለወጥ ይሞክሩ።"</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ማንቂያዎች"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ጥሪ ማስተላለፍ"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"የአደጋ ጊዜ ጥሪ ሁነታ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 3483b68b605f..45405a0f09bd 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -99,7 +99,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"لا تتوفر خدمة الصوت/الطوارئ"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"مؤقتا لا تقدمها شبكة الجوال في موقعك"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"يتعذر الوصول إلى الشبكة"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"‏لتحسين الاستقبال، يمكنك تجربة تغيير النوع المحدّد في النظام &gt; الشبكة والإنترنت &gt; شبكات الجوّال &gt; نوع الشبكة المفضّل."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"التنبيهات"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"إعادة توجيه المكالمة"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"وضع معاودة الاتصال بالطوارئ"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 01e54521fd16..9c0ee38b1be8 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Səsli/təcili xidmət yoxdur"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Müvəqqəti olaraq məkanda mobil şəbəkə tərəfindən təklif edilmir"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Şəbəkəyə daxil olmaq mümkün deyil"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Qəbulu inkişaf etdirmək üçün seçilmiş növü Sistem &gt; Şəbəkə və İnternet &gt; Mobil şəbəkə &gt; Tərcih edilən şəbəkə növü bölməsində dəyişə bilərsiniz."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Siqnallar"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Zəng yönləndirmə"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Təcili geriyə zəng rejimi"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index a4487a82249f..69d56a968218 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -96,7 +96,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nema glasovne usluge/usluge za hitne pozive"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Privremeno je onemogućeno na mobilnoj mreži na vašoj lokaciji"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Povezivanje sa mrežom nije uspelo"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Da biste poboljšali prijem, probajte da promenite izabrani tip u odeljku Sistem &gt; Mreža i internet &gt; Mobilne mreže &gt; Željeni tip mreže."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Obaveštenja"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmeravanje poziva"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Režim za hitan povratni poziv"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 483aa21151e2..a477fe5cdb3a 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -97,7 +97,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Няма сэрвісу галасавых / экстранных выклікаў"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Часова не прапаноўваецца сеткай мабільнай сувязі ў вашым месцазанходжанні"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Немагчыма падключыцца да сеткі"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Каб палепшыць якасць прыёму, паспрабуйце змяніць тып, выбраны ў меню \"Сістэма &gt; Сетка і інтэрнэт &gt; Мабільныя сеткі &gt; Прыярытэтны тып сеткі\"."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Абвесткі"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Пераадрасацыя выкліку"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Рэжым экстраннага зваротнага выкліку"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 565b09474129..e4abe3a5f582 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Няма услуга за гласови/спешни обаждания"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Временно не се предлага от мобилната мрежа в местоположението ви"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Не може да се установи връзка с мрежата"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"За да подобрите сигнала, променете избрания тип мрежа от „Система“ &gt; „Мрежа и интернет“ &gt; „Мобилни мрежи“ &gt; „Предпочитан тип мрежа“."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Сигнали"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Пренасочване на обаждания"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим на обратно обаждане при спешност"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index c36dd1a3e3aa..1134d450fa29 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"কোনো ভয়েস/জরুরী পরিষেবা নেই"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"সাময়িকভাবে মোবাইল নেটওয়ার্ক আপনার অবস্থানে এই পরিষেবা দিচ্ছে না"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"নেটওয়ার্কের সিগন্যাল নেই"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"রিসেপশন উন্নত করতে সিস্টেম &gt; নেটওয়ার্ক এবং ইন্টারনেট &gt; মোবাইল নেটওয়ার্ক &gt; পছন্দের নেটওয়ার্কের ধরণ এ গিয়ে নির্বাচিত নেটওয়ার্কের ধরণ পরিবর্তন করে দেখুন।"</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"সতর্কবার্তা"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"কল ফরওয়ার্ড করা"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"জরুরি কলব্যাক মোড"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 4f5ad4a7302f..9462613668dc 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -96,7 +96,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nema govornih/hitnih usluga"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Trenutno nije u ponudi mobilne mreže na vašoj lokaciji"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nije moguće dosegnuti mrežu"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Za poboljšanje prijema, pokušajte promijeniti tip odabran u meniju Sistem &gt; Mreža i internet &gt; Mobilne mreže &gt; Preferirani tip mreže."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozorenja"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmjeravanje poziva"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Način rada za hitni povratni poziv"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 7556246b094d..75b41b6593b1 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sense servei de veu/emergència"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"La xarxa de telefonia mòbil de la teva ubicació temporalment no ofereix aquest servei"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"No es pot accedir a la xarxa"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Per millorar la recepció, prova de canviar-ne el tipus a Sistema &gt; Xarxa i Internet &gt; Xarxes de telefonia mòbil &gt; Tipus de xarxa preferit."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertes"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Desviació de trucades"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode de devolució de trucada d\'emergència"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 5a5a943bb5f8..94564f3442e3 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -97,7 +97,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Hlasová ani tísňová volání nejsou k dispozici"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Mobilní síť ve vaší oblasti tuto službu dočasně nenabízí"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"K síti se nelze připojit"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Chcete-li zlepšit příjem, zkuste změnit vybraný typ sítě v nastavení Systém &gt; Síť a internet &gt; Mobilní sítě &gt; Preferovaný typ sítě."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozornění"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Přesměrování hovorů"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Režim tísňového zpětného volání"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 4ff1f25f5f3e..d1d30828144e 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ingen tale- og nødtjenester"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Tilbydes i øjeblikket ikke af mobilnetværket på din placering"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Der er ingen forbindelse til netværket"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Hvis du vil forbedre signalet, kan du prøve at ændre den valgte netværkstype i System &gt; Netværk og internet &gt; Mobilnetværk &gt; Foretrukken netværkstype."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Underretninger"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Viderestilling af opkald"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Nødtilbagekaldstilstand"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index b8f1b5102371..1feb2ec06647 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Keine Anrufe/Notrufe"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Derzeit nicht im Mobilfunknetz in deiner Region verfügbar"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Netzwerk nicht erreichbar"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Der Empfang lässt sich möglicherweise verbessern, indem du unter \"System\" &gt; \"Netzwerk\" &amp; \"Internet\" &gt; \"Mobilfunknetze\" &gt; \"Bevorzugter Netzwerktyp\" einen anderen Typ auswählst."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Warnmeldungen"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Anrufweiterleitung"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Notfallrückrufmodus"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 2f105d9a1bb7..be6dfee56d32 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Δεν υπάρχει φωνητική υπηρεσία/υπηρεσία έκτακτης ανάγκης"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Δεν προσφέρεται προσωρινά από το δίκτυο κινητής τηλεφωνίας στην τοποθεσία σας"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Δεν είναι δυνατή η σύνδεση στο δίκτυο"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Για να βελτιώσετε τη λήψη, δοκιμάστε να αλλάξετε τον επιλεγμένο τύπο από το Σύστημα &gt; Δίκτυο και διαδίκτυο &gt; Δίκτυα κινητής τηλεφωνίας &gt; Προτιμώμενος τύπος δικτύου."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Ειδοποιήσεις"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Προώθηση κλήσης"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Λειτουργία επιστροφής κλήσης έκτακτης ανάγκης"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index fdbe3014b0ee..fdc03680ceab 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"No voice/emergency service"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Temporarily not offered by the mobile network at your location"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t find network"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"To improve reception, try changing the type selected at System &gt; Network &amp; Internet &gt; Mobile networks &gt; Preferred network type."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerts"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Call forwarding"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index fdbe3014b0ee..fdc03680ceab 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"No voice/emergency service"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Temporarily not offered by the mobile network at your location"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t find network"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"To improve reception, try changing the type selected at System &gt; Network &amp; Internet &gt; Mobile networks &gt; Preferred network type."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerts"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Call forwarding"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index fdbe3014b0ee..fdc03680ceab 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"No voice/emergency service"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Temporarily not offered by the mobile network at your location"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t find network"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"To improve reception, try changing the type selected at System &gt; Network &amp; Internet &gt; Mobile networks &gt; Preferred network type."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerts"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Call forwarding"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 8dafd5fc61ae..0fc0f2f1f5bd 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sin servicio de voz/emergencia"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"La red móvil de tu ubicación no ofrece este servicio de forma temporal"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"No se puede establecer conexión con la red"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para mejorar la recepción, cambia el tipo de red. Selecciona Sistema &gt; Internet y red &gt; Redes móviles &gt; Tipo de red preferido."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Desvío de llamada"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de devolución de llamada de emergencia"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index a899f4b511df..db2e9d3b5938 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sin servicio de emergencia ni de voz"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"La red móvil disponible en tu ubicación no ofrece esta opción de forma temporal"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"No se puede establecer conexión con la red"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para mejorar la recepción, prueba a cambiar el tipo de red seleccionado en Sistema &gt; Red e Internet &gt; Redes móviles &gt; Tipo de red preferido."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Desvío de llamada"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de devolución de llamada de emergencia"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 277fefc8cdcf..7f9ff6c37cac 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Häälkõned/hädaabiteenus pole saadaval"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Teie asukoha mobiilsidevõrk seda teenust ajutiselt ei paku"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Võrguga ei saa ühendust"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Vastuvõtu parandamiseks muutke valitud tüüpi jaotises Süsteem &gt; Võrk ja Internet &gt; Mobiilsidevõrgud &gt; Eelistatud võrgutüüp."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Teatised"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Kõnede suunamine"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Hädaolukorra tagasihelistusrežiim"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 9f50406ee36f..016f4b440936 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ez dago ahots- edo larrialdi-deien zerbitzurik"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Zauden tokiko sare mugikorrak ez du eskaintzen aukera hori une honetan"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ezin da konektatu sarera"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Seinalea hobea izan dadin, aldatu hautatutako sare mota Sistema &gt; Sareak eta Internet &gt; Sare mugikorrak &gt; Sare mota hobetsia atalean."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Abisuak"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Dei-desbideratzea"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Larrialdi-deiak soilik jasotzeko modua"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 1280b41ea87e..31035fa0a2f6 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"سرویس صوتی/اضطراری دردسترس نیست"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"موقتاً توسط شبکه داده دستگاه همراه در مکان شما ارائه نمی‌شود"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"شبکه دردسترس نیست"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"برای بهبود دریافت، نوع شبکه‌ای را که انتخاب کرده‌اید در «سیستم» &gt; «شبکه‌ و اینترنت» &gt; «شبکه‌های تلفن همراه» &gt; «نوع شبکه ترجیحی» تغییر دهید."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"هشدارها"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"بازارسال تماس"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"حالت پاسخ تماس اضطراری"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index df35b50b80dc..cd642cb2c4ba 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ei ääni- tai hätäpuheluja"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Sijaintisi mobiiliverkko ei tarjoa tätä tilapäisesti."</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ei yhteyttä verkkoon"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Voit yrittää parantaa kuuluvuutta vaihtamalla tyypin asetusta. Valitse Järjestelmä &gt; Verkko &gt; Internet &gt; Mobiiliverkot &gt; Ensisijainen verkko."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Ilmoitukset"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Soitonsiirto"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Hätäpuhelujen takaisinsoittotila"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index a211d64fd752..7646ea89a3d4 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Aucun service vocal ou d\'urgence"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Ce service est temporairement non offert par le réseau cellulaire à l\'endroit où vous êtes"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Impossible de joindre le réseau"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Pour améliorer la réception, essayez de changer le type de réseau sélectionné, sous Système &gt; Réseaux et Internet &gt; Réseaux cellulaires &gt; Type de réseau préféré."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertes"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Transfert d\'appel"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode de rappel d\'urgence"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index e1683d664ec0..58a5455744ae 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Aucun service vocal/d\'urgence"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Momentanément non proposé par le réseau mobile à votre position"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Impossible d\'accéder au réseau"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Pour améliorer la réception, essayez de modifier le type sélectionné sous Système &gt; Réseau et Internet &gt; Réseaux mobiles &gt; Type de réseau préféré."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertes"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Transfert d\'appel"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode de rappel d\'urgence"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index ec891e9ba8f5..e8359a8b3b47 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Non hai servizo de chamadas de emerxencia nin de voz"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"A rede de telefonía móbil non ofrece o servizo na túa localización temporalmente"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Non se pode conectar coa rede"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para mellorar a recepción, proba a cambiar o tipo seleccionado en Sistema &gt; Rede e Internet &gt; Redes de telefonía móbil &gt; Tipo de rede preferido."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Desvío de chamadas"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de devolución de chamadas de emerxencia"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 30516dc68f2d..0e4a77bf094e 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"કોઈ વૉઇસ/કટોકટીની સેવા નથી"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"તમારા સ્થળે મોબાઇલ નેટવર્ક દ્વારા અસ્થાયીરૂપે ઑફર કરવામાં આવતી નથી"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"નેટવર્ક પર પહોંચી શકાતું નથી"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"રિસેપ્શનને બહેતર બનાવવા માટે, સિસ્ટમ &gt; નેટવર્ક અને ઇન્ટરનેટ &gt; મોબાઇલ નેટવર્ક &gt; પસંદગીનો નેટવર્ક પ્રકારમાં પસંદ કરેલો પ્રકાર બદલવાનો પ્રયાસ કરો."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ચેતવણીઓ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"કૉલ ફૉર્વર્ડિંગ"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"કટોકટી કૉલબૅક મોડ"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 2af02565c297..c5e532fce801 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"कोई वॉइस/आपातकालीन सेवा नहीं है"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"आपके स्थान के मोबाइल नेटवर्क की ओर से इस समय ऑफ़र नहीं किया जा रहा है"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"नेटवर्क तक नहीं पहुंच पा रहे हैं"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"रिसेप्शन बेहतर करने के लिए, सिस्टम &gt; नेटवर्क और इंटरनेट &gt; मोबाइल नेटवर्क &gt; पसंदीदा नेटवर्क प्रकार पर जाकर, चुना गया प्रकार बदलकर देखें."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"सूचनाएं"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"कॉल अग्रेषण"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"आपातकालीन कॉलबैक मोड"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 6719b2ce0af6..3d7743bd342f 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -96,7 +96,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nema glasovnih i hitnih usluga"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Trenutačno nije u ponudi mobilne mreže na vašoj lokaciji"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Pristup mreži nije moguć"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Za bolji prijem pokušajte odabrati drugu vrstu mreže u odjeljku Sustav &gt; Mreža i internet &gt; Mobilne mreže &gt; Željena vrsta mreže."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozorenja"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmjeravanje poziva"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Način hitnog povratnog poziva"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 942e4780f728..51c111c78417 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -90,12 +90,13 @@
<string name="serviceNotProvisioned" msgid="8614830180508686666">"A szolgáltatás nincs biztosítva."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Nem tudja módosítani a hívó fél azonosítója beállítást."</string>
<string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Adatszolgáltatás letiltva"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Nincs vészhívás"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Nincs segélyhívás"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Hangszolgáltatás letiltva"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Hang- és segélyszolgáltatás letiltva"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Az Ön tartózkodási helyén ideiglenesen nem áll rendelkezésre a mobilhálózaton"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"A hálózat nem érhető el"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"A vétel javítása érdekében próbálja módosítani a kiválasztott hálózattípust a Rendszer &gt; Hálózat és internet &gt; Mobilhálózatok &gt; Preferált hálózattípus menüben."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Értesítések"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Hívásátirányítás"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Sürgősségi visszahívás mód"</string>
@@ -223,7 +224,7 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Telefonbeállítások"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Képernyő lezárása"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Kikapcsolás"</string>
- <string name="global_action_emergency" msgid="7112311161137421166">"Vészhívás"</string>
+ <string name="global_action_emergency" msgid="7112311161137421166">"Segélyhívás"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"Programhiba bejelentése"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Hibajelentés készítése"</string>
<string name="bugreport_message" msgid="398447048750350456">"Ezzel információt fog gyűjteni az eszköz jelenlegi állapotáról, amelyet a rendszer e-mailben fog elküldeni. Kérjük, legyen türelemmel, amíg a hibajelentés elkészül, és küldhető állapotba kerül."</string>
@@ -714,7 +715,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"A feloldáshoz vagy segélyhívás kezdeményezéséhez nyomja meg a Menü gombot."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"A feloldáshoz nyomja meg a Menü gombot."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Rajzolja le a mintát a feloldáshoz"</string>
- <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Vészhívás"</string>
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Segélyhívás"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Hívás folytatása"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Helyes!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Próbálja újra"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index a1b74b5aa37b..01a6faebfd68 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ձայնային/արտակարգ իրավիճակների ծառայությունն անհասանելի է"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Ձեր գտնվելու վայրում ծառայությունը ժամանակավորապես չի տրամադրվում բջջային ցանցի կողմից"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ցանցն անհասանելի է"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Ազդանշանի ընդունման որակը բարելավելու համար փոխեք ցանցի տեսակը՝ անցնելով Համակարգ &gt; Ցանց և ինտերնետ &gt; Բջջային ցանցեր &gt; Ցանկալի ցանցի տեսակը։"</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Ծանուցումներ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Զանգի վերահասցեավորում"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Շտապ հետկանչի ռեժիմ"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 6ef5aa7aa14c..42c612888980 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Tidak ada layanan panggilan suara/darurat"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Untuk sementara tidak ditawarkan oleh jaringan seluler di lokasi Anda"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Tidak dapat menjangkau jaringan"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Untuk meningkatkan penerimaan sinyal, coba ubah jenis yang dipilih di Sistem &gt; Jaringan &amp; Internet &gt; Jaringan seluler &gt; Jenis jaringan pilihan."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Notifikasi"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Penerusan panggilan"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode panggilan balik darurat"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 0917defd7541..6acc12e6eec1 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Símtöl/neyðarsímtöl eru ekki í boði"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Ekki í boði á farsímakerfinu á þínum stað eins og er"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ekki næst samband við símkerfi"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Reyndu að breyta valinni gerð í Kerfi &gt; Netkerfi og internet > Farsímakerfi &gt; Valin símkerfistegund til að bæta móttökuskilyrðin."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Tilkynningar"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Símtalsflutningur"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Stilling fyrir svarhringingu neyðarsímtala"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 5e8b57d760ca..7cf051ae54ee 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nessun servizio di telefonia/emergenza"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Servizio temporaneamente non offerto dalla rete mobile nella tua località"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Impossibile raggiungere la rete"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Per migliorare la ricezione, prova a modificare il tipo selezionato in Sistema &gt; Rete e Internet &gt; Reti mobili &gt; Tipo di rete preferito."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Avvisi"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Deviazione chiamate"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modalità di richiamata di emergenza"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 1944fe361c2e..57c0ba38eff5 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -97,7 +97,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"אין אפשרות לבצע שיחות חירום ושיחות קוליות רגילות"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"הרשת הסלולרית במיקום הזה חסמה את השירות באופן זמני"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"לא ניתן להתחבר לרשת"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"‏כדי לשפר את הקליטה, נסה לשנות את הסוג הנבחר ב\'מערכת\' &gt; \'רשת ואינטרנט\' &gt; \'רשתות סלולריות\' &gt; \'סוג רשת מועדף\'."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"התראות"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"העברת שיחות"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"מצב \'התקשרות חזרה בחירום\'"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index c60b401c3318..f7de291819cf 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"音声通話 / 緊急通報サービス停止"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"現在地のモバイル ネットワークでは一時的に提供されていません"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ネットワークにアクセスできません"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"受信状態を改善するには、[システム] &gt; [ネットワークとインターネット] &gt; [モバイル ネットワーク] &gt; [優先ネットワーク タイプ] で選択したタイプを変更してみてください。"</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"通知"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"電話の転送"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"緊急通報待機モード"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 67ee958ac2a0..5e5b43ee2c56 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ხმოვანი/გადაუდებელი ზარების სერვისი არ არის"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"დროებით არ არის შემოთავაზებული მობილური ქსელის მიერ თქვენს მდებარეობაზე"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ქსელთან დაკავშირება ვერ ხერხდება"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"მიღების გასაუმჯობესებლად ცადეთ არჩეული ტიპის შეცვლა აქ: სისტემა &gt; ქსელი და ინტერნეტი &gt; მობილური ქსელები &gt; ქსელის სასურველი ტიპი."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"გაფრთხილებები"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ზარის გადამისამართება"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"გადაუდებელი გადმორეკვის რეჟიმი"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 28e950fe9d2f..bc9a79e65ebe 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Дауыстық/жедел қызметке қоңыраулар қызметі жоқ"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Орналасқан аймағыңызда мобильдік желі уақытша ұсынбады"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Желіге қосылу мүмкін емес"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Қабылдауды жақсарту үшін \"Жүйе &gt; Желі және интернет &gt; Мобильдік желілер &gt; Қалаған желі түрі\" тармағынан түрді өзгертіп көріңіз."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Дабылдар"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Қоңырауды басқа нөмірге бағыттау"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Шұғыл кері қоңырау шалу режимі"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index a72446d63822..c2d6bec49edd 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"គ្មាន​សេវាកម្ម​សំឡេង/សង្រ្គោះបន្ទាន់​ទេ"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"​មិន​បាន​ផ្តល់​ជូន​ដោយ​បណ្តាញចល័តនៅ​ទីកន្លែងរបស់អ្នកជា​បណ្តោះ​អាសន្ន"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"មិន​អាច​ភ្ជាប់​ទៅ​បណ្តាញ​បានទេ​"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ដើម្បីកែលម្អការទទួលយក សាកល្បងប្តូរប្រភេទដែលបានជ្រើសរើសនៅ ប្រព័ន្ធ &gt; បណ្តាញ និងអ៊ីនធឺណិត &gt; បណ្តាញទូរសព្ទចល័ត &gt; ប្រភេទបណ្តាញដែលចង់ប្រើ។"</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ការជូនដំណឹង"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ការបញ្ជូន​ការហៅ​ទូរសព្ទ​បន្ត"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"មុខងារ​ហៅត្រឡប់​វិញ​បន្ទាន់"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index e8e549705760..16342d09cb6c 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ಧ್ವನಿ/ತುರ್ತು ಸೇವೆ ಇಲ್ಲ"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"ತಾತ್ಕಾಲಿಕವಾಗಿ ಮೊಬೈಲ್ ನೆಟ್‌ವರ್ಕ್‌ನಿಂದ ನಿಮ್ಮ ಸ್ಥಳದಲ್ಲಿ ಒದಗಿಸುತ್ತಿಲ್ಲ"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ನೆಟ್‌ವರ್ಕ್ ತಲುಪಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕ ಪಡೆಯುವುದನ್ನು ಸುಧಾರಿಸಲು, ಆಯ್ಕೆ ಮಾಡಿರುವ ವಿಧವನ್ನು ಸಿಸ್ಟಂ &gt; ನೆಟ್‌ವರ್ಕ್ ಮತ್ತು ಇಂಟರ್ನೆಟ್ &gt; ಮೊಬೈಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳು &gt; ಆದ್ಯತೆಯ ನೆಟ್‌ವರ್ಕ್ ವಿಧದಲ್ಲಿ ಬದಲಿಸಿ ನೋಡಿ."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ಎಚ್ಚರಿಕೆಗಳು"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ಕರೆ ಫಾರ್ವರ್ಡ್‌ ಮಾಡುವಿಕೆ"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ತುರ್ತು ಕಾಲ್‌ಬ್ಯಾಕ್‌ ಮೋಡ್‌"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 89b305b360cd..38fe6a7dcf6d 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"음성/긴급 서비스를 이용할 수 없음"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"현재 위치에서 모바일 네트워크가 서비스 제공을 일시적으로 중단했습니다."</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"네트워크에 연결할 수 없습니다."</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"수신 상태를 개선하려면 시스템 &gt; 네트워크 및 인터넷 &gt; 모바일 네트워크 &gt; 기본 네트워크 유형에서 선택된 유형을 변경해 보세요."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"알림"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"착신전환"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"긴급 콜백 모드"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 14cda50b3a8e..475b491c4847 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Бардык чалуулар жана кызматтар бөгөттөлгөн"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Өзгөчө кырдаалдагы кызматтар сиз жайгашкан жердеги мобилдик тармак тарабынан убактылуу бөгөттөлгөн"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Тармакка туташпай жатат"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Кабыл алуу мүмкүнчүлүгүн жакшыртуу үчүн Тутум &gt; Тармак жана Интернет &gt; Мобилдик тармактар &gt; Тандалган тармак бөлүмүнөн тармактын түрүн өзгөртүп көрүңүз."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Эскертүүлөр"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Чалууну башка номерге багыттоо"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Шашылыш кайра чалуу режими"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index f3ea91be76a6..ab1c18c1f130 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ບໍ່ມີບໍລິການສຽງ/ສຸກເສີນ"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"ເຄືອຂ່າຍຂອງທ່ານບໍ່ໄດ້ໃຫ້ບໍລິການຢູ່ສະຖານທີ່ນີ້ເປັນການຊົ່ວຄາວ"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t reach network"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ເພື່ອປັບປຸງການຮັບສັນຍານ, ໃຫ້ລອງປ່ຽນປະເພດທີ່ເລືອກໄວ້ທີ່ ລະບົບ &gt; ເຄືອຂ່າຍ ແລະ ອິນເຕີເນັດ &gt; ເຄືອຂ່າຍມືຖື &gt; ປະເພດເຄືອຂ່າຍທີ່ຕ້ອງການ."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ການເຕືອນ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ການໂອນສາຍ"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ໂໝດໂທກັບສຸກເສີນ"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index ec706edc278f..989046d363fc 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -97,7 +97,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Balso skambučių / skambučių pagalbos numeriais paslauga neteikiama"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Laikinai nesiūloma mobiliojo ryšio tinkle jūsų vietovėje"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nepavyko pasiekti tinklo"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Kad pagerintumėte ryšį, pabandykite pakeisti tipą, pasirinktą skiltyje „Nustatymai“ &gt; „Tinklas ir internetas“ &gt; „Mobiliojo ryšio tinklai“ &gt; „Pageidaujamas tinklo tipas“."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Įspėjimai"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Skambučio peradresavimas"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Atskambinimo pagalbos numeriu režimas"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index e8dff85caff9..ed649f76860c 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -96,7 +96,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Balss un ārkārtas izsaukumu pakalpojums nedarbojas"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Pagaidām netiek piedāvāts mobilajā tīklā jūsu atrašanās vietā"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nevar sasniegt tīklu"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Lai uzlabotu uztveršanu, mainiet atlasīto veidu sadaļā Sistēma &gt; Tīkls un internets &gt; Mobilie tīkli &gt; Ieteicamais tīkla veids."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Brīdinājumi"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Zvanu pāradresācija"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Ārkārtas atzvana režīms"</string>
diff --git a/core/res/res/values-mcc404/config.xml b/core/res/res/values-mcc404/config.xml
index 6b77e9c1663a..4cadef7893d3 100644
--- a/core/res/res/values-mcc404/config.xml
+++ b/core/res/res/values-mcc404/config.xml
@@ -20,4 +20,6 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Whether camera shutter sound is forced or not (country specific). -->
<bool name="config_camera_sound_forced">true</bool>
+ <!-- Show area update info settings in CellBroadcastReceiver and information in SIM status in Settings app -->
+ <bool name="config_showAreaUpdateInfoSettings">true</bool>
</resources>
diff --git a/core/res/res/values-mcc724/config.xml b/core/res/res/values-mcc724/config.xml
new file mode 100644
index 000000000000..98f70d5441d2
--- /dev/null
+++ b/core/res/res/values-mcc724/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2017, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Show area update info settings in CellBroadcastReceiver and information in SIM status in Settings app -->
+ <bool name="config_showAreaUpdateInfoSettings">true</bool>
+</resources>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index f4435959215f..f777f8394fde 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Нема услуга за говорни/итни повици"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Привремено не се нуди од мобилната мрежа на вашата локација"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Не може да се дојде до мрежата"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"За подобрување на приемот, обидете се да го промените избраниот тип во: Систем &gt; Мрежа и интернет &gt; Мобилни мрежи &gt; Претпочитан тип мрежа."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Предупредувања"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Проследување повик"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим на итен повратен повик"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 1641534964e5..0eda9cbec59b 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"വോയ്സ്/അടിയന്തിര സേവനമില്ല"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"നിങ്ങളുടെ ലൊക്കേഷനിൽ മൊബൈൽ നെറ്റ്‌വര്‍ക്ക് താൽക്കാലികമായി ലഭ്യമല്ല"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"നെറ്റ്‌വർക്കിലേക്ക് കണക്റ്റുചെയ്യാനാവുന്നില്ല"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"സ്വീകരണം മെച്ചപ്പെടുത്തുന്നതിന് സിസ്റ്റം &gt; നെറ്റ്‌വർക്കും ഇന്റർനെറ്റും &gt; മൊബൈൽ നെറ്റ്‌വർക്കുകൾ &gt; തിരഞ്ഞെടുത്ത നെറ്റ്‌വർക്ക് തരം എന്നതിൽ തിരഞ്ഞെടുത്തിരിക്കുന്ന തരം മാറ്റിക്കൊണ്ട് ശ്രമിച്ചുനോക്കുക."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"അലേർട്ടുകൾ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"കോൾ ഫോർവേഡിംഗ്"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"അടിയന്തര കോൾബാക്ക് മോഡ്"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index ae3d21c477cc..a9f81e1f65c8 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Дуу хоолой/яаралтай үйлчилгээ алга"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Таны байршилд таны мобайл сүлжээнээс түр хугацаанд блоклосон"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Сүлжээнд холбогдох боломжгүй байна"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Хүлээн авалтыг сайжруулахын тулд систем, сүлжээ, интернэт, мобайл сүлжээнд сонгосон сүлжээний төрлийг өөрчилнө үү."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Сануулга"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Дуудлага шилжүүлэх"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Яаралтай дуудлага хийх горим"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 6d404e4b335a..461790992930 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"व्हॉइस/आणीबाणी सेवा नाही"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"तुम्‍ही असलेल्‍या स्‍थानी मोबाइल नेटवर्क तात्‍पुरते उपलब्‍ध नाही"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"नेटवर्कवर पोहोचूू शकत नाही"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"रिसेप्शन सुधारण्यासाठी प्रणाली &gt; नेटवर्क आणि इंटरनेट &gt; मोबाइल नेटवर्क &gt; प्राधान्य दिलेला नेटवर्क प्रकार येथे निवडलेला प्रकार बदलून पहा."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"अलर्ट"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"कॉल फॉरवर्डिंग"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"इमर्जन्सी कॉलबॅक मोड"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 762eaa166e70..7aae94fc875b 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Tiada perkhidmatan suara/kecemasan"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Tidak ditawarkan oleh rangkaian mudah alih di lokasi anda untuk sementara waktu"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Tidak dapat mencapai rangkaian"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Untuk memperbaik penerimaan, cuba tukar jenis rangkaian yang dipilih di Sistem &gt; Rangkaian &amp; Internet &gt; Rangkaian mudah alih &gt; Jenis rangkaian pilihan."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Makluman"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Pemajuan panggilan"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mod paggil balik kecemasan"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 6dd70fe3d7e6..f02efbe97b31 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ဖုန်း/အရေးပေါ် ဝန်ဆောင်မှုများမရရှိနိုင်ပါ"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"သင်၏ ဒေသတွင် မိုဘိုင်းကွန်ရက် ယာယီမရရှိနိုင်ပါ"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ကွန်ရက်ကို ချိတ်ဆက်၍မရပါ"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"လိုင်းဖမ်းယူမှု ကောင်းမွန်စေရန် စနစ် &gt; ကွန်ရက်နှင့် အင်တာနက် &gt; မိုဘိုင်းကွန်ရက်များ &gt; အသုံးပြုလိုသည့် ကွန်ရက်အမျိုးအစားတွင် ရွေးချယ်ထားသည့် အမျိုးအစားကို ပြောင်းကြည့်ပါ။"</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"သတိပေးချက်များ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"အဝင်ခေါ်ဆိုမှုအား ထပ်ဆင့်ပို့ခြင်း"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"အရေးပေါ် ပြန်လည်ခေါ်ဆိုနိုင်သောမုဒ်"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index ee644e3f4f1c..4f6065190483 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ingen tale-/nødtjeneste"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Tilbys midlertidig ikke gjennom mobilnettverket der du er"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Får ikke kontakt med nettverket"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"For å forbedre signalet, prøv å endre valgt nettverkstype i System &gt; Nettverk og Internett &gt; Mobilnettverk &gt; Foretrukket nettverkstype."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Varsler"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Viderekobling"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modusen nødsamtale-tilbakeringing"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 2df0bc072da1..2734873f2c31 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"कुनै पनि भ्वाइस/आपतकालीन सेवा उपलब्ध छैन"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"तपाईंको स्थानमा सञ्चालन भइरहेको मोबाइल नेटवर्कले अस्थायी रूपमा यो सुविधा प्रदान गर्दैन"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"नेटवर्कमाथि पहुँच राख्न सकिँदैन"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"रिसेप्सनमा सुधार गर्न, प्रणाली &gt; नेटवर्क र इन्टरनेट &gt; मोबाइल नेटवर्कहरू &gt; रुचाइएको नेटवर्कको प्रकार मा गएर चयन गरिएको प्रकार परिवर्तन गरी हेर्नुहोस्।"</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"अलर्टहरू"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"कल फर्वार्ड गर्ने सेवा"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"आपतकालीन कलब्याक मोड"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 5f427f473ece..52ffb7c61e26 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Geen service voor spraak-/noodoproepen"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Tijdelijk niet aangeboden door het mobiele netwerk op je locatie"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Kan netwerk niet bereiken"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Als je de ontvangst wilt verbeteren, kun je het netwerktype wijzigen dat is geselecteerd bij Systeem &gt; Netwerk en internet &gt; Mobiele netwerken &gt; Voorkeursnetwerktype."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Meldingen"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Oproep doorschakelen"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modus voor noodoproepen"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index bf917c606990..1d42eeaec948 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ਕੋਈ ਆਵਾਜ਼ੀ/ਸੰਕਟਕਾਲੀਨ ਸੇਵਾ ਨਹੀਂ"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"ਤੁਹਾਡੇ ਟਿਕਾਣੇ \'ਤੇ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਵੱਲੋਂ ਉਪਲਬਧ ਨਹੀਂ ਕਰਵਾਈ ਗਈ"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ਨੈੱਟਵਰਕ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ਸਿਗਨਲ ਪ੍ਰਾਪਤੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ, ਸਿਸਟਮ &gt; ਨੈੱਟਵਰਕ ਅਤੇ ਇੰਟਰਨੈੱਟ &gt; ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ &gt; ਤਰਜੀਹੀ ਨੈੱਟਵਰਕ ਦੀ ਕਿਸਮ \'ਤੇ ਚੁਣੀ ਗਈ ਕਿਸਮ ਨੂੰ ਬਦਲਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ਸੁਚੇਤਨਾਵਾਂ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ਕਾਲ ਫਾਰਵਾਰਡਿੰਗ"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ਸੰਕਟਕਾਲੀਨ ਕਾਲਬੈਕ ਮੋਡ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 2edd37140c9c..ff869abe6b17 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -97,7 +97,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Brak usługi połączeń głosowych/alarmowych"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Usługa tymczasowo nieoferowana przez sieć komórkową w Twojej lokalizacji"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Brak zasięgu sieci"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Aby poprawić odbiór, zmień typ sieci – wybierz System &gt; Sieć i internet &gt; Sieci komórkowe &gt; Preferowany typ sieci."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerty"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Przekierowanie połączeń"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Tryb alarmowego połączenia zwrotnego"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index d5a4f7bde492..e13a20f2b7fd 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sem serviço de voz/emergência"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Serviço temporariamente bloqueado pela rede móvel no seu local"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Não foi possível acessar a rede"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para melhorar a recepção, tente alterar o tipo selecionado em Sistema &gt; Rede &amp; Internet &gt; Redes móveis &gt; Tipo de rede preferencial."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Encaminhamento de chamada"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de retorno de chamada de emergência"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 2f6e3dd04582..df2bb9a32164 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sem serviço de voz/emergência"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Serviço temporariamente não disponibilizado pela rede móvel na sua localização"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Não é possível ligar à rede"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para melhorar a receção, experimente alterar o tipo selecionado em Sistema &gt; Rede e Internet &gt; Redes móveis &gt; Tipo de rede preferido."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Reencaminhamento de chamadas"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de chamada de retorno de emergência"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index d5a4f7bde492..e13a20f2b7fd 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sem serviço de voz/emergência"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Serviço temporariamente bloqueado pela rede móvel no seu local"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Não foi possível acessar a rede"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para melhorar a recepção, tente alterar o tipo selecionado em Sistema &gt; Rede &amp; Internet &gt; Redes móveis &gt; Tipo de rede preferencial."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Encaminhamento de chamada"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de retorno de chamada de emergência"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 8bf321e05ffd..6844f45cb1e8 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -96,7 +96,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Fără servicii vocale/de urgență"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Momentan nu este oferit de rețeaua mobilă în locația dvs."</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nu se poate stabili conexiunea la rețea"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Pentru o recepție mai bună, încercați să schimbați tipul selectat în Sistem &gt; Rețea și internet &gt; Rețele mobile &gt; Tip preferat de rețea."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerte"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Redirecționarea apelurilor"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mod de apelare inversă de urgență"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index d8174ad7f1c5..b11bf0cce809 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -97,7 +97,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Голосовые и экстренные вызовы недоступны"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Местная мобильная сеть временно не поддерживает эту функцию."</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Сеть недоступна"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Чтобы улучшить сигнал, попробуйте выбрать другой тип сети в настройках (раздел \"Мобильные сети\")."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Оповещения"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Переадресация вызовов"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим экстренных обратных вызовов"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index fc3caf7095c5..00fbbd8bda10 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"හඬ/හදිසි සේවාව නොමැත"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"ඔබේ ස්ථානයේ ජංගම ජාලය මගින් තාවකාලිකව පිරිනොනමයි"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ජාලය වෙත ළඟා විය නොහැකිය"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ප්‍රතිග්‍රහණය වැඩි දියුණු කිරීමට, පද්ධතිය &gt; ජාලය සහ අන්තර්ජාලය &gt; ජංගම ජාල &gt; වඩා කැමති ජාල වර්ගය තුළ තෝරන ලද වර්ගය වෙනස් කිරීම උත්සාහ කරන්න."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ඇඟවීම්"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ඇමතුම ප්‍රතියොමු කිරීම"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"හදිසි අවස්ථා පසු ඇමතුම් ප්‍රකාරය"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index aa912ec97ef3..0cd967a8837e 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -97,7 +97,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Hlasové ani tiesňové volania nie sú k dispozícii"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Momentálne nie sú v ponuke mobilnej siete na vašom mieste"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nepodarilo sa pripojiť k sieti"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Ak chcete vylepšiť príjem, skúste zmeniť vybratý typ siete v časti Systém &gt; Sieť a internet &gt; Mobilné siete &gt; Preferovaný typ siete."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozornenia"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Presmerovanie hovorov"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Režim tiesňového spätného volania"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 7d5c184e8ba1..68678d787d59 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -97,7 +97,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ni storitve za glasovne klice / klice v sili"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Ta storitev trenutno ni na voljo v mobilnem omrežju na vaši lokaciji"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Povezave z omrežjem ni mogoče vzpostaviti"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Če želite izboljšati sprejem, poskusite zamenjati vrsto omrežja v možnostih »Sistem« &gt; »Omrežje in internet« &gt; »Mobilna omrežja« &gt; »Prednostna vrsta omrežja«."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Opozorila"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmerjanje klicev"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Način za povratni klic v sili"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 6b903ae3d2b7..94005852effd 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nuk ka shërbim zanor/urgjence"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Përkohësisht nuk ofrohet nga rrjeti celular në vendndodhjen tënde"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Rrjeti i paarritshëm"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Për të përmirësuar marrjen e sinjalit, provo të ndryshosh llojin e zgjedhur te Sistemi &gt; Rrjeti dhe interneti &gt; Lloji i preferuar i rrjetit."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Sinjalizimet"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Transferimi i telefonatave"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modaliteti i \"Kthimit të telefonatës së urgjencës\""</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 8d7f5967f84f..ab369ad77d56 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -96,7 +96,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Нема гласовне услуге/услуге за хитне позиве"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Привремено је онемогућено на мобилној мрежи на вашој локацији"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Повезивање са мрежом није успело"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Да бисте побољшали пријем, пробајте да промените изабрани тип у одељку Систем &gt; Мрежа и интернет &gt; Мобилне мреже &gt; Жељени тип мреже."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Обавештења"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Преусмеравање позива"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим за хитан повратни позив"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 172ae15d3e8c..b9f08e2c3085 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Tjänster för röst- och nödsamtal har blockerats"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Detta erbjuds för tillfället inte på mobilnätverket där du befinner dig"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Det går inte att nå nätverket"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Testa om du får bättre mottagning genom att ändra till en annan typ under System &gt; Nätverk och internet &gt; Mobila nätverk &gt; Önskad nätverkstyp."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Aviseringar"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Vidarekoppla samtal"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Läget Återuppringning vid nödsamtal"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 7786f2c0ab45..3f1152604bfc 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Hakuna huduma ya simu za dharura au za sauti"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Kwa sasa, huduma hii haipatikani katika mtandao wa simu mahali ulipo"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Haiwezi kufikia mtandao"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Ili kupata mtandao thabiti, jaribu kubadilisha aina iliyochaguliwa katika Mfumo &gt; Mtandao na Intaneti &gt; Mitandao ya simu &gt; Aina ya mtandao unaopendelea."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Arifa"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Kupeleka simu kwenye nambari nyingine"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Hali ya kupiga simu za dharura"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 407cfa02c644..afe5bd93cdfe 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"குரல்/அவசரச் சேவை இல்லை"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"தற்காலிகமாக உங்கள் இருப்பிடத்தில் மொபைல் நெட்வொர்க் வழங்கவில்லை"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"நெட்வொர்க்குடன் இணைக்க முடியவில்லை"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"பெறுதலை மேம்படுத்த, சாதனம் &gt; நெட்வொர்க் &amp; இணையம் &gt; மொபைல் நெட்வொர்க்குகள் &gt; விரும்பும் நெட்வொர்க் வகை என்பதற்குச் சென்று, தேர்ந்தெடுத்த வகையை மாற்றவும்."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"விழிப்பூட்டல்கள்"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"அழைப்புப் பகிர்வு"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"அவசரகாலத் திரும்ப அழைக்கும் பயன்முறை"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index d6b89e7545b5..553fde17a7bf 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"వాయిస్/అత్యవసర సేవ లేదు"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"మీ స్థానంలో మొబైల్ నెట్‌వర్క్ ద్వారా తాత్కాలికంగా అందించబడదు"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"నెట్‌వర్క్‌ను చేరుకోలేరు"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"స్వీకరణను మెరుగుపరచాలంటే, సిస్టమ్ &gt; నెట్‌వర్క్ &amp; ఇంటర్నెట్ &gt; మొబైల్ నెట్‌వర్క్‌లు &gt; ప్రాధాన్య నెట్‌వర్క్ రకంలో మీరు ఎంచుకున్న రకాన్ని మార్చి ప్రయత్నించండి."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"హెచ్చరికలు"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"కాల్ ఫార్వార్డింగ్"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"అత్యవసర కాల్‌బ్యాక్ మోడ్"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index c57fb07dac7b..f4d7779ad1b8 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ไม่มีบริการเสียง/บริการฉุกเฉิน"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"งดให้บริการชั่วคราวโดยเครือข่ายมือถือในตำแหน่งของคุณ"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"เข้าถึงเครือข่ายไม่ได้"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"เพื่อให้การรับสัญญาณดีขึ้น ลองเปลี่ยนประเภทที่เลือกใน \"การตั้งค่า\" &gt; \"เครือข่ายและอินเทอร์เน็ต\" &gt; \"เครือข่ายมือถือ\" &gt; \"ประเภทเครือข่ายที่ต้องการ\""</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"การแจ้งเตือน"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"การโอนสาย"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"โหมดติดต่อกลับฉุกเฉิน"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 6f77f8262740..0d79441c3697 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Walang serbisyo para sa voice/emergency"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Pansamantalang hindi inaalok ng mobile network sa iyong lokasyon"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Hindi maabot ang network"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Upang lumakas ang reception, subukang baguhin ang uring napili sa System &gt; Network at Internet &gt; Mga mobile network &gt; Gustong uri ng network."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Mga Alerto"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Pagpasa ng tawag"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 76bee02e1363..9c8d3edff51b 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ses/acil durum hizmeti yok"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Bulunduğunuz yerdeki mobil ağ tarafından geçici olarak sunulmuyor"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ağa erişilemiyor"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Sinyal gücünü iyileştirmek için Sistem &gt; Ağ ve İnternet &gt; Mobil ağlar &gt; Tercih edilen ağ türü\'nden seçili türü değiştirmeyi deneyin."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Uyarılar"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Çağrı yönlendirme"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Acil geri arama modu"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 1c5166459927..f90b25274a03 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -97,7 +97,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Немає голосової/екстреної служби"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Тимчасово не пропонується мобільною мережею у вашому місцезнаходженні"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Не вдається під’єднатися до мережі"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Щоб покращити якість сигналу, змініть тип у меню \"Система\" &gt; \"Мережа й Інтернет\" &gt; \"Мобільні мережі\" &gt; \"Тип мережі\"."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Сповіщення"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Переадресація виклику"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим екстреного зворотного виклику"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 9c5ad7268151..8c7026cf9f0e 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"کوئی صوتی/ہنگامی سروس نہیں"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"عارضی طور پر آپ کے مقام پر موبائل نیٹ ورک کی طرف سے پیش نہیں ہے"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"نیٹ ورک تک نہیں پہنچا جا سکتا"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"‏ریسپشن کو بہتر بنانے کیلئے، سسٹم ‎&gt; نیٹ ورک اور انٹرنیٹ ‎&gt; موبائل نیٹ ورکس ‎&gt; ترجیحی نیٹ ورک کی قسم تبدیل کرنے کی کوشش کریں۔"</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"الرٹس"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"کال آگے منتقل کرنا"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ہنگامی کال بیک وضع"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 7921b09a2835..1d6e313d6ba7 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ovozli va favqulodda chaqiruvlar ishlamaydi"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Hududingizda mobil tarmoq tomonidan vaqtinchalik taklif etilmayapti"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Tarmoq bilan bog‘lanib bo‘lmadi"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Qabul qilish sifatini yaxshilash uchun Tizim &gt; Tarmoq va Internet &gt; Mobil tarmoqlar > Asosiy tarmoq turi orqali o‘zgartirib ko‘ring."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Ogohlantirishlar"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Chaqiruvlarni uzatish"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Favqulodda qaytarib chaqirish rejimi"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 614aca7f321c..fc36ab6cf8c1 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Không có dịch vụ thoại/khẩn cấp"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Tạm thời không được cung cấp bởi mạng di động tại vị trí của bạn"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Không thể kết nối mạng"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Để cải thiện khả năng thu tín hiệu, hãy thử thay đổi loại mạng được chọn trong Hệ thống &gt; Mạng và Internet &gt; Mạng di động &gt; Loại mạng ưa thích."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Thông báo"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Chuyển tiếp cuộc gọi"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Chế độ gọi lại khẩn cấp"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 9738e232a07a..77e594d87269 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"无法使用语音通话/紧急呼救服务"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"您所在位置的移动网络暂时不提供这项服务"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"无法连接网络"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"要改善信号情况,请尝试更改在“系统”&gt;“网络和互联网”&gt;“移动网络”&gt;“首选网络类型”中选择的类型。"</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"提醒"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"来电转接"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"紧急回拨模式"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 47b43a75ce9a..3bd4e812ea2f 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"沒有語音/緊急服務"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"您所在位置的流動網絡暫不提供這項服務"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"無法連接網絡"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"如要改善接收品質,請前往 [系統] &gt; [網絡與互聯網] &gt; [流動網絡] &gt; [偏好的網絡類型],然後變更所選的網絡類型。"</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"通知"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"來電轉駁"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"緊急回撥模式"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 1f047f944733..07fdd0d12a5a 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"無法使用語音/緊急通話服務"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"你所在位置的行動網路暫時不提供這項服務"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"無法連上網路"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"如要改善收訊狀況,請依序開啟 [系統] &gt; [網路與網際網路] &gt; [行動網路] &gt; [偏好的網路類型],然後選取其他網路類型。"</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"快訊"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"來電轉接"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"緊急回撥模式"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index e974baec172e..e96cf2444c83 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -95,7 +95,8 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ayikho isevisi yezwi/yesimo esiphuthumayo"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Okwesikhashana akunikezwa inethiwekhi yeselula endaweni yakho"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ayikwazi ukufinyelela inethiwekhi"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Ukuze kuthuthukiswe ukwamukelwa, zama ukushintsha uhlobo olukhethiwe kusistimu &gt; Inethiwekhi ne-inthanethi &gt; amanethiwekhi eselula &gt; uhlobo oluncanyelwayo lwenethiwekhi."</string>
+ <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) -->
+ <skip />
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Izexwayiso"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Ukudlulisa ikholi"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Imodi yokushayela yesimo esiphuthumayo"</string>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index ffd88c31b422..3033f8c6543a 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2972,4 +2972,7 @@
<!-- Flag indicating that the actions buttons for a notification should be tinted with by the
color supplied by the Notification.Builder if present. -->
<bool name="config_tintNotificationActionButtons">true</bool>
+
+ <!-- Show area update info settings in CellBroadcastReceiver and information in SIM status in Settings app -->
+ <bool name="config_showAreaUpdateInfoSettings">false</bool>
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 4ee9d549e3da..2e9bd0897b69 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -38,48 +38,6 @@
the placeholders. -->
<string name="fileSizeSuffix"><xliff:g id="number" example="123">%1$s</xliff:g> <xliff:g id="unit" example="MB">%2$s</xliff:g></string>
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration in days -->
- <string name="durationDays"><xliff:g id="days">%1$d</xliff:g> days</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration of one day with hours -->
- <string name="durationDayHours"><xliff:g id="days">%1$d</xliff:g> day
- <xliff:g id="hours">%2$d</xliff:g> hrs</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration of one day with one hours -->
- <string name="durationDayHour"><xliff:g id="days">%1$d</xliff:g> day
- <xliff:g id="hours">%2$d</xliff:g> hr</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration in hours -->
- <string name="durationHours"><xliff:g id="hours">%1$d</xliff:g> hrs</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration of one hour with minutes -->
- <string name="durationHourMinutes"><xliff:g id="hours">%1$d</xliff:g> hr
- <xliff:g id="minutes">%2$d</xliff:g> mins</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration of one hour with one minute -->
- <string name="durationHourMinute"><xliff:g id="hours">%1$d</xliff:g> hr
- <xliff:g id="minutes">%2$d</xliff:g> min</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration in minutes -->
- <string name="durationMinutes"><xliff:g id="minutes">%1$d</xliff:g> mins</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration of one minute -->
- <string name="durationMinute"><xliff:g id="minutes">%1$d</xliff:g> min</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration of one minute with seconds -->
- <string name="durationMinuteSeconds"><xliff:g id="minutes">%1$d</xliff:g> min
- <xliff:g id="seconds">%2$d</xliff:g> secs</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration of one minute with one second -->
- <string name="durationMinuteSecond"><xliff:g id="minutes">%1$d</xliff:g> min
- <xliff:g id="seconds">%2$d</xliff:g> sec</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration in seconds -->
- <string name="durationSeconds"><xliff:g id="seconds">%1$d</xliff:g> secs</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration of one second -->
- <string name="durationSecond"><xliff:g id="seconds">%1$d</xliff:g> sec</string>
-
<!-- Used in Contacts for a field that has no label and in Note Pad
for a note with no name. -->
<string name="untitled">&lt;Untitled&gt;</string>
@@ -266,7 +224,7 @@
<string name="wfcRegErrorTitle">Wi-Fi Calling</string>
<!-- WFC Operator Error Messages showed as alerts -->
<string-array name="wfcOperatorErrorAlertMessages">
- <item>To make calls and send messages over Wi-Fi, first ask your carrier to set up this service. Then turn on Wi-Fi calling again from Settings.</item>
+ <item>To make calls and send messages over Wi-Fi, first ask your carrier to set up this service. Then turn on Wi-Fi calling again from Settings. (Error code: <xliff:g id="code" example="REG09 - No 911 Address">%1$s</xliff:g>)</item>
</string-array>
<!-- WFC Operator Error Messages showed as notifications -->
<string-array name="wfcOperatorErrorNotificationMessages">
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 6cbf11f0f830..3b98b01204a8 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -656,18 +656,6 @@
<java-symbol type="string" name="display_manager_overlay_display_secure_suffix" />
<java-symbol type="string" name="display_manager_overlay_display_title" />
<java-symbol type="string" name="double_tap_toast" />
- <java-symbol type="string" name="durationDays" />
- <java-symbol type="string" name="durationDayHours" />
- <java-symbol type="string" name="durationDayHour" />
- <java-symbol type="string" name="durationHours" />
- <java-symbol type="string" name="durationHourMinutes" />
- <java-symbol type="string" name="durationHourMinute" />
- <java-symbol type="string" name="durationMinutes" />
- <java-symbol type="string" name="durationMinute" />
- <java-symbol type="string" name="durationMinuteSeconds" />
- <java-symbol type="string" name="durationMinuteSecond" />
- <java-symbol type="string" name="durationSeconds" />
- <java-symbol type="string" name="durationSecond" />
<java-symbol type="string" name="elapsed_time_short_format_h_mm_ss" />
<java-symbol type="string" name="elapsed_time_short_format_mm_ss" />
<java-symbol type="string" name="emailTypeCustom" />
@@ -3057,4 +3045,5 @@
<java-symbol type="array" name="config_batteryPackageTypeService" />
<java-symbol type="string" name="popup_window_default_title" />
+ <java-symbol type="bool" name="config_showAreaUpdateInfoSettings" />
</resources>
diff --git a/core/tests/coretests/src/android/database/DatabasePerformanceTests.java b/core/tests/coretests/src/android/database/DatabasePerformanceTests.java
deleted file mode 100644
index d0e739b4310a..000000000000
--- a/core/tests/coretests/src/android/database/DatabasePerformanceTests.java
+++ /dev/null
@@ -1,1354 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.database;
-
-import junit.framework.Assert;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.provider.Contacts;
-import android.provider.Contacts.People;
-import android.test.PerformanceTestCase;
-import android.test.TestCase;
-
-import java.io.File;
-import java.util.Random;
-
-/**
- * Database Performance Tests
- *
- */
-
-@SuppressWarnings("deprecation")
-public class DatabasePerformanceTests {
-
- public static String[] children() {
- return new String[] {
- ContactReadingTest1.class.getName(),
- Perf1Test.class.getName(),
- Perf2Test.class.getName(),
- Perf3Test.class.getName(),
- Perf4Test.class.getName(),
- Perf5Test.class.getName(),
- Perf6Test.class.getName(),
- Perf7Test.class.getName(),
- Perf8Test.class.getName(),
- Perf9Test.class.getName(),
- Perf10Test.class.getName(),
- Perf11Test.class.getName(),
- Perf12Test.class.getName(),
- Perf13Test.class.getName(),
- Perf14Test.class.getName(),
- Perf15Test.class.getName(),
- Perf16Test.class.getName(),
- Perf17Test.class.getName(),
- Perf18Test.class.getName(),
- Perf19Test.class.getName(),
- Perf20Test.class.getName(),
- Perf21Test.class.getName(),
- Perf22Test.class.getName(),
- Perf23Test.class.getName(),
- Perf24Test.class.getName(),
- Perf25Test.class.getName(),
- Perf26Test.class.getName(),
- Perf27Test.class.getName(),
- Perf28Test.class.getName(),
- Perf29Test.class.getName(),
- Perf30Test.class.getName(),
- Perf31Test.class.getName(),
- };
- }
-
- public static abstract class PerformanceBase implements TestCase,
- PerformanceTestCase {
- protected static final int CURRENT_DATABASE_VERSION = 42;
- protected SQLiteDatabase mDatabase;
- protected File mDatabaseFile;
- protected Context mContext;
-
- public void setUp(Context c) {
- mContext = c;
- mDatabaseFile = new File("/tmp", "perf_database_test.db");
- if (mDatabaseFile.exists()) {
- mDatabaseFile.delete();
- }
- mDatabase = SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), null);
- Assert.assertTrue(mDatabase != null);
- mDatabase.setVersion(CURRENT_DATABASE_VERSION);
- }
-
- public void tearDown() {
- mDatabase.close();
- mDatabaseFile.delete();
- }
-
- public boolean isPerformanceOnly() {
- return true;
- }
-
- // These test can only be run once.
- public int startPerformance(Intermediates intermediates) {
- return 0;
- }
-
- public void run() {
- }
-
- public String numberName(int number) {
- String result = "";
-
- if (number >= 1000) {
- result += numberName((number / 1000)) + " thousand";
- number = (number % 1000);
-
- if (number > 0) result += " ";
- }
-
- if (number >= 100) {
- result += ONES[(number / 100)] + " hundred";
- number = (number % 100);
-
- if (number > 0) result += " ";
- }
-
- if (number >= 20) {
- result += TENS[(number / 10)];
- number = (number % 10);
-
- if (number > 0) result += " ";
- }
-
- if (number > 0) {
- result += ONES[number];
- }
-
- return result;
- }
- }
-
- /**
- * Test reading all contact data.
- */
- public static class ContactReadingTest1 implements TestCase, PerformanceTestCase {
- private static final String[] PEOPLE_PROJECTION = new String[] {
- Contacts.People._ID, // 0
- Contacts.People.PRIMARY_PHONE_ID, // 1
- Contacts.People.TYPE, // 2
- Contacts.People.NUMBER, // 3
- Contacts.People.LABEL, // 4
- Contacts.People.NAME, // 5
- Contacts.People.PRESENCE_STATUS, // 6
- };
-
- private Cursor mCursor;
-
- public void setUp(Context c) {
- mCursor = c.getContentResolver().query(People.CONTENT_URI, PEOPLE_PROJECTION, null,
- null, People.DEFAULT_SORT_ORDER);
- }
-
- public void tearDown() {
- mCursor.close();
- }
-
- public boolean isPerformanceOnly() {
- return true;
- }
-
- public int startPerformance(Intermediates intermediates) {
- // This test can only be run once.
- return 0;
- }
-
- public void run() {
- while (mCursor.moveToNext()) {
- // Read out all of the data
- mCursor.getLong(0);
- mCursor.getLong(1);
- mCursor.getLong(2);
- mCursor.getString(3);
- mCursor.getString(4);
- mCursor.getString(5);
- mCursor.getLong(6);
- }
- }
- }
-
- /**
- * Test 1000 inserts
- */
-
- public static class Perf1Test extends PerformanceBase {
- private static final int SIZE = 1000;
-
- private String[] statements = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- statements[i] =
- "INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')";
- }
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.execSQL(statements[i]);
- }
- }
- }
-
- /**
- * Test 1000 inserts into and indexed table
- */
-
- public static class Perf2Test extends PerformanceBase {
- private static final int SIZE = 1000;
-
- private String[] statements = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- statements[i] =
- "INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')";
- }
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i1c ON t1(c)");
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.execSQL(statements[i]);
- }
- }
- }
-
- /**
- * 100 SELECTs without an index
- */
-
- public static class Perf3Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"count(*)", "avg(b)"};
-
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int lower = i * 100;
- int upper = (i + 10) * 100;
- where[i] = "b >= " + lower + " AND b < " + upper;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase
- .query("t1", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * 100 SELECTs on a string comparison
- */
-
- public static class Perf4Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"count(*)", "avg(b)"};
-
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- where[i] = "c LIKE '" + numberName(i) + "'";
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase
- .query("t1", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * 100 SELECTs with an index
- */
-
- public static class Perf5Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"count(*)", "avg(b)"};
-
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i1b ON t1(b)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int lower = i * 100;
- int upper = (i + 10) * 100;
- where[i] = "b >= " + lower + " AND b < " + upper;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase
- .query("t1", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * INNER JOIN without an index
- */
-
- public static class Perf6Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"t1.a"};
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase
- .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
- }
-
- @Override
- public void run() {
- mDatabase.query("t1 INNER JOIN t2 ON t1.b = t2.b", COLUMNS, null,
- null, null, null, null);
- }
- }
-
- /**
- * INNER JOIN without an index on one side
- */
-
- public static class Perf7Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"t1.a"};
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase
- .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- mDatabase.execSQL("CREATE INDEX i1b ON t1(b)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
- }
-
- @Override
- public void run() {
- mDatabase.query("t1 INNER JOIN t2 ON t1.b = t2.b", COLUMNS, null,
- null, null, null, null);
- }
- }
-
- /**
- * INNER JOIN without an index on one side
- */
-
- public static class Perf8Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"t1.a"};
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase
- .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- mDatabase.execSQL("CREATE INDEX i1b ON t1(b)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
- }
-
- @Override
- public void run() {
- mDatabase.query("t1 INNER JOIN t2 ON t1.c = t2.c", COLUMNS, null,
- null, null, null, null);
- }
- }
-
- /**
- * 100 SELECTs with subqueries. Subquery is using an index
- */
-
- public static class Perf9Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"t1.a"};
-
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase
- .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- mDatabase.execSQL("CREATE INDEX i2b ON t2(b)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int lower = i * 100;
- int upper = (i + 10) * 100;
- where[i] =
- "t1.b IN (SELECT t2.b FROM t2 WHERE t2.b >= " + lower
- + " AND t2.b < " + upper + ")";
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase
- .query("t1", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * 100 SELECTs on string comparison with Index
- */
-
- public static class Perf10Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"count(*)", "avg(b)"};
-
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i3c ON t1(c)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- where[i] = "c LIKE '" + numberName(i) + "'";
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase
- .query("t1", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * 100 SELECTs on integer
- */
-
- public static class Perf11Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"b"};
-
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t1", COLUMNS, null, null, null, null, null);
- }
- }
- }
-
- /**
- * 100 SELECTs on String
- */
-
- public static class Perf12Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"c"};
-
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t1", COLUMNS, null, null, null, null, null);
- }
- }
- }
-
- /**
- * 100 SELECTs on integer with index
- */
-
- public static class Perf13Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"b"};
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i1b on t1(b)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t1", COLUMNS, null, null, null, null, null);
- }
- }
- }
-
- /**
- * 100 SELECTs on String with index
- */
-
- public static class Perf14Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"c"};
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i1c ON t1(c)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t1", COLUMNS, null, null, null, null, null);
- }
- }
- }
-
- /**
- * 100 SELECTs on String with starts with
- */
-
- public static class Perf15Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"c"};
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i1c ON t1(c)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- where[i] = "c LIKE '" + numberName(r).substring(0, 1) + "*'";
-
- }
-
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase
- .query("t1", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * 1000 Deletes on an indexed table
- */
-
- public static class Perf16Test extends PerformanceBase {
- private static final int SIZE = 1000;
- private static final String[] COLUMNS = {"c"};
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i3c ON t1(c)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.delete("t1", null, null);
- }
- }
- }
-
- /**
- * 1000 Deletes
- */
-
- public static class Perf17Test extends PerformanceBase {
- private static final int SIZE = 1000;
- private static final String[] COLUMNS = {"c"};
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.delete("t1", null, null);
- }
- }
- }
-
- /**
- * 1000 DELETE's without an index with where clause
- */
-
- public static class Perf18Test extends PerformanceBase {
- private static final int SIZE = 1000;
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int lower = i * 100;
- int upper = (i + 10) * 100;
- where[i] = "b >= " + lower + " AND b < " + upper;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.delete("t1", where[i], null);
- }
- }
- }
-
- /**
- * 1000 DELETE's with an index with where clause
- */
-
- public static class Perf19Test extends PerformanceBase {
- private static final int SIZE = 1000;
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i1b ON t1(b)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int lower = i * 100;
- int upper = (i + 10) * 100;
- where[i] = "b >= " + lower + " AND b < " + upper;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.delete("t1", where[i], null);
- }
- }
- }
-
- /**
- * 1000 update's with an index with where clause
- */
-
- public static class Perf20Test extends PerformanceBase {
- private static final int SIZE = 1000;
- private String[] where = new String[SIZE];
- ContentValues[] mValues = new ContentValues[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i1b ON t1(b)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
-
- int lower = i * 100;
- int upper = (i + 10) * 100;
- where[i] = "b >= " + lower + " AND b < " + upper;
- ContentValues b = new ContentValues(1);
- b.put("b", upper);
- mValues[i] = b;
-
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.update("t1", mValues[i], where[i], null);
- }
- }
- }
-
- /**
- * 1000 update's without an index with where clause
- */
-
- public static class Perf21Test extends PerformanceBase {
- private static final int SIZE = 1000;
- private String[] where = new String[SIZE];
- ContentValues[] mValues = new ContentValues[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
-
- int lower = i * 100;
- int upper = (i + 10) * 100;
- where[i] = "b >= " + lower + " AND b < " + upper;
- ContentValues b = new ContentValues(1);
- b.put("b", upper);
- mValues[i] = b;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.update("t1", mValues[i], where[i], null);
- }
- }
- }
-
- /**
- * 10000 inserts for an integer
- */
-
- public static class Perf22Test extends PerformanceBase {
- private static final int SIZE = 10000;
- ContentValues[] mValues = new ContentValues[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- ContentValues b = new ContentValues(1);
- b.put("a", r);
- mValues[i] = b;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.insert("t1", null, mValues[i]);
- }
- }
- }
-
- /**
- * 10000 inserts for an integer -indexed table
- */
-
- public static class Perf23Test extends PerformanceBase {
- private static final int SIZE = 10000;
- ContentValues[] mValues = new ContentValues[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER)");
- mDatabase.execSQL("CREATE INDEX i1a ON t1(a)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- ContentValues b = new ContentValues(1);
- b.put("a", r);
- mValues[i] = b;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.insert("t1", null, mValues[i]);
- }
- }
- }
-
- /**
- * 10000 inserts for a String
- */
-
- public static class Perf24Test extends PerformanceBase {
- private static final int SIZE = 10000;
- ContentValues[] mValues = new ContentValues[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- ContentValues b = new ContentValues(1);
- b.put("a", numberName(r));
- mValues[i] = b;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.insert("t1", null, mValues[i]);
- }
- }
- }
-
- /**
- * 10000 inserts for a String - indexed table
- */
-
- public static class Perf25Test extends PerformanceBase {
- private static final int SIZE = 10000;
- ContentValues[] mValues = new ContentValues[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i1a ON t1(a)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- ContentValues b = new ContentValues(1);
- b.put("a", numberName(r));
- mValues[i] = b;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.insert("t1", null, mValues[i]);
- }
- }
- }
-
-
- /**
- * 10000 selects for a String -starts with
- */
-
- public static class Perf26Test extends PerformanceBase {
- private static final int SIZE = 10000;
- private static final String[] COLUMNS = {"t3.a"};
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t3(a VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t3 VALUES('"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- where[i] = "a LIKE '" + numberName(r).substring(0, 1) + "*'";
-
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t3", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * 10000 selects for a String - indexed table -starts with
- */
-
- public static class Perf27Test extends PerformanceBase {
- private static final int SIZE = 10000;
- private static final String[] COLUMNS = {"t3.a"};
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t3(a VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i3a ON t3(a)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t3 VALUES('"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- where[i] = "a LIKE '" + numberName(r).substring(0, 1) + "*'";
-
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t3", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * 10000 selects for an integer -
- */
-
- public static class Perf28Test extends PerformanceBase {
- private static final int SIZE = 10000;
- private static final String[] COLUMNS = {"t4.a"};
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t4(a INTEGER)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t4 VALUES(" + r + ")");
- int lower = i * 100;
- int upper = (i + 10) * 100;
- where[i] = "a >= " + lower + " AND a < " + upper;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t4", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * 10000 selects for an integer -indexed table
- */
-
- public static class Perf29Test extends PerformanceBase {
- private static final int SIZE = 10000;
- private static final String[] COLUMNS = {"t4.a"};
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t4(a INTEGER)");
- mDatabase.execSQL("CREATE INDEX i4a ON t4(a)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t4 VALUES(" + r + ")");
-
- int lower = i * 100;
- int upper = (i + 10) * 100;
- where[i] = "a >= " + lower + " AND a < " + upper;
- }
-
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t4", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
-
- /**
- * 10000 selects for a String - contains 'e'
- */
-
- public static class Perf30Test extends PerformanceBase {
- private static final int SIZE = 10000;
- private static final String[] COLUMNS = {"t3.a"};
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t3(a VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t3 VALUES('"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- where[i] = "a LIKE '*e*'";
-
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t3", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * 10000 selects for a String - contains 'e'-indexed table
- */
-
- public static class Perf31Test extends PerformanceBase {
- private static final int SIZE = 10000;
- private static final String[] COLUMNS = {"t3.a"};
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t3(a VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i3a ON t3(a)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t3 VALUES('"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- where[i] = "a LIKE '*e*'";
-
- }
-
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t3", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- public static final String[] ONES =
- {"zero", "one", "two", "three", "four", "five", "six", "seven",
- "eight", "nine", "ten", "eleven", "twelve", "thirteen",
- "fourteen", "fifteen", "sixteen", "seventeen", "eighteen",
- "nineteen"};
-
- public static final String[] TENS =
- {"", "ten", "twenty", "thirty", "forty", "fifty", "sixty",
- "seventy", "eighty", "ninety"};
-}
diff --git a/core/tests/coretests/src/android/text/format/FormatterTest.java b/core/tests/coretests/src/android/text/format/FormatterTest.java
index a4ce911cf929..ff75c29cc112 100644
--- a/core/tests/coretests/src/android/text/format/FormatterTest.java
+++ b/core/tests/coretests/src/android/text/format/FormatterTest.java
@@ -26,12 +26,13 @@ import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.text.format.Formatter.BytesResult;
-import java.util.Locale;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.Locale;
+
@SmallTest
@RunWith(AndroidJUnit4.class)
public class FormatterTest {
@@ -54,7 +55,7 @@ public class FormatterTest {
@Test
public void testFormatBytes() {
- setLocale(Locale.ENGLISH);
+ setLocale(Locale.US);
checkFormatBytes(0, true, "0", 0);
checkFormatBytes(0, false, "0", 0);
@@ -99,6 +100,95 @@ public class FormatterTest {
checkFormatBytes(9123000, false, "9,12", 9120000);
}
+ private static final long SECOND = 1000;
+ private static final long MINUTE = 60 * SECOND;
+ private static final long HOUR = 60 * MINUTE;
+ private static final long DAY = 24 * HOUR;
+
+ @Test
+ public void testFormatShortElapsedTime() {
+ setLocale(Locale.US);
+ assertEquals("3 days", Formatter.formatShortElapsedTime(mContext, 2 * DAY + 12 * HOUR));
+ assertEquals("2 days", Formatter.formatShortElapsedTime(mContext, 2 * DAY + 11 * HOUR));
+ assertEquals("2 days", Formatter.formatShortElapsedTime(mContext, 2 * DAY));
+ assertEquals("1 day, 23 hr",
+ Formatter.formatShortElapsedTime(mContext, 1 * DAY + 23 * HOUR + 59 * MINUTE));
+ assertEquals("1 day, 0 hr",
+ Formatter.formatShortElapsedTime(mContext, 1 * DAY + 59 * MINUTE));
+ assertEquals("1 day, 0 hr", Formatter.formatShortElapsedTime(mContext, 1 * DAY));
+ assertEquals("24 hr", Formatter.formatShortElapsedTime(mContext, 23 * HOUR + 30 * MINUTE));
+ assertEquals("3 hr", Formatter.formatShortElapsedTime(mContext, 2 * HOUR + 30 * MINUTE));
+ assertEquals("2 hr", Formatter.formatShortElapsedTime(mContext, 2 * HOUR));
+ assertEquals("1 hr, 0 min", Formatter.formatShortElapsedTime(mContext, 1 * HOUR));
+ assertEquals("60 min",
+ Formatter.formatShortElapsedTime(mContext, 59 * MINUTE + 30 * SECOND));
+ assertEquals("59 min",
+ Formatter.formatShortElapsedTime(mContext, 59 * MINUTE));
+ assertEquals("3 min", Formatter.formatShortElapsedTime(mContext, 2 * MINUTE + 30 * SECOND));
+ assertEquals("2 min", Formatter.formatShortElapsedTime(mContext, 2 * MINUTE));
+ assertEquals("1 min, 59 sec",
+ Formatter.formatShortElapsedTime(mContext, 1 * MINUTE + 59 * SECOND + 999));
+ assertEquals("1 min, 0 sec", Formatter.formatShortElapsedTime(mContext, 1 * MINUTE));
+ assertEquals("59 sec", Formatter.formatShortElapsedTime(mContext, 59 * SECOND + 999));
+ assertEquals("1 sec", Formatter.formatShortElapsedTime(mContext, 1 * SECOND));
+ assertEquals("0 sec", Formatter.formatShortElapsedTime(mContext, 1));
+ assertEquals("0 sec", Formatter.formatShortElapsedTime(mContext, 0));
+
+ // Make sure it works on different locales.
+ setLocale(Locale.FRANCE);
+ assertEquals("2 j", Formatter.formatShortElapsedTime(mContext, 2 * DAY));
+ }
+
+ @Test
+ public void testFormatShortElapsedTimeRoundingUpToMinutes() {
+ setLocale(Locale.US);
+ assertEquals("3 days", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 2 * DAY + 12 * HOUR));
+ assertEquals("2 days", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 2 * DAY + 11 * HOUR));
+ assertEquals("2 days", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 2 * DAY));
+ assertEquals("1 day, 23 hr", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 1 * DAY + 23 * HOUR + 59 * MINUTE));
+ assertEquals("1 day, 0 hr", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 1 * DAY + 59 * MINUTE));
+ assertEquals("1 day, 0 hr", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 1 * DAY));
+ assertEquals("24 hr", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 23 * HOUR + 30 * MINUTE));
+ assertEquals("3 hr", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 2 * HOUR + 30 * MINUTE));
+ assertEquals("2 hr", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 2 * HOUR));
+ assertEquals("1 hr, 0 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 1 * HOUR));
+ assertEquals("1 hr, 0 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 59 * MINUTE + 30 * SECOND));
+ assertEquals("59 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 59 * MINUTE));
+ assertEquals("3 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 2 * MINUTE + 30 * SECOND));
+ assertEquals("2 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 2 * MINUTE));
+ assertEquals("2 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 1 * MINUTE + 59 * SECOND + 999));
+ assertEquals("1 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 1 * MINUTE));
+ assertEquals("1 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 59 * SECOND + 999));
+ assertEquals("1 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 1 * SECOND));
+ assertEquals("1 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 1));
+ assertEquals("0 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 0));
+
+ // Make sure it works on different locales.
+ setLocale(new Locale("ru", "RU"));
+ assertEquals("1 мин", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 1 * SECOND));
+ }
+
private void checkFormatBytes(long bytes, boolean useShort,
String expectedString, long expectedRounded) {
BytesResult r = Formatter.formatBytes(mContext.getResources(), bytes,
diff --git a/core/tests/utiltests/Android.mk b/core/tests/utiltests/Android.mk
index f2e02e332bfc..233d070f9507 100644
--- a/core/tests/utiltests/Android.mk
+++ b/core/tests/utiltests/Android.mk
@@ -18,7 +18,6 @@ LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-test \
frameworks-base-testutils \
mockito-target-minus-junit4 \
- legacy-android-tests
LOCAL_JAVA_LIBRARIES := android.test.runner
diff --git a/legacy-test/Android.mk b/legacy-test/Android.mk
index 8efda2ad0c20..e6839997d57e 100644
--- a/legacy-test/Android.mk
+++ b/legacy-test/Android.mk
@@ -48,19 +48,6 @@ LOCAL_JAVA_LIBRARIES := core-oj core-libart framework junit
include $(BUILD_STATIC_JAVA_LIBRARY)
-# Build the legacy-android-tests library
-# ======================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- $(call all-java-files-under, tests)
-LOCAL_MODULE := legacy-android-tests
-LOCAL_NO_STANDARD_LIBRARIES := true
-LOCAL_JAVA_LIBRARIES := core-oj core-libart framework junit
-LOCAL_STATIC_JAVA_LIBRARIES := legacy-android-test
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
ifeq ($(HOST_OS),linux)
# Build the legacy-performance-test-hostdex library
# =================================================
diff --git a/test-runner/src/android/test/suitebuilder/annotation/package.html b/legacy-test/src/android/test/suitebuilder/annotation/package.html
index ffba2e9bf980..ffba2e9bf980 100644
--- a/test-runner/src/android/test/suitebuilder/annotation/package.html
+++ b/legacy-test/src/android/test/suitebuilder/annotation/package.html
diff --git a/legacy-test/src/com/android/internal/util/Predicates.java b/legacy-test/src/com/android/internal/util/Predicates.java
deleted file mode 100644
index fe1ff1529138..000000000000
--- a/legacy-test/src/com/android/internal/util/Predicates.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.util;
-
-import java.util.Arrays;
-
-/**
- * Predicates contains static methods for creating the standard set of
- * {@code Predicate} objects.
- *
- * @hide
- */
-public class Predicates {
-
- private Predicates() {
- }
-
- /**
- * Returns a Predicate that evaluates to true iff each of its components
- * evaluates to true. The components are evaluated in order, and evaluation
- * will be "short-circuited" as soon as the answer is determined.
- */
- public static <T> Predicate<T> and(Predicate<? super T>... components) {
- return Predicates.<T>and(Arrays.asList(components));
- }
-
- /**
- * Returns a Predicate that evaluates to true iff each of its components
- * evaluates to true. The components are evaluated in order, and evaluation
- * will be "short-circuited" as soon as the answer is determined. Does not
- * defensively copy the iterable passed in, so future changes to it will alter
- * the behavior of this Predicate. If components is empty, the returned
- * Predicate will always evaluate to true.
- */
- public static <T> Predicate<T> and(Iterable<? extends Predicate<? super T>> components) {
- return new AndPredicate(components);
- }
-
- /**
- * Returns a Predicate that evaluates to true iff any one of its components
- * evaluates to true. The components are evaluated in order, and evaluation
- * will be "short-circuited" as soon as the answer is determined.
- */
- public static <T> Predicate<T> or(Predicate<? super T>... components) {
- return Predicates.<T>or(Arrays.asList(components));
- }
-
- /**
- * Returns a Predicate that evaluates to true iff any one of its components
- * evaluates to true. The components are evaluated in order, and evaluation
- * will be "short-circuited" as soon as the answer is determined. Does not
- * defensively copy the iterable passed in, so future changes to it will alter
- * the behavior of this Predicate. If components is empty, the returned
- * Predicate will always evaluate to false.
- */
- public static <T> Predicate<T> or(Iterable<? extends Predicate<? super T>> components) {
- return new OrPredicate(components);
- }
-
- /**
- * Returns a Predicate that evaluates to true iff the given Predicate
- * evaluates to false.
- */
- public static <T> Predicate<T> not(Predicate<? super T> predicate) {
- return new NotPredicate<T>(predicate);
- }
-
- private static class AndPredicate<T> implements Predicate<T> {
- private final Iterable<? extends Predicate<? super T>> components;
-
- private AndPredicate(Iterable<? extends Predicate<? super T>> components) {
- this.components = components;
- }
-
- public boolean apply(T t) {
- for (Predicate<? super T> predicate : components) {
- if (!predicate.apply(t)) {
- return false;
- }
- }
- return true;
- }
- }
-
- private static class OrPredicate<T> implements Predicate<T> {
- private final Iterable<? extends Predicate<? super T>> components;
-
- private OrPredicate(Iterable<? extends Predicate<? super T>> components) {
- this.components = components;
- }
-
- public boolean apply(T t) {
- for (Predicate<? super T> predicate : components) {
- if (predicate.apply(t)) {
- return true;
- }
- }
- return false;
- }
- }
-
- private static class NotPredicate<T> implements Predicate<T> {
- private final Predicate<? super T> predicate;
-
- private NotPredicate(Predicate<? super T> predicate) {
- this.predicate = predicate;
- }
-
- public boolean apply(T t) {
- return !predicate.apply(t);
- }
- }
-}
diff --git a/legacy-test/tests/com/android/internal/util/PredicatesTest.java b/legacy-test/tests/com/android/internal/util/PredicatesTest.java
deleted file mode 100644
index c46ff051dd33..000000000000
--- a/legacy-test/tests/com/android/internal/util/PredicatesTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.util;
-
-import junit.framework.TestCase;
-
-import java.util.ArrayList;
-import java.util.Collections;
-
-public class PredicatesTest extends TestCase {
-
- private static final Predicate<Object> TRUE = new Predicate<Object>() {
- public boolean apply(Object o) {
- return true;
- }
- };
-
- private static final Predicate<Object> FALSE = new Predicate<Object>() {
- public boolean apply(Object o) {
- return false;
- }
- };
-
- public void testAndPredicate_AllConditionsTrue() throws Exception {
- assertTrue(Predicates.and(newArrayList(TRUE)).apply(null));
- assertTrue(Predicates.and(newArrayList(TRUE, TRUE)).apply(null));
- }
-
- public void testAndPredicate_AtLeastOneConditionIsFalse() throws Exception {
- assertFalse(Predicates.and(newArrayList(FALSE, TRUE, TRUE)).apply(null));
- assertFalse(Predicates.and(newArrayList(TRUE, FALSE, TRUE)).apply(null));
- assertFalse(Predicates.and(newArrayList(TRUE, TRUE, FALSE)).apply(null));
- }
-
- public void testOrPredicate_AllConditionsTrue() throws Exception {
- assertTrue(Predicates.or(newArrayList(TRUE, TRUE, TRUE)).apply(null));
- }
-
- public void testOrPredicate_AllConditionsFalse() throws Exception {
- assertFalse(Predicates.or(newArrayList(FALSE, FALSE, FALSE)).apply(null));
- }
-
- public void testOrPredicate_AtLeastOneConditionIsTrue() throws Exception {
- assertTrue(Predicates.or(newArrayList(TRUE, FALSE, FALSE)).apply(null));
- assertTrue(Predicates.or(newArrayList(FALSE, TRUE, FALSE)).apply(null));
- assertTrue(Predicates.or(newArrayList(FALSE, FALSE, TRUE)).apply(null));
- }
-
- public void testNotPredicate() throws Exception {
- assertTrue(Predicates.not(FALSE).apply(null));
- assertFalse(Predicates.not(TRUE).apply(null));
- }
-
- private static <E> ArrayList<E> newArrayList(E... elements) {
- ArrayList<E> list = new ArrayList<E>();
- Collections.addAll(list, elements);
- return list;
- }
-
-}
diff --git a/libs/hwui/tests/unit/SkiaBehaviorTests.cpp b/libs/hwui/tests/unit/SkiaBehaviorTests.cpp
index a3d5079c6ce9..85b12ba79a8c 100644
--- a/libs/hwui/tests/unit/SkiaBehaviorTests.cpp
+++ b/libs/hwui/tests/unit/SkiaBehaviorTests.cpp
@@ -51,8 +51,6 @@ TEST(SkiaBehavior, CreateBitmapShader1x1) {
SkShader::TileMode xy[2];
ASSERT_TRUE(s->isABitmap(&bitmap, nullptr, xy))
<< "1x1 bitmap shader must query as bitmap shader";
- EXPECT_EQ(SkShader::kClamp_TileMode, xy[0]);
- EXPECT_EQ(SkShader::kRepeat_TileMode, xy[1]);
EXPECT_EQ(origBitmap.pixelRef(), bitmap.pixelRef());
}
diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java
index c1e81c54f117..f4039889aded 100644
--- a/media/java/android/media/AudioAttributes.java
+++ b/media/java/android/media/AudioAttributes.java
@@ -218,6 +218,7 @@ public final class AudioAttributes implements Parcelable {
SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_COMMUNICATION_DELAYED,SUPPRESSIBLE_NOTIFICATION);
SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_EVENT, SUPPRESSIBLE_NOTIFICATION);
SUPPRESSIBLE_USAGES.put(USAGE_ASSISTANCE_ACCESSIBILITY, SUPPRESSIBLE_NEVER);
+ SUPPRESSIBLE_USAGES.put(USAGE_VOICE_COMMUNICATION, SUPPRESSIBLE_NEVER);
}
/**
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index c7c2dd8aedcd..1dcd214f8891 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -427,7 +427,8 @@ public class AudioSystem
DEVICE_OUT_BLUETOOTH_SCO_HEADSET |
DEVICE_OUT_BLUETOOTH_SCO_CARKIT);
public static final int DEVICE_OUT_ALL_USB = (DEVICE_OUT_USB_ACCESSORY |
- DEVICE_OUT_USB_DEVICE);
+ DEVICE_OUT_USB_DEVICE |
+ DEVICE_OUT_USB_HEADSET);
public static final int DEVICE_OUT_ALL_HDMI_SYSTEM_AUDIO = (DEVICE_OUT_AUX_LINE |
DEVICE_OUT_HDMI_ARC |
DEVICE_OUT_SPDIF);
@@ -489,7 +490,8 @@ public class AudioSystem
DEVICE_IN_DEFAULT);
public static final int DEVICE_IN_ALL_SCO = DEVICE_IN_BLUETOOTH_SCO_HEADSET;
public static final int DEVICE_IN_ALL_USB = (DEVICE_IN_USB_ACCESSORY |
- DEVICE_IN_USB_DEVICE);
+ DEVICE_IN_USB_DEVICE |
+ DEVICE_IN_USB_HEADSET);
// device states, must match AudioSystem::device_connection_state
public static final int DEVICE_STATE_UNAVAILABLE = 0;
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index bf5939fa1737..50145f8a9886 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -276,6 +276,9 @@ public class AudioTrack extends PlayerBase
private static final int AUDIO_OUTPUT_FLAG_FAST = 0x4;
private static final int AUDIO_OUTPUT_FLAG_DEEP_BUFFER = 0x8;
+ // Size of HW_AV_SYNC track AV header.
+ private static final float HEADER_V2_SIZE_BYTES = 20.0f;
+
//--------------------------------------------------------------------------
// Member variables
//--------------------
@@ -364,6 +367,10 @@ public class AudioTrack extends PlayerBase
* HW_AV_SYNC track audio data bytes remaining to write after current AV sync header
*/
private int mAvSyncBytesRemaining = 0;
+ /**
+ * Offset of the first sample of the audio in byte from start of HW_AV_SYNC track AV header.
+ */
+ private int mOffset = 0;
//--------------------------------
// Used exclusively by native code
@@ -603,6 +610,16 @@ public class AudioTrack extends PlayerBase
mSampleRate = sampleRate[0];
mSessionId = session[0];
+ if ((mAttributes.getFlags() & AudioAttributes.FLAG_HW_AV_SYNC) != 0) {
+ int frameSizeInBytes;
+ if (AudioFormat.isEncodingLinearFrames(mAudioFormat)) {
+ frameSizeInBytes = mChannelCount * AudioFormat.getBytesPerSample(mAudioFormat);
+ } else {
+ frameSizeInBytes = 1;
+ }
+ mOffset = ((int) Math.ceil(HEADER_V2_SIZE_BYTES / frameSizeInBytes)) * frameSizeInBytes;
+ }
+
if (mDataLoadMode == MODE_STATIC) {
mState = STATE_NO_STATIC_DATA;
} else {
@@ -2520,14 +2537,15 @@ public class AudioTrack extends PlayerBase
// create timestamp header if none exists
if (mAvSyncHeader == null) {
- mAvSyncHeader = ByteBuffer.allocate(16);
+ mAvSyncHeader = ByteBuffer.allocate(mOffset);
mAvSyncHeader.order(ByteOrder.BIG_ENDIAN);
- mAvSyncHeader.putInt(0x55550001);
+ mAvSyncHeader.putInt(0x55550002);
}
if (mAvSyncBytesRemaining == 0) {
mAvSyncHeader.putInt(4, sizeInBytes);
mAvSyncHeader.putLong(8, timestamp);
+ mAvSyncHeader.putInt(16, mOffset);
mAvSyncHeader.position(0);
mAvSyncBytesRemaining = sizeInBytes;
}
diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java
index dfd2bb35d6ea..44bd252a349e 100644
--- a/media/java/android/media/session/MediaSession.java
+++ b/media/java/android/media/session/MediaSession.java
@@ -43,6 +43,7 @@ import android.service.media.MediaBrowserService;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
+import android.view.ViewConfiguration;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -200,8 +201,7 @@ public final class MediaSession {
return;
}
if (mCallback != null) {
- // We're updating the callback, clear the session from the old
- // one.
+ // We're updating the callback, clear the session from the old one.
mCallback.mCallback.mSession = null;
}
if (handler == null) {
@@ -735,6 +735,8 @@ public final class MediaSession {
*/
public abstract static class Callback {
private MediaSession mSession;
+ private CallbackMessageHandler mHandler;
+ private boolean mMediaPlayPauseKeyPending;
public Callback() {
}
@@ -766,13 +768,41 @@ public final class MediaSession {
* @return True if the event was handled, false otherwise.
*/
public boolean onMediaButtonEvent(@NonNull Intent mediaButtonIntent) {
- if (mSession != null
+ if (mSession != null && mHandler != null
&& Intent.ACTION_MEDIA_BUTTON.equals(mediaButtonIntent.getAction())) {
KeyEvent ke = mediaButtonIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (ke != null && ke.getAction() == KeyEvent.ACTION_DOWN) {
PlaybackState state = mSession.mPlaybackState;
long validActions = state == null ? 0 : state.getActions();
switch (ke.getKeyCode()) {
+ case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
+ case KeyEvent.KEYCODE_HEADSETHOOK:
+ if (ke.getRepeatCount() > 0) {
+ // Consider long-press as a single tap.
+ handleMediaPlayPauseKeySingleTapIfPending();
+ } else if (mMediaPlayPauseKeyPending) {
+ // Consider double tap as the next.
+ mHandler.removeMessages(CallbackMessageHandler
+ .MSG_PLAY_PAUSE_KEY_DOUBLE_TAP_TIMEOUT);
+ mMediaPlayPauseKeyPending = false;
+ if ((validActions & PlaybackState.ACTION_SKIP_TO_NEXT) != 0) {
+ onSkipToNext();
+ }
+ } else {
+ mMediaPlayPauseKeyPending = true;
+ mHandler.sendEmptyMessageDelayed(CallbackMessageHandler
+ .MSG_PLAY_PAUSE_KEY_DOUBLE_TAP_TIMEOUT,
+ ViewConfiguration.getDoubleTapTimeout());
+ }
+ return true;
+ default:
+ // If another key is pressed within double tap timeout, consider the
+ // pending play/pause as a single tap to handle media keys in order.
+ handleMediaPlayPauseKeySingleTapIfPending();
+ break;
+ }
+
+ switch (ke.getKeyCode()) {
case KeyEvent.KEYCODE_MEDIA_PLAY:
if ((validActions & PlaybackState.ACTION_PLAY) != 0) {
onPlay();
@@ -815,28 +845,33 @@ public final class MediaSession {
return true;
}
break;
- case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
- case KeyEvent.KEYCODE_HEADSETHOOK:
- boolean isPlaying = state == null ? false
- : state.getState() == PlaybackState.STATE_PLAYING;
- boolean canPlay = (validActions & (PlaybackState.ACTION_PLAY_PAUSE
- | PlaybackState.ACTION_PLAY)) != 0;
- boolean canPause = (validActions & (PlaybackState.ACTION_PLAY_PAUSE
- | PlaybackState.ACTION_PAUSE)) != 0;
- if (isPlaying && canPause) {
- onPause();
- return true;
- } else if (!isPlaying && canPlay) {
- onPlay();
- return true;
- }
- break;
}
}
}
return false;
}
+ private void handleMediaPlayPauseKeySingleTapIfPending() {
+ if (!mMediaPlayPauseKeyPending) {
+ return;
+ }
+ mMediaPlayPauseKeyPending = false;
+ mHandler.removeMessages(CallbackMessageHandler.MSG_PLAY_PAUSE_KEY_DOUBLE_TAP_TIMEOUT);
+ PlaybackState state = mSession.mPlaybackState;
+ long validActions = state == null ? 0 : state.getActions();
+ boolean isPlaying = state != null
+ && state.getState() == PlaybackState.STATE_PLAYING;
+ boolean canPlay = (validActions & (PlaybackState.ACTION_PLAY_PAUSE
+ | PlaybackState.ACTION_PLAY)) != 0;
+ boolean canPause = (validActions & (PlaybackState.ACTION_PLAY_PAUSE
+ | PlaybackState.ACTION_PAUSE)) != 0;
+ if (isPlaying && canPause) {
+ onPause();
+ } else if (!isPlaying && canPlay) {
+ onPlay();
+ }
+ }
+
/**
* Override to handle requests to prepare playback. During the preparation, a session should
* not hold audio focus in order to allow other sessions play seamlessly. The state of
@@ -1294,12 +1329,14 @@ public final class MediaSession {
private static final int MSG_CUSTOM_ACTION = 20;
private static final int MSG_ADJUST_VOLUME = 21;
private static final int MSG_SET_VOLUME = 22;
+ private static final int MSG_PLAY_PAUSE_KEY_DOUBLE_TAP_TIMEOUT = 23;
private MediaSession.Callback mCallback;
public CallbackMessageHandler(Looper looper, MediaSession.Callback callback) {
super(looper, null, true);
mCallback = callback;
+ mCallback.mHandler = this;
}
public void post(int what, Object obj, Bundle bundle) {
@@ -1401,6 +1438,9 @@ public final class MediaSession {
vp.onSetVolumeTo((int) msg.obj);
}
break;
+ case MSG_PLAY_PAUSE_KEY_DOUBLE_TAP_TIMEOUT:
+ mCallback.handleMediaPlayPauseKeySingleTapIfPending();
+ break;
}
}
}
diff --git a/native/webview/Android.mk b/native/webview/Android.mk
new file mode 100644
index 000000000000..a2a93d7d664d
--- /dev/null
+++ b/native/webview/Android.mk
@@ -0,0 +1,19 @@
+#
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Include all the makefiles for subdirectories.
+include $(call all-subdir-makefiles)
+
diff --git a/native/webview/OWNERS b/native/webview/OWNERS
new file mode 100644
index 000000000000..deee852093d7
--- /dev/null
+++ b/native/webview/OWNERS
@@ -0,0 +1,4 @@
+boliu@google.com
+sgurun@google.com
+tobiasjs@google.com
+torne@google.com
diff --git a/native/webview/loader/Android.mk b/native/webview/loader/Android.mk
new file mode 100644
index 000000000000..e8a7d9743cb9
--- /dev/null
+++ b/native/webview/loader/Android.mk
@@ -0,0 +1,40 @@
+#
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This package provides the system interfaces required to load WebView.
+
+LOCAL_PATH := $(call my-dir)
+
+# Loader library which handles address space reservation and relro sharing.
+# Does NOT link any native chromium code.
+include $(CLEAR_VARS)
+
+LOCAL_MODULE:= libwebviewchromium_loader
+
+LOCAL_SRC_FILES := \
+ loader.cpp \
+
+LOCAL_CFLAGS := \
+ -Werror \
+
+LOCAL_SHARED_LIBRARIES += \
+ libdl \
+ liblog \
+ libnativeloader \
+
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/native/webview/loader/loader.cpp b/native/webview/loader/loader.cpp
new file mode 100644
index 000000000000..376dbb844906
--- /dev/null
+++ b/native/webview/loader/loader.cpp
@@ -0,0 +1,259 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+// Uncomment for verbose logging.
+// #define LOG_NDEBUG 0
+#define LOG_TAG "webviewchromiumloader"
+
+#include <dlfcn.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include <jni.h>
+#include <android/dlext.h>
+#include <nativeloader/native_loader.h>
+#include <utils/Log.h>
+
+#define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
+
+namespace android {
+namespace {
+
+void* gReservedAddress = NULL;
+size_t gReservedSize = 0;
+
+jint LIBLOAD_SUCCESS;
+jint LIBLOAD_FAILED_TO_OPEN_RELRO_FILE;
+jint LIBLOAD_FAILED_TO_LOAD_LIBRARY;
+jint LIBLOAD_FAILED_JNI_CALL;
+jint LIBLOAD_FAILED_TO_FIND_NAMESPACE;
+
+jboolean DoReserveAddressSpace(jlong size) {
+ size_t vsize = static_cast<size_t>(size);
+
+ void* addr = mmap(NULL, vsize, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (addr == MAP_FAILED) {
+ ALOGE("Failed to reserve %zd bytes of address space for future load of "
+ "libwebviewchromium.so: %s",
+ vsize, strerror(errno));
+ return JNI_FALSE;
+ }
+ gReservedAddress = addr;
+ gReservedSize = vsize;
+ ALOGV("Reserved %zd bytes at %p", vsize, addr);
+ return JNI_TRUE;
+}
+
+jboolean DoCreateRelroFile(const char* lib, const char* relro) {
+ // Try to unlink the old file, since if this is being called, the old one is
+ // obsolete.
+ if (unlink(relro) != 0 && errno != ENOENT) {
+ // If something went wrong other than the file not existing, log a warning
+ // but continue anyway in the hope that we can successfully overwrite the
+ // existing file with rename() later.
+ ALOGW("Failed to unlink old file %s: %s", relro, strerror(errno));
+ }
+ static const char tmpsuffix[] = ".XXXXXX";
+ char relro_tmp[strlen(relro) + sizeof(tmpsuffix)];
+ strlcpy(relro_tmp, relro, sizeof(relro_tmp));
+ strlcat(relro_tmp, tmpsuffix, sizeof(relro_tmp));
+ int tmp_fd = TEMP_FAILURE_RETRY(mkstemp(relro_tmp));
+ if (tmp_fd == -1) {
+ ALOGE("Failed to create temporary file %s: %s", relro_tmp, strerror(errno));
+ return JNI_FALSE;
+ }
+ android_dlextinfo extinfo;
+ extinfo.flags = ANDROID_DLEXT_RESERVED_ADDRESS | ANDROID_DLEXT_WRITE_RELRO;
+ extinfo.reserved_addr = gReservedAddress;
+ extinfo.reserved_size = gReservedSize;
+ extinfo.relro_fd = tmp_fd;
+ void* handle = android_dlopen_ext(lib, RTLD_NOW, &extinfo);
+ int close_result = close(tmp_fd);
+ if (handle == NULL) {
+ ALOGE("Failed to load library %s: %s", lib, dlerror());
+ unlink(relro_tmp);
+ return JNI_FALSE;
+ }
+ if (close_result != 0 ||
+ chmod(relro_tmp, S_IRUSR | S_IRGRP | S_IROTH) != 0 ||
+ rename(relro_tmp, relro) != 0) {
+ ALOGE("Failed to update relro file %s: %s", relro, strerror(errno));
+ unlink(relro_tmp);
+ return JNI_FALSE;
+ }
+ ALOGV("Created relro file %s for library %s", relro, lib);
+ return JNI_TRUE;
+}
+
+jint DoLoadWithRelroFile(JNIEnv* env, const char* lib, const char* relro,
+ jobject clazzLoader) {
+ int relro_fd = TEMP_FAILURE_RETRY(open(relro, O_RDONLY));
+ if (relro_fd == -1) {
+ ALOGE("Failed to open relro file %s: %s", relro, strerror(errno));
+ return LIBLOAD_FAILED_TO_OPEN_RELRO_FILE;
+ }
+ android_namespace_t* ns =
+ android::FindNamespaceByClassLoader(env, clazzLoader);
+ if (ns == NULL) {
+ ALOGE("Failed to find classloader namespace");
+ return LIBLOAD_FAILED_TO_FIND_NAMESPACE;
+ }
+ android_dlextinfo extinfo;
+ extinfo.flags = ANDROID_DLEXT_RESERVED_ADDRESS | ANDROID_DLEXT_USE_RELRO |
+ ANDROID_DLEXT_USE_NAMESPACE;
+ extinfo.reserved_addr = gReservedAddress;
+ extinfo.reserved_size = gReservedSize;
+ extinfo.relro_fd = relro_fd;
+ extinfo.library_namespace = ns;
+ void* handle = android_dlopen_ext(lib, RTLD_NOW, &extinfo);
+ close(relro_fd);
+ if (handle == NULL) {
+ ALOGE("Failed to load library %s: %s", lib, dlerror());
+ return LIBLOAD_FAILED_TO_LOAD_LIBRARY;
+ }
+ ALOGV("Loaded library %s with relro file %s", lib, relro);
+ return LIBLOAD_SUCCESS;
+}
+
+/******************************************************************************/
+/* JNI wrappers - handle string lifetimes and 32/64 ABI choice */
+/******************************************************************************/
+
+jboolean ReserveAddressSpace(JNIEnv*, jclass, jlong size) {
+ return DoReserveAddressSpace(size);
+}
+
+jboolean CreateRelroFile(JNIEnv* env, jclass, jstring lib32, jstring lib64,
+ jstring relro32, jstring relro64) {
+#ifdef __LP64__
+ jstring lib = lib64;
+ jstring relro = relro64;
+ (void)lib32; (void)relro32;
+#else
+ jstring lib = lib32;
+ jstring relro = relro32;
+ (void)lib64; (void)relro64;
+#endif
+ jboolean ret = JNI_FALSE;
+ const char* lib_utf8 = env->GetStringUTFChars(lib, NULL);
+ if (lib_utf8 != NULL) {
+ const char* relro_utf8 = env->GetStringUTFChars(relro, NULL);
+ if (relro_utf8 != NULL) {
+ ret = DoCreateRelroFile(lib_utf8, relro_utf8);
+ env->ReleaseStringUTFChars(relro, relro_utf8);
+ }
+ env->ReleaseStringUTFChars(lib, lib_utf8);
+ }
+ return ret;
+}
+
+jint LoadWithRelroFile(JNIEnv* env, jclass, jstring lib, jstring relro32,
+ jstring relro64, jobject clazzLoader) {
+#ifdef __LP64__
+ jstring relro = relro64;
+ (void)relro32;
+#else
+ jstring relro = relro32;
+ (void)relro64;
+#endif
+ jint ret = LIBLOAD_FAILED_JNI_CALL;
+ const char* lib_utf8 = env->GetStringUTFChars(lib, NULL);
+ if (lib_utf8 != NULL) {
+ const char* relro_utf8 = env->GetStringUTFChars(relro, NULL);
+ if (relro_utf8 != NULL) {
+ ret = DoLoadWithRelroFile(env, lib_utf8, relro_utf8, clazzLoader);
+ env->ReleaseStringUTFChars(relro, relro_utf8);
+ }
+ env->ReleaseStringUTFChars(lib, lib_utf8);
+ }
+ return ret;
+}
+
+const char kWebViewFactoryClassName[] = "android/webkit/WebViewFactory";
+const char kWebViewLibraryLoaderClassName[] =
+ "android/webkit/WebViewLibraryLoader";
+const JNINativeMethod kJniMethods[] = {
+ { "nativeReserveAddressSpace", "(J)Z",
+ reinterpret_cast<void*>(ReserveAddressSpace) },
+ { "nativeCreateRelroFile",
+ "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z",
+ reinterpret_cast<void*>(CreateRelroFile) },
+ { "nativeLoadWithRelroFile",
+ "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)I",
+ reinterpret_cast<void*>(LoadWithRelroFile) },
+};
+
+} // namespace
+
+void RegisterWebViewFactory(JNIEnv* env) {
+ // If either of these fail, it will set an exception that will be thrown on
+ // return, so no need to handle errors here.
+ jclass clazz = env->FindClass(kWebViewFactoryClassName);
+ if (clazz) {
+ LIBLOAD_SUCCESS = env->GetStaticIntField(
+ clazz,
+ env->GetStaticFieldID(clazz, "LIBLOAD_SUCCESS", "I"));
+
+ LIBLOAD_FAILED_TO_OPEN_RELRO_FILE = env->GetStaticIntField(
+ clazz,
+ env->GetStaticFieldID(clazz, "LIBLOAD_FAILED_TO_OPEN_RELRO_FILE", "I"));
+
+ LIBLOAD_FAILED_TO_LOAD_LIBRARY = env->GetStaticIntField(
+ clazz,
+ env->GetStaticFieldID(clazz, "LIBLOAD_FAILED_TO_LOAD_LIBRARY", "I"));
+
+ LIBLOAD_FAILED_JNI_CALL = env->GetStaticIntField(
+ clazz,
+ env->GetStaticFieldID(clazz, "LIBLOAD_FAILED_JNI_CALL", "I"));
+
+ LIBLOAD_FAILED_TO_FIND_NAMESPACE = env->GetStaticIntField(
+ clazz,
+ env->GetStaticFieldID(clazz, "LIBLOAD_FAILED_TO_FIND_NAMESPACE", "I"));
+ }
+}
+
+void RegisterWebViewLibraryLoader(JNIEnv* env) {
+ // If either of these fail, it will set an exception that will be thrown on
+ // return, so no need to handle errors here.
+ jclass clazz = env->FindClass(kWebViewLibraryLoaderClassName);
+ if (clazz) {
+ env->RegisterNatives(clazz, kJniMethods, NELEM(kJniMethods));
+ }
+}
+
+} // namespace android
+
+JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void*) {
+ JNIEnv* env = NULL;
+ if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
+ ALOGE("GetEnv failed");
+ return JNI_ERR;
+ }
+ android::RegisterWebViewFactory(env);
+ // Ensure there isn't a pending Java exception before registering methods from
+ // WebViewLibraryLoader
+ if (!env->ExceptionCheck()) {
+ android::RegisterWebViewLibraryLoader(env);
+ }
+ return JNI_VERSION_1_6;
+}
diff --git a/packages/BackupRestoreConfirmation/res/values-da/strings.xml b/packages/BackupRestoreConfirmation/res/values-da/strings.xml
index 28aea3374b02..3a749153a0b3 100644
--- a/packages/BackupRestoreConfirmation/res/values-da/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-da/strings.xml
@@ -19,7 +19,7 @@
<string name="backup_confirm_title" msgid="827563724209303345">"Fuld sikkerhedskopiering"</string>
<string name="restore_confirm_title" msgid="5469365809567486602">"Fuld genoprettelse"</string>
<string name="backup_confirm_text" msgid="1878021282758896593">"Der er anmodet om en fuld sikkerhedskopiering af alle data til en tilsluttet stationær computer. Vil du tillade dette?\n\nHvis du ikke har anmodet om sikkerhedskopiering, skal du ikke tillade denne handling."</string>
- <string name="allow_backup_button_label" msgid="4217228747769644068">"Sikkerhedskopier mine data"</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"Sikkerhedskopiér mine data"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Undlad at sikkerhedskopiere"</string>
<string name="restore_confirm_text" msgid="7499866728030461776">"Der er anmodet om en fuld sikkerhedskopiering af alle data til en tilsluttet stationær computer. Vil du tillade dette?\n\nHvis du ikke har anmodet om sikkerhedskopiering, skal du ikke tillade denne handling."</string>
<string name="allow_restore_button_label" msgid="3081286752277127827">"Gendan mine data"</string>
diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
index 20b12b4823ac..3dc170f0fa8d 100644
--- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
+++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
@@ -375,6 +375,9 @@ public class CaptivePortalLoginActivity extends Activity {
return;
} else if (mPagesLoaded == 2) {
// Prevent going back to empty first page.
+ // Fix for missing focus, see b/62449959 for details. Remove it once we get a
+ // newer version of WebView (60.x.y).
+ view.requestFocus();
view.clearHistory();
}
testForCaptivePortal();
diff --git a/packages/MtpDocumentsProvider/res/values-af/strings.xml b/packages/MtpDocumentsProvider/res/values-af/strings.xml
new file mode 100644
index 000000000000..c2c8761146f3
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-af/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP-gasheer"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Aflaaie"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Toegang tot lêers word tans van <xliff:g id="DEVICE_MODEL">%1$s</xliff:g> af verkry"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Die ander toestel is besig. Jy kan nie lêers oordra voordat dit beskikbaar is nie."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Geen lêers is gevind nie. Die ander toestel is dalk gesluit. Indien wel, ontsluit dit en probeer weer."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-am/strings.xml b/packages/MtpDocumentsProvider/res/values-am/strings.xml
new file mode 100644
index 000000000000..7b721c86cec0
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-am/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"የMTP አስተናጋጅ"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"የወረዱ"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"ፋይሎችን ከ<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> በመድረስ ላይ"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"ሌላኛው መሣሪያ ሥራ በዝቶበታል። እስከሚገኝ ድረስ ፋይሎችን ማስተላለፍ አይችሉም።"</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"ምንም ፋይሎች አልተገኙም። ሌላኛው መሣሪያ ተቆልፎ ሊሆን ይችላል። ተቆልፎ ከሆነ ይክፈቱት እና እንደገና ይሞክሩ።"</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-ar/strings.xml b/packages/MtpDocumentsProvider/res/values-ar/strings.xml
new file mode 100644
index 000000000000..284a8602ce6a
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-ar/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"‏مضيف بروتوكول نقل الوسائط (MTP)"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"التنزيلات"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"جارٍ الوصول إلى الملفات من <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"الجهاز الآخر مشغول، ولا يمكنك نقل الملفات إلا بعد أن يصبح متاحًا."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"لم يتم العثور على ملفات، وربما يكون الجهاز الآخر في وضع القفل. إذا كان الأمر كذلك، فعليك إلغاء قفله وإعادة المحاولة."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-az/strings.xml b/packages/MtpDocumentsProvider/res/values-az/strings.xml
new file mode 100644
index 000000000000..e8ed1242f13c
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-az/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP Host"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Endirmələr"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Fayllara <xliff:g id="DEVICE_MODEL">%1$s</xliff:g> cihazından daxil olunur"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Digər cihaz məşğuldur. Əlçatan olmayana kimi fayl köçürə bilməzsiniz."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Fayl tapılmadı. Digər cihaz kilidlənmiş ola bilər. Elədirsə, kiliddən çıxarın və yenidən cəhd edin."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-b+sr+Latn/strings.xml b/packages/MtpDocumentsProvider/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 000000000000..bc9009969a16
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP host"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Preuzimanja"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Pristup datotekama sa uređaja <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Drugi uređaj je zauzet. Datoteke možete da prenesete tek kad on postane dostupan."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Nije pronađena nijedna datoteka. Drugi uređaj je možda zaključan. Ako jeste, otključajte ga i pokušajte ponovo."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-be/strings.xml b/packages/MtpDocumentsProvider/res/values-be/strings.xml
new file mode 100644
index 000000000000..f6263acb0150
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-be/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Вузел MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Спампоўкі"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Доступ да файлаў з <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Іншая прылада занята. Вы не можаце перадаць файлы, пакуль яна не стане даступнай."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Файлы не знойдзены. Іншая прылада можа быць заблакіравана. Калі гэта так, разблакіруйце яе і паўтарыце спробу."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-bg/strings.xml b/packages/MtpDocumentsProvider/res/values-bg/strings.xml
new file mode 100644
index 000000000000..52d311971fc1
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-bg/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP хост"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Изтегляния"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> на <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"От <xliff:g id="DEVICE_MODEL">%1$s</xliff:g> се осъществява достъп до файловете"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Другото устройство е заето. Не можете да прехвърляте файлове, докато то не се освободи."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Няма намерени файлове. Другото устройство може да е заключено. Ако е така, отключете го и опитайте отново."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-bn/strings.xml b/packages/MtpDocumentsProvider/res/values-bn/strings.xml
new file mode 100644
index 000000000000..7fad89e89d60
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-bn/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP হোস্ট"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"ডাউনলোডগুলি"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> থেকে ফাইলগুলিকে অ্যাক্সেস করা হচ্ছে"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"অন্য ডিভাইসটি ব্যস্ত আছে৷ এটি উপলব্ধ না হওয়া পর্যন্ত আপনি ফাইলগুলিকে স্থানান্তর করতে পারবেন না৷"</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"কোনো ফাইল পাওয়া যায়নি৷ অন্য ডিভাইসটি লক থাকতে পারে৷ যদি তাই হয়, তাহলে এটিকে আনলক করে আবার চেষ্টা করুন৷"</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-bs/strings.xml b/packages/MtpDocumentsProvider/res/values-bs/strings.xml
new file mode 100644
index 000000000000..33323f81f81a
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-bs/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP Host"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Preuzimanja"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Pristupanje datotekama iz uređaja <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Drugi uređaj je zauzet. Nećete moći prenositi fajlove dok ne bude dostupan."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Fajlovi nisu pronađeni. Moguće je da je drugi uređaj zaključan. Ako jeste, otključajte ga i pokušajte ponovo."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-ca/strings.xml b/packages/MtpDocumentsProvider/res/values-ca/strings.xml
new file mode 100644
index 000000000000..b2aa59966ac4
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-ca/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Amfitrió MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Baixades"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> de <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"S\'està accedint als fitxers del dispositiu <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"L\'altre dispositiu està ocupat. No pots transferir fitxers fins que estigui disponible."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"No s\'han trobat fitxers. És possible que l\'altre dispositiu estigui bloquejat. Si és així, desbloqueja\'l i torna-ho a provar."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-cs/strings.xml b/packages/MtpDocumentsProvider/res/values-cs/strings.xml
new file mode 100644
index 000000000000..2156e8c52f7e
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-cs/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Hostitel MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Stahování"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> – <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Používání souborů ze zařízení <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Druhé zařízení je zaneprázdněné. Dokud nebude dostupné, soubory nelze přenést."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Nebyly nalezeny žádné soubory. Druhé zařízení je možná uzamčené. Pokud ano, odemkněte jej a zkuste to znovu."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-da/strings.xml b/packages/MtpDocumentsProvider/res/values-da/strings.xml
new file mode 100644
index 000000000000..b82c5e8b0af8
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-da/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP-host"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Adgang til filer fra <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Den anden enhed er optaget. Du kan ikke overføre filer, før den er tilgængelig."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Der blev ikke fundet nogen filer. Den anden enhed er muligvis låst. Hvis dette er tilfældet, skal du låse den op og prøve igen."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-de/strings.xml b/packages/MtpDocumentsProvider/res/values-de/strings.xml
new file mode 100644
index 000000000000..9a71c769aaed
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-de/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP-Host"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> von <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Zugriff auf Dateien von <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Das andere Gerät ist nicht verfügbar. Du kannst die Dateien übertragen, sobald das Gerät wieder verfügbar ist."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Keine Dateien gefunden. Das andere Gerät ist möglicherweise gesperrt. Entsperre es in diesem Fall und versuche es noch einmal."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-el/strings.xml b/packages/MtpDocumentsProvider/res/values-el/strings.xml
new file mode 100644
index 000000000000..562d2952988a
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-el/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Κεντρικός υπολογιστής MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Λήψεις"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Πρόσβαση στα αρχεία από τη συσκευή <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Η άλλη συσκευή είναι απασχολημένη. Δεν μπορείτε να μεταφέρετε αρχεία μέχρι να γίνει διαθέσιμη."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Δεν βρέθηκαν αρχεία. Η άλλη συσκευή ενδέχεται να είναι κλειδωμένη. Εάν ισχύει αυτό, ξεκλειδώστε την και δοκιμάστε ξανά."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-en-rAU/strings.xml b/packages/MtpDocumentsProvider/res/values-en-rAU/strings.xml
new file mode 100644
index 000000000000..5f2167e8273a
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-en-rAU/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP Host"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Accessing files from <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"The other device is busy. You can\'t transfer files until it\'s available."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"No files found. The other device may be locked. If so, unlock it and try again."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-en-rGB/strings.xml b/packages/MtpDocumentsProvider/res/values-en-rGB/strings.xml
new file mode 100644
index 000000000000..5f2167e8273a
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-en-rGB/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP Host"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Accessing files from <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"The other device is busy. You can\'t transfer files until it\'s available."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"No files found. The other device may be locked. If so, unlock it and try again."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-en-rIN/strings.xml b/packages/MtpDocumentsProvider/res/values-en-rIN/strings.xml
new file mode 100644
index 000000000000..5f2167e8273a
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-en-rIN/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP Host"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Accessing files from <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"The other device is busy. You can\'t transfer files until it\'s available."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"No files found. The other device may be locked. If so, unlock it and try again."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-es-rUS/strings.xml b/packages/MtpDocumentsProvider/res/values-es-rUS/strings.xml
new file mode 100644
index 000000000000..740d224d7136
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-es-rUS/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Host MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Descargas"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Accediendo a los archivos de <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"El otro dispositivo está ocupado. No podrás transferir archivos hasta que esté disponible."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"No se encontraron archivos. Es posible que el otro dispositivo esté bloqueado. Si es así, desbloquéalo y vuelve a intentarlo."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-es/strings.xml b/packages/MtpDocumentsProvider/res/values-es/strings.xml
new file mode 100644
index 000000000000..d80a75ac07f7
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-es/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Host de MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Descargas"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> de <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Accediendo a los archivos desde <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"El otro dispositivo está ocupado. No se pueden transferir archivos hasta que esté disponible."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"No se ha encontrado ningún archivo. Es posible que el otro dispositivo esté bloqueado. Si es así, desbloquéalo y vuelve a intentarlo."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-et/strings.xml b/packages/MtpDocumentsProvider/res/values-et/strings.xml
new file mode 100644
index 000000000000..7568777e15f7
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-et/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP host"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Allalaadimised"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g>, <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Juurdepääsemine failidele seadmest <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Teine seade on hõivatud. Te ei saa faile üle viia enne, kui see seade on saadaval."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Faile ei leitud. Teine seade võib olla lukustatud. Kui see on nii, avage see ja proovige uuesti."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-eu/strings.xml b/packages/MtpDocumentsProvider/res/values-eu/strings.xml
new file mode 100644
index 000000000000..dc9d463b98eb
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-eu/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP ostalaria"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Deskargak"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> gailuko fitxategiak atzitzen"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Beste gailua lanpetuta dago. Erabilgarri egon arte ezingo duzu transferitu fitxategirik."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Ez da aurkitu fitxategirik. Baliteke beste gailua blokeatuta egotea. Hala bada, desblokea ezazu eta saiatu berriro."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-fa/strings.xml b/packages/MtpDocumentsProvider/res/values-fa/strings.xml
new file mode 100644
index 000000000000..9ac58c7ad3f1
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-fa/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"‏میزبان MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"بارگیری‌ها"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"دسترسی به فایل‌ها از <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"دستگاه دیگر مشغول است. تا زمانی که این دستگاه دردسترس قرار نگیرد نمی‌توانید فایل‌ها را منتقل کنید."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"فایلی پیدا نشد. دستگاه دیگر ممکن است قفل باشد. اگر این‌طور است، قفل آن را باز کنید و دوباره تلاش کنید."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-fi/strings.xml b/packages/MtpDocumentsProvider/res/values-fi/strings.xml
new file mode 100644
index 000000000000..0a61d08a566e
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-fi/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP-isäntä"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Lataukset"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Käytetään laitteen <xliff:g id="DEVICE_MODEL">%1$s</xliff:g> tiedostoja"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Toinen laite on varattu. Et voi siirtää tiedostoja, ennen kuin se on käytettävissä."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Tiedostoja ei löytynyt. Toinen laite voi olla lukittu. Jos näin on, avaa se ja yritä uudelleen."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-fr-rCA/strings.xml b/packages/MtpDocumentsProvider/res/values-fr-rCA/strings.xml
new file mode 100644
index 000000000000..281760ecb620
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-fr-rCA/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Hôte MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Téléchargements"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Accès aux fichiers à partir de l\'appareil <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"L\'autre appareil est occupé. Vous devez attendre qu\'il soit disponible pour transférer des fichiers."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Aucun fichier trouvé. L\'autre appareil est peut-être verrouillé. Si c\'est le cas, déverrouillez-le, puis réessayez."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-fr/strings.xml b/packages/MtpDocumentsProvider/res/values-fr/strings.xml
new file mode 100644
index 000000000000..96c713b61af4
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-fr/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Hôte MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Téléchargements"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> – <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Accès aux fichiers depuis le <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>…"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"L\'autre appareil est occupé. Vous devez attendre qu\'il soit disponible pour transférer des fichiers."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Aucun fichier trouvé. L\'autre appareil est peut-être verrouillé. Si tel est le cas, déverrouillez-le, puis réessayez."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-gl/strings.xml b/packages/MtpDocumentsProvider/res/values-gl/strings.xml
new file mode 100644
index 000000000000..7e61c7cedff9
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-gl/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Host MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Descargas"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> de <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Accedendo aos ficheiros do dispositivo <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"O outro dispositivo está ocupado. Non podes transferir ficheiros ata que estea dispoñible."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Non se atopou ningún ficheiro. Se o outro dispositivo está bloqueado, desbloquéao e téntao de novo."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-gu/strings.xml b/packages/MtpDocumentsProvider/res/values-gu/strings.xml
new file mode 100644
index 000000000000..40ec38ddcda9
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-gu/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP હોસ્ટ"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"ડાઉનલોડ્સ"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> ની ફાઇલોને ઍક્સેસ કરી રહ્યાં છે"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"અન્ય ઉપકરણ વ્યસ્ત છે. તે ઉપલબ્ધ ન થાય ત્યાં સુધી તમે ફાઇલોને સ્થાનાંતરિત કરી શકતાં નથી."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"કોઈ ફાઇલો મળી નહીં. અન્ય ઉપકરણ લૉક કરેલ હોઈ શકે છે. જો આમ હોય, તો તેને અનલૉક કરો અને ફરી પ્રયાસ કરો."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-hi/strings.xml b/packages/MtpDocumentsProvider/res/values-hi/strings.xml
new file mode 100644
index 000000000000..1cf1c03780e8
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-hi/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP होस्ट"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"डाउनलोड"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> से फ़ाइलें एक्सेस कर रहा है"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"दूसरा डिवाइस व्यस्त है. आप उसके उपलब्ध हो जाने तक फ़ाइलें स्थानांतरित नहीं कर सकते हैं."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"कोई फ़ाइल नहीं मिली. हो सकता है कि दूसरा डिवाइस लॉक हो. यदि ऐसा है, तो उसे अनलॉक करें और पुन: प्रयास करें."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-hr/strings.xml b/packages/MtpDocumentsProvider/res/values-hr/strings.xml
new file mode 100644
index 000000000000..63fc5c768113
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-hr/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP host"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Preuzimanja"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g><xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Pristupanje datotekama s uređaja <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Drugi je uređaj zauzet. Datoteke ćete moći prenijeti kada postane dostupan."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Datoteke nisu pronađene. Drugi je uređaj možda zaključan. U tom ga slučaju otključajte i pokušajte ponovo."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-hu/strings.xml b/packages/MtpDocumentsProvider/res/values-hu/strings.xml
new file mode 100644
index 000000000000..e5b822c14271
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-hu/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP Host"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Letöltések"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Hozzáférés a fájlokhoz a következő eszközről: <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"A másik eszköz elfoglalt. Nem vihetők át fájlok addig, amíg rendelkezésre nem áll."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Nem található fájl. Lehet, hogy a másik eszköz zárolva van. Ha igen, oldja fel, és próbálkozzon újra."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-hy/strings.xml b/packages/MtpDocumentsProvider/res/values-hy/strings.xml
new file mode 100644
index 000000000000..3a6bfb50de44
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-hy/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP խնամորդ"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Ներբեռնումներ"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Մուտք է գործում ֆայլեր <xliff:g id="DEVICE_MODEL">%1$s</xliff:g> սարքից"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Մյուս սարքը զբաղված է: Ֆայլերը կարող եք փոխանցել միայն երբ այն հասանելի է:"</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Ֆայլեր չեն գտնվել: Հնարավոր է, որ մյուս սարքը կողպված է: Եթե դա այդպես է, ապակողպեք այն և փորձեք նորից:"</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-in/strings.xml b/packages/MtpDocumentsProvider/res/values-in/strings.xml
new file mode 100644
index 000000000000..6f65337a1d61
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-in/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Host MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Download"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Mengakses file dari <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Perangkat lainnya sedang sibuk. Anda dapat mentransfer file jika telah tersedia."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"File tidak ditemukan. Perangkat lainnya mungkin terkunci. Jika begitu, buka kuncinya dan coba lagi."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-is/strings.xml b/packages/MtpDocumentsProvider/res/values-is/strings.xml
new file mode 100644
index 000000000000..9388f7e76efa
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-is/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP-hýsill"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Niðurhal"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Fær aðgang að skrám frá <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Hitt tækið er upptekið. Þú getur ekki fært skrár fyrr en það er tiltækt."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Engar skrár fundust. Hitt tækið gæti verið læst. Ef svo er skaltu opna það og reyna aftur."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-it/strings.xml b/packages/MtpDocumentsProvider/res/values-it/strings.xml
new file mode 100644
index 000000000000..a41699f55282
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-it/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Host MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Download"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> di <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Accesso ai file da <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"L\'altro dispositivo è occupato. I file non possono essere trasferiti fino a quando non sarà disponibile."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Nessun file trovato. L\'altro dispositivo potrebbe essere bloccato. In questo caso, sbloccalo e riprova."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-iw/strings.xml b/packages/MtpDocumentsProvider/res/values-iw/strings.xml
new file mode 100644
index 000000000000..62dfe7dd4ebb
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-iw/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"‏מארח פרוטוקול העברת מדיה (MTP)"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"הורדות"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"גישה לקבצים מ-<xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"המכשיר השני לא פנוי. ניתן יהיה להעביר קבצים רק לאחר שהוא יהיה זמין."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"לא נמצאו קבצים. ייתכן שהמכשיר השני נעול. אם כן, פתח אותו ונסה שוב."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-ja/strings.xml b/packages/MtpDocumentsProvider/res/values-ja/strings.xml
new file mode 100644
index 000000000000..4ae59f5d9037
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-ja/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP ホスト"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"ダウンロード"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> からファイルにアクセスしています"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"接続先の端末は使用中のため、利用できるようになるまでファイルを転送できません。"</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"ファイルが見つかりません。接続先の端末がロックされている可能性があります。その場合は、ロックを解除してからもう一度お試しください。"</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-ka/strings.xml b/packages/MtpDocumentsProvider/res/values-ka/strings.xml
new file mode 100644
index 000000000000..33812dfbf3df
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-ka/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP ჰოსტი"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"ჩამოტვირთვები"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"მიმდინარეობს <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>-ზე არსებულ ფაილებზე წვდომა"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"სხვა მოწყობილობა დაკავებულია. ფაილების გადატანა ვერ მოხერხდება, სანამ ის ხელმისაწვდომი არ გახდება."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"ფაილები ვერ მოიძებნა. მეორე მოწყობილობა შეიძლება დაბლოკილი იყოს. ამ შემთხვევაში, განბლოკეთ ის და ცადეთ ხელახლა."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-kk/strings.xml b/packages/MtpDocumentsProvider/res/values-kk/strings.xml
new file mode 100644
index 000000000000..a6dea5b97b03
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-kk/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP хосты"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Жүктеп алынғандар"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Файлдарға <xliff:g id="DEVICE_MODEL">%1$s</xliff:g> құрылғысынан кіру"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Екінші құрылғы бос емес. Ол босамайынша, файлдар тасымалданбайды."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Ешқандай файл табылмады. Екінші құрылғы құлыптаулы болуы мүмкін. Құлыптаулы болса, құлпын ашып, қайталап көріңіз."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-km/strings.xml b/packages/MtpDocumentsProvider/res/values-km/strings.xml
new file mode 100644
index 000000000000..baffa95c426b
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-km/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"ម៉ាស៊ីន MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"ដោយឡូត"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"កំពុងចូលដំណើរការពី <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"ឧបករណ៍ផ្សេងទៀតកំពុងជាប់រវល់។ អ្នកមិនផ្ទេរឯកសារបានទេ រហូតទាល់តែវាអាចប្រើបាន។"</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"រកមិនឃើញឯកសារទេ។ ឧបករណ៍ផ្សេងទៀតប្រហែលជាត្រូវបានចាក់សោ។ ប្រសិនបើវាត្រូវបានចាក់សោមែន សូមដោះសោ ហើយព្យាយាមម្តងទៀត។"</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-kn/strings.xml b/packages/MtpDocumentsProvider/res/values-kn/strings.xml
new file mode 100644
index 000000000000..3f16c142aba1
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-kn/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP ಹೋಸ್ಟ್"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"ಡೌನ್‌ಲೋಡ್‌ಗಳು"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> ನಿಂದ ಫೈಲ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಲಾಗುತ್ತಿದೆ"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"ಬೇರೆಯ ಸಾಧನವು ಕಾರ್ಯನಿರತವಾಗಿದೆ. ಇದು ಲಭ್ಯವಾಗುವವರೆಗೆ ಫೈಲ್‌ಗಳನ್ನು ನಿಮಗೆ ವರ್ಗಾಯಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"ಯಾವುದೇ ಫೈಲ್‌ಗಳು ಕಂಡುಬಂದಿಲ್ಲ. ಬೇರೆಯ ಸಾಧನವು ಲಾಕ್ ಆಗಿರಬಹುದು. ಹಾಗಾದಲ್ಲಿ, ಇದನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-ko/strings.xml b/packages/MtpDocumentsProvider/res/values-ko/strings.xml
new file mode 100644
index 000000000000..bbe2fe6d78a4
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-ko/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP 호스트"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"다운로드"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g>에서 파일에 액세스 중"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"다른 기기가 사용 중입니다. 다른 기기를 사용할 수 있을 때까지 파일을 전송할 수 없습니다."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"파일이 없습니다. 다른 기기가 잠겨 있을 수 있습니다. 기기의 잠금을 해제하고 다시 시도하세요."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-ky/strings.xml b/packages/MtpDocumentsProvider/res/values-ky/strings.xml
new file mode 100644
index 000000000000..e60a494a9919
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-ky/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP хосту"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Жүктөлүп алынган нерселер"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> түзмөгүндөгү файлдар колдонулууда"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Берки түзмөк бош эмес. Ал бошомоюнча файлдарды өткөрө албайсыз."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Бир дагы файл табылган жок. Берки түзмөк кулпуланып турат окшойт. Кулпусун ачып, кайра аракет кылып көрүңүз."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-lo/strings.xml b/packages/MtpDocumentsProvider/res/values-lo/strings.xml
new file mode 100644
index 000000000000..bcc0ee6b7ff3
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-lo/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"ໂຮສ MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"ການດາວໂຫລດ"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"ກຳລັງເຂົ້າເຖິງໄຟລ໌ຈາກ <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"ອຸປະກອນອື່ນບໍ່ຫວ່າງເທື່ອ. ທ່ານບໍ່ສາມາດໂອນຍ້າຍໄຟລ໌ໄດ້ຈົນກວ່າມັນຈະຫວ່າງ."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"ບໍ່ພົບໄຟລ໌. ອຸປະກອນອີກເຄື່ອງອາດຖືກລັອກໄວ້ຢູ່. ຫາກມັນຖືກລັອກໄວ້, ໃຫ້ປົດລັອກມັນກ່ອນແລ້ວລອງໃໝ່ອີກຄັ້ງ."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-lt/strings.xml b/packages/MtpDocumentsProvider/res/values-lt/strings.xml
new file mode 100644
index 000000000000..8bff3a8fe78a
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-lt/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MPP priegloba"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Atsisiuntimai"</string>
+ <string name="root_name" msgid="5819495383921089536">"„<xliff:g id="DEVICE_MODEL">%1$s</xliff:g>“ <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Pasiekiami failai iš „<xliff:g id="DEVICE_MODEL">%1$s</xliff:g>“"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Kitas įrenginys yra užsiėmęs. Failus galėsite perkelti tik tada, kai jis bus pasiekiamas."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Nerasta failų. Gali būti, kad kitas įrenginys yra užrakintas. Jei taip yra, atrakinkite jį ir bandykite dar kartą."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-lv/strings.xml b/packages/MtpDocumentsProvider/res/values-lv/strings.xml
new file mode 100644
index 000000000000..5e96338afaa0
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-lv/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP saimniekdators"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Lejupielādes"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Piekļuve failiem no: <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Otra ierīce ir aizņemta. Varēsiet pārsūtīt failus tikai tad, kad tā būs pieejama."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Neviens fails netika atrasts. Iespējams, otra ierīce ir bloķēta. Ja tā ir, atbloķējiet ierīci un mēģiniet vēlreiz."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-mk/strings.xml b/packages/MtpDocumentsProvider/res/values-mk/strings.xml
new file mode 100644
index 000000000000..6028b716ec9e
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-mk/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP-хост"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Преземања"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Се пристапува до датотеки од <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Другиот уред е зафатен. Не може да се пренесуваат датотеки сѐ додека не стане достапен."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Не се најдени датотеки. Другиот уред можеби е заклучен. Ако е така, отклучете го и обидете се повторно."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-ml/strings.xml b/packages/MtpDocumentsProvider/res/values-ml/strings.xml
new file mode 100644
index 000000000000..49eb847b1173
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-ml/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP ഹോസ്റ്റ്"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"ഡൗണ്‍ലോഡുകൾ"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> ഉപകരണത്തിൽ നിന്ന് ഫയലുകൾ ആക്സസ്സ് ചെയ്യുന്നു"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"രണ്ടാമത്തെ ഉപകരണം തിരക്കിലാണ്. അത് ലഭ്യമാകുന്നത് വരെ നിങ്ങൾക്ക് ഫയലുകൾ കൈമാറാൻ കഴിയില്ല."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"ഫയലുകളൊന്നും കണ്ടെത്തിയില്ല. രണ്ടാമത്തെ ഉപകരണം ലോക്കുചെയ്ത നിലയിലായിരിക്കാം. ആണെങ്കിൽ, അൺലോക്കുചെയ്ത് വീണ്ടും ശ്രമിക്കുക."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-mn/strings.xml b/packages/MtpDocumentsProvider/res/values-mn/strings.xml
new file mode 100644
index 000000000000..43b8204e7599
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-mn/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP Хост"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Таталт"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g>-с файлд хандаж байна"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Нөгөө төхөөрөмж завгүй байна. Үүнийг боломжтой болох хүртэл файл шилжүүлэх боломжгүй."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Файл олдсонгүй. Нөгөө төхөөрөмж түгжигдсэн байж болзошгүй. Ингэсэн тохиолдолд түгжээг нь тайлаад, дахин оролдоно уу."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-mr/strings.xml b/packages/MtpDocumentsProvider/res/values-mr/strings.xml
new file mode 100644
index 000000000000..5b856dc4ec19
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-mr/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP होस्ट"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"डाउनलोड"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> मधून फायलींंमध्ये प्रवेश करीत आहे"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"अन्य डिव्हाइस व्यस्त आहे. ते उपलब्‍ध होईपर्यंत आपण फायली हस्तांतरित करू शकत नाही."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"कोणत्याही फायली आढळल्या नाहीत. अन्य डिव्हाइस कदाचित बंद असू शकते. तसे असल्यास, ते अनलॉक करा आणि पुन्हा प्रयत्न करा."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-ms/strings.xml b/packages/MtpDocumentsProvider/res/values-ms/strings.xml
new file mode 100644
index 000000000000..febec1d349af
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-ms/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Hos MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Muat turun"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Mengakses fail daripada <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Peranti lain sedang sibuk. Anda tidak boleh memindahkan fail sehingga peranti itu tersedia."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Tiada fail ditemui. Peranti lain itu mungkin dikunci. Jika benar, sila buka kuncinya dan cuba lagi."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-my/strings.xml b/packages/MtpDocumentsProvider/res/values-my/strings.xml
new file mode 100644
index 000000000000..8b509fbf0167
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-my/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP လက်ခံစက်"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"ဒေါင်းလုဒ်များ"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> မှ ဖိုင်များကို အသုံးပြုနေသည်"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"တခြားစက်ပစ္စည်းသည် မအားသေးပါ။ ၎င်းအဆင်သင့် မဖြစ်သေးသ၍ ဖိုင်များကို လွှဲပြောင်း၍ရမည် မဟုတ်ပါ။"</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"မည်သည့်ဖိုင်မျှ မတွေ့ပါ။ ၎င်းစက်ပစ္စည်းကို လော့ခ်ချထားပုံရပါသည်။ သို့ဖြစ်လျှင် ၎င်းကိုလော့ခ်ဖြုတ်ပြီး ထပ်လုပ်ကြည့်ပါ။"</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-nb/strings.xml b/packages/MtpDocumentsProvider/res/values-nb/strings.xml
new file mode 100644
index 000000000000..40fabed73f40
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-nb/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP-vert"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Nedlastinger"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> på <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Bruker filer på <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Den andre enheten er opptatt. Du kan ikke overføre filer før den er tilgjengelig."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Ingen filer ble funnet. Den andre enheten kan være låst. I så fall må du låse den opp og prøve igjen."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-ne/strings.xml b/packages/MtpDocumentsProvider/res/values-ne/strings.xml
new file mode 100644
index 000000000000..53c0954d296e
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-ne/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP होस्ट"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"डाउनलोडहरू"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> बाट फाइलहरूमाथि पहुँच राख्दै"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"अर्को यन्त्र व्यस्त छ। त्यो यन्त्र उपलब्ध नभएसम्म तपाईं फाइल स्थानान्तरण गर्न सक्नुहुन्न।"</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"कुनै फाइल भेट्टिएन। अर्को यन्त्र लक गरिएको हुन सक्छ। यदि त्यसो हो भने त्यसलाई अनलक गरेर फेरि प्रयास गर्नुहोस्।"</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-nl/strings.xml b/packages/MtpDocumentsProvider/res/values-nl/strings.xml
new file mode 100644
index 000000000000..b1a01b2cd8a9
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-nl/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP-host"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Bestanden openen op <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Het andere apparaat wordt gebruikt. Je moet wachten tot het beschikbaar is om bestanden te kunnen overzetten."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Geen bestanden gevonden. Het kan zijn dat het andere apparaat is vergrendeld. Als dat het geval is, ontgrendel je het en probeer je het opnieuw."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-pa/strings.xml b/packages/MtpDocumentsProvider/res/values-pa/strings.xml
new file mode 100644
index 000000000000..ab8ba1592ba7
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-pa/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP ਹੋਸਟ"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"ਡਾਊਨਲੋਡ"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> ਦੀਆਂ ਫ਼ਾਈਲਾਂ \'ਤੇ ਪਹੁੰਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"ਦੂਜੀ ਡੀਵਾਈਸ ਰੁਝੇਵੇਂ ਵਿੱਚ ਹੈ। ਉਸਦੇ ਉਪਲਬਧ ਹੋਣ ਤੱਕ ਤੁਸੀਂ ਫ਼ਾਈਲਾਂ ਦਾ ਤਬਾਦਲਾ ਨਹੀਂ ਕਰ ਸਕਦੇ।"</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"ਕੋਈ ਫ਼ਾਈਲਾਂ ਨਹੀਂ ਮਿਲੀਆਂ। ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਦੂਜੀ ਡੀਵਾਈਸ ਲੌਕ ਹੋਵੇ। ਜੇਕਰ ਇੰਝ ਹੈ, ਤਾਂ ਉਸਨੂੰ ਅਨਲੌਕ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-pl/strings.xml b/packages/MtpDocumentsProvider/res/values-pl/strings.xml
new file mode 100644
index 000000000000..69fa0f4473ca
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-pl/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Host MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Pobrane"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> – <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Uzyskuję dostęp do plików na urządzeniu <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Drugie urządzenie jest zajęte. Dopóki nie będzie dostępne, nie możesz przesłać plików."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Nie znaleziono plików. Drugie urządzenie może być zablokowane. Jeśli tak jest, odblokuj je i spróbuj ponownie."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-pt-rBR/strings.xml b/packages/MtpDocumentsProvider/res/values-pt-rBR/strings.xml
new file mode 100644
index 000000000000..03a14263f9c3
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-pt-rBR/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Host do MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> do <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Acessando arquivos do <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"O outro dispositivo está ocupado. Não é possível transferir arquivos até que ele esteja disponível."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Nenhum arquivo encontrado. É possível que o outro dispositivo esteja bloqueado. Se for o caso, desbloqueie-o e tente novamente."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-pt-rPT/strings.xml b/packages/MtpDocumentsProvider/res/values-pt-rPT/strings.xml
new file mode 100644
index 000000000000..05d32d40fa27
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-pt-rPT/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Anfitrião MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Transferências"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Aceder a ficheiros do <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"O outro dispositivo está ocupado. Não pode transferir os ficheiros enquanto não estiver disponível."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Nenhum ficheiro encontrado. O outro dispositivo pode estar bloqueado. Se assim for, desbloqueie e tente novamente."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-pt/strings.xml b/packages/MtpDocumentsProvider/res/values-pt/strings.xml
new file mode 100644
index 000000000000..03a14263f9c3
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-pt/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Host do MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> do <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Acessando arquivos do <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"O outro dispositivo está ocupado. Não é possível transferir arquivos até que ele esteja disponível."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Nenhum arquivo encontrado. É possível que o outro dispositivo esteja bloqueado. Se for o caso, desbloqueie-o e tente novamente."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-ro/strings.xml b/packages/MtpDocumentsProvider/res/values-ro/strings.xml
new file mode 100644
index 000000000000..21ebc57836b4
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-ro/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Gazdă MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Descărcări"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Se accesează fișierele de pe <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Celălalt dispozitiv este ocupat. Nu puteți să transferați fișiere înainte să fie disponibil."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Nu s-au găsit fișiere. Este posibil ca celălalt dispozitiv să fie blocat. În acest caz, deblocați-l și încercați din nou."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-ru/strings.xml b/packages/MtpDocumentsProvider/res/values-ru/strings.xml
new file mode 100644
index 000000000000..717f12f5403f
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-ru/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP-хост"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Загрузки"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Доступ к файлам на устройстве <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>…"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Другое устройство занято. Вы сможете передать файлы, когда оно будет доступно."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Файлы не найдены. Если другое устройство заблокировано, разблокируйте его и повторите попытку."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-si/strings.xml b/packages/MtpDocumentsProvider/res/values-si/strings.xml
new file mode 100644
index 000000000000..7a096b0a356a
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-si/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP සංග්‍රාහක"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"බාගැනීම්"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> වෙතින් ගොනු වෙත පිවිසීම"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"අනෙක් උපාංගය කාර්ය බහුලය. එය ලබා ගත හැකි වන තෙක් ඔබට ගොනු මාරු කළ නොහැකිය."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"ගොනු හමු නොවීය. අනෙක් උපාංගය අගුලු දමා තිබිය හැකිය. එසේ නම්, එය අගුලු හැර නැවත උත්සාහ කරන්න."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-sk/strings.xml b/packages/MtpDocumentsProvider/res/values-sk/strings.xml
new file mode 100644
index 000000000000..365e1b7ba0ae
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-sk/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Hostiteľ MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Stiahnuté súbory"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Prístup k súborom zo zariadenia <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Druhé zariadenie je zaneprázdnené. Súbory bude možné preniesť, keď bude k dispozícii."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Nenašli sa žiadne súbory. Druhé zariadenie môže byť uzamknuté. Ak je to tak, odomknite ho a skúste to znova."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-sl/strings.xml b/packages/MtpDocumentsProvider/res/values-sl/strings.xml
new file mode 100644
index 000000000000..60945d64fe8f
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-sl/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Gostitelj MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Prenosi"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Dostopanje do datotek iz naprave <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Druga naprava ni na voljo. Dokler ne bo na voljo, ne bo mogoče prenašati datotek."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Ni datotek. Druga naprava je morda zaklenjena. Če je zaklenjena, jo odklenite in poskusite znova."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-sq/strings.xml b/packages/MtpDocumentsProvider/res/values-sq/strings.xml
new file mode 100644
index 000000000000..d92f29f6db60
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-sq/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Pritësi i protokollit MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Shkarkimet"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Po qaset te skedarët nga <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Pajisja tjetër është e zënë. Nuk mund të transferosh skedarë deri sa të jetë në dispozicion."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Nuk u gjet asnjë skedar. Pajisja tjetër mund të jetë e kyçur. Nëse po, shkyçe dhe provo përsëri."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-sr/strings.xml b/packages/MtpDocumentsProvider/res/values-sr/strings.xml
new file mode 100644
index 000000000000..d91c5c4354ce
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-sr/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP хост"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Преузимања"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Приступ датотекама са уређаја <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Други уређај је заузет. Датотеке можете да пренесете тек кад он постане доступан."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Није пронађена ниједна датотека. Други уређај је можда закључан. Ако јесте, откључајте га и покушајте поново."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-sv/strings.xml b/packages/MtpDocumentsProvider/res/values-sv/strings.xml
new file mode 100644
index 000000000000..26818eb220ce
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-sv/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP-värd"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Nedladdningar"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Åtkomst till filer från <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Den andra enheten är upptagen. Du kan inte överföra filer förrän den är tillgänglig."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Inga filer hittades. Den andra enheten kan vara låst. Om den är det låser du upp den och försöker igen."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-sw/strings.xml b/packages/MtpDocumentsProvider/res/values-sw/strings.xml
new file mode 100644
index 000000000000..de3ed54b367f
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-sw/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Seva pangishi ya MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Vipakuliwa"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Inafikia faili kwenye <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Kifaa hicho kingine kinatumika. Huwezi kuhamisha faili hadi kipatikane."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Hakuna faili zilizopatikana. Huenda kifaa hicho kingine kimefungwa. Ikiwa kimefungwa, kifungue na ujaribu tena."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-ta/strings.xml b/packages/MtpDocumentsProvider/res/values-ta/strings.xml
new file mode 100644
index 000000000000..c6e6e6204e2f
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-ta/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP ஹோஸ்ட்"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"இறக்கங்கள்"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> இலிருந்து கோப்புகளை அணுகுகிறது"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"பிற சாதனம் பணிமிகுதியில் உள்ளதால், அந்தப் பணி முடியும் வரை கோப்புகளை இடமாற்ற முடியாது."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"கோப்புகள் இல்லை. பிற சாதனம் பூட்டப்பட்டிருக்கக்கூடும் என்பதால் முதலில் அதைத் திறந்து, மீண்டும் முயலவும்."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-te/strings.xml b/packages/MtpDocumentsProvider/res/values-te/strings.xml
new file mode 100644
index 000000000000..7add85835da7
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-te/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP హోస్ట్"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"డౌన్‌లోడ్‌లు"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> నుండి ఫైల్‌లను ప్రాప్యత చేస్తోంది"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"ఇతర పరికరం బిజీగా ఉంది. అది అందుబాటులోకి వచ్చే వరకు మీరు ఫైల్‌లను బదిలీ చేయలేరు."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"ఫైల్‍లు ఏవీ కనుగొనబడలేదు. ఇతర పరికరం లాక్ చేయబడి ఉండవచ్చు. అలా జరిగి ఉంటే, దాన్ని అన్‌లాక్ చేసి, ఆపై మళ్లీ ప్రయత్నించండి."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-th/strings.xml b/packages/MtpDocumentsProvider/res/values-th/strings.xml
new file mode 100644
index 000000000000..d2b62fe516e1
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-th/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"โฮสต์ MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"ดาวน์โหลด"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"กำลังเข้าถึงไฟล์จาก <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"อุปกรณ์อีกเครื่องหนึ่งไม่ว่าง คุณไม่สามารถโอนไฟล์จนกว่าอุปกรณ์จะสามารถใช้ได้"</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"ไม่พบไฟล์ อุปกรณ์อีกเครื่องหนึ่งอาจล็อกอยู่ หากเป็นเช่นนั้น ให้ปลดล็อกและลองอีกครั้ง"</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-tl/strings.xml b/packages/MtpDocumentsProvider/res/values-tl/strings.xml
new file mode 100644
index 000000000000..68b2eba38ea3
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-tl/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Host ng MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Mga Download"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Nag-a-access ng mga file mula sa <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Abala ang kabilang device. Hindi ka makakapaglipat ng mga file hanggang sa maging available ito."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Walang natagpuang mga file. Maaaring naka-lock ang kabilang device. Kung gayon, i-unlock ito at subukang muli."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-tr/strings.xml b/packages/MtpDocumentsProvider/res/values-tr/strings.xml
new file mode 100644
index 000000000000..14250ef527c7
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-tr/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP Ana Makinesi"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"İndirilenler"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> cihazdaki dosyalara erişiliyor"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Diğer cihaz meşgul. Cihaz kullanılabilir duruma gelene kadar dosyaları aktaramazsınız."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Hiçbir dosya bulunamadı. Diğer cihaz kilitli olabilir. Kilitliyse, kilidini açıp tekrar deneyin."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-uk/strings.xml b/packages/MtpDocumentsProvider/res/values-uk/strings.xml
new file mode 100644
index 000000000000..8589f8c594b6
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-uk/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Хост MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Завантаження"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Відкриваються файли з пристрою <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Інший пристрій зайнятий. Щоб передавати файли, він має бути доступним."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Не вдалося знайти файли. Можливо, інший пристрій заблоковано. У такому разі розблокуйте його та повторіть спробу."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-ur/strings.xml b/packages/MtpDocumentsProvider/res/values-ur/strings.xml
new file mode 100644
index 000000000000..17578ae51b9f
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-ur/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"‏MTP میزبان"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"ڈاؤن لوڈز"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> سے فائلوں کی رسائی ہو رہی ہے"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"دوسرا آلہ مصروف ہے۔ اس کے دستیاب ہونے تک آپ فائلیں منتقل نہیں کر سکتے۔"</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"کوئی فائلیں نہیں ملیں۔ ہو سکتا ہے دوسرا آلہ مقفل ہو۔ اگر ایسا ہے تو اسے غیر مقفل کریں اور دوبارہ کوشش کریں۔"</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-uz/strings.xml b/packages/MtpDocumentsProvider/res/values-uz/strings.xml
new file mode 100644
index 000000000000..c511172076c0
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-uz/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP Host"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Yuklanmalar"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g><xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> qurilmasidan fayllar o‘qilmoqda"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Ulangan qurilma band. U bo‘shamaguncha fayllarni o‘tkazib bo‘lmaydi."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Hech qanday fayl topilmadi. Ulangan qurilma qulflangan bo‘lishi mumkin. Agar shunday bo‘lsa, uni qulfdan chiqaring va qayta urinib ko‘ring."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-vi/strings.xml b/packages/MtpDocumentsProvider/res/values-vi/strings.xml
new file mode 100644
index 000000000000..0eb63106d85e
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-vi/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Máy chủ MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Tải xuống"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Đang truy cập tệp từ <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Thiết bị khác đang bận. Bạn không thể chuyển tệp cho đến khi thiết bị rảnh."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Không tìm thấy tệp. Thiết bị khác có thể đã bị khóa. Nếu như vậy, hãy mở khóa thiết bị rồi thử lại."</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-zh-rCN/strings.xml b/packages/MtpDocumentsProvider/res/values-zh-rCN/strings.xml
new file mode 100644
index 000000000000..7f1f3942c911
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-zh-rCN/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP 主机"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"下载"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"正在访问 <xliff:g id="DEVICE_MODEL">%1$s</xliff:g> 的文件"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"另一台设备正忙。您必须等到该设备可用时才能传输文件。"</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"未找到任何文件。另一台设备可能处于锁定状态;如果是这样,请解锁该设备并重试。"</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-zh-rHK/strings.xml b/packages/MtpDocumentsProvider/res/values-zh-rHK/strings.xml
new file mode 100644
index 000000000000..be8c5482c13c
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-zh-rHK/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"媒體傳輸協定主機"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"下載"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> 的「<xliff:g id="STORAGE_NAME">%2$s</xliff:g>」"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"正在從 <xliff:g id="DEVICE_MODEL">%1$s</xliff:g> 存取檔案"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"另一部裝置目前處於忙碌狀態,要等到該裝置可用時才能轉移檔案。"</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"找不到檔案。如果另一部裝置處於鎖定狀態,請解鎖該裝置,然後再試一次。"</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-zh-rTW/strings.xml b/packages/MtpDocumentsProvider/res/values-zh-rTW/strings.xml
new file mode 100644
index 000000000000..2fe3c06898e0
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-zh-rTW/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"媒體傳輸通訊協定主機"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"下載"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"正在從 <xliff:g id="DEVICE_MODEL">%1$s</xliff:g> 存取檔案"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"另一個裝置忙碌中。必須等到該裝置可用時才能轉移檔案。"</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"找不到任何檔案。如果另一個裝置處於鎖定狀態,請將該裝置解鎖後再試一次。"</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-zu/strings.xml b/packages/MtpDocumentsProvider/res/values-zu/strings.xml
new file mode 100644
index 000000000000..f3f720676b22
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-zu/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"Ukusingatha kwe-MTP"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"Okulandiwe"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Ifinyelela kumafayela kusukela ku-<xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"Enye idivayisi imatasatasa. Awukwazi ukudlulisela amafayela ize itholakale."</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"Awekho amafayela atholiwe. Enye idivayisi kungenzeka ikhiyiwe. Uma kunjalo, yivule uphinde uzame futhi."</string>
+</resources>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 7e2e7d5a93f0..8ceb1d8c630b 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -50,7 +50,7 @@
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Bağlantı kesiliyor…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Bağlanıyor…"</string>
<string name="bluetooth_connected" msgid="6038755206916626419">"Bağlandı"</string>
- <string name="bluetooth_pairing" msgid="1426882272690346242">"Eşleştiriliyor…"</string>
+ <string name="bluetooth_pairing" msgid="1426882272690346242">"Eşleniyor…"</string>
<string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Bağlandı (telefon yok)"</string>
<string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Bağlandı (medya yok)"</string>
<string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Bağlı (mesaj erişimi yok)"</string>
@@ -83,14 +83,14 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Telefon sesi için kullan"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Dosya aktarımı için kullan"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Giriş için kullan"</string>
- <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Eşleştir"</string>
- <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"EŞLEŞTİR"</string>
+ <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Eşle"</string>
+ <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"EŞLE"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"İptal"</string>
<string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"Eşleme işlemi, bağlantı kurulduğunda kişilerinize ve çağrı geçmişine erişim izni verir."</string>
- <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ile eşleştirilemedi."</string>
- <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"PIN veya parola yanlış olduğundan <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ile eşleştirilemedi"</string>
+ <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ile eşlenemedi."</string>
+ <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"PIN veya parola yanlış olduğundan <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ile eşlenemedi"</string>
<string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ile iletişim kurulamıyor."</string>
- <string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"Eşleştirme <xliff:g id="DEVICE_NAME">%1$s</xliff:g> tarafından reddedildi."</string>
+ <string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"Eşleme <xliff:g id="DEVICE_NAME">%1$s</xliff:g> tarafından reddedildi."</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Kablosuz kapalı."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Kablosuz bağlantı kesildi."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Kablosuz sinyal gücü tek çubuk."</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java b/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java
index b06b0328f8fd..7357fe63d9b0 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java
@@ -107,4 +107,20 @@ public class AppUtils {
return false;
}
+ /** Returns the label for a given package. */
+ public static CharSequence getApplicationLabel(
+ PackageManager packageManager, String packageName) {
+ try {
+ final ApplicationInfo appInfo =
+ packageManager.getApplicationInfo(
+ packageName,
+ PackageManager.MATCH_DISABLED_COMPONENTS
+ | PackageManager.MATCH_ANY_USER);
+ return appInfo.loadLabel(packageManager);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.w(TAG, "Unable to find info for package: " + packageName);
+ }
+ return null;
+ }
+
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
index fc1a3a902c73..38fe8790e4d0 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
@@ -4,7 +4,6 @@ import android.content.Context;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceGroup;
import android.support.v7.preference.PreferenceScreen;
-import java.util.List;
/**
* A controller that manages event for preference.
@@ -40,17 +39,6 @@ public abstract class AbstractPreferenceController {
}
/**
- * Updates non-indexable keys for search provider.
- *
- * Called by SearchIndexProvider#getNonIndexableKeys
- */
- public void updateNonIndexableKeys(List<String> keys) {
- if (!isAvailable()) {
- keys.add(getPreferenceKey());
- }
- }
-
- /**
* Returns true if preference is available (should be displayed)
*/
public abstract boolean isAvailable();
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index edb322680c69..d45ed1922aa4 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -703,6 +703,9 @@ public class AccessPoint implements Comparable<AccessPoint> {
case WifiConfiguration.NetworkSelectionStatus.DISABLED_AUTHENTICATION_FAILURE:
summary.append(mContext.getString(R.string.wifi_disabled_password_failure));
break;
+ case WifiConfiguration.NetworkSelectionStatus.DISABLED_BY_WRONG_PASSWORD:
+ summary.append(mContext.getString(R.string.wifi_check_password_try_again));
+ break;
case WifiConfiguration.NetworkSelectionStatus.DISABLED_DHCP_FAILURE:
case WifiConfiguration.NetworkSelectionStatus.DISABLED_DNS_FAILURE:
summary.append(mContext.getString(R.string.wifi_disabled_network_failure));
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
index 72ac54421220..89328ee47f1c 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
@@ -417,6 +417,19 @@ public class AccessPointTest {
assertThat(ap.getSummary()).isEqualTo(expectedString);
}
+ @Test
+ public void testSummaryString_showsWrongPasswordLabel() {
+ WifiConfiguration configuration = createWifiConfiguration();
+ configuration.getNetworkSelectionStatus().setNetworkSelectionStatus(
+ WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_PERMANENTLY_DISABLED);
+ configuration.getNetworkSelectionStatus().setNetworkSelectionDisableReason(
+ WifiConfiguration.NetworkSelectionStatus.DISABLED_BY_WRONG_PASSWORD);
+ AccessPoint ap = new AccessPoint(mContext, configuration);
+
+ assertThat(ap.getSummary()).isEqualTo(mContext.getString(
+ R.string.wifi_check_password_try_again));
+ }
+
private ScoredNetwork buildScoredNetworkWithMockBadgeCurve() {
Bundle attr1 = new Bundle();
attr1.putParcelable(ScoredNetwork.ATTRIBUTES_KEY_BADGING_CURVE, mockBadgeCurve);
diff --git a/packages/SystemUI/colorextraction/src/com/google/android/colorextraction/types/Tonal.java b/packages/SystemUI/colorextraction/src/com/google/android/colorextraction/types/Tonal.java
index d9719f356f14..f59c4a56bf3b 100644
--- a/packages/SystemUI/colorextraction/src/com/google/android/colorextraction/types/Tonal.java
+++ b/packages/SystemUI/colorextraction/src/com/google/android/colorextraction/types/Tonal.java
@@ -29,6 +29,7 @@ import android.util.Range;
import com.google.android.colorextraction.ColorExtractor.GradientColors;
+import java.util.Arrays;
import java.util.List;
/**
@@ -311,6 +312,12 @@ public class Tonal implements ExtractionType {
final float maxHue;
TonalPalette(float[] h, float[] s, float[] l) {
+ if (h.length != s.length || s.length != l.length) {
+ throw new IllegalArgumentException("All arrays should have the same size. h: "
+ + Arrays.toString(h) + " s: " + Arrays.toString(s) + " l: "
+ + Arrays.toString(l));
+ }
+
this.h = h;
this.s = s;
this.l = l;
@@ -388,7 +395,7 @@ public class Tonal implements ExtractionType {
new float[] {0.70f, 0.72f, 0.69f, 0.6703296703296703f, 0.728813559322034f,
0.5657142857142856f, 0.5076923076923077f, 0.3944223107569721f,
0.6206896551724138f, 0.8931297709923666f, 1f, 1f, 1f},
- new float[] {0.05f, 0.08f, 0.1784313725490196f, 0.23137254901960785f,
+ new float[] {0.05f, 0.08f, 0.14f, 0.1784313725490196f, 0.23137254901960785f,
0.3431372549019608f, 0.38235294117647056f, 0.49215686274509807f,
0.6588235294117647f, 0.7431372549019608f, 0.8176470588235294f,
0.8784313725490196f, 0.9294117647058824f}
@@ -442,7 +449,7 @@ public class Tonal implements ExtractionType {
0.8285256410256411f, 0.821522309711286f, 0.8083333333333333f,
0.8046594982078853f, 0.8005822416302766f, 0.7842377260981912f,
0.7771084337349398f, 0.7747747747747749f},
- new float[] {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f,
+ new float[] {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f,
0.737142857142857f, 0.6434108527131781f, 0.46835443037974644f},
new float[] {0.05f, 0.08f, 0.12745098039215685f, 0.15490196078431373f,
0.20392156862745098f, 0.24901960784313726f, 0.3137254901960784f,
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 1fed208e01bc..129d605811c5 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -281,7 +281,7 @@
<string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"Rotació bloquejada"</string>
<string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"Vertical"</string>
<string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"Horitzontal"</string>
- <string name="quick_settings_ime_label" msgid="7073463064369468429">"Mètode d\'entrada"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"Mètode d\'introducció"</string>
<string name="quick_settings_location_label" msgid="5011327048748762257">"Ubicació"</string>
<string name="quick_settings_location_off_label" msgid="7464544086507331459">"Ubicació desactivada"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"Dispositiu multimèdia"</string>
@@ -730,7 +730,7 @@
<string name="pip_notification_message" msgid="5619512781514343311">"Si no vols que <xliff:g id="NAME">%s</xliff:g> utilitzi aquesta funció, toca per obrir la configuració i desactiva-la."</string>
<string name="pip_play" msgid="1417176722760265888">"Reprodueix"</string>
<string name="pip_pause" msgid="8881063404466476571">"Posa en pausa"</string>
- <string name="pip_skip_to_next" msgid="1948440006726306284">"Vés al següent"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"Ves al següent"</string>
<string name="pip_skip_to_prev" msgid="1955311326688637914">"Torna a l\'anterior"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"Telèfon apagat per la calor"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"Ara el telèfon funciona de manera normal"</string>
@@ -759,7 +759,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Aplicacions instantànies"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"No cal instal·lar les aplicacions instantànies."</string>
<string name="app_info" msgid="6856026610594615344">"Informació de l\'aplicació"</string>
- <string name="go_to_web" msgid="1106022723459948514">"Vés al web"</string>
+ <string name="go_to_web" msgid="1106022723459948514">"Ves al web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Dades mòbils"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"La Wi-Fi està desactivada"</string>
<string name="bt_is_off" msgid="2640685272289706392">"El Bluetooth està desactivat"</string>
diff --git a/packages/SystemUI/res/values-mcc311-mnc480/config.xml b/packages/SystemUI/res/values-mcc311-mnc480/config.xml
new file mode 100644
index 000000000000..7dadae7f9107
--- /dev/null
+++ b/packages/SystemUI/res/values-mcc311-mnc480/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2017, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+<resources>
+ <!-- Enable 5 bar signal strength icon -->
+ <bool name="config_inflateSignalStrength">true</bool>
+</resources>
+
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index f6b785a52eec..caf4df7b7187 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -489,7 +489,7 @@
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Keyingi safar sozlamalardan yoqilgan paydo bo‘ladi."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Berkitish"</string>
<string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Siz ishchi profildan foydalanmoqdasiz"</string>
- <string name="stream_voice_call" msgid="4410002696470423714">"Qo‘ng‘iroq qilish"</string>
+ <string name="stream_voice_call" msgid="4410002696470423714">"Chaqiruv"</string>
<string name="stream_system" msgid="7493299064422163147">"Tizim"</string>
<string name="stream_ring" msgid="8213049469184048338">"Jiringlatish"</string>
<string name="stream_music" msgid="9086982948697544342">"Multimedia"</string>
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
index 4a459974fcb6..9034c3fd926e 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
@@ -26,8 +26,10 @@ import android.content.pm.ApplicationInfo;
import android.content.res.Configuration;
import android.os.Process;
import android.os.SystemProperties;
+import android.os.Trace;
import android.os.UserHandle;
import android.util.ArraySet;
+import android.util.BootTimingsTraceLog;
import android.util.Log;
import com.android.systemui.fragments.FragmentService;
@@ -190,11 +192,17 @@ public class SystemUIApplication extends Application implements SysUiServiceProv
Log.v(TAG, "Starting SystemUI services for user " +
Process.myUserHandle().getIdentifier() + ".");
+ BootTimingsTraceLog log = new BootTimingsTraceLog("SystemUIBootTiming",
+ Trace.TRACE_TAG_APP);
+ log.traceBegin("StartServices");
final int N = services.length;
for (int i = 0; i < N; i++) {
Class<?> cl = services[i];
if (DEBUG) Log.d(TAG, "loading: " + cl);
+ log.traceBegin("StartServices" + cl.getSimpleName());
+ long ti = System.currentTimeMillis();
try {
+
Object newService = SystemUIFactory.getInstance().createInstance(cl);
mServices[i] = (SystemUI) ((newService == null) ? cl.newInstance() : newService);
} catch (IllegalAccessException ex) {
@@ -207,11 +215,18 @@ public class SystemUIApplication extends Application implements SysUiServiceProv
mServices[i].mComponents = mComponents;
if (DEBUG) Log.d(TAG, "running: " + mServices[i]);
mServices[i].start();
+ log.traceEnd();
+ // Warn if initialization of component takes too long
+ ti = System.currentTimeMillis() - ti;
+ if (ti > 1000) {
+ Log.w(TAG, "Initialization of " + cl.getName() + " took " + ti + " ms");
+ }
if (mBootCompleted) {
mServices[i].onBootCompleted();
}
}
+ log.traceEnd();
Dependency.get(PluginManager.class).addPluginListener(
new PluginListener<OverlayPlugin>() {
private ArraySet<OverlayPlugin> mOverlays;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
index 6b507645e4d0..8f1880039857 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
@@ -161,7 +161,8 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha
QSTileLayout tileLayout = mQsPanel.getTileLayout();
mAllViews.add((View) tileLayout);
- int heightDiff = mQsPanel.getBottom() - mQs.getHeader().getBottom()
+ int height = mQs.getView() != null ? mQs.getView().getMeasuredHeight() : 0;
+ int heightDiff = height - mQs.getHeader().getBottom()
+ mQs.getHeader().getPaddingBottom();
firstPageBuilder.addFloat(tileLayout, "translationY", heightDiff, 0);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index 90275c50b54a..bb3672511c48 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -253,7 +253,8 @@ public class QSFragment extends Fragment implements QS {
}
mHeader.setExpansion(mKeyguardShowing ? 1 : expansion);
mFooter.setExpansion(mKeyguardShowing ? 1 : expansion);
- int heightDiff = mQSPanel.getBottom() - mHeader.getBottom() + mHeader.getPaddingBottom();
+ int heightDiff = mQSPanel.getBottom() - mHeader.getBottom() + mHeader.getPaddingBottom()
+ + mFooter.getHeight();
mQSPanel.setTranslationY(translationScaleY * heightDiff);
mQSDetail.setFullyExpanded(expansion == 1);
@@ -262,7 +263,7 @@ public class QSFragment extends Fragment implements QS {
}
// Set bounds on the QS panel so it doesn't run over the header.
- mQsBounds.top = (int) (mQSPanel.getHeight() * (1 - expansion));
+ mQsBounds.top = (int) -mQSPanel.getTranslationY();
mQsBounds.right = mQSPanel.getWidth();
mQsBounds.bottom = mQSPanel.getHeight();
mQSPanel.setClipBounds(mQsBounds);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
index c0691c11a286..e5b1afe31370 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
@@ -568,8 +568,6 @@ public class NotificationData {
mTmpRanking.getImportance());
pw.print(indent);
pw.println(" notification=" + n.getNotification());
- pw.print(indent);
- pw.println(" tickerText=\"" + n.getNotification().tickerText + "\"");
}
private static boolean isSystemNotification(StatusBarNotification sbn) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index 1a47e4428e49..89694b33e035 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -601,7 +601,8 @@ public class StatusBarIconView extends AnimatedImageView {
}
private void updateContrastedStaticColor() {
- if (mCachedContrastBackgroundColor == NO_COLOR) {
+ if (Color.alpha(mCachedContrastBackgroundColor) != 255) {
+ mContrastedDrawableColor = mDrawableColor;
return;
}
// We'll modify the color if it doesn't pass GAR
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
index d77796144282..2d3e0b6829ca 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
@@ -226,6 +226,9 @@ public class KeyButtonView extends ImageView implements ButtonInterface {
case MotionEvent.ACTION_UP:
final boolean doIt = isPressed() && !mLongClicked;
setPressed(false);
+ // Always send a release ourselves because it doesn't seem to be sent elsewhere
+ // and it feels weird to sometimes get a release haptic and other times not.
+ performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY_RELEASE);
if (mCode != 0) {
if (doIt) {
sendEvent(KeyEvent.ACTION_UP, 0);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java
index 8e7ffdfd4b47..7b2071ca14fd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java
@@ -116,5 +116,10 @@ public class StatusBarIconViewTest extends SysuiTestCase {
color = mIconView.getContrastedStaticDrawableColor(Color.WHITE);
assertTrue("Similar colors should be shifted to satisfy contrast",
NotificationColorUtil.satisfiesTextContrast(Color.WHITE, color));
+
+ mIconView.setStaticDrawableColor(Color.GREEN);
+ color = mIconView.getContrastedStaticDrawableColor(0xcc000000);
+ assertEquals("Transparent backgrounds should fallback to drawable color",
+ color, mIconView.getStaticDrawableColor());
}
} \ No newline at end of file
diff --git a/services/core/java/com/android/server/ContextHubSystemService.java b/services/core/java/com/android/server/ContextHubSystemService.java
index 5d4317cbdae3..110847dd54c8 100644
--- a/services/core/java/com/android/server/ContextHubSystemService.java
+++ b/services/core/java/com/android/server/ContextHubSystemService.java
@@ -16,17 +16,25 @@
package com.android.server;
+import com.android.internal.util.ConcurrentUtils;
import com.android.server.location.ContextHubService;
+import com.android.server.SystemServerInitThreadPool;
import android.content.Context;
import android.util.Log;
+import java.util.concurrent.Future;
+
class ContextHubSystemService extends SystemService {
private static final String TAG = "ContextHubSystemService";
- private final ContextHubService mContextHubService;
+ private ContextHubService mContextHubService;
+
+ private Future<?> mInit;
public ContextHubSystemService(Context context) {
super(context);
- mContextHubService = new ContextHubService(context);
+ mInit = SystemServerInitThreadPool.get().submit(() -> {
+ mContextHubService = new ContextHubService(context);
+ }, "Init ContextHubSystemService");
}
@Override
@@ -37,6 +45,9 @@ class ContextHubSystemService extends SystemService {
public void onBootPhase(int phase) {
if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
Log.d(TAG, "onBootPhase: PHASE_SYSTEM_SERVICES_READY");
+ ConcurrentUtils.waitForFutureNoInterrupt(mInit,
+ "Wait for ContextHubSystemService init");
+ mInit = null;
publishBinderService(Context.CONTEXTHUB_SERVICE, mContextHubService);
}
}
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index f718e803a973..aa2ce1ce3857 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -108,6 +108,7 @@ import com.android.internal.util.Preconditions;
import com.android.internal.widget.LockPatternUtils;
import com.android.server.NativeDaemonConnector.Command;
import com.android.server.NativeDaemonConnector.SensitiveArg;
+import com.android.server.pm.PackageManagerException;
import com.android.server.pm.PackageManagerService;
import com.android.server.storage.AppFuseBridge;
@@ -1078,7 +1079,8 @@ class StorageManagerService extends IStorageManager.Stub
flags |= DiskInfo.FLAG_ADOPTABLE;
}
// Adoptable storage isn't currently supported on FBE devices
- if (StorageManager.isFileEncryptedNativeOnly()) {
+ if (StorageManager.isFileEncryptedNativeOnly()
+ && !SystemProperties.getBoolean(StorageManager.PROP_ADOPTABLE_FBE, false)) {
flags &= ~DiskInfo.FLAG_ADOPTABLE;
}
mDisks.put(id, new DiskInfo(id, flags));
@@ -2045,7 +2047,8 @@ class StorageManagerService extends IStorageManager.Stub
}
if ((mask & StorageManager.DEBUG_FORCE_ADOPTABLE) != 0) {
- if (StorageManager.isFileEncryptedNativeOnly()) {
+ if (StorageManager.isFileEncryptedNativeOnly()
+ && !SystemProperties.getBoolean(StorageManager.PROP_ADOPTABLE_FBE, false)) {
throw new IllegalStateException(
"Adoptable storage not available on device with native FBE");
}
@@ -2121,6 +2124,17 @@ class StorageManagerService extends IStorageManager.Stub
mMoveCallback = callback;
mMoveTargetUuid = volumeUuid;
+ // We need all the users unlocked to move their primary storage
+ final List<UserInfo> users = mContext.getSystemService(UserManager.class).getUsers();
+ for (UserInfo user : users) {
+ if (StorageManager.isFileEncryptedNativeOrEmulated()
+ && !isUserKeyUnlocked(user.id)) {
+ Slog.w(TAG, "Failing move due to locked user " + user.id);
+ onMoveStatusLocked(PackageManager.MOVE_FAILED_LOCKED_USER);
+ return;
+ }
+ }
+
// When moving to/from primary physical volume, we probably just nuked
// the current storage location, so we have nothing to move.
if (Objects.equals(StorageManager.UUID_PRIMARY_PHYSICAL, mPrimaryStorageUuid)
diff --git a/services/core/java/com/android/server/TextServicesManagerService.java b/services/core/java/com/android/server/TextServicesManagerService.java
index 21aeee292ed5..098b43c897e7 100644
--- a/services/core/java/com/android/server/TextServicesManagerService.java
+++ b/services/core/java/com/android/server/TextServicesManagerService.java
@@ -1024,7 +1024,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
}
}
- private final class InternalDeathRecipients extends
+ private static final class InternalDeathRecipients extends
RemoteCallbackList<ISpellCheckerSessionListener> {
private final SpellCheckerBindGroup mGroup;
@@ -1034,11 +1034,8 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
@Override
public void onCallbackDied(ISpellCheckerSessionListener listener) {
- synchronized(mSpellCheckerMap) {
- mGroup.removeListener(listener);
- }
+ mGroup.removeListener(listener);
}
-
}
private static final class ISpellCheckerServiceCallbackBinder
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index a145435976fa..902353e8a3f1 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -117,6 +117,7 @@ import android.os.UserManager;
import android.service.voice.IVoiceInteractionSession;
import android.text.TextUtils;
import android.util.EventLog;
+import android.util.Printer;
import android.util.Slog;
import com.android.internal.app.HeavyWeightSwitcherActivity;
@@ -129,6 +130,7 @@ import java.io.PrintWriter;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
+import java.util.List;
/**
* Controller for interpreting how and then launching activities.
@@ -246,6 +248,34 @@ class ActivityStarter {
mUsingVr2dDisplay = false;
}
+ // TODO(b/38121026): Remove once issue has been resolved.
+ private class ActivityInfoAssignment {
+ final ActivityInfo info;
+ final String description;
+ final long timestamp;
+
+ public ActivityInfoAssignment(ActivityInfo info, String description) {
+ timestamp = System.currentTimeMillis();
+ this.info = info;
+ this.description = description;
+ }
+
+ void dump(PrintWriter pw, String prefix) {
+ pw.println(prefix + " " + timestamp + ":" + description + ":" + describeInfo());
+ }
+
+ private String describeInfo() {
+ return "ActivityInfo[obj:" + info + " userId:"
+ + (info != null ? UserHandle.getUserId(info.applicationInfo.uid) : 0) + "]";
+ }
+ }
+
+ private List<ActivityInfoAssignment> mLastStartActivityInfoAssignments = new ArrayList<>();
+
+ private void addActivityInfoAssignment(ActivityInfo info, String description) {
+ mLastStartActivityInfoAssignments.add(new ActivityInfoAssignment(info, description));
+ }
+
ActivityStarter(ActivityManagerService service, ActivityStackSupervisor supervisor) {
mService = service;
mSupervisor = supervisor;
@@ -253,6 +283,8 @@ class ActivityStarter {
mUsingVr2dDisplay = false;
}
+
+
int startActivityLocked(IApplicationThread caller, Intent intent, Intent ephemeralIntent,
String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
@@ -261,6 +293,8 @@ class ActivityStarter {
ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
ActivityRecord[] outActivity, ActivityStackSupervisor.ActivityContainer container,
TaskRecord inTask, String reason) {
+ mLastStartActivityInfoAssignments.clear();
+ addActivityInfoAssignment(aInfo, "startActivityLocked::initial");
if (TextUtils.isEmpty(reason)) {
throw new IllegalArgumentException("Need to specify a reason.");
@@ -452,6 +486,7 @@ class ActivityStarter {
intent = mInterceptor.mIntent;
rInfo = mInterceptor.mRInfo;
aInfo = mInterceptor.mAInfo;
+ addActivityInfoAssignment(aInfo, "startActivity::mInterceptor.mAInfo");
resolvedType = mInterceptor.mResolvedType;
inTask = mInterceptor.mInTask;
callingPid = mInterceptor.mCallingPid;
@@ -498,6 +533,7 @@ class ActivityStarter {
rInfo = mSupervisor.resolveIntent(intent, resolvedType, userId);
aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags,
null /*profilerInfo*/);
+ addActivityInfoAssignment(aInfo, "startActivity::isPermissionReviewRequired");
if (DEBUG_PERMISSIONS_REVIEW) {
Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true,
@@ -522,12 +558,14 @@ class ActivityStarter {
callingPid = realCallingPid;
aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, null /*profilerInfo*/);
+ addActivityInfoAssignment(aInfo, "startActivity::auxiliaryInfo != null");
}
ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid,
callingPackage, intent, resolvedType, aInfo, mService.getGlobalConfiguration(),
resultRecord, resultWho, requestCode, componentSpecified, voiceSession != null,
mSupervisor, container, options, sourceRecord);
+ addActivityInfoAssignment(aInfo, "startActivity:: value used to create new activity");
if (outActivity != null) {
outActivity[0] = r;
}
@@ -2328,6 +2366,16 @@ class ActivityStarter {
pw.println(prefix + "mStartActivity:");
mStartActivity.dump(pw, prefix + " ");
}
+
+ if (!mLastStartActivityInfoAssignments.isEmpty()) {
+ pw.println(prefix + "mLastStartActivityInfoAssignments:");
+ for (ActivityInfoAssignment assignment : mLastStartActivityInfoAssignments) {
+ assignment.dump(pw, prefix);
+ /*pw.println(prefix + prefix + assignment.description + "@" + p
+ + ":" + assignment.info);*/
+ }
+ }
+
if (mIntent != null) {
pw.println(prefix + "mIntent=" + mIntent);
}
diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java
index 2e0ec0b361e2..a46c85170ba2 100644
--- a/services/core/java/com/android/server/am/KeyguardController.java
+++ b/services/core/java/com/android/server/am/KeyguardController.java
@@ -17,6 +17,7 @@
package com.android.server.am;
import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
+import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER;
import static android.view.WindowManagerPolicy.KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS;
import static android.view.WindowManagerPolicy.KEYGUARD_GOING_AWAY_FLAG_TO_SHADE;
import static android.view.WindowManagerPolicy.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER;
@@ -34,6 +35,7 @@ import static com.android.server.wm.AppTransition.TRANSIT_UNSET;
import android.os.IBinder;
import android.os.RemoteException;
+import android.os.Trace;
import android.util.Slog;
import com.android.internal.policy.IKeyguardDismissCallback;
@@ -111,22 +113,28 @@ class KeyguardController {
* etc.
*/
void keyguardGoingAway(int flags) {
- if (mKeyguardShowing) {
- mWindowManager.deferSurfaceLayout();
- try {
- setKeyguardGoingAway(true);
- mWindowManager.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY,
- false /* alwaysKeepCurrent */, convertTransitFlags(flags),
- false /* forceOverride */);
- mService.updateSleepIfNeededLocked();
-
- // Some stack visibility might change (e.g. docked stack)
- mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
- mStackSupervisor.addStartingWindowsForVisibleActivities(true /* taskSwitch */);
- mWindowManager.executeAppTransition();
- } finally {
- mWindowManager.continueSurfaceLayout();
- }
+ if (!mKeyguardShowing) {
+ return;
+ }
+ Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "keyguardGoingAway");
+ mWindowManager.deferSurfaceLayout();
+ try {
+ setKeyguardGoingAway(true);
+ mWindowManager.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY,
+ false /* alwaysKeepCurrent */, convertTransitFlags(flags),
+ false /* forceOverride */);
+ mService.updateSleepIfNeededLocked();
+
+ // Some stack visibility might change (e.g. docked stack)
+ mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
+ mStackSupervisor.addStartingWindowsForVisibleActivities(true /* taskSwitch */);
+ mWindowManager.executeAppTransition();
+ } finally {
+ Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "keyguardGoingAway: surfaceLayout");
+ mWindowManager.continueSurfaceLayout();
+ Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
+
+ Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
}
}
diff --git a/services/core/java/com/android/server/notification/AlertRateLimiter.java b/services/core/java/com/android/server/notification/AlertRateLimiter.java
new file mode 100644
index 000000000000..e4a79345a040
--- /dev/null
+++ b/services/core/java/com/android/server/notification/AlertRateLimiter.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.notification;
+
+
+/**
+ * {@hide}
+ */
+public class AlertRateLimiter {
+ static final long ALLOWED_ALERT_INTERVAL = 1000;
+ private long mLastNotificationMillis = 0;
+
+ boolean isRateLimited(long now) {
+ final long millisSinceLast = now - mLastNotificationMillis;
+ if (millisSinceLast < 0 || millisSinceLast < ALLOWED_ALERT_INTERVAL) {
+ return true;
+ }
+ mLastNotificationMillis = now;
+ return false;
+ }
+}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index e7bfa2d57a2b..48b4c5724b5f 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -265,6 +265,7 @@ public class NotificationManagerService extends SystemService {
private static final String EXTRA_KEY = "key";
private IActivityManager mAm;
+ private ActivityManager mActivityManager;
private IPackageManager mPackageManager;
private PackageManager mPackageManagerClient;
AudioManager mAudioManager;
@@ -450,9 +451,12 @@ public class NotificationManagerService extends SystemService {
while (parser.next() != END_DOCUMENT) {
mZenModeHelper.readXml(parser, forRestore);
mRankingHelper.readXml(parser, forRestore);
- saveXml |= mListeners.readXml(parser);
- saveXml |= mNotificationAssistants.readXml(parser);
- saveXml |= mConditionProviders.readXml(parser);
+ // No non-system managed services are allowed on low ram devices
+ if (!ActivityManager.isLowRamDeviceStatic()) {
+ saveXml |= mListeners.readXml(parser);
+ saveXml |= mNotificationAssistants.readXml(parser);
+ saveXml |= mConditionProviders.readXml(parser);
+ }
}
if (saveXml) {
@@ -1120,13 +1124,19 @@ public class NotificationManagerService extends SystemService {
mIsTelevision = isTelevision;
}
+ @VisibleForTesting
+ void setUsageStats(NotificationUsageStats us) {
+ mUsageStats = us;
+ }
+
// TODO: Tests should call onStart instead once the methods above are removed.
@VisibleForTesting
void init(Looper looper, IPackageManager packageManager, PackageManager packageManagerClient,
LightsManager lightsManager, NotificationListeners notificationListeners,
NotificationAssistants notificationAssistants, ConditionProviders conditionProviders,
ICompanionDeviceManager companionManager, SnoozeHelper snoozeHelper,
- NotificationUsageStats usageStats, AtomicFile policyFile) {
+ NotificationUsageStats usageStats, AtomicFile policyFile,
+ ActivityManager activityManager, GroupHelper groupHelper) {
Resources resources = getContext().getResources();
mMaxPackageEnqueueRate = Settings.Global.getFloat(getContext().getContentResolver(),
Settings.Global.MAX_NOTIFICATION_ENQUEUE_RATE,
@@ -1140,6 +1150,7 @@ public class NotificationManagerService extends SystemService {
mAppUsageStats = LocalServices.getService(UsageStatsManagerInternal.class);
mAlarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
mCompanionManager = companionManager;
+ mActivityManager = activityManager;
mHandler = new WorkerHandler(looper);
mRankingThread.start();
@@ -1182,35 +1193,7 @@ public class NotificationManagerService extends SystemService {
}
});
mSnoozeHelper = snoozeHelper;
- mGroupHelper = new GroupHelper(new GroupHelper.Callback() {
- @Override
- public void addAutoGroup(String key) {
- synchronized (mNotificationLock) {
- addAutogroupKeyLocked(key);
- }
- mRankingHandler.requestSort(false);
- }
-
- @Override
- public void removeAutoGroup(String key) {
- synchronized (mNotificationLock) {
- removeAutogroupKeyLocked(key);
- }
- mRankingHandler.requestSort(false);
- }
-
- @Override
- public void addAutoGroupSummary(int userId, String pkg, String triggeringKey) {
- createAutoGroupSummary(userId, pkg, triggeringKey);
- }
-
- @Override
- public void removeAutoGroupSummary(int userId, String pkg) {
- synchronized (mNotificationLock) {
- clearAutogroupSummaryLocked(userId, pkg);
- }
- }
- });
+ mGroupHelper = groupHelper;
// This is a ManagedServices object that keeps track of the listeners.
mListeners = notificationListeners;
@@ -1325,11 +1308,45 @@ public class NotificationManagerService extends SystemService {
new NotificationAssistants(AppGlobals.getPackageManager()),
new ConditionProviders(getContext(), mUserProfiles, AppGlobals.getPackageManager()),
null, snoozeHelper, new NotificationUsageStats(getContext()),
- new AtomicFile(new File(systemDir, "notification_policy.xml")));
+ new AtomicFile(new File(systemDir, "notification_policy.xml")),
+ (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE),
+ getGroupHelper());
publishBinderService(Context.NOTIFICATION_SERVICE, mService);
publishLocalService(NotificationManagerInternal.class, mInternalService);
}
+ private GroupHelper getGroupHelper() {
+ return new GroupHelper(new GroupHelper.Callback() {
+ @Override
+ public void addAutoGroup(String key) {
+ synchronized (mNotificationLock) {
+ addAutogroupKeyLocked(key);
+ }
+ mRankingHandler.requestSort(false);
+ }
+
+ @Override
+ public void removeAutoGroup(String key) {
+ synchronized (mNotificationLock) {
+ removeAutogroupKeyLocked(key);
+ }
+ mRankingHandler.requestSort(false);
+ }
+
+ @Override
+ public void addAutoGroupSummary(int userId, String pkg, String triggeringKey) {
+ createAutoGroupSummary(userId, pkg, triggeringKey);
+ }
+
+ @Override
+ public void removeAutoGroupSummary(int userId, String pkg) {
+ synchronized (mNotificationLock) {
+ clearAutogroupSummaryLocked(userId, pkg);
+ }
+ }
+ });
+ }
+
private void sendRegisteredOnlyBroadcast(String action) {
getContext().sendBroadcastAsUser(new Intent(action)
.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY), UserHandle.ALL, null);
@@ -2684,16 +2701,18 @@ public class NotificationManagerService extends SystemService {
public void setNotificationPolicyAccessGranted(String pkg, boolean granted)
throws RemoteException {
checkCallerIsSystemOrShell();
- mConditionProviders.setPackageOrComponentEnabled(
- pkg, getCallingUserHandle().getIdentifier(), true, granted);
+ if (!mActivityManager.isLowRamDevice()) {
+ mConditionProviders.setPackageOrComponentEnabled(
+ pkg, getCallingUserHandle().getIdentifier(), true, granted);
- getContext().sendBroadcastAsUser(new Intent(NotificationManager
- .ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED)
- .setPackage(pkg)
- .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY),
- getCallingUserHandle(), null);
+ getContext().sendBroadcastAsUser(new Intent(
+ NotificationManager.ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED)
+ .setPackage(pkg)
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY),
+ getCallingUserHandle(), null);
- savePolicyFile();
+ savePolicyFile();
+ }
}
@Override
@@ -2774,17 +2793,20 @@ public class NotificationManagerService extends SystemService {
boolean granted) throws RemoteException {
Preconditions.checkNotNull(listener);
enforceSystemOrSystemUI("grant notification listener access");
- mConditionProviders.setPackageOrComponentEnabled(listener.flattenToString(),
- userId, false, granted);
- mListeners.setPackageOrComponentEnabled(listener.flattenToString(),
- userId, true, granted);
-
- getContext().sendBroadcastAsUser(new Intent(NotificationManager
- .ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED)
- .setPackage(listener.getPackageName())
- .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY), getCallingUserHandle(), null);
+ if (!mActivityManager.isLowRamDevice()) {
+ mConditionProviders.setPackageOrComponentEnabled(listener.flattenToString(),
+ userId, false, granted);
+ mListeners.setPackageOrComponentEnabled(listener.flattenToString(),
+ userId, true, granted);
+
+ getContext().sendBroadcastAsUser(new Intent(
+ NotificationManager.ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED)
+ .setPackage(listener.getPackageName())
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY),
+ getCallingUserHandle(), null);
- savePolicyFile();
+ savePolicyFile();
+ }
}
@Override
@@ -2792,17 +2814,20 @@ public class NotificationManagerService extends SystemService {
int userId, boolean granted) throws RemoteException {
Preconditions.checkNotNull(assistant);
enforceSystemOrSystemUI("grant notification assistant access");
- mConditionProviders.setPackageOrComponentEnabled(assistant.flattenToString(),
- userId, false, granted);
- mNotificationAssistants.setPackageOrComponentEnabled(assistant.flattenToString(),
- userId, true, granted);
+ if (!mActivityManager.isLowRamDevice()) {
+ mConditionProviders.setPackageOrComponentEnabled(assistant.flattenToString(),
+ userId, false, granted);
+ mNotificationAssistants.setPackageOrComponentEnabled(assistant.flattenToString(),
+ userId, true, granted);
+
+ getContext().sendBroadcastAsUser(new Intent(
+ NotificationManager.ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED)
+ .setPackage(assistant.getPackageName())
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY),
+ getCallingUserHandle(), null);
- getContext().sendBroadcastAsUser(new Intent(NotificationManager
- .ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED)
- .setPackage(assistant.getPackageName())
- .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY), getCallingUserHandle(), null);
-
- savePolicyFile();
+ savePolicyFile();
+ }
}
@Override
@@ -3303,7 +3328,6 @@ public class NotificationManagerService extends SystemService {
(r.mOriginalFlags & ~Notification.FLAG_FOREGROUND_SERVICE);
mRankingHelper.sort(mNotificationList);
mListeners.notifyPostedLocked(sbn, sbn /* oldSbn */);
- mGroupHelper.onNotificationPosted(sbn);
}
};
@@ -3720,12 +3744,14 @@ public class NotificationManagerService extends SystemService {
if (notification.getSmallIcon() != null) {
StatusBarNotification oldSbn = (old != null) ? old.sbn : null;
mListeners.notifyPostedLocked(n, oldSbn);
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mGroupHelper.onNotificationPosted(n);
- }
- });
+ if (oldSbn == null || !Objects.equals(oldSbn.getGroup(), n.getGroup())) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mGroupHelper.onNotificationPosted(n);
+ }
+ });
+ }
} else {
Slog.e(TAG, "Not posting notification without small icon: " + notification);
if (old != null && !old.isCanceled) {
@@ -3838,18 +3864,6 @@ public class NotificationManagerService extends SystemService {
// Should this notification make noise, vibe, or use the LED?
final boolean aboveThreshold =
record.getImportance() >= NotificationManager.IMPORTANCE_DEFAULT;
- final boolean canInterrupt = aboveThreshold && !record.isIntercepted();
- if (DBG)
- Slog.v(TAG,
- "pkg=" + record.sbn.getPackageName() + " canInterrupt=" + canInterrupt +
- " intercept=" + record.isIntercepted()
- );
-
- // If we're not supposed to beep, vibrate, etc. then don't.
- final String disableEffects = disableNotificationEffects(record);
- if (disableEffects != null) {
- ZenLog.traceDisableEffects(record, disableEffects);
- }
// Remember if this notification already owns the notification channels.
boolean wasBeep = key != null && key.equals(mSoundNotificationKey);
@@ -3858,20 +3872,16 @@ public class NotificationManagerService extends SystemService {
boolean hasValidVibrate = false;
boolean hasValidSound = false;
- if (isNotificationForCurrentUser(record)) {
+ if (aboveThreshold && isNotificationForCurrentUser(record)) {
// If the notification will appear in the status bar, it should send an accessibility
// event
if (!record.isUpdate && record.getImportance() > IMPORTANCE_MIN) {
sendAccessibilityEvent(notification, record.sbn.getPackageName());
}
-
- if (disableEffects == null
- && canInterrupt
- && mSystemReady
- && mAudioManager != null) {
- if (DBG) Slog.v(TAG, "Interrupting!");
+ if (mSystemReady && mAudioManager != null) {
Uri soundUri = record.getSound();
hasValidSound = soundUri != null && !Uri.EMPTY.equals(soundUri);
+
long[] vibration = record.getVibration();
// Demote sound to vibration if vibration missing & phone in vibration mode.
if (vibration == null
@@ -3882,7 +3892,10 @@ public class NotificationManagerService extends SystemService {
}
hasValidVibrate = vibration != null;
- if (!shouldMuteNotificationLocked(record)) {
+ boolean hasAudibleAlert = hasValidSound || hasValidVibrate;
+
+ if (hasAudibleAlert && !shouldMuteNotificationLocked(record)) {
+ if (DBG) Slog.v(TAG, "Interrupting!");
if (hasValidSound) {
mSoundNotificationKey = key;
if (mInCall) {
@@ -3939,14 +3952,37 @@ public class NotificationManagerService extends SystemService {
@GuardedBy("mNotificationLock")
boolean shouldMuteNotificationLocked(final NotificationRecord record) {
+ // Suppressed because it's a silent update
final Notification notification = record.getNotification();
if(record.isUpdate
&& (notification.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0) {
return true;
}
+
+ // Suppressed for being too recently noisy
+ final String pkg = record.sbn.getPackageName();
+ if (mUsageStats.isAlertRateLimited(pkg)) {
+ Slog.e(TAG, "Muting recently noisy " + record.getKey());
+ return true;
+ }
+
+ // muted by listener
+ final String disableEffects = disableNotificationEffects(record);
+ if (disableEffects != null) {
+ ZenLog.traceDisableEffects(record, disableEffects);
+ return true;
+ }
+
+ // suppressed due to DND
+ if (record.isIntercepted()) {
+ return true;
+ }
+
+ // Suppressed because another notification in its group handles alerting
if (record.sbn.isGroup()) {
return notification.suppressAlertingDueToGrouping();
}
+
return false;
}
@@ -4164,16 +4200,19 @@ public class NotificationManagerService extends SystemService {
}
int indexBefore = findNotificationRecordIndexLocked(record);
boolean interceptBefore = record.isIntercepted();
+ float contactAffinityBefore = record.getContactAffinity();
int visibilityBefore = record.getPackageVisibilityOverride();
recon.applyChangesLocked(record);
applyZenModeLocked(record);
mRankingHelper.sort(mNotificationList);
int indexAfter = findNotificationRecordIndexLocked(record);
boolean interceptAfter = record.isIntercepted();
+ float contactAffinityAfter = record.getContactAffinity();
int visibilityAfter = record.getPackageVisibilityOverride();
changed = indexBefore != indexAfter || interceptBefore != interceptAfter
|| visibilityBefore != visibilityAfter;
- if (interceptBefore && !interceptAfter) {
+ if (interceptBefore && !interceptAfter
+ && Float.compare(contactAffinityBefore, contactAffinityAfter) != 0) {
buzzBeepBlinkLocked(record);
}
}
@@ -5649,11 +5688,14 @@ public class NotificationManagerService extends SystemService {
private class ShellCmd extends ShellCommand {
public static final String USAGE = "help\n"
+ + "allow_listener COMPONENT\n"
+ + "disallow_listener COMPONENT\n"
+ "allow_dnd PACKAGE\n"
+ "disallow_dnd PACKAGE";
@Override
public int onCommand(String cmd) {
+ final PrintWriter pw = getOutPrintWriter();
try {
switch (cmd) {
case "allow_dnd": {
@@ -5667,11 +5709,30 @@ public class NotificationManagerService extends SystemService {
getNextArgRequired(), false);
}
break;
+ case "allow_listener": {
+ ComponentName cn = ComponentName.unflattenFromString(getNextArgRequired());
+ if (cn == null) {
+ pw.println("Invalid listener - must be a ComponentName");
+ return -1;
+ }
+ getBinderService().setNotificationListenerAccessGranted(cn, true);
+ }
+ break;
+ case "disallow_listener": {
+ ComponentName cn = ComponentName.unflattenFromString(getNextArgRequired());
+ if (cn == null) {
+ pw.println("Invalid listener - must be a ComponentName");
+ return -1;
+ }
+ getBinderService().setNotificationListenerAccessGranted(cn, false);
+ }
+ break;
default:
return handleDefaultCommands(cmd);
}
- } catch (RemoteException e) {
+ } catch (Exception e) {
+ pw.println("Error occurred. Check logcat for details. " + e.getMessage());
Slog.e(TAG, "Error running shell command", e);
}
return 0;
diff --git a/services/core/java/com/android/server/notification/NotificationUsageStats.java b/services/core/java/com/android/server/notification/NotificationUsageStats.java
index e8cf6a195c90..3689cb10dfda 100644
--- a/services/core/java/com/android/server/notification/NotificationUsageStats.java
+++ b/services/core/java/com/android/server/notification/NotificationUsageStats.java
@@ -114,6 +114,18 @@ public class NotificationUsageStats {
}
/**
+ * Called when a notification wants to alert.
+ */
+ public synchronized boolean isAlertRateLimited(String packageName) {
+ AggregatedStats stats = getOrCreateAggregatedStatsLocked(packageName);
+ if (stats != null) {
+ return stats.isAlertRateLimited();
+ } else {
+ return false;
+ }
+ }
+
+ /**
* Called when a notification is tentatively enqueued by an app, before rate checking.
*/
public synchronized void registerEnqueuedByApp(String packageName) {
@@ -386,7 +398,9 @@ public class NotificationUsageStats {
public ImportanceHistogram quietImportance;
public ImportanceHistogram finalImportance;
public RateEstimator enqueueRate;
+ public AlertRateLimiter alertRate;
public int numRateViolations;
+ public int numAlertViolations;
public int numQuotaViolations;
public long mLastAccessTime;
@@ -398,6 +412,7 @@ public class NotificationUsageStats {
quietImportance = new ImportanceHistogram(context, "note_imp_quiet_");
finalImportance = new ImportanceHistogram(context, "note_importance_");
enqueueRate = new RateEstimator();
+ alertRate = new AlertRateLimiter();
}
public AggregatedStats getPrevious() {
@@ -510,6 +525,7 @@ public class NotificationUsageStats {
maybeCount("note_sub_text", (numWithSubText - previous.numWithSubText));
maybeCount("note_info_text", (numWithInfoText - previous.numWithInfoText));
maybeCount("note_over_rate", (numRateViolations - previous.numRateViolations));
+ maybeCount("note_over_alert_rate", (numAlertViolations - previous.numAlertViolations));
maybeCount("note_over_quota", (numQuotaViolations - previous.numQuotaViolations));
noisyImportance.maybeCount(previous.noisyImportance);
quietImportance.maybeCount(previous.quietImportance);
@@ -542,6 +558,7 @@ public class NotificationUsageStats {
previous.numWithSubText = numWithSubText;
previous.numWithInfoText = numWithInfoText;
previous.numRateViolations = numRateViolations;
+ previous.numAlertViolations = numAlertViolations;
previous.numQuotaViolations = numQuotaViolations;
noisyImportance.update(previous.noisyImportance);
quietImportance.update(previous.quietImportance);
@@ -576,6 +593,14 @@ public class NotificationUsageStats {
enqueueRate.update(now);
}
+ public boolean isAlertRateLimited() {
+ boolean limited = alertRate.isRateLimited(SystemClock.elapsedRealtime());
+ if (limited) {
+ numAlertViolations++;
+ }
+ return limited;
+ }
+
private String toStringWithIndent(String indent) {
StringBuilder output = new StringBuilder();
output.append(indent).append("AggregatedStats{\n");
@@ -634,7 +659,11 @@ public class NotificationUsageStats {
output.append("numWithSubText=").append(numWithSubText).append("\n");
output.append(indentPlusTwo);
output.append("numWithInfoText=").append(numWithInfoText).append("\n");
+ output.append(indentPlusTwo);
output.append("numRateViolations=").append(numRateViolations).append("\n");
+ output.append(indentPlusTwo);
+ output.append("numAlertViolations=").append(numAlertViolations).append("\n");
+ output.append(indentPlusTwo);
output.append("numQuotaViolations=").append(numQuotaViolations).append("\n");
output.append(indentPlusTwo).append(noisyImportance.toString()).append("\n");
output.append(indentPlusTwo).append(quietImportance.toString()).append("\n");
@@ -677,6 +706,7 @@ public class NotificationUsageStats {
maybePut(dump, "numRateViolations", numRateViolations);
maybePut(dump, "numQuotaLViolations", numQuotaViolations);
maybePut(dump, "notificationEnqueueRate", getEnqueueRate());
+ maybePut(dump, "numAlertViolations", numAlertViolations);
noisyImportance.maybePut(dump, previous.noisyImportance);
quietImportance.maybePut(dump, previous.quietImportance);
finalImportance.maybePut(dump, previous.finalImportance);
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index c1c14e8a2cef..e59b9e383d13 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -58,7 +58,6 @@ import static android.content.pm.PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE
import static android.content.pm.PackageManager.INSTALL_FORWARD_LOCK;
import static android.content.pm.PackageManager.INSTALL_INTERNAL;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
-import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK;
@@ -78,6 +77,7 @@ import static android.content.pm.PackageManager.MOVE_FAILED_3RD_PARTY_NOT_ALLOWE
import static android.content.pm.PackageManager.MOVE_FAILED_DEVICE_ADMIN;
import static android.content.pm.PackageManager.MOVE_FAILED_DOESNT_EXIST;
import static android.content.pm.PackageManager.MOVE_FAILED_INTERNAL_ERROR;
+import static android.content.pm.PackageManager.MOVE_FAILED_LOCKED_USER;
import static android.content.pm.PackageManager.MOVE_FAILED_OPERATION_PENDING;
import static android.content.pm.PackageManager.MOVE_FAILED_SYSTEM_PACKAGE;
import static android.content.pm.PackageManager.PERMISSION_DENIED;
@@ -87,6 +87,7 @@ import static android.content.pm.PackageParser.isApkFile;
import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
import static android.system.OsConstants.O_CREAT;
import static android.system.OsConstants.O_RDWR;
+
import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_MANAGED_PROFILE;
import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_PARENT;
import static com.android.internal.content.NativeLibraryHelper.LIB64_DIR_NAME;
@@ -102,6 +103,7 @@ import static com.android.server.pm.PackageManagerServiceCompilerMapping.getDefa
import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_FAILURE;
import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_SUCCESS;
import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED;
+
import static dalvik.system.DexFile.getNonProfileGuidedCompilerFilter;
import android.Manifest;
@@ -130,6 +132,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.AppsQueryHelper;
import android.content.pm.AuxiliaryResolveInfo;
import android.content.pm.ChangedPackages;
+import android.content.pm.ComponentInfo;
import android.content.pm.FallbackCategoryProvider;
import android.content.pm.FeatureInfo;
import android.content.pm.IDexModuleRegisterCallback;
@@ -724,6 +727,9 @@ public class PackageManagerService extends IPackageManager.Stub
final ProtectedPackages mProtectedPackages;
+ @GuardedBy("mLoadedVolumes")
+ final ArraySet<String> mLoadedVolumes = new ArraySet<>();
+
boolean mFirstBoot;
PackageManagerInternal.ExternalSourcesPolicy mExternalSourcesPolicy;
@@ -7203,12 +7209,15 @@ public class PackageManagerService extends IPackageManager.Stub
// load resources from the correct package
installerInfo.resolvePackageName = info.getComponentInfo().packageName;
resolveInfos.set(i, installerInfo);
+ continue;
}
- continue;
}
// caller is a full app, don't need to apply any other filtering
if (ephemeralPkgName == null) {
continue;
+ } else if (ephemeralPkgName.equals(info.activityInfo.packageName)) {
+ // caller is same app; don't need to apply any other filtering
+ continue;
}
// allow activities that have been explicitly exposed to ephemeral apps
if (!isEphemeralApp
@@ -20029,7 +20038,7 @@ public class PackageManagerService extends IPackageManager.Stub
// Queue up an async operation since the package deletion may take a little while.
mHandler.post(new Runnable() {
public void run() {
- final PackageSetting ps = (PackageSetting) pkg.mExtras;
+ final PackageSetting ps = pkg == null ? null : (PackageSetting) pkg.mExtras;
boolean doClearData = true;
if (ps != null) {
final boolean targetIsInstantApp =
@@ -21673,6 +21682,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
public static final int DUMP_DEXOPT = 1 << 20;
public static final int DUMP_COMPILER_STATS = 1 << 21;
public static final int DUMP_CHANGES = 1 << 22;
+ public static final int DUMP_VOLUMES = 1 << 23;
public static final int OPTION_SHOW_FILTERS = 1 << 0;
@@ -21912,6 +21922,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
dumpState.setDump(DumpState.DUMP_INSTALLS);
} else if ("frozen".equals(cmd)) {
dumpState.setDump(DumpState.DUMP_FROZEN);
+ } else if ("volumes".equals(cmd)) {
+ dumpState.setDump(DumpState.DUMP_VOLUMES);
} else if ("dexopt".equals(cmd)) {
dumpState.setDump(DumpState.DUMP_DEXOPT);
} else if ("compiler-stats".equals(cmd)) {
@@ -22296,6 +22308,23 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
ipw.decreaseIndent();
}
+ if (!checkin && dumpState.isDumping(DumpState.DUMP_VOLUMES) && packageName == null) {
+ if (dumpState.onTitlePrinted()) pw.println();
+
+ final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", 120);
+ ipw.println();
+ ipw.println("Loaded volumes:");
+ ipw.increaseIndent();
+ if (mLoadedVolumes.size() == 0) {
+ ipw.println("(none)");
+ } else {
+ for (int i = 0; i < mLoadedVolumes.size(); i++) {
+ ipw.println(mLoadedVolumes.valueAt(i));
+ }
+ }
+ ipw.decreaseIndent();
+ }
+
if (!checkin && dumpState.isDumping(DumpState.DUMP_DEXOPT)) {
if (dumpState.onTitlePrinted()) pw.println();
dumpDexoptStateLPr(pw, packageName);
@@ -23012,6 +23041,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
if (DEBUG_INSTALL) Slog.d(TAG, "Loaded packages " + loaded);
sendResourcesChangedBroadcast(true, false, loaded, null);
+ mLoadedVolumes.add(vol.getId());
}
private void unloadPrivatePackages(final VolumeInfo vol) {
@@ -23063,6 +23093,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
if (DEBUG_INSTALL) Slog.d(TAG, "Unloaded packages " + unloaded);
sendResourcesChangedBroadcast(false, false, unloaded, null);
+ mLoadedVolumes.remove(vol.getId());
// Try very hard to release any references to this path so we don't risk
// the system server being killed due to open FDs
@@ -23606,8 +23637,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
movePackageInternal(packageName, volumeUuid, moveId, callingUid, user);
} catch (PackageManagerException e) {
Slog.w(TAG, "Failed to move " + packageName, e);
- mMoveCallbacks.notifyStatusChanged(moveId,
- PackageManager.MOVE_FAILED_INTERNAL_ERROR);
+ mMoveCallbacks.notifyStatusChanged(moveId, e.error);
}
}
});
@@ -23730,6 +23760,17 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
measurePath = Environment.getDataAppDirectory(volumeUuid);
}
+ // If we're moving app data around, we need all the users unlocked
+ if (moveCompleteApp) {
+ for (int userId : installedUserIds) {
+ if (StorageManager.isFileEncryptedNativeOrEmulated()
+ && !StorageManager.isUserKeyUnlocked(userId)) {
+ throw new PackageManagerException(MOVE_FAILED_LOCKED_USER,
+ "User " + userId + " must be unlocked");
+ }
+ }
+ }
+
final PackageStats stats = new PackageStats(null, -1);
synchronized (mInstaller) {
for (int userId : installedUserIds) {
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index 35e4e58c92cf..c07bd8e3a2d3 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -345,7 +345,7 @@ public class TrustManagerService extends SystemService {
+ "of user " + userInfo.id + "can unlock user profile.");
}
- if (!StorageManager.isUserKeyUnlocked(userInfo.id)
+ if (!mUserManager.isUserUnlockingOrUnlocked(userInfo.id)
&& !directUnlock) {
if (DEBUG) Slog.d(TAG, "refreshAgentList: skipping user " + userInfo.id
+ "'s trust agent " + name + ": FBE still locked and "
diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java
index fe7494728ac3..5f34c6067997 100644
--- a/services/core/java/com/android/server/wm/AppWindowContainerController.java
+++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java
@@ -614,8 +614,8 @@ public class AppWindowContainerController
return STARTING_WINDOW_TYPE_SPLASH_SCREEN;
} else if (taskSwitch && allowTaskSnapshot) {
return snapshot == null ? STARTING_WINDOW_TYPE_NONE
- : snapshotFillsWidth(snapshot) || fromRecents ? STARTING_WINDOW_TYPE_SNAPSHOT
- : STARTING_WINDOW_TYPE_SPLASH_SCREEN;
+ : snapshotOrientationSameAsDisplay(snapshot) || fromRecents
+ ? STARTING_WINDOW_TYPE_SNAPSHOT : STARTING_WINDOW_TYPE_SPLASH_SCREEN;
} else {
return STARTING_WINDOW_TYPE_NONE;
}
@@ -640,7 +640,7 @@ public class AppWindowContainerController
return true;
}
- private boolean snapshotFillsWidth(TaskSnapshot snapshot) {
+ private boolean snapshotOrientationSameAsDisplay(TaskSnapshot snapshot) {
if (snapshot == null) {
return false;
}
@@ -655,7 +655,9 @@ public class AppWindowContainerController
mService.mPolicy.getStableInsetsLw(di.rotation, di.logicalWidth, di.logicalHeight,
stableInsets);
displayBounds.inset(stableInsets);
- return rect.width() >= displayBounds.width();
+ final boolean snapshotInLandscape = rect.width() >= rect.height();
+ final boolean displayInLandscape = displayBounds.width() >= displayBounds.height();
+ return snapshotInLandscape == displayInLandscape;
}
public void removeStartingWindow() {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index f9d7c3704341..a95a0cf9808c 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2948,9 +2948,10 @@ public class WindowManagerService extends IWindowManager.Stub
}
public void setKeyguardGoingAway(boolean keyguardGoingAway) {
- synchronized (mWindowMap) {
- mKeyguardGoingAway = keyguardGoingAway;
- }
+// TODO: Use of this can be removed. Revert ag/I8369723d6a77f2c602f1ef080371fa7cd9ee094e
+// synchronized (mWindowMap) {
+// mKeyguardGoingAway = keyguardGoingAway;
+// }
}
// -------------------------------------------------------------
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 136d335cf473..8cac6e051e6b 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -43,6 +43,7 @@ import static android.app.admin.DevicePolicyManager.DELEGATION_PACKAGE_ACCESS;
import static android.app.admin.DevicePolicyManager.DELEGATION_PERMISSION_GRANT;
import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
import static android.app.admin.DevicePolicyManager.PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER;
+import static android.app.admin.DevicePolicyManager.WIPE_EUICC;
import static android.app.admin.DevicePolicyManager.WIPE_EXTERNAL_STORAGE;
import static android.app.admin.DevicePolicyManager.WIPE_RESET_PROTECTION_DATA;
import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES;
@@ -1691,9 +1692,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
mContext.getSystemService(PowerManager.class).reboot(reason);
}
- void recoverySystemRebootWipeUserData(boolean shutdown, String reason, boolean force)
- throws IOException {
- RecoverySystem.rebootWipeUserData(mContext, shutdown, reason, force);
+ void recoverySystemRebootWipeUserData(boolean shutdown, String reason, boolean force,
+ boolean wipeEuicc) throws IOException {
+ RecoverySystem.rebootWipeUserData(mContext, shutdown, reason, force, wipeEuicc);
}
boolean systemPropertiesGetBoolean(String key, boolean def) {
@@ -5302,7 +5303,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
}
}
- private void forceWipeDeviceNoLock(boolean wipeExtRequested, String reason) {
+ private void forceWipeDeviceNoLock(boolean wipeExtRequested, String reason, boolean wipeEuicc) {
wtfIfInLock();
if (wipeExtRequested) {
@@ -5312,7 +5313,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
}
try {
mInjector.recoverySystemRebootWipeUserData(
- /*shutdown=*/ false, reason, /*force=*/ true);
+ /*shutdown=*/ false, reason, /*force=*/ true, /*wipeEuicc=*/ wipeEuicc);
} catch (IOException | SecurityException e) {
Slog.w(LOG_TAG, "Failed requesting data wipe", e);
}
@@ -5389,7 +5390,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
// removes that user (but still clears FRP...)
if (userId == UserHandle.USER_SYSTEM) {
forceWipeDeviceNoLock(/*wipeExtRequested=*/ (flags & WIPE_EXTERNAL_STORAGE) != 0,
- reason);
+ reason, /*wipeEuicc=*/ (flags & WIPE_EUICC) != 0);
} else {
forceWipeUser(userId);
}
diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java
index f09ec6e660bd..a94536ceaab4 100644
--- a/services/net/java/android/net/ip/IpManager.java
+++ b/services/net/java/android/net/ip/IpManager.java
@@ -714,7 +714,6 @@ public class IpManager extends StateMachine {
return shouldLog;
}
- // TODO: Migrate all Log.e(...) to logError(...).
private void logError(String fmt, Object... args) {
final String msg = "ERROR " + String.format(fmt, args);
Log.e(mTag, msg);
@@ -1035,7 +1034,7 @@ public class IpManager extends StateMachine {
}
private void doImmediateProvisioningFailure(int failureType) {
- if (DBG) { Log.e(mTag, "onProvisioningFailure(): " + failureType); }
+ logError("onProvisioningFailure(): %s", failureType);
recordMetric(failureType);
mCallback.onProvisioningFailure(new LinkProperties(mLinkProperties));
}
@@ -1170,7 +1169,7 @@ public class IpManager extends StateMachine {
case DhcpClient.CMD_ON_QUIT:
// Everything is already stopped.
- Log.e(mTag, "Unexpected CMD_ON_QUIT (already stopped).");
+ logError("Unexpected CMD_ON_QUIT (already stopped).");
break;
default:
@@ -1376,7 +1375,7 @@ public class IpManager extends StateMachine {
break;
case CMD_START:
- Log.e(mTag, "ALERT: START received in StartedState. Please fix caller.");
+ logError("ALERT: START received in StartedState. Please fix caller.");
break;
case CMD_CONFIRM:
@@ -1475,13 +1474,13 @@ public class IpManager extends StateMachine {
handleIPv4Failure();
break;
default:
- Log.e(mTag, "Unknown CMD_POST_DHCP_ACTION status:" + msg.arg1);
+ logError("Unknown CMD_POST_DHCP_ACTION status: %s", msg.arg1);
}
break;
case DhcpClient.CMD_ON_QUIT:
// DHCPv4 quit early for some reason.
- Log.e(mTag, "Unexpected CMD_ON_QUIT.");
+ logError("Unexpected CMD_ON_QUIT.");
mDhcpClient = null;
break;
diff --git a/services/tests/notification/src/com/android/server/notification/AlertRateLimiterTest.java b/services/tests/notification/src/com/android/server/notification/AlertRateLimiterTest.java
new file mode 100644
index 000000000000..5ed8210a80bc
--- /dev/null
+++ b/services/tests/notification/src/com/android/server/notification/AlertRateLimiterTest.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.notification;
+
+import static com.android.server.notification.AlertRateLimiter.ALLOWED_ALERT_INTERVAL;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.SmallTest;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class AlertRateLimiterTest extends NotificationTestCase {
+
+ private long mTestStartTime;
+ private
+ AlertRateLimiter mLimiter;
+
+ @Before
+ public void setUp() {
+ mTestStartTime = 1225731600000L;
+ mLimiter = new AlertRateLimiter();
+ }
+
+ @Test
+ public void testFirstAlertAllowed() throws Exception {
+ assertFalse(mLimiter.isRateLimited(mTestStartTime));
+ }
+
+ @Test
+ public void testAllowedAfterSecond() throws Exception {
+ assertFalse(mLimiter.isRateLimited(mTestStartTime));
+ assertFalse(mLimiter.isRateLimited(mTestStartTime + ALLOWED_ALERT_INTERVAL));
+ }
+
+ @Test
+ public void testAllowedAfterSecondEvenWithBlockedEntries() throws Exception {
+ assertFalse(mLimiter.isRateLimited(mTestStartTime));
+ assertTrue(mLimiter.isRateLimited(mTestStartTime + ALLOWED_ALERT_INTERVAL - 1));
+ assertFalse(mLimiter.isRateLimited(mTestStartTime + ALLOWED_ALERT_INTERVAL));
+ }
+
+ @Test
+ public void testAllowedDisallowedBeforeSecond() throws Exception {
+ assertFalse(mLimiter.isRateLimited(mTestStartTime));
+ assertTrue(mLimiter.isRateLimited(mTestStartTime + ALLOWED_ALERT_INTERVAL - 1));
+ }
+
+ @Test
+ public void testDisallowedTimePast() throws Exception {
+ assertFalse(mLimiter.isRateLimited(mTestStartTime));
+ assertTrue(mLimiter.isRateLimited(mTestStartTime - ALLOWED_ALERT_INTERVAL));
+ }
+}
diff --git a/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java b/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java
index ae9827428179..807703b95a63 100644
--- a/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java
+++ b/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java
@@ -23,6 +23,7 @@ import static android.app.NotificationManager.IMPORTANCE_HIGH;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
+import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyObject;
@@ -76,6 +77,8 @@ public class BuzzBeepBlinkTest extends NotificationTestCase {
@Mock android.media.IRingtonePlayer mRingtonePlayer;
@Mock Light mLight;
@Mock Handler mHandler;
+ @Mock
+ NotificationUsageStats mUsageStats;
private NotificationManagerService mService;
private String mPkg = "com.android.server.notification";
@@ -115,6 +118,8 @@ public class BuzzBeepBlinkTest extends NotificationTestCase {
when(mAudioManager.getStreamVolume(anyInt())).thenReturn(10);
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
+ when(mUsageStats.isAlertRateLimited(any())).thenReturn(false);
+
mService = new NotificationManagerService(getContext());
mService.setAudioManager(mAudioManager);
mService.setVibrator(mVibrator);
@@ -123,6 +128,7 @@ public class BuzzBeepBlinkTest extends NotificationTestCase {
mService.setLights(mLight);
mService.setScreenOn(false);
mService.setFallbackVibrationPattern(FALLBACK_VIBRATION_PATTERN);
+ mService.setUsageStats(mUsageStats);
}
//
@@ -806,6 +812,39 @@ public class BuzzBeepBlinkTest extends NotificationTestCase {
verifyNeverBeep();
}
+ @Test
+ public void testRepeatedSoundOverLimitMuted() throws Exception {
+ when(mUsageStats.isAlertRateLimited(any())).thenReturn(true);
+
+ NotificationRecord r = getBeepyNotification();
+
+ mService.buzzBeepBlinkLocked(r);
+ verifyNeverBeep();
+ }
+
+ @Test
+ public void testPostingSilentNotificationDoesNotAffectRateLimiting() throws Exception {
+ NotificationRecord r = getQuietNotification();
+ mService.buzzBeepBlinkLocked(r);
+
+ verify(mUsageStats, never()).isAlertRateLimited(any());
+ }
+
+ @Test
+ public void testCrossUserSoundMuted() throws Exception {
+ final Notification n = new Builder(getContext(), "test")
+ .setSmallIcon(android.R.drawable.sym_def_app_icon).build();
+
+ int userId = mUser.getIdentifier() + 1;
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 0, mTag, mUid,
+ mPid, n, UserHandle.of(userId), null, System.currentTimeMillis());
+ NotificationRecord r = new NotificationRecord(getContext(), sbn,
+ new NotificationChannel("test", "test", IMPORTANCE_HIGH));
+
+ mService.buzzBeepBlinkLocked(r);
+ verifyNeverBeep();
+ }
+
static class VibrateRepeatMatcher implements ArgumentMatcher<VibrationEffect> {
private final int mRepeatIndex;
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
index a356ae0337e2..8ff46394db14 100644
--- a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -37,6 +37,7 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.ActivityManager;
import android.app.INotificationManager;
import android.app.Notification;
import android.app.NotificationChannel;
@@ -50,6 +51,7 @@ import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
import android.graphics.Color;
+import android.media.AudioManager;
import android.os.Binder;
import android.os.Process;
import android.os.UserHandle;
@@ -103,6 +105,10 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
File mFile;
@Mock
private NotificationUsageStats mUsageStats;
+ @Mock
+ private AudioManager mAudioManager;
+ @Mock
+ ActivityManager mActivityManager;
private NotificationChannel mTestNotificationChannel = new NotificationChannel(
TEST_CHANNEL_ID, TEST_CHANNEL_ID, NotificationManager.IMPORTANCE_DEFAULT);
@Mock
@@ -112,6 +118,7 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
private ManagedServices.ManagedServiceInfo mListener;
@Mock private ICompanionDeviceManager mCompanionMgr;
@Mock SnoozeHelper mSnoozeHelper;
+ @Mock GroupHelper mGroupHelper;
// Use a Testable subclass so we can simulate calls from the system without failing.
private static class TestableNotificationManagerService extends NotificationManagerService {
@@ -153,6 +160,7 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
.thenReturn(applicationInfo);
final LightsManager mockLightsManager = mock(LightsManager.class);
when(mockLightsManager.getLight(anyInt())).thenReturn(mock(Light.class));
+ when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
// Use this testable looper.
mTestableLooper = TestableLooper.get(this);
@@ -168,12 +176,13 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
mNotificationManagerService.init(mTestableLooper.getLooper(), mPackageManager,
mPackageManagerClient, mockLightsManager, mNotificationListeners,
mNotificationAssistants, mConditionProviders, mCompanionMgr,
- mSnoozeHelper, mUsageStats, mPolicyFile);
+ mSnoozeHelper, mUsageStats, mPolicyFile, mActivityManager, mGroupHelper);
} catch (SecurityException e) {
if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) {
throw e;
}
}
+ mNotificationManagerService.setAudioManager(mAudioManager);
// Tests call directly into the Binder.
mBinderService = mNotificationManagerService.getBinderService();
@@ -1035,4 +1044,90 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
verify(mNotificationListeners, never()).setPackageOrComponentEnabled(
any(), anyInt(), anyBoolean(), anyBoolean());
}
+
+ @Test
+ public void testSetListenerAccess_doesNothingOnLowRam() throws Exception {
+ when(mActivityManager.isLowRamDevice()).thenReturn(true);
+ ComponentName c = ComponentName.unflattenFromString("package/Component");
+ mBinderService.setNotificationListenerAccessGranted(c, true);
+
+ verify(mNotificationListeners, never()).setPackageOrComponentEnabled(
+ c.flattenToString(), 0, true, true);
+ verify(mConditionProviders, never()).setPackageOrComponentEnabled(
+ c.flattenToString(), 0, false, true);
+ verify(mNotificationAssistants, never()).setPackageOrComponentEnabled(
+ any(), anyInt(), anyBoolean(), anyBoolean());
+ }
+
+ @Test
+ public void testSetAssistantAccess_doesNothingOnLowRam() throws Exception {
+ when(mActivityManager.isLowRamDevice()).thenReturn(true);
+ ComponentName c = ComponentName.unflattenFromString("package/Component");
+ mBinderService.setNotificationAssistantAccessGranted(c, true);
+
+
+ verify(mNotificationListeners, never()).setPackageOrComponentEnabled(
+ c.flattenToString(), 0, true, true);
+ verify(mConditionProviders, never()).setPackageOrComponentEnabled(
+ c.flattenToString(), 0, false, true);
+ verify(mNotificationAssistants, never()).setPackageOrComponentEnabled(
+ any(), anyInt(), anyBoolean(), anyBoolean());
+ }
+
+ @Test
+ public void testSetDndAccess_doesNothingOnLowRam() throws Exception {
+ when(mActivityManager.isLowRamDevice()).thenReturn(true);
+ ComponentName c = ComponentName.unflattenFromString("package/Component");
+ mBinderService.setNotificationPolicyAccessGranted(c.getPackageName(), true);
+
+ verify(mNotificationListeners, never()).setPackageOrComponentEnabled(
+ c.flattenToString(), 0, true, true);
+ verify(mConditionProviders, never()).setPackageOrComponentEnabled(
+ c.flattenToString(), 0, false, true);
+ verify(mNotificationAssistants, never()).setPackageOrComponentEnabled(
+ any(), anyInt(), anyBoolean(), anyBoolean());
+ }
+
+ @Test
+ public void testOnlyAutogroupIfGroupChanged_noPriorNoti_autogroups() throws Exception {
+ NotificationRecord r = generateNotificationRecord(mTestNotificationChannel, 0, null, false);
+ mNotificationManagerService.addEnqueuedNotification(r);
+ NotificationManagerService.PostNotificationRunnable runnable =
+ mNotificationManagerService.new PostNotificationRunnable(r.getKey());
+ runnable.run();
+ waitForIdle();
+
+ verify(mGroupHelper, times(1)).onNotificationPosted(any());
+ }
+
+ @Test
+ public void testOnlyAutogroupIfGroupChanged_groupChanged_autogroups()
+ throws Exception {
+ NotificationRecord r = generateNotificationRecord(mTestNotificationChannel, 0, "group", false);
+ mNotificationManagerService.addNotification(r);
+
+ r = generateNotificationRecord(mTestNotificationChannel, 0, null, false);
+ mNotificationManagerService.addEnqueuedNotification(r);
+ NotificationManagerService.PostNotificationRunnable runnable =
+ mNotificationManagerService.new PostNotificationRunnable(r.getKey());
+ runnable.run();
+ waitForIdle();
+
+ verify(mGroupHelper, times(1)).onNotificationPosted(any());
+ }
+
+ @Test
+ public void testOnlyAutogroupIfGroupChanged_noGroupChanged_autogroups()
+ throws Exception {
+ NotificationRecord r = generateNotificationRecord(mTestNotificationChannel, 0, "group", false);
+ mNotificationManagerService.addNotification(r);
+ mNotificationManagerService.addEnqueuedNotification(r);
+
+ NotificationManagerService.PostNotificationRunnable runnable =
+ mNotificationManagerService.new PostNotificationRunnable(r.getKey());
+ runnable.run();
+ waitForIdle();
+
+ verify(mGroupHelper, never()).onNotificationPosted(any());
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
index a33153e07496..54717157d069 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
@@ -269,9 +269,9 @@ public class DevicePolicyManagerServiceTestable extends DevicePolicyManagerServi
}
@Override
- void recoverySystemRebootWipeUserData(boolean shutdown, String reason, boolean force)
- throws IOException {
- services.recoverySystem.rebootWipeUserData(shutdown, reason, force);
+ void recoverySystemRebootWipeUserData(boolean shutdown, String reason, boolean force,
+ boolean wipeEuicc) throws IOException {
+ services.recoverySystem.rebootWipeUserData(shutdown, reason, force, wipeEuicc);
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index 6393b0b4018e..c58b733b8b54 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -17,6 +17,7 @@ package com.android.server.devicepolicy;
import static android.app.admin.DevicePolicyManager.DELEGATION_APP_RESTRICTIONS;
import static android.app.admin.DevicePolicyManager.DELEGATION_CERT_INSTALL;
+import static android.app.admin.DevicePolicyManager.WIPE_EUICC;
import static android.os.UserManagerInternal.CAMERA_DISABLED_GLOBALLY;
import static android.os.UserManagerInternal.CAMERA_DISABLED_LOCALLY;
import static android.os.UserManagerInternal.CAMERA_NOT_DISABLED;
@@ -3451,7 +3452,21 @@ public class DevicePolicyManagerTest extends DpmTestBase {
dpm.wipeData(0);
verify(getServices().recoverySystem).rebootWipeUserData(
- /*shutdown=*/ eq(false), anyString(), /*force=*/ eq(true));
+ /*shutdown=*/ eq(false), anyString(), /*force=*/ eq(true),
+ /*wipeEuicc=*/ eq(false));
+ }
+
+ public void testWipeEuiccDataEnabled() throws Exception {
+ setDeviceOwner();
+ when(getServices().userManager.getUserRestrictionSource(
+ UserManager.DISALLOW_FACTORY_RESET,
+ UserHandle.SYSTEM))
+ .thenReturn(UserManager.RESTRICTION_SOURCE_DEVICE_OWNER);
+
+ dpm.wipeData(WIPE_EUICC);
+ verify(getServices().recoverySystem).rebootWipeUserData(
+ /*shutdown=*/ eq(false), anyString(), /*force=*/ eq(true),
+ /*wipeEuicc=*/ eq(true));
}
public void testWipeDataDeviceOwnerDisallowed() throws Exception {
@@ -3549,7 +3564,8 @@ public class DevicePolicyManagerTest extends DpmTestBase {
// The device should be wiped even if DISALLOW_FACTORY_RESET is enabled, because both the
// user restriction and the policy were set by the DO.
verify(getServices().recoverySystem).rebootWipeUserData(
- /*shutdown=*/ eq(false), anyString(), /*force=*/ eq(true));
+ /*shutdown=*/ eq(false), anyString(), /*force=*/ eq(true),
+ /*wipeEuicc=*/ eq(false));
}
public void testMaximumFailedPasswordAttemptsReachedDeviceOwnerDisallowed() throws Exception {
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java b/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java
index ed8de0517631..8121bcf16c60 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java
@@ -314,8 +314,8 @@ public class MockSystemServices {
}
public static class RecoverySystemForMock {
- public void rebootWipeUserData(
- boolean shutdown, String reason, boolean force) throws IOException {
+ public void rebootWipeUserData(boolean shutdown, String reason, boolean force,
+ boolean wipeEuicc) throws IOException {
}
}
diff --git a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
index 86116a9237bf..c3a6f07548c8 100644
--- a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
@@ -17,8 +17,8 @@
package com.android.server.timezone;
import com.android.timezone.distro.DistroVersion;
-import com.android.timezone.distro.TimeZoneDistro;
import com.android.timezone.distro.StagedDistroOperation;
+import com.android.timezone.distro.TimeZoneDistro;
import org.junit.Before;
import org.junit.Test;
@@ -42,7 +42,7 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import static org.mockito.Matchers.eq;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
@@ -284,12 +284,14 @@ public class RulesManagerServiceTest {
mRulesManagerService.requestInstall(parcelFileDescriptor, tokenBytes, callback);
+ // Request the rules state while the async operation is "happening".
+ RulesState actualRulesState = mRulesManagerService.getRulesState();
RulesState expectedRuleState = new RulesState(
systemRulesVersion, RulesManagerService.DISTRO_FORMAT_VERSION_SUPPORTED,
true /* operationInProgress */,
RulesState.STAGED_OPERATION_UNKNOWN, null /* stagedDistroRulesVersion */,
RulesState.DISTRO_STATUS_UNKNOWN, null /* installedDistroRulesVersion */);
- assertEquals(expectedRuleState, mRulesManagerService.getRulesState());
+ assertEquals(expectedRuleState, actualRulesState);
}
@Test
@@ -407,13 +409,13 @@ public class RulesManagerServiceTest {
TimeZoneDistro expectedDistro = new TimeZoneDistro(expectedContent);
// Set up the installer.
- configureStageInstallExpectation(expectedDistro, TimeZoneDistroInstaller.INSTALL_SUCCESS);
+ configureStageInstallExpectation(TimeZoneDistroInstaller.INSTALL_SUCCESS);
// Simulate the async execution.
mFakeExecutor.simulateAsyncExecutionOfLastCommand();
// Verify the expected calls were made to other components.
- verifyStageInstallCalled(expectedDistro);
+ verifyStageInstallCalled();
verifyPackageTrackerCalled(token, true /* success */);
// Check the callback was called.
@@ -439,16 +441,14 @@ public class RulesManagerServiceTest {
verifyNoInstallerCallsMade();
callback.assertNoResultReceived();
- TimeZoneDistro expectedDistro = new TimeZoneDistro(expectedContent);
-
// Set up the installer.
- configureStageInstallExpectation(expectedDistro, TimeZoneDistroInstaller.INSTALL_SUCCESS);
+ configureStageInstallExpectation(TimeZoneDistroInstaller.INSTALL_SUCCESS);
// Simulate the async execution.
mFakeExecutor.simulateAsyncExecutionOfLastCommand();
// Verify the expected calls were made to other components.
- verifyStageInstallCalled(expectedDistro);
+ verifyStageInstallCalled();
verifyPackageTrackerCalled(null /* expectedToken */, true /* success */);
// Check the callback was received.
@@ -476,17 +476,14 @@ public class RulesManagerServiceTest {
verifyNoInstallerCallsMade();
callback.assertNoResultReceived();
- TimeZoneDistro expectedDistro = new TimeZoneDistro(expectedContent);
-
// Set up the installer.
- configureStageInstallExpectation(
- expectedDistro, TimeZoneDistroInstaller.INSTALL_FAIL_VALIDATION_ERROR);
+ configureStageInstallExpectation(TimeZoneDistroInstaller.INSTALL_FAIL_VALIDATION_ERROR);
// Simulate the async execution.
mFakeExecutor.simulateAsyncExecutionOfLastCommand();
// Verify the expected calls were made to other components.
- verifyStageInstallCalled(expectedDistro);
+ verifyStageInstallCalled();
// Validation failure is treated like a successful check: repeating it won't improve things.
boolean expectedSuccess = true;
@@ -787,9 +784,9 @@ public class RulesManagerServiceTest {
.thenThrow(new IOException("Simulated failure"));
}
- private void configureStageInstallExpectation(TimeZoneDistro expected, int resultCode)
+ private void configureStageInstallExpectation(int resultCode)
throws Exception {
- when(mMockTimeZoneDistroInstaller.stageInstallWithErrorCode(eq(expected)))
+ when(mMockTimeZoneDistroInstaller.stageInstallWithErrorCode(any(TimeZoneDistro.class)))
.thenReturn(resultCode);
}
@@ -797,8 +794,8 @@ public class RulesManagerServiceTest {
doReturn(success).when(mMockTimeZoneDistroInstaller).stageUninstall();
}
- private void verifyStageInstallCalled(TimeZoneDistro expected) throws Exception {
- verify(mMockTimeZoneDistroInstaller).stageInstallWithErrorCode(eq(expected));
+ private void verifyStageInstallCalled() throws Exception {
+ verify(mMockTimeZoneDistroInstaller).stageInstallWithErrorCode(any(TimeZoneDistro.class));
verifyNoMoreInteractions(mMockTimeZoneDistroInstaller);
reset(mMockTimeZoneDistroInstaller);
}
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index c1475784a9ac..c1289d3f1401 100644
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -188,6 +188,19 @@ public final class Call {
*/
public static final String EVENT_HANDOVER_COMPLETE =
"android.telecom.event.HANDOVER_COMPLETE";
+
+ /**
+ * Call event sent from Telecom to the handover destination {@link ConnectionService} via
+ * {@link Connection#onCallEvent(String, Bundle)} to inform the handover destination that the
+ * source connection has disconnected. The {@link Bundle} parameter for the call event will be
+ * {@code null}.
+ * <p>
+ * A handover is initiated with the {@link #EVENT_REQUEST_HANDOVER} call event.
+ * @hide
+ */
+ public static final String EVENT_HANDOVER_SOURCE_DISCONNECTED =
+ "android.telecom.event.HANDOVER_SOURCE_DISCONNECTED";
+
/**
* Call event sent from Telecom to the handover {@link ConnectionService} via
* {@link Connection#onCallEvent(String, Bundle)} to inform a {@link Connection} that a handover
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 8be30d208385..52b64b65404e 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -1455,23 +1455,6 @@ public class CarrierConfigManager {
"disable_voice_barring_notification_bool";
/**
- * URL from which the proto containing the public key of the Carrier used for
- * IMSI encryption will be downloaded.
- * @hide
- */
- public static final String IMSI_KEY_DOWNLOAD_URL_STRING = "imsi_key_download_url_string";
-
- /**
- * Time in days, after which the key will expire, and a new key will need to be downloaded.
- * default value is {@link IMSI_ENCRYPTION_DAYS_TIME_DISABLED}, and indicates that IMSI
- * encryption is not enabled by default for a carrier. Value of 0 indicates that the key
- * does not expire.
- * @hide
- */
- public static final String IMSI_KEY_EXPIRATION_DAYS_TIME_INT =
- "imsi_key_expiration_days_time_int";
-
- /**
* List of operators considered non-roaming which won't show roaming icon.
* <p>
* Can use mcc or mcc+mnc as item. For example, 302 or 21407.
@@ -1495,6 +1478,23 @@ public class CarrierConfigManager {
public static final String KEY_ROAMING_OPERATOR_STRING_ARRAY =
"roaming_operator_string_array";
+ /**
+ * URL from which the proto containing the public key of the Carrier used for
+ * IMSI encryption will be downloaded.
+ * @hide
+ */
+ public static final String IMSI_KEY_DOWNLOAD_URL_STRING = "imsi_key_download_url_string";
+
+ /**
+ * Time in days, after which the key will expire, and a new key will need to be downloaded.
+ * default value is {@link IMSI_ENCRYPTION_DAYS_TIME_DISABLED}, and indicates that IMSI
+ * encryption is not enabled by default for a carrier. Value of 0 indicates that the key
+ * does not expire.
+ * @hide
+ */
+ public static final String IMSI_KEY_EXPIRATION_DAYS_TIME_INT =
+ "imsi_key_expiration_days_time_int";
+
/** The default value for every variable. */
private final static PersistableBundle sDefaults;
@@ -1747,6 +1747,8 @@ public class CarrierConfigManager {
sDefaults.putString(IMSI_KEY_DOWNLOAD_URL_STRING, null);
sDefaults.putStringArray(KEY_NON_ROAMING_OPERATOR_STRING_ARRAY, null);
sDefaults.putStringArray(KEY_ROAMING_OPERATOR_STRING_ARRAY, null);
+ sDefaults.putInt(IMSI_KEY_EXPIRATION_DAYS_TIME_INT, IMSI_ENCRYPTION_DAYS_TIME_DISABLED);
+ sDefaults.putString(IMSI_KEY_DOWNLOAD_URL_STRING, null);
}
/**
diff --git a/telephony/java/com/android/ims/ImsConfig.java b/telephony/java/com/android/ims/ImsConfig.java
index c3010296d9c0..e7b22bdfadcc 100644
--- a/telephony/java/com/android/ims/ImsConfig.java
+++ b/telephony/java/com/android/ims/ImsConfig.java
@@ -697,4 +697,11 @@ public class ImsConfig {
ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
}
}
+
+ /**
+ * @return true if the binder connection is alive, false otherwise.
+ */
+ public boolean isBinderAlive() {
+ return miConfig.asBinder().isBinderAlive();
+ }
}
diff --git a/telephony/java/com/android/internal/telephony/NetworkScanResult.java b/telephony/java/com/android/internal/telephony/NetworkScanResult.java
index 7a7c17467dae..95f39d7f878a 100644
--- a/telephony/java/com/android/internal/telephony/NetworkScanResult.java
+++ b/telephony/java/com/android/internal/telephony/NetworkScanResult.java
@@ -35,10 +35,10 @@ import java.util.Objects;
public final class NetworkScanResult implements Parcelable {
// Contains only part of the scan result and more are coming.
- public static final int SCAN_STATUS_PARTIAL = 0;
+ public static final int SCAN_STATUS_PARTIAL = 1;
// Contains the last part of the scan result and the scan is now complete.
- public static final int SCAN_STATUS_COMPLETE = 1;
+ public static final int SCAN_STATUS_COMPLETE = 2;
// The status of the scan, only valid when scanError = SUCCESS.
public int scanStatus;
diff --git a/telephony/java/com/android/internal/telephony/gsm/SmsCbConstants.java b/telephony/java/com/android/internal/telephony/gsm/SmsCbConstants.java
index f28d1263d13a..0fabc2ff6b86 100644
--- a/telephony/java/com/android/internal/telephony/gsm/SmsCbConstants.java
+++ b/telephony/java/com/android/internal/telephony/gsm/SmsCbConstants.java
@@ -30,10 +30,6 @@ public class SmsCbConstants {
/** Private constructor for utility class. */
private SmsCbConstants() { }
- /** Channel 50 required by Brazil. ID 0~999 is allocated by GSMA */
- public static final int MESSAGE_ID_GSMA_ALLOCATED_CHANNEL_50
- = 0x0032;
-
/** Start of PWS Message Identifier range (includes ETWS and CMAS). */
public static final int MESSAGE_ID_PWS_FIRST_IDENTIFIER
= 0x1100; // 4352
diff --git a/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java b/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java
index 582506a367d0..d4098d94ba6c 100644
--- a/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java
+++ b/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java
@@ -278,6 +278,10 @@ public class SmsMessage extends SmsMessageBase {
scAddress, destinationAddress, mtiByte,
statusReportRequested, ret);
+ // Skip encoding pdu if error occurs when create pdu head and the error will be handled
+ // properly later on encodedMessage sanity check.
+ if (bo == null) return ret;
+
// User Data (and length)
byte[] userData;
try {
@@ -420,6 +424,9 @@ public class SmsMessage extends SmsMessageBase {
scAddress, destinationAddress, (byte) 0x41, // MTI = SMS-SUBMIT,
// TP-UDHI = true
statusReportRequested, ret);
+ // Skip encoding pdu if error occurs when create pdu head and the error will be handled
+ // properly later on encodedMessage sanity check.
+ if (bo == null) return ret;
// TP-Data-Coding-Scheme
// No class, 8 bit data
@@ -451,7 +458,7 @@ public class SmsMessage extends SmsMessageBase {
* @param destinationAddress the address of the destination for the message
* @param mtiByte
* @param ret <code>SubmitPdu</code> containing the encoded SC
- * address, if applicable, and the encoded message
+ * address, if applicable, and the encoded message. Returns null on encode error.
*/
private static ByteArrayOutputStream getSubmitPduHead(
String scAddress, String destinationAddress, byte mtiByte,
@@ -482,6 +489,9 @@ public class SmsMessage extends SmsMessageBase {
daBytes = PhoneNumberUtils.networkPortionToCalledPartyBCD(destinationAddress);
+ // return empty pduHead for invalid destination address
+ if (daBytes == null) return null;
+
// destination address length in BCD digits, ignoring TON byte and pad
// TODO Should be better.
bo.write((daBytes.length - 1) * 2
diff --git a/test-runner/src/android/test/InstrumentationTestRunner.java b/test-runner/src/android/test/InstrumentationTestRunner.java
index 29e21a757f10..b2582c19b548 100644
--- a/test-runner/src/android/test/InstrumentationTestRunner.java
+++ b/test-runner/src/android/test/InstrumentationTestRunner.java
@@ -16,8 +16,9 @@
package android.test;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.SmallTest;
import com.android.internal.util.Predicate;
-import com.android.internal.util.Predicates;
import android.app.Activity;
import android.app.Instrumentation;
@@ -27,7 +28,6 @@ import android.os.Looper;
import android.test.suitebuilder.TestMethod;
import android.test.suitebuilder.TestPredicates;
import android.test.suitebuilder.TestSuiteBuilder;
-import android.test.suitebuilder.annotation.HasAnnotation;
import android.test.suitebuilder.annotation.LargeTest;
import android.util.Log;
@@ -49,6 +49,8 @@ import junit.framework.TestSuite;
import junit.runner.BaseTestRunner;
import junit.textui.ResultPrinter;
+import static android.test.suitebuilder.TestPredicates.hasAnnotation;
+
/**
* An {@link Instrumentation} that runs various types of {@link junit.framework.TestCase}s against
* an Android package (application).
@@ -193,6 +195,12 @@ public class InstrumentationTestRunner extends Instrumentation implements TestSu
/** @hide */
static final String ARGUMENT_NOT_ANNOTATION = "notAnnotation";
+ private static final Predicate<TestMethod> SELECT_SMALL = hasAnnotation(SmallTest.class);
+
+ private static final Predicate<TestMethod> SELECT_MEDIUM = hasAnnotation(MediumTest.class);
+
+ private static final Predicate<TestMethod> SELECT_LARGE = hasAnnotation(LargeTest.class);
+
/**
* This constant defines the maximum allowed runtime (in ms) for a test included in the "small"
* suite. It is used to make an educated guess at what suite an unlabeled test belongs.
@@ -460,11 +468,11 @@ public class InstrumentationTestRunner extends Instrumentation implements TestSu
private Predicate<TestMethod> getSizePredicateFromArg(String sizeArg) {
if (SMALL_SUITE.equals(sizeArg)) {
- return TestPredicates.SELECT_SMALL;
+ return SELECT_SMALL;
} else if (MEDIUM_SUITE.equals(sizeArg)) {
- return TestPredicates.SELECT_MEDIUM;
+ return SELECT_MEDIUM;
} else if (LARGE_SUITE.equals(sizeArg)) {
- return TestPredicates.SELECT_LARGE;
+ return SELECT_LARGE;
} else {
return null;
}
@@ -479,7 +487,7 @@ public class InstrumentationTestRunner extends Instrumentation implements TestSu
private Predicate<TestMethod> getAnnotationPredicate(String annotationClassName) {
Class<? extends Annotation> annotationClass = getAnnotationClass(annotationClassName);
if (annotationClass != null) {
- return new HasAnnotation(annotationClass);
+ return hasAnnotation(annotationClass);
}
return null;
}
@@ -493,7 +501,7 @@ public class InstrumentationTestRunner extends Instrumentation implements TestSu
private Predicate<TestMethod> getNotAnnotationPredicate(String annotationClassName) {
Class<? extends Annotation> annotationClass = getAnnotationClass(annotationClassName);
if (annotationClass != null) {
- return Predicates.not(new HasAnnotation(annotationClass));
+ return TestPredicates.not(hasAnnotation(annotationClass));
}
return null;
}
diff --git a/test-runner/src/android/test/TestCase.java b/test-runner/src/android/test/TestCase.java
deleted file mode 100644
index b234f441c5c2..000000000000
--- a/test-runner/src/android/test/TestCase.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.test;
-
-import android.content.Context;
-
-/**
- * {@hide}
- * More complex interface for test cases.
- *
- * <p>Just implementing Runnable is enough for many test cases. If you
- * have additional setup or teardown, this interface might be for you,
- * especially if you need to share it between different test cases, or your
- * teardown code must execute regardless of whether your test passed.
- *
- * <p>See the android.test package documentation (click the more... link)
- * for a full description
- */
-@Deprecated
-public interface TestCase extends Runnable
-{
- /**
- * Called before run() is called.
- */
- public void setUp(Context context);
-
- /**
- * Called after run() is called, even if run() threw an exception, but
- * not if setUp() threw an execption.
- */
- public void tearDown();
-}
-
diff --git a/test-runner/src/android/test/TestCaseUtil.java b/test-runner/src/android/test/TestCaseUtil.java
index dc053a2359a0..156290997a1b 100644
--- a/test-runner/src/android/test/TestCaseUtil.java
+++ b/test-runner/src/android/test/TestCaseUtil.java
@@ -40,16 +40,6 @@ public class TestCaseUtil {
private TestCaseUtil() {
}
- @SuppressWarnings("unchecked")
- public static List<String> getTestCaseNames(Test test, boolean flatten) {
- List<Test> tests = (List<Test>) getTests(test, flatten);
- List<String> testCaseNames = new ArrayList<>();
- for (Test aTest : tests) {
- testCaseNames.add(getTestName(aTest));
- }
- return testCaseNames;
- }
-
public static List<? extends Test> getTests(Test test, boolean flatten) {
return getTests(test, flatten, new HashSet<Class<?>>());
}
@@ -92,7 +82,7 @@ public class TestCaseUtil {
return testCases;
}
- private static Test invokeSuiteMethodIfPossible(Class testClass,
+ static Test invokeSuiteMethodIfPossible(Class testClass,
Set<Class<?>> seen) {
try {
Method suiteMethod = testClass.getMethod(
@@ -120,7 +110,7 @@ public class TestCaseUtil {
return null;
}
- public static String getTestName(Test test) {
+ static String getTestName(Test test) {
if (test instanceof TestCase) {
TestCase testCase = (TestCase) test;
return testCase.getName();
@@ -138,34 +128,4 @@ public class TestCaseUtil {
}
return "";
}
-
- public static Test getTestAtIndex(TestSuite testSuite, int position) {
- int index = 0;
- Enumeration enumeration = testSuite.tests();
- while (enumeration.hasMoreElements()) {
- Test test = (Test) enumeration.nextElement();
- if (index == position) {
- return test;
- }
- index++;
- }
- return null;
- }
-
- public static TestSuite createTestSuite(Class<? extends Test> testClass)
- throws InstantiationException, IllegalAccessException {
-
- Test test = invokeSuiteMethodIfPossible(testClass,
- new HashSet<Class<?>>());
- if (test == null) {
- return new TestSuite(testClass);
-
- } else if (TestCase.class.isAssignableFrom(test.getClass())) {
- TestSuite testSuite = new TestSuite(test.getClass().getName());
- testSuite.addTest(test);
- return testSuite;
- }
-
- return (TestSuite) test;
- }
}
diff --git a/test-runner/src/android/test/TestPrinter.java b/test-runner/src/android/test/TestPrinter.java
index a23f06dde9b0..01d392dac7b5 100644
--- a/test-runner/src/android/test/TestPrinter.java
+++ b/test-runner/src/android/test/TestPrinter.java
@@ -21,7 +21,6 @@ import junit.framework.Test;
import junit.framework.TestListener;
import java.util.HashSet;
-import java.util.List;
import java.util.Set;
/**
@@ -34,52 +33,37 @@ import java.util.Set;
* {@hide} Not needed for 1.0 SDK.
*/
@Deprecated
-public class TestPrinter implements TestRunner.Listener, TestListener {
+class TestPrinter implements TestListener {
private String mTag;
private boolean mOnlyFailures;
private Set<String> mFailedTests = new HashSet<String>();
- public TestPrinter(String tag, boolean onlyFailures) {
+ TestPrinter(String tag, boolean onlyFailures) {
mTag = tag;
mOnlyFailures = onlyFailures;
}
- public void started(String className) {
+ private void started(String className) {
if (!mOnlyFailures) {
Log.i(mTag, "started: " + className);
}
}
- public void finished(String className) {
+ private void finished(String className) {
if (!mOnlyFailures) {
Log.i(mTag, "finished: " + className);
}
}
- public void performance(String className,
- long itemTimeNS, int iterations,
- List<TestRunner.IntermediateTime> intermediates) {
- Log.i(mTag, "perf: " + className + " = " + itemTimeNS + "ns/op (done "
- + iterations + " times)");
- if (intermediates != null && intermediates.size() > 0) {
- int N = intermediates.size();
- for (int i = 0; i < N; i++) {
- TestRunner.IntermediateTime time = intermediates.get(i);
- Log.i(mTag, " intermediate: " + time.name + " = "
- + time.timeInNS + "ns");
- }
- }
- }
-
- public void passed(String className) {
+ private void passed(String className) {
if (!mOnlyFailures) {
Log.i(mTag, "passed: " + className);
}
}
- public void failed(String className, Throwable exception) {
+ private void failed(String className, Throwable exception) {
Log.i(mTag, "failed: " + className);
Log.i(mTag, "----- begin exception -----");
Log.i(mTag, "", exception);
diff --git a/test-runner/src/android/test/TestRunner.java b/test-runner/src/android/test/TestRunner.java
deleted file mode 100644
index ff045c3b4072..000000000000
--- a/test-runner/src/android/test/TestRunner.java
+++ /dev/null
@@ -1,725 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.test;
-
-import android.content.Context;
-import android.util.Log;
-import android.os.Debug;
-import android.os.SystemClock;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestSuite;
-import junit.framework.TestListener;
-import junit.framework.Test;
-import junit.framework.TestResult;
-
-/**
- * Support class that actually runs a test. Android uses this class,
- * and you probably will not need to instantiate, extend, or call this
- * class yourself. See the full {@link android.test} package description
- * to learn more about testing Android applications.
- *
- * {@hide} Not needed for 1.0 SDK.
- */
-@Deprecated
-public class TestRunner implements PerformanceTestCase.Intermediates {
- public static final int REGRESSION = 0;
- public static final int PERFORMANCE = 1;
- public static final int PROFILING = 2;
-
- public static final int CLEARSCREEN = 0;
- private static final String TAG = "TestHarness";
- private Context mContext;
-
- private int mMode = REGRESSION;
-
- private List<Listener> mListeners = new ArrayList<>();
- private int mPassed;
- private int mFailed;
-
- private int mInternalIterations;
- private long mStartTime;
- private long mEndTime;
-
- private String mClassName;
-
- List<IntermediateTime> mIntermediates = null;
-
- private static Class mRunnableClass;
- private static Class mJUnitClass;
-
- static {
- try {
- mRunnableClass = Class.forName("java.lang.Runnable", false, null);
- mJUnitClass = Class.forName("junit.framework.TestCase", false, null);
- } catch (ClassNotFoundException ex) {
- throw new RuntimeException("shouldn't happen", ex);
- }
- }
-
- public class JunitTestSuite extends TestSuite implements TestListener {
- boolean mError = false;
-
- public JunitTestSuite() {
- super();
- }
-
- @Override
- public void run(TestResult result) {
- result.addListener(this);
- super.run(result);
- result.removeListener(this);
- }
-
- /**
- * Implemented method of the interface TestListener which will listen for the
- * start of a test.
- *
- * @param test
- */
- public void startTest(Test test) {
- started(test.toString());
- }
-
- /**
- * Implemented method of the interface TestListener which will listen for the
- * end of the test.
- *
- * @param test
- */
- public void endTest(Test test) {
- finished(test.toString());
- if (!mError) {
- passed(test.toString());
- }
- }
-
- /**
- * Implemented method of the interface TestListener which will listen for an
- * mError while running the test.
- *
- * @param test
- */
- public void addError(Test test, Throwable t) {
- mError = true;
- failed(test.toString(), t);
- }
-
- public void addFailure(Test test, junit.framework.AssertionFailedError t) {
- mError = true;
- failed(test.toString(), t);
- }
- }
-
- /**
- * Listener.performance() 'intermediates' argument is a list of these.
- */
- public static class IntermediateTime {
- public IntermediateTime(String name, long timeInNS) {
- this.name = name;
- this.timeInNS = timeInNS;
- }
-
- public String name;
- public long timeInNS;
- }
-
- /**
- * Support class that receives status on test progress. You should not need to
- * extend this interface yourself.
- */
- public interface Listener {
- void started(String className);
- void finished(String className);
- void performance(String className,
- long itemTimeNS, int iterations,
- List<IntermediateTime> itermediates);
- void passed(String className);
- void failed(String className, Throwable execption);
- }
-
- public TestRunner(Context context) {
- mContext = context;
- }
-
- public void addListener(Listener listener) {
- mListeners.add(listener);
- }
-
- public void startProfiling() {
- File file = new File("/tmp/trace");
- file.mkdir();
- String base = "/tmp/trace/" + mClassName + ".dmtrace";
- Debug.startMethodTracing(base, 8 * 1024 * 1024);
- }
-
- public void finishProfiling() {
- Debug.stopMethodTracing();
- }
-
- private void started(String className) {
-
- int count = mListeners.size();
- for (int i = 0; i < count; i++) {
- mListeners.get(i).started(className);
- }
- }
-
- private void finished(String className) {
- int count = mListeners.size();
- for (int i = 0; i < count; i++) {
- mListeners.get(i).finished(className);
- }
- }
-
- private void performance(String className,
- long itemTimeNS,
- int iterations,
- List<IntermediateTime> intermediates) {
- int count = mListeners.size();
- for (int i = 0; i < count; i++) {
- mListeners.get(i).performance(className,
- itemTimeNS,
- iterations,
- intermediates);
- }
- }
-
- public void passed(String className) {
- mPassed++;
- int count = mListeners.size();
- for (int i = 0; i < count; i++) {
- mListeners.get(i).passed(className);
- }
- }
-
- public void failed(String className, Throwable exception) {
- mFailed++;
- int count = mListeners.size();
- for (int i = 0; i < count; i++) {
- mListeners.get(i).failed(className, exception);
- }
- }
-
- public int passedCount() {
- return mPassed;
- }
-
- public int failedCount() {
- return mFailed;
- }
-
- public void run(String[] classes) {
- for (String cl : classes) {
- run(cl);
- }
- }
-
- public void setInternalIterations(int count) {
- mInternalIterations = count;
- }
-
- public void startTiming(boolean realTime) {
- if (realTime) {
- mStartTime = System.currentTimeMillis();
- } else {
- mStartTime = SystemClock.currentThreadTimeMillis();
- }
- }
-
- public void addIntermediate(String name) {
- addIntermediate(name, (System.currentTimeMillis() - mStartTime) * 1000000);
- }
-
- public void addIntermediate(String name, long timeInNS) {
- mIntermediates.add(new IntermediateTime(name, timeInNS));
- }
-
- public void finishTiming(boolean realTime) {
- if (realTime) {
- mEndTime = System.currentTimeMillis();
- } else {
- mEndTime = SystemClock.currentThreadTimeMillis();
- }
- }
-
- public void setPerformanceMode(int mode) {
- mMode = mode;
- }
-
- private void missingTest(String className, Throwable e) {
- started(className);
- finished(className);
- failed(className, e);
- }
-
- /*
- This class determines if more suites are added to this class then adds all individual
- test classes to a test suite for run
- */
- public void run(String className) {
- try {
- mClassName = className;
- Class clazz = mContext.getClassLoader().loadClass(className);
- Method method = getChildrenMethod(clazz);
- if (method != null) {
- String[] children = getChildren(method);
- run(children);
- } else if (mRunnableClass.isAssignableFrom(clazz)) {
- Runnable test = (Runnable) clazz.newInstance();
- TestCase testcase = null;
- if (test instanceof TestCase) {
- testcase = (TestCase) test;
- }
- Throwable e = null;
- boolean didSetup = false;
- started(className);
- try {
- if (testcase != null) {
- testcase.setUp(mContext);
- didSetup = true;
- }
- if (mMode == PERFORMANCE) {
- runInPerformanceMode(test, className, false, className);
- } else if (mMode == PROFILING) {
- //Need a way to mark a test to be run in profiling mode or not.
- startProfiling();
- test.run();
- finishProfiling();
- } else {
- test.run();
- }
- } catch (Throwable ex) {
- e = ex;
- }
- if (testcase != null && didSetup) {
- try {
- testcase.tearDown();
- } catch (Throwable ex) {
- e = ex;
- }
- }
- finished(className);
- if (e == null) {
- passed(className);
- } else {
- failed(className, e);
- }
- } else if (mJUnitClass.isAssignableFrom(clazz)) {
- Throwable e = null;
- //Create a Junit Suite.
- JunitTestSuite suite = new JunitTestSuite();
- Method[] methods = getAllTestMethods(clazz);
- for (Method m : methods) {
- junit.framework.TestCase test = (junit.framework.TestCase) clazz.newInstance();
- test.setName(m.getName());
-
- if (test instanceof AndroidTestCase) {
- AndroidTestCase testcase = (AndroidTestCase) test;
- try {
- testcase.setContext(mContext);
- testcase.setTestContext(mContext);
- } catch (Exception ex) {
- Log.i("TestHarness", ex.toString());
- }
- }
- suite.addTest(test);
- }
- if (mMode == PERFORMANCE) {
- final int testCount = suite.testCount();
-
- for (int j = 0; j < testCount; j++) {
- Test test = suite.testAt(j);
- started(test.toString());
- try {
- runInPerformanceMode(test, className, true, test.toString());
- } catch (Throwable ex) {
- e = ex;
- }
- finished(test.toString());
- if (e == null) {
- passed(test.toString());
- } else {
- failed(test.toString(), e);
- }
- }
- } else if (mMode == PROFILING) {
- //Need a way to mark a test to be run in profiling mode or not.
- startProfiling();
- junit.textui.TestRunner.run(suite);
- finishProfiling();
- } else {
- junit.textui.TestRunner.run(suite);
- }
- } else {
- System.out.println("Test wasn't Runnable and didn't have a"
- + " children method: " + className);
- }
- } catch (ClassNotFoundException e) {
- Log.e("ClassNotFoundException for " + className, e.toString());
- if (isJunitTest(className)) {
- runSingleJunitTest(className);
- } else {
- missingTest(className, e);
- }
- } catch (InstantiationException e) {
- System.out.println("InstantiationException for " + className);
- missingTest(className, e);
- } catch (IllegalAccessException e) {
- System.out.println("IllegalAccessException for " + className);
- missingTest(className, e);
- }
- }
-
- public void runInPerformanceMode(Object testCase, String className, boolean junitTest,
- String testNameInDb) throws Exception {
- boolean increaseIterations = true;
- int iterations = 1;
- long duration = 0;
- mIntermediates = null;
-
- mInternalIterations = 1;
- Class clazz = mContext.getClassLoader().loadClass(className);
- Object perftest = clazz.newInstance();
-
- PerformanceTestCase perftestcase = null;
- if (perftest instanceof PerformanceTestCase) {
- perftestcase = (PerformanceTestCase) perftest;
- // only run the test if it is not marked as a performance only test
- if (mMode == REGRESSION && perftestcase.isPerformanceOnly()) return;
- }
-
- // First force GCs, to avoid GCs happening during out
- // test and skewing its time.
- Runtime.getRuntime().runFinalization();
- Runtime.getRuntime().gc();
-
- if (perftestcase != null) {
- mIntermediates = new ArrayList<IntermediateTime>();
- iterations = perftestcase.startPerformance(this);
- if (iterations > 0) {
- increaseIterations = false;
- } else {
- iterations = 1;
- }
- }
-
- // Pause briefly to let things settle down...
- Thread.sleep(1000);
- do {
- mEndTime = 0;
- if (increaseIterations) {
- // Test case does not implement
- // PerformanceTestCase or returned 0 iterations,
- // so we take care of measure the whole test time.
- mStartTime = SystemClock.currentThreadTimeMillis();
- } else {
- // Try to make it obvious if the test case
- // doesn't call startTiming().
- mStartTime = 0;
- }
-
- if (junitTest) {
- for (int i = 0; i < iterations; i++) {
- junit.textui.TestRunner.run((junit.framework.Test) testCase);
- }
- } else {
- Runnable test = (Runnable) testCase;
- for (int i = 0; i < iterations; i++) {
- test.run();
- }
- }
-
- long endTime = mEndTime;
- if (endTime == 0) {
- endTime = SystemClock.currentThreadTimeMillis();
- }
-
- duration = endTime - mStartTime;
- if (!increaseIterations) {
- break;
- }
- if (duration <= 1) {
- iterations *= 1000;
- } else if (duration <= 10) {
- iterations *= 100;
- } else if (duration < 100) {
- iterations *= 10;
- } else if (duration < 1000) {
- iterations *= (int) ((1000 / duration) + 2);
- } else {
- break;
- }
- } while (true);
-
- if (duration != 0) {
- iterations *= mInternalIterations;
- performance(testNameInDb, (duration * 1000000) / iterations,
- iterations, mIntermediates);
- }
- }
-
- public void runSingleJunitTest(String className) {
- Throwable excep = null;
- int index = className.lastIndexOf('$');
- String testName = "";
- String originalClassName = className;
- if (index >= 0) {
- className = className.substring(0, index);
- testName = originalClassName.substring(index + 1);
- }
- try {
- Class clazz = mContext.getClassLoader().loadClass(className);
- if (mJUnitClass.isAssignableFrom(clazz)) {
- junit.framework.TestCase test = (junit.framework.TestCase) clazz.newInstance();
- JunitTestSuite newSuite = new JunitTestSuite();
- test.setName(testName);
-
- if (test instanceof AndroidTestCase) {
- AndroidTestCase testcase = (AndroidTestCase) test;
- try {
- testcase.setContext(mContext);
- } catch (Exception ex) {
- Log.w(TAG, "Exception encountered while trying to set the context.", ex);
- }
- }
- newSuite.addTest(test);
-
- if (mMode == PERFORMANCE) {
- try {
- started(test.toString());
- runInPerformanceMode(test, className, true, test.toString());
- finished(test.toString());
- if (excep == null) {
- passed(test.toString());
- } else {
- failed(test.toString(), excep);
- }
- } catch (Throwable ex) {
- excep = ex;
- }
-
- } else if (mMode == PROFILING) {
- startProfiling();
- junit.textui.TestRunner.run(newSuite);
- finishProfiling();
- } else {
- junit.textui.TestRunner.run(newSuite);
- }
- }
- } catch (ClassNotFoundException e) {
- Log.e("TestHarness", "No test case to run", e);
- } catch (IllegalAccessException e) {
- Log.e("TestHarness", "Illegal Access Exception", e);
- } catch (InstantiationException e) {
- Log.e("TestHarness", "Instantiation Exception", e);
- }
- }
-
- public static Method getChildrenMethod(Class clazz) {
- try {
- return clazz.getMethod("children", (Class[]) null);
- } catch (NoSuchMethodException e) {
- }
-
- return null;
- }
-
- public static Method getChildrenMethod(Context c, String className) {
- try {
- return getChildrenMethod(c.getClassLoader().loadClass(className));
- } catch (ClassNotFoundException e) {
- }
- return null;
- }
-
- public static String[] getChildren(Context c, String className) {
- Method m = getChildrenMethod(c, className);
- String[] testChildren = getTestChildren(c, className);
- if (m == null & testChildren == null) {
- throw new RuntimeException("couldn't get children method for "
- + className);
- }
- if (m != null) {
- String[] children = getChildren(m);
- if (testChildren != null) {
- String[] allChildren = new String[testChildren.length + children.length];
- System.arraycopy(children, 0, allChildren, 0, children.length);
- System.arraycopy(testChildren, 0, allChildren, children.length, testChildren.length);
- return allChildren;
- } else {
- return children;
- }
- } else {
- if (testChildren != null) {
- return testChildren;
- }
- }
- return null;
- }
-
- public static String[] getChildren(Method m) {
- try {
- if (!Modifier.isStatic(m.getModifiers())) {
- throw new RuntimeException("children method is not static");
- }
- return (String[]) m.invoke(null, (Object[]) null);
- } catch (IllegalAccessException e) {
- } catch (InvocationTargetException e) {
- }
- return new String[0];
- }
-
- public static String[] getTestChildren(Context c, String className) {
- try {
- Class clazz = c.getClassLoader().loadClass(className);
-
- if (mJUnitClass.isAssignableFrom(clazz)) {
- return getTestChildren(clazz);
- }
- } catch (ClassNotFoundException e) {
- Log.e("TestHarness", "No class found", e);
- }
- return null;
- }
-
- public static String[] getTestChildren(Class clazz) {
- Method[] methods = getAllTestMethods(clazz);
-
- String[] onScreenTestNames = new String[methods.length];
- int index = 0;
- for (Method m : methods) {
- onScreenTestNames[index] = clazz.getName() + "$" + m.getName();
- index++;
- }
- return onScreenTestNames;
- }
-
- public static Method[] getAllTestMethods(Class clazz) {
- Method[] allMethods = clazz.getDeclaredMethods();
- int numOfMethods = 0;
- for (Method m : allMethods) {
- boolean mTrue = isTestMethod(m);
- if (mTrue) {
- numOfMethods++;
- }
- }
- int index = 0;
- Method[] testMethods = new Method[numOfMethods];
- for (Method m : allMethods) {
- boolean mTrue = isTestMethod(m);
- if (mTrue) {
- testMethods[index] = m;
- index++;
- }
- }
- return testMethods;
- }
-
- private static boolean isTestMethod(Method m) {
- return m.getName().startsWith("test") &&
- m.getReturnType() == void.class &&
- m.getParameterTypes().length == 0;
- }
-
- public static int countJunitTests(Class clazz) {
- Method[] allTestMethods = getAllTestMethods(clazz);
- int numberofMethods = allTestMethods.length;
-
- return numberofMethods;
- }
-
- public static boolean isTestSuite(Context c, String className) {
- boolean childrenMethods = getChildrenMethod(c, className) != null;
-
- try {
- Class clazz = c.getClassLoader().loadClass(className);
- if (mJUnitClass.isAssignableFrom(clazz)) {
- int numTests = countJunitTests(clazz);
- if (numTests > 0)
- childrenMethods = true;
- }
- } catch (ClassNotFoundException e) {
- }
- return childrenMethods;
- }
-
-
- public boolean isJunitTest(String className) {
- int index = className.lastIndexOf('$');
- if (index >= 0) {
- className = className.substring(0, index);
- }
- try {
- Class clazz = mContext.getClassLoader().loadClass(className);
- if (mJUnitClass.isAssignableFrom(clazz)) {
- return true;
- }
- } catch (ClassNotFoundException e) {
- }
- return false;
- }
-
- /**
- * Returns the number of tests that will be run if you try to do this.
- */
- public static int countTests(Context c, String className) {
- try {
- Class clazz = c.getClassLoader().loadClass(className);
- Method method = getChildrenMethod(clazz);
- if (method != null) {
-
- String[] children = getChildren(method);
- int rv = 0;
- for (String child : children) {
- rv += countTests(c, child);
- }
- return rv;
- } else if (mRunnableClass.isAssignableFrom(clazz)) {
- return 1;
- } else if (mJUnitClass.isAssignableFrom(clazz)) {
- return countJunitTests(clazz);
- }
- } catch (ClassNotFoundException e) {
- return 1; // this gets the count right, because either this test
- // is missing, and it will fail when run or it is a single Junit test to be run.
- }
- return 0;
- }
-
- /**
- * Returns a title to display given the className of a test.
- * <p/>
- * <p>Currently this function just returns the portion of the
- * class name after the last '.'
- */
- public static String getTitle(String className) {
- int indexDot = className.lastIndexOf('.');
- int indexDollar = className.lastIndexOf('$');
- int index = indexDot > indexDollar ? indexDot : indexDollar;
- if (index >= 0) {
- className = className.substring(index + 1);
- }
- return className;
- }
-}
diff --git a/test-runner/src/android/test/suitebuilder/AssignableFrom.java b/test-runner/src/android/test/suitebuilder/AssignableFrom.java
index 38b4ee3f8c6e..84db06669cf4 100644
--- a/test-runner/src/android/test/suitebuilder/AssignableFrom.java
+++ b/test-runner/src/android/test/suitebuilder/AssignableFrom.java
@@ -20,9 +20,9 @@ import com.android.internal.util.Predicate;
class AssignableFrom implements Predicate<TestMethod> {
- private final Class root;
+ private final Class<?> root;
- AssignableFrom(Class root) {
+ AssignableFrom(Class<?> root) {
this.root = root;
}
diff --git a/test-runner/src/android/test/suitebuilder/TestPredicates.java b/test-runner/src/android/test/suitebuilder/TestPredicates.java
index 47aca55f9972..616d1a972612 100644
--- a/test-runner/src/android/test/suitebuilder/TestPredicates.java
+++ b/test-runner/src/android/test/suitebuilder/TestPredicates.java
@@ -17,30 +17,63 @@
package android.test.suitebuilder;
import android.test.InstrumentationTestCase;
-import android.test.suitebuilder.annotation.HasAnnotation;
-import android.test.suitebuilder.annotation.Suppress;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
import android.test.suitebuilder.annotation.Smoke;
+import android.test.suitebuilder.annotation.Suppress;
import com.android.internal.util.Predicate;
-import com.android.internal.util.Predicates;
+import java.lang.annotation.Annotation;
/**
* {@hide} Not needed for 1.0 SDK.
*/
public class TestPredicates {
- public static final Predicate<TestMethod> SELECT_INSTRUMENTATION =
- new AssignableFrom(InstrumentationTestCase.class);
- public static final Predicate<TestMethod> REJECT_INSTRUMENTATION =
- Predicates.not(SELECT_INSTRUMENTATION);
+ static final Predicate<TestMethod> REJECT_INSTRUMENTATION =
+ not(new AssignableFrom(InstrumentationTestCase.class));
+
+ static final Predicate<TestMethod> SELECT_SMOKE = hasAnnotation(Smoke.class);
+
+ static final Predicate<TestMethod> REJECT_SUPPRESSED = not(hasAnnotation(Suppress.class));
+
+ /**
+ * Return a predicate that checks to see if a {@link TestMethod} has an instance of the supplied
+ * annotation class, either on the method or on the containing class.
+ */
+ public static Predicate<TestMethod> hasAnnotation(Class<? extends Annotation> annotationClass) {
+ return new HasAnnotation(annotationClass);
+ }
+
+ private static class HasAnnotation implements Predicate<TestMethod> {
+
+ private final Class<? extends Annotation> annotationClass;
+
+ private HasAnnotation(Class<? extends Annotation> annotationClass) {
+ this.annotationClass = annotationClass;
+ }
+
+ @Override
+ public boolean apply(TestMethod testMethod) {
+ return testMethod.getAnnotation(annotationClass) != null ||
+ testMethod.getEnclosingClass().getAnnotation(annotationClass) != null;
+ }
+ }
+
+ /**
+ * Returns a Predicate that evaluates to true iff the given Predicate
+ * evaluates to false.
+ */
+ public static <T> Predicate<T> not(Predicate<? super T> predicate) {
+ return new NotPredicate<T>(predicate);
+ }
+
+ private static class NotPredicate<T> implements Predicate<T> {
+ private final Predicate<? super T> predicate;
- public static final Predicate<TestMethod> SELECT_SMOKE = new HasAnnotation(Smoke.class);
- public static final Predicate<TestMethod> SELECT_SMALL = new HasAnnotation(SmallTest.class);
- public static final Predicate<TestMethod> SELECT_MEDIUM = new HasAnnotation(MediumTest.class);
- public static final Predicate<TestMethod> SELECT_LARGE = new HasAnnotation(LargeTest.class);
- public static final Predicate<TestMethod> REJECT_SUPPRESSED =
- Predicates.not(new HasAnnotation(Suppress.class));
+ private NotPredicate(Predicate<? super T> predicate) {
+ this.predicate = predicate;
+ }
+ public boolean apply(T t) {
+ return !predicate.apply(t);
+ }
+ }
}
diff --git a/test-runner/src/android/test/suitebuilder/annotation/HasAnnotation.java b/test-runner/src/android/test/suitebuilder/annotation/HasAnnotation.java
deleted file mode 100644
index a2868fc9e0fd..000000000000
--- a/test-runner/src/android/test/suitebuilder/annotation/HasAnnotation.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.test.suitebuilder.annotation;
-
-import static com.android.internal.util.Predicates.or;
-import com.android.internal.util.Predicate;
-import android.test.suitebuilder.TestMethod;
-
-import java.lang.annotation.Annotation;
-
-/**
- * A predicate that checks to see if a {@link TestMethod} has a specific annotation, either on the
- * method or on the containing class.
- *
- * {@hide} Not needed for 1.0 SDK.
- */
-public class HasAnnotation implements Predicate<TestMethod> {
-
- private Predicate<TestMethod> hasMethodOrClassAnnotation;
-
- public HasAnnotation(Class<? extends Annotation> annotationClass) {
- this.hasMethodOrClassAnnotation = or(
- new HasMethodAnnotation(annotationClass),
- new HasClassAnnotation(annotationClass));
- }
-
- public boolean apply(TestMethod testMethod) {
- return hasMethodOrClassAnnotation.apply(testMethod);
- }
-}
diff --git a/test-runner/src/android/test/suitebuilder/annotation/HasClassAnnotation.java b/test-runner/src/android/test/suitebuilder/annotation/HasClassAnnotation.java
deleted file mode 100644
index ac76f4cb46fe..000000000000
--- a/test-runner/src/android/test/suitebuilder/annotation/HasClassAnnotation.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.test.suitebuilder.annotation;
-
-import java.lang.annotation.Annotation;
-
-import android.test.suitebuilder.TestMethod;
-import com.android.internal.util.Predicate;
-
-/**
- * A predicate that checks to see if a {@link android.test.suitebuilder.TestMethod} has a specific annotation on the
- * containing class. Consider using the public {@link HasAnnotation} class instead of this class.
- *
- * {@hide} Not needed for 1.0 SDK.
- */
-class HasClassAnnotation implements Predicate<TestMethod> {
-
- private Class<? extends Annotation> annotationClass;
-
- public HasClassAnnotation(Class<? extends Annotation> annotationClass) {
- this.annotationClass = annotationClass;
- }
-
- public boolean apply(TestMethod testMethod) {
- return testMethod.getEnclosingClass().getAnnotation(annotationClass) != null;
- }
-}
diff --git a/test-runner/src/android/test/suitebuilder/annotation/HasMethodAnnotation.java b/test-runner/src/android/test/suitebuilder/annotation/HasMethodAnnotation.java
deleted file mode 100644
index 96bd922721ea..000000000000
--- a/test-runner/src/android/test/suitebuilder/annotation/HasMethodAnnotation.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.test.suitebuilder.annotation;
-
-import com.android.internal.util.Predicate;
-import android.test.suitebuilder.TestMethod;
-
-import java.lang.annotation.Annotation;
-
-/**
- * A predicate that checks to see if a the method represented by {@link TestMethod} has a certain
- * annotation on it. Consider using the public {@link HasAnnotation} class instead of this class.
- *
- * {@hide} Not needed for 1.0 SDK.
- */
-class HasMethodAnnotation implements Predicate<TestMethod> {
-
- private final Class<? extends Annotation> annotationClass;
-
- public HasMethodAnnotation(Class<? extends Annotation> annotationClass) {
- this.annotationClass = annotationClass;
- }
-
- public boolean apply(TestMethod testMethod) {
- return testMethod.getAnnotation(annotationClass) != null;
- }
-}
diff --git a/test-runner/tests/src/android/test/TestCaseUtilTest.java b/test-runner/tests/src/android/test/TestCaseUtilTest.java
index 9d12eafcd34f..6d424b08dfb1 100644
--- a/test-runner/tests/src/android/test/TestCaseUtilTest.java
+++ b/test-runner/tests/src/android/test/TestCaseUtilTest.java
@@ -16,6 +16,8 @@
package android.test;
+import java.util.ArrayList;
+import java.util.HashSet;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
@@ -24,38 +26,50 @@ import java.util.List;
public class TestCaseUtilTest extends TestCase {
- public void testGetTestCaseNamesForTestSuiteWithSuiteMethod() throws Exception {
+ @SuppressWarnings("unchecked")
+ private static List<String> getTestCaseNames(Test test) {
+ List<Test> tests = (List<Test>) TestCaseUtil.getTests(test, false);
+ List<String> testCaseNames = new ArrayList<>();
+ for (Test aTest : tests) {
+ testCaseNames.add(TestCaseUtil.getTestName(aTest));
+ }
+ return testCaseNames;
+ }
+
+ public void testGetTests_ForTestSuiteWithSuiteMethod() throws Exception {
TestSuite testSuite = new TwoTestsInTestSuite();
- List<String> testCaseNames = TestCaseUtil.getTestCaseNames(testSuite, false);
+ List<String> testCaseNames = getTestCaseNames(testSuite);
assertEquals(0, testCaseNames.size());
}
- public void testGetTestCaseNamesForTestCaseWithSuiteMethod() throws Exception {
+ public void testGetTests_ForTestCaseWithSuiteMethod() throws Exception {
TestCase testCase = new OneTestTestCaseWithSuite();
- List<String> testCaseNames = TestCaseUtil.getTestCaseNames(testCase, false);
+ List<String> testCaseNames = getTestCaseNames(testCase);
assertEquals(1, testCaseNames.size());
assertTrue(testCaseNames.get(0).endsWith("testOne"));
}
- public void testCreateTestForTestCase() throws Exception {
- Test test = TestCaseUtil.createTestSuite(OneTestTestCase.class);
- assertEquals(1, test.countTestCases());
+ public void testInvokeSuiteMethodIfPossible_ForTestCase() throws Exception {
+ Test test = TestCaseUtil.invokeSuiteMethodIfPossible(OneTestTestCase.class, new HashSet<>());
+ assertNull(test);
}
-
- public void testCreateTestForTestSuiteWithSuiteMethod() throws Exception {
- Test test = TestCaseUtil.createTestSuite(TwoTestsInTestSuite.class);
+
+ public void testInvokeSuiteMethodIfPossible_ForTestSuiteWithSuiteMethod() throws Exception {
+ Test test = TestCaseUtil.invokeSuiteMethodIfPossible(TwoTestsInTestSuite.class, new HashSet<>());
+ assertNotNull(test);
assertEquals(2, test.countTestCases());
}
- public void testCreateTestForTestCaseWithSuiteMethod() throws Exception {
- Test test = TestCaseUtil.createTestSuite(OneTestTestCaseWithSuite.class);
+ public void testInvokeSuiteMethodIfPossible_ForTestCaseWithSuiteMethod() throws Exception {
+ Test test = TestCaseUtil.invokeSuiteMethodIfPossible(OneTestTestCaseWithSuite.class, new HashSet<>());
+ assertNotNull(test);
assertEquals(1, test.countTestCases());
}
-
+
public void testReturnEmptyStringForTestSuiteWithNoName() throws Exception {
assertEquals("", TestCaseUtil.getTestName(new TestSuite()));
}
diff --git a/test-runner/tests/src/android/test/suitebuilder/annotation/HasAnnotationTest.java b/test-runner/tests/src/android/test/suitebuilder/TestPredicatesTest.java
index edf067dce48b..3d8d5f1dc071 100644
--- a/test-runner/tests/src/android/test/suitebuilder/annotation/HasAnnotationTest.java
+++ b/test-runner/tests/src/android/test/suitebuilder/TestPredicatesTest.java
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-package android.test.suitebuilder.annotation;
+package android.test.suitebuilder;
-import android.test.suitebuilder.TestMethod;
+import com.android.internal.util.Predicate;
import junit.framework.TestCase;
import java.lang.annotation.ElementType;
@@ -25,7 +25,7 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
-public class HasAnnotationTest extends TestCase {
+public class TestPredicatesTest extends TestCase {
public void testThatMethodWithAnnotationIsReportedAsBeingAnnotated() throws Exception {
assertTrue(hasExampleAnnotation(ClassWithAnnotation.class, "testWithAnnotation"));
@@ -45,7 +45,7 @@ public class HasAnnotationTest extends TestCase {
throws NoSuchMethodException {
Method method = aClass.getMethod(methodName);
TestMethod testMethod = new TestMethod(method, aClass);
- return new HasAnnotation(Example.class).apply(testMethod);
+ return TestPredicates.hasAnnotation(Example.class).apply(testMethod);
}
@Retention(RetentionPolicy.RUNTIME)
@@ -73,4 +73,21 @@ public class HasAnnotationTest extends TestCase {
public void testWithoutAnnotation() {
}
}
+
+ private static final Predicate<Object> TRUE = new Predicate<Object>() {
+ public boolean apply(Object o) {
+ return true;
+ }
+ };
+
+ private static final Predicate<Object> FALSE = new Predicate<Object>() {
+ public boolean apply(Object o) {
+ return false;
+ }
+ };
+
+ public void testNotPredicate() throws Exception {
+ assertTrue(TestPredicates.not(FALSE).apply(null));
+ assertFalse(TestPredicates.not(TRUE).apply(null));
+ }
}
diff --git a/test-runner/tests/src/android/test/suitebuilder/annotation/HasClassAnnotationTest.java b/test-runner/tests/src/android/test/suitebuilder/annotation/HasClassAnnotationTest.java
deleted file mode 100644
index 051ea547dbbd..000000000000
--- a/test-runner/tests/src/android/test/suitebuilder/annotation/HasClassAnnotationTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.test.suitebuilder.annotation;
-
-import android.test.suitebuilder.TestMethod;
-import junit.framework.TestCase;
-
-import java.lang.reflect.Method;
-
-public class HasClassAnnotationTest extends TestCase {
-
- public void testShouldTellIfParentClassHasSpecifiedClassification()
- throws NoSuchMethodException {
- assertTrue(classHasAnnotation(SmokeTestExample.class, Smoke.class));
- }
-
- public void testShouldTellIfParentClassDoesNotHaveSpecifiedClassification()
- throws NoSuchMethodException {
- assertFalse(classHasAnnotation(NonSmokeTestExample.class, Smoke.class));
- }
-
- private boolean classHasAnnotation(
- Class<? extends TestCase> aClass,
- Class<Smoke> expectedClassification) throws NoSuchMethodException {
- Method method = aClass.getMethod("testSomeTest");
-
- TestMethod testMethod = new TestMethod(method, aClass);
- return new HasClassAnnotation(expectedClassification).apply(testMethod);
- }
-
- @Smoke
- static class SmokeTestExample extends TestCase {
-
- public void testSomeTest() {
- }
- }
-
- static class NonSmokeTestExample extends TestCase {
-
- public void testSomeTest() {
- }
- }
-}
diff --git a/test-runner/tests/src/android/test/suitebuilder/annotation/HasMethodAnnotationTest.java b/test-runner/tests/src/android/test/suitebuilder/annotation/HasMethodAnnotationTest.java
deleted file mode 100644
index c864e288702e..000000000000
--- a/test-runner/tests/src/android/test/suitebuilder/annotation/HasMethodAnnotationTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.test.suitebuilder.annotation;
-
-import android.test.suitebuilder.TestMethod;
-import junit.framework.TestCase;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Method;
-
-
-public class HasMethodAnnotationTest extends TestCase {
-
- public void testMethodWithSpecifiedAttribute() throws Exception {
- assertTrue(methodHasAnnotation(AnnotatedMethodExample.class,
- "testThatIsAnnotated", Smoke.class));
- }
-
- public void testMethodWithoutSpecifiedAttribute() throws Exception {
- assertFalse(methodHasAnnotation(AnnotatedMethodExample.class,
- "testThatIsNotAnnotated", Smoke.class));
- }
-
- private boolean methodHasAnnotation(Class<? extends TestCase> aClass,
- String methodName,
- Class<? extends Annotation> expectedClassification
- ) throws NoSuchMethodException {
- Method method = aClass.getMethod(methodName);
- TestMethod testMethod = new TestMethod(method, aClass);
- return new HasMethodAnnotation(expectedClassification).apply(testMethod);
- }
-
- static class AnnotatedMethodExample extends TestCase {
-
- @Smoke
- public void testThatIsAnnotated() {
- }
-
- public void testThatIsNotAnnotated() {
- }
- }
-}
diff --git a/tests/StatusBar/AndroidManifest.xml b/tests/StatusBar/AndroidManifest.xml
index 81442bfc60a4..6a082e990dab 100644
--- a/tests/StatusBar/AndroidManifest.xml
+++ b/tests/StatusBar/AndroidManifest.xml
@@ -6,6 +6,7 @@
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
+ <uses-permission android:name="android.permission.MANAGE_NOTIFICATIONS" />
<application>
<activity android:name="StatusBarTest" android:label="_StatusBar">
diff --git a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
index 5dd42dd21c90..fc68183b5970 100644
--- a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
+++ b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
@@ -129,6 +129,42 @@ public class NotificationTestList extends TestActivity
mNM.notify(7001, n);
}
},
+ new Test("with zen") {
+ public void run()
+ {
+ mNM.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALARMS);
+ Notification n = new Notification.Builder(NotificationTestList.this,
+ "default")
+ .setSmallIcon(R.drawable.icon2)
+ .setContentTitle("Default priority")
+ .build();
+ mNM.notify("default", 7004, n);
+ try {
+ Thread.sleep(8000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ mNM.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
+ }
+ },
+ new Test("repeated") {
+ public void run()
+ {
+ for (int i = 0; i < 50; i++) {
+ Notification n = new Notification.Builder(NotificationTestList.this,
+ "default")
+ .setSmallIcon(R.drawable.icon2)
+ .setContentTitle("Default priority")
+ .build();
+ mNM.notify("default", 7004, n);
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ },
new Test("Post a group") {
public void run()
{
diff --git a/tests/net/java/android/net/util/SharedLogTest.java b/tests/net/java/android/net/util/SharedLogTest.java
index 7fd7a634d298..3957cb075673 100644
--- a/tests/net/java/android/net/util/SharedLogTest.java
+++ b/tests/net/java/android/net/util/SharedLogTest.java
@@ -33,9 +33,8 @@ import java.util.Vector;
@RunWith(AndroidJUnit4.class)
@SmallTest
public class SharedLogTest {
- private static final String TIMESTAMP_PATTERN =
- "^[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9]";
- private static final String TIMESTAMP = "mm-dd HH:MM:SS.xxx";
+ private static final String TIMESTAMP_PATTERN = "\\d{2}:\\d{2}:\\d{2}\\.\\d{3}";
+ private static final String TIMESTAMP = "HH:MM:SS.xxx";
@Test
public void testBasicOperation() {
@@ -53,12 +52,12 @@ public class SharedLogTest {
logLevel2a.mark("ok: last post");
final String[] expected = {
- TIMESTAMP + " - MARK first post!",
- TIMESTAMP + " - [twoB] ERROR 2b or not 2b",
- TIMESTAMP + " - [twoA] WARN second post?",
- TIMESTAMP + " - still logging",
- TIMESTAMP + " - [twoA.three] 3 >> 2",
- TIMESTAMP + " - [twoA] MARK ok: last post",
+ " - MARK first post!",
+ " - [twoB] ERROR 2b or not 2b",
+ " - [twoA] WARN second post?",
+ " - still logging",
+ " - [twoA.three] 3 >> 2",
+ " - [twoA] MARK ok: last post",
};
// Verify the logs are all there and in the correct order.
verifyLogLines(expected, logTop);
@@ -82,13 +81,12 @@ public class SharedLogTest {
final String[] lines = dumpOutput.split("\n");
assertEquals(expected.length, lines.length);
- for (int i = 0; i < lines.length; i++) {
- // Fix up the timestamps.
- lines[i] = lines[i].replaceAll(TIMESTAMP_PATTERN, TIMESTAMP);
- }
-
for (int i = 0; i < expected.length; i++) {
- assertEquals(expected[i], lines[i]);
+ String got = lines[i];
+ String want = expected[i];
+ assertTrue(String.format("'%s' did not contain '%s'", got, want), got.endsWith(want));
+ assertTrue(String.format("'%s' did not contain a HH:MM:SS.xxx timestamp", got),
+ got.replaceFirst(TIMESTAMP_PATTERN, TIMESTAMP).contains(TIMESTAMP));
}
}
}
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index 91fc2f7ce773..e7fbe4fe55fc 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -891,9 +891,13 @@ public class WifiConfiguration implements Parcelable {
*/
public static final int DISABLED_DUE_TO_USER_SWITCH = 11;
/**
+ * This network is disabled due to wrong password
+ */
+ public static final int DISABLED_BY_WRONG_PASSWORD = 12;
+ /**
* This Maximum disable reason value
*/
- public static final int NETWORK_SELECTION_DISABLED_MAX = 12;
+ public static final int NETWORK_SELECTION_DISABLED_MAX = 13;
/**
* Quality network selection disable reason String (for debug purpose)
@@ -910,7 +914,8 @@ public class WifiConfiguration implements Parcelable {
"NETWORK_SELECTION_DISABLED_AUTHENTICATION_NO_CREDENTIALS",
"NETWORK_SELECTION_DISABLED_NO_INTERNET",
"NETWORK_SELECTION_DISABLED_BY_WIFI_MANAGER",
- "NETWORK_SELECTION_DISABLED_BY_USER_SWITCH"
+ "NETWORK_SELECTION_DISABLED_BY_USER_SWITCH",
+ "NETWORK_SELECTION_DISABLED_BY_WRONG_PASSWORD"
};
/**
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
index f596eef1bf21..0d4359e878d2 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
@@ -291,7 +291,6 @@ public class WifiP2pManager {
"android.net.wifi.p2p.CALLING_PACKAGE";
IWifiP2pManager mService;
- private final Map<Channel, Binder> mBinders = new HashMap<>();
private static final int BASE = Protocol.BASE_WIFI_P2P_MANAGER;
@@ -670,11 +669,12 @@ public class WifiP2pManager {
* by doing a call on {@link #initialize}
*/
public static class Channel {
- Channel(Context context, Looper looper, ChannelListener l) {
+ Channel(Context context, Looper looper, ChannelListener l, Binder binder) {
mAsyncChannel = new AsyncChannel();
mHandler = new P2pHandler(looper);
mChannelListener = l;
mContext = context;
+ mBinder = binder;
}
private final static int INVALID_LISTENER_KEY = 0;
private ChannelListener mChannelListener;
@@ -686,6 +686,8 @@ public class WifiP2pManager {
private final Object mListenerMapLock = new Object();
private int mListenerKey = 0;
+ /* package */ final Binder mBinder;
+
private AsyncChannel mAsyncChannel;
private P2pHandler mHandler;
Context mContext;
@@ -892,8 +894,8 @@ public class WifiP2pManager {
*/
public Channel initialize(Context srcContext, Looper srcLooper, ChannelListener listener) {
Binder binder = new Binder();
- Channel channel = initalizeChannel(srcContext, srcLooper, listener, getMessenger(binder));
- mBinders.put(channel, binder);
+ Channel channel = initalizeChannel(srcContext, srcLooper, listener, getMessenger(binder),
+ binder);
return channel;
}
@@ -903,14 +905,15 @@ public class WifiP2pManager {
*/
public Channel initializeInternal(Context srcContext, Looper srcLooper,
ChannelListener listener) {
- return initalizeChannel(srcContext, srcLooper, listener, getP2pStateMachineMessenger());
+ return initalizeChannel(srcContext, srcLooper, listener, getP2pStateMachineMessenger(),
+ null);
}
private Channel initalizeChannel(Context srcContext, Looper srcLooper, ChannelListener listener,
- Messenger messenger) {
+ Messenger messenger, Binder binder) {
if (messenger == null) return null;
- Channel c = new Channel(srcContext, srcLooper, listener);
+ Channel c = new Channel(srcContext, srcLooper, listener, binder);
if (c.mAsyncChannel.connectSync(srcContext, c.mHandler, messenger)
== AsyncChannel.STATUS_SUCCESSFUL) {
return c;
@@ -1428,8 +1431,9 @@ public class WifiP2pManager {
*/
public void close(Channel c) {
try {
- mService.close(mBinders.get(c));
- mBinders.remove(c);
+ if (c != null) {
+ mService.close(c.mBinder);
+ }
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}