summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.mk4
-rw-r--r--api/current.txt222
-rw-r--r--cmds/app_process/app_main.cpp6
-rw-r--r--core/java/android/accessibilityservice/AccessibilityServiceInfo.java21
-rw-r--r--core/java/android/accounts/AccountManager.java17
-rw-r--r--core/java/android/accounts/ChooseTypeAndAccountActivity.java5
-rw-r--r--core/java/android/accounts/IAccountManager.aidl1
-rw-r--r--core/java/android/app/INotificationManager.aidl6
-rw-r--r--core/java/android/app/NativeActivity.java46
-rw-r--r--core/java/android/app/Notification.java41
-rw-r--r--core/java/android/app/UiAutomation.java19
-rw-r--r--core/java/android/app/UiAutomationConnection.java4
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java27
-rw-r--r--core/java/android/app/backup/BackupAgent.java48
-rw-r--r--core/java/android/bluetooth/BluetoothAdapter.java6
-rw-r--r--core/java/android/content/ContentValues.aidl19
-rw-r--r--core/java/android/content/Intent.java4
-rw-r--r--core/java/android/content/RestrictionEntry.java7
-rw-r--r--core/java/android/content/pm/PackageManager.java8
-rw-r--r--core/java/android/content/res/Configuration.java8
-rw-r--r--core/java/android/content/res/Resources.java81
-rw-r--r--core/java/android/database/CursorWindow.aidl19
-rw-r--r--core/java/android/net/DhcpInfo.java3
-rw-r--r--core/java/android/net/IConnectivityManager.aidl2
-rw-r--r--core/java/android/os/Build.java4
-rw-r--r--core/java/android/os/Debug.java1
-rw-r--r--core/java/android/os/Environment.java31
-rw-r--r--core/java/android/os/StatFs.java34
-rw-r--r--core/java/android/service/notification/NotificationListenerService.java38
-rw-r--r--core/java/android/service/notification/StatusBarNotification.java102
-rw-r--r--core/java/android/text/BidiFormatter.java (renamed from core/java/android/text/bidi/BidiFormatter.java)273
-rw-r--r--core/java/android/text/TextUtils.java20
-rwxr-xr-xcore/java/android/util/PropertyValueModel.java143
-rwxr-xr-xcore/java/android/util/ValueModel.java74
-rw-r--r--core/java/android/view/DisplayList.java4
-rw-r--r--core/java/android/view/GLES20DisplayList.java6
-rw-r--r--core/java/android/view/InputDevice.java2
-rw-r--r--core/java/android/view/InputEvent.java1
-rw-r--r--core/java/android/view/InputQueue.java130
-rw-r--r--core/java/android/view/KeyEvent.java8
-rw-r--r--core/java/android/view/MotionEvent.java8
-rw-r--r--core/java/android/view/View.java46
-rw-r--r--core/java/android/view/ViewGroup.java8
-rw-r--r--core/java/android/view/ViewParent.java8
-rw-r--r--core/java/android/view/ViewRootImpl.java64
-rw-r--r--core/java/android/view/WindowManager.java9
-rw-r--r--core/java/android/view/accessibility/AccessibilityNodeInfo.java10
-rw-r--r--core/java/android/view/accessibility/AccessibilityNodeInfoCache.java1
-rw-r--r--core/java/android/webkit/BrowserFrame.java15
-rw-r--r--core/java/android/webkit/WebView.java3
-rw-r--r--core/java/android/webkit/WebViewDatabaseClassic.java15
-rw-r--r--core/java/android/widget/CheckBox.java23
-rw-r--r--core/java/android/widget/EditText.java23
-rw-r--r--core/java/android/widget/Editor.java2
-rw-r--r--core/java/android/widget/RelativeLayout.java7
-rw-r--r--core/java/android/widget/SeekBar.java20
-rw-r--r--core/java/android/widget/TextView.java28
-rwxr-xr-xcore/java/android/widget/ValueEditor.java53
-rw-r--r--core/jni/Android.mk1
-rw-r--r--core/jni/AndroidRuntime.cpp2
-rw-r--r--core/jni/android/graphics/TextLayoutCache.cpp17
-rw-r--r--core/jni/android_app_NativeActivity.cpp428
-rw-r--r--core/jni/android_view_GLES20DisplayList.cpp8
-rw-r--r--core/jni/android_view_InputQueue.cpp282
-rw-r--r--core/res/AndroidManifest.xml9
-rw-r--r--core/res/res/values-af/strings.xml24
-rw-r--r--core/res/res/values-am/strings.xml28
-rw-r--r--core/res/res/values-ar/strings.xml24
-rw-r--r--core/res/res/values-be/strings.xml24
-rw-r--r--core/res/res/values-bg/strings.xml24
-rw-r--r--core/res/res/values-ca/strings.xml34
-rw-r--r--core/res/res/values-cs/strings.xml26
-rw-r--r--core/res/res/values-da/strings.xml24
-rw-r--r--core/res/res/values-de/strings.xml24
-rw-r--r--core/res/res/values-el/strings.xml24
-rw-r--r--core/res/res/values-en-rGB/strings.xml24
-rw-r--r--core/res/res/values-es-rUS/strings.xml28
-rw-r--r--core/res/res/values-es/strings.xml38
-rw-r--r--core/res/res/values-et/strings.xml24
-rw-r--r--core/res/res/values-fa/strings.xml24
-rw-r--r--core/res/res/values-fi/strings.xml24
-rw-r--r--core/res/res/values-fr/strings.xml24
-rw-r--r--core/res/res/values-hi/strings.xml26
-rw-r--r--core/res/res/values-hr/strings.xml24
-rw-r--r--core/res/res/values-hu/strings.xml24
-rw-r--r--core/res/res/values-in/strings.xml24
-rw-r--r--core/res/res/values-it/strings.xml24
-rw-r--r--core/res/res/values-iw/strings.xml24
-rw-r--r--core/res/res/values-ja/strings.xml24
-rw-r--r--core/res/res/values-ko/strings.xml28
-rw-r--r--core/res/res/values-lt/strings.xml24
-rw-r--r--core/res/res/values-lv/strings.xml24
-rw-r--r--core/res/res/values-ms/strings.xml24
-rw-r--r--core/res/res/values-nb/strings.xml24
-rw-r--r--core/res/res/values-nl/strings.xml28
-rw-r--r--core/res/res/values-pl/strings.xml24
-rw-r--r--core/res/res/values-pt-rPT/strings.xml50
-rw-r--r--core/res/res/values-pt/strings.xml24
-rw-r--r--core/res/res/values-rm/strings.xml24
-rw-r--r--core/res/res/values-ro/strings.xml28
-rw-r--r--core/res/res/values-ru/strings.xml44
-rw-r--r--core/res/res/values-sk/strings.xml24
-rw-r--r--core/res/res/values-sl/strings.xml26
-rw-r--r--core/res/res/values-sr/strings.xml24
-rw-r--r--core/res/res/values-sv/strings.xml24
-rw-r--r--core/res/res/values-sw/strings.xml30
-rw-r--r--core/res/res/values-th/strings.xml24
-rw-r--r--core/res/res/values-tl/strings.xml24
-rw-r--r--core/res/res/values-tr/strings.xml90
-rw-r--r--core/res/res/values-uk/strings.xml24
-rw-r--r--core/res/res/values-vi/strings.xml24
-rw-r--r--core/res/res/values-zh-rCN/strings.xml26
-rw-r--r--core/res/res/values-zh-rTW/strings.xml26
-rw-r--r--core/res/res/values-zu/strings.xml66
-rw-r--r--core/res/res/values/config.xml54
-rw-r--r--core/res/res/values/public.xml38
-rw-r--r--core/res/res/values/strings.xml6
-rw-r--r--core/res/res/values/symbols.xml8
-rw-r--r--data/keyboards/Vendor_045e_Product_028e.kl4
-rw-r--r--data/keyboards/Vendor_046d_Product_c219.kl2
-rw-r--r--data/keyboards/Vendor_046d_Product_c21f.kl4
-rw-r--r--data/keyboards/Vendor_054c_Product_0268.kl2
-rw-r--r--data/keyboards/Vendor_1689_Product_fd00.kl8
-rw-r--r--data/keyboards/Vendor_1689_Product_fd01.kl6
-rw-r--r--data/keyboards/Vendor_1689_Product_fe00.kl4
-rw-r--r--data/keyboards/Vendor_1bad_Product_f016.kl4
-rw-r--r--data/keyboards/Vendor_1bad_Product_f023.kl2
-rw-r--r--data/keyboards/Vendor_1bad_Product_f027.kl4
-rw-r--r--data/keyboards/Vendor_1bad_Product_f036.kl4
-rw-r--r--data/keyboards/Vendor_1d79_Product_0009.kl4
-rw-r--r--data/keyboards/common.mk18
-rw-r--r--docs/html/about/versions/android-1.1.jd1
-rw-r--r--docs/html/about/versions/android-1.5-highlights.jd1
-rw-r--r--docs/html/about/versions/android-1.5.jd1
-rw-r--r--docs/html/about/versions/android-1.6-highlights.jd1
-rw-r--r--docs/html/about/versions/android-1.6.jd1
-rw-r--r--docs/html/about/versions/android-2.0-highlights.jd1
-rw-r--r--docs/html/about/versions/android-2.0.1.jd1
-rw-r--r--docs/html/about/versions/android-2.0.jd1
-rw-r--r--docs/html/about/versions/android-2.1.jd1
-rw-r--r--docs/html/about/versions/android-2.2-highlights.jd1
-rw-r--r--docs/html/about/versions/android-2.2.jd1
-rw-r--r--docs/html/about/versions/android-2.3.3.jd1
-rw-r--r--docs/html/about/versions/android-2.3.4.jd1
-rw-r--r--docs/html/about/versions/android-2.3.jd1
-rw-r--r--docs/html/about/versions/android-3.0.jd1
-rw-r--r--docs/html/about/versions/android-3.1.jd1
-rw-r--r--docs/html/about/versions/android-3.2.jd1
-rw-r--r--docs/html/about/versions/android-4.0.3.jd1
-rw-r--r--docs/html/about/versions/android-4.0.jd1
-rw-r--r--docs/html/about/versions/android-4.1.jd1
-rw-r--r--docs/html/about/versions/android-4.2.jd1
-rw-r--r--docs/html/distribute/googleplay/about/monetizing.jd4
-rw-r--r--docs/html/distribute/googleplay/promote/brand.jd21
-rw-r--r--docs/html/distribute/googleplay/publish/console.jd4
-rw-r--r--docs/html/distribute/googleplay/publish/preparing.jd4
-rw-r--r--docs/html/distribute/googleplay/publish/register.jd4
-rw-r--r--docs/html/distribute/googleplay/quality/tablet.jd548
-rw-r--r--docs/html/google/backup/signup.jd2
-rw-r--r--docs/html/google/gcm/gcm.jd6
-rw-r--r--docs/html/google/gcm/gs.jd1
-rw-r--r--docs/html/google/play-services/auth.jd1
-rw-r--r--docs/html/google/play-services/maps.jd1
-rw-r--r--docs/html/google/play-services/plus.jd1
-rw-r--r--docs/html/google/play-services/setup.jd2
-rw-r--r--docs/html/google/play/billing/billing_admin.jd24
-rw-r--r--docs/html/google/play/billing/billing_overview.jd6
-rw-r--r--docs/html/google/play/billing/billing_subscriptions.jd12
-rw-r--r--docs/html/google/play/billing/billing_testing.jd10
-rw-r--r--docs/html/google/play/billing/index.jd2
-rw-r--r--docs/html/google/play/billing/v2/billing_integrate.jd6
-rw-r--r--docs/html/google/play/billing/v2/billing_subscriptions.jd2
-rw-r--r--docs/html/guide/appendix/app-intents.jd1
-rw-r--r--docs/html/guide/appendix/g-app-intents.jd1
-rw-r--r--docs/html/guide/appendix/glossary.jd1
-rw-r--r--docs/html/guide/practices/compatibility.jd1
-rw-r--r--docs/html/guide/practices/index.jd1
-rw-r--r--docs/html/guide/practices/optimizing-for-3.0.jd1
-rw-r--r--docs/html/guide/practices/screen-compat-mode.jd1
-rw-r--r--docs/html/guide/practices/screens-distribution.jd1
-rw-r--r--docs/html/guide/practices/screens-support-1.5.jd1
-rw-r--r--docs/html/guide/practices/seamlessness.jd1
-rw-r--r--docs/html/guide/practices/ui_guidelines/activity_task_design.jd1
-rw-r--r--docs/html/guide/practices/ui_guidelines/icon_design.jd1
-rw-r--r--docs/html/guide/practices/ui_guidelines/icon_design_action_bar.jd1
-rw-r--r--docs/html/guide/practices/ui_guidelines/icon_design_dialog.jd1
-rw-r--r--docs/html/guide/practices/ui_guidelines/icon_design_launcher.jd1
-rw-r--r--docs/html/guide/practices/ui_guidelines/icon_design_launcher_archive.jd1
-rw-r--r--docs/html/guide/practices/ui_guidelines/icon_design_list.jd1
-rw-r--r--docs/html/guide/practices/ui_guidelines/icon_design_menu.jd1
-rw-r--r--docs/html/guide/practices/ui_guidelines/icon_design_status_bar.jd1
-rw-r--r--docs/html/guide/practices/ui_guidelines/icon_design_tab.jd1
-rw-r--r--docs/html/guide/practices/ui_guidelines/index.jd1
-rw-r--r--docs/html/guide/practices/ui_guidelines/menu_design.jd1
-rw-r--r--docs/html/guide/practices/ui_guidelines/widget_design.jd1
-rw-r--r--docs/html/guide/topics/graphics/hardware-accel.jd437
-rw-r--r--docs/html/index.jd4
-rw-r--r--docs/html/sdk/OLD_RELEASENOTES.jd1
-rw-r--r--docs/html/sdk/RELEASENOTES.jd1
-rw-r--r--docs/html/sdk/download.jd1
-rw-r--r--docs/html/sdk/index.jd1
-rw-r--r--docs/html/sdk/older_releases.jd1
-rw-r--r--docs/html/support.jd6
-rw-r--r--docs/html/tools/help/index.jd2
-rw-r--r--docs/html/tools/sdk/download.jd93
-rw-r--r--docs/html/tools/workflow/publishing/publishing.jd4
-rw-r--r--docs/html/training/in-app-billing/preparing-iab-app.jd2
-rw-r--r--graphics/java/android/renderscript/Allocation.java4
-rw-r--r--graphics/java/android/renderscript/FieldPacker.java4
-rw-r--r--graphics/java/android/renderscript/RenderScript.java17
-rw-r--r--graphics/java/android/renderscript/Script.java98
-rw-r--r--include/android_runtime/android_app_NativeActivity.h103
-rw-r--r--include/android_runtime/android_view_InputQueue.h85
-rw-r--r--include/androidfw/Input.h3
-rw-r--r--keystore/java/android/security/AndroidKeyPairGenerator.java14
-rw-r--r--keystore/java/android/security/AndroidKeyStore.java9
-rw-r--r--keystore/java/android/security/AndroidKeyStoreProvider.java4
-rw-r--r--keystore/java/android/security/KeyPairGeneratorSpec.java (renamed from keystore/java/android/security/AndroidKeyPairGeneratorSpec.java)34
-rw-r--r--keystore/java/android/security/KeyStoreParameter.java (renamed from keystore/java/android/security/AndroidKeyStoreParameter.java)41
-rw-r--r--keystore/tests/src/android/security/AndroidKeyPairGeneratorTest.java18
-rw-r--r--keystore/tests/src/android/security/AndroidKeyStoreTest.java14
-rw-r--r--keystore/tests/src/android/security/KeyPairGeneratorSpecTest.java (renamed from keystore/tests/src/android/security/AndroidKeyPairGeneratorSpecTest.java)22
-rw-r--r--libs/hwui/DisplayList.cpp33
-rw-r--r--libs/hwui/DisplayList.h6
-rw-r--r--libs/hwui/DisplayListOp.h42
-rw-r--r--media/java/android/media/AudioManager.java34
-rw-r--r--media/java/android/media/AudioService.java113
-rw-r--r--media/java/android/media/IAudioService.aidl16
-rw-r--r--media/java/android/media/IRemoteControlClient.aidl1
-rw-r--r--media/java/android/media/MediaCodecInfo.java14
-rw-r--r--media/java/android/media/MediaDrm.java8
-rw-r--r--media/java/android/media/RemoteControlClient.java190
-rw-r--r--native/android/input.cpp27
-rw-r--r--opengl/java/android/opengl/GLSurfaceView.java1059
-rw-r--r--packages/SystemUI/ic_sysbar_internal.psdbin0 -> 360448 bytes
-rw-r--r--packages/SystemUI/src/com/android/systemui/settings/SettingsUI.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java86
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java22
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/Ticker.java20
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java12
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindowManager.java95
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java10
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetPager.java1
-rw-r--r--services/input/InputReader.cpp53
-rw-r--r--services/input/InputReader.h5
-rw-r--r--services/java/com/android/server/ConnectivityService.java25
-rw-r--r--services/java/com/android/server/LocationManagerService.java29
-rw-r--r--services/java/com/android/server/LockSettingsService.java43
-rw-r--r--services/java/com/android/server/NotificationManagerService.java92
-rw-r--r--services/java/com/android/server/ServiceWatcher.java134
-rw-r--r--services/java/com/android/server/SystemServer.java3
-rw-r--r--services/java/com/android/server/accessibility/AccessibilityManagerService.java51
-rw-r--r--services/java/com/android/server/accounts/AccountManagerService.java15
-rw-r--r--services/java/com/android/server/am/NativeCrashListener.java8
-rw-r--r--services/java/com/android/server/connectivity/Vpn.java51
-rw-r--r--services/java/com/android/server/firewall/IntentFirewall.java1
-rw-r--r--services/java/com/android/server/location/GeocoderProxy.java14
-rw-r--r--services/java/com/android/server/location/GeofenceProxy.java15
-rw-r--r--services/java/com/android/server/location/LocationProviderProxy.java15
-rw-r--r--services/java/com/android/server/power/ElectronBeam.java12
-rw-r--r--services/java/com/android/server/wifi/WifiService.java22
-rw-r--r--wifi/java/android/net/wifi/IWifiManager.aidl2
-rw-r--r--wifi/java/android/net/wifi/WifiEnterpriseConfig.java45
-rw-r--r--wifi/java/android/net/wifi/WifiManager.java4
266 files changed, 4562 insertions, 3758 deletions
diff --git a/Android.mk b/Android.mk
index bd88877b5841..849ec8cb1a39 100644
--- a/Android.mk
+++ b/Android.mk
@@ -282,15 +282,17 @@ aidl_files := \
frameworks/base/core/java/android/accounts/IAccountAuthenticatorResponse.aidl \
frameworks/base/core/java/android/app/Notification.aidl \
frameworks/base/core/java/android/app/PendingIntent.aidl \
+ frameworks/base/core/java/android/appwidget/AppWidgetProviderInfo.aidl \
frameworks/base/core/java/android/bluetooth/BluetoothDevice.aidl \
frameworks/base/core/java/android/bluetooth/BluetoothHealthAppConfiguration.aidl \
frameworks/base/core/java/android/content/ComponentName.aidl \
+ frameworks/base/core/java/android/content/ContentValues.aidl \
frameworks/base/core/java/android/content/Intent.aidl \
frameworks/base/core/java/android/content/IntentSender.aidl \
frameworks/base/core/java/android/content/PeriodicSync.aidl \
frameworks/base/core/java/android/content/SyncStats.aidl \
frameworks/base/core/java/android/content/res/Configuration.aidl \
- frameworks/base/core/java/android/appwidget/AppWidgetProviderInfo.aidl \
+ frameworks/base/core/java/android/database/CursorWindow.aidl \
frameworks/base/core/java/android/net/Uri.aidl \
frameworks/base/core/java/android/nfc/NdefMessage.aidl \
frameworks/base/core/java/android/nfc/NdefRecord.aidl \
diff --git a/api/current.txt b/api/current.txt
index 2ec1533483c5..dcdf0ba565d0 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -2198,6 +2198,7 @@ package android.accounts {
method public android.accounts.Account[] getAccounts();
method public android.accounts.Account[] getAccountsByType(java.lang.String);
method public android.accounts.AccountManagerFuture<android.accounts.Account[]> getAccountsByTypeAndFeatures(java.lang.String, java.lang.String[], android.accounts.AccountManagerCallback<android.accounts.Account[]>, android.os.Handler);
+ method public android.accounts.Account[] getAccountsByTypeForPackage(java.lang.String, java.lang.String);
method public android.accounts.AccountManagerFuture<android.os.Bundle> getAuthToken(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
method public deprecated android.accounts.AccountManagerFuture<android.os.Bundle> getAuthToken(android.accounts.Account, java.lang.String, boolean, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
method public android.accounts.AccountManagerFuture<android.os.Bundle> getAuthToken(android.accounts.Account, java.lang.String, android.os.Bundle, boolean, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
@@ -4358,7 +4359,7 @@ package android.app.admin {
method public boolean hasGrantedPolicy(android.content.ComponentName, int);
method public boolean isActivePasswordSufficient();
method public boolean isAdminActive(android.content.ComponentName);
- method public boolean isDeviceOwner(java.lang.String);
+ method public boolean isDeviceOwnerApp(java.lang.String);
method public void lockNow();
method public void removeActiveAdmin(android.content.ComponentName);
method public boolean resetPassword(java.lang.String, int);
@@ -6472,7 +6473,6 @@ package android.content {
field public static final android.os.Parcelable.Creator CREATOR;
field public static final int TYPE_BOOLEAN = 1; // 0x1
field public static final int TYPE_CHOICE = 2; // 0x2
- field public static final int TYPE_CHOICE_LEVEL = 3; // 0x3
field public static final int TYPE_MULTI_SELECT = 4; // 0x4
field public static final int TYPE_NULL = 0; // 0x0
}
@@ -6948,6 +6948,7 @@ package android.content.pm {
field public static final java.lang.String FEATURE_APP_WIDGETS = "android.software.app_widgets";
field public static final java.lang.String FEATURE_AUDIO_LOW_LATENCY = "android.hardware.audio.low_latency";
field public static final java.lang.String FEATURE_BLUETOOTH = "android.hardware.bluetooth";
+ field public static final java.lang.String FEATURE_BLUETOOTH_LE = "android.hardware.bluetooth_le";
field public static final java.lang.String FEATURE_CAMERA = "android.hardware.camera";
field public static final java.lang.String FEATURE_CAMERA_ANY = "android.hardware.camera.any";
field public static final java.lang.String FEATURE_CAMERA_AUTOFOCUS = "android.hardware.camera.autofocus";
@@ -11844,7 +11845,7 @@ package android.media {
field public static final int KEY_TYPE_OFFLINE = 2; // 0x2
field public static final int KEY_TYPE_RELEASE = 3; // 0x3
field public static final int KEY_TYPE_STREAMING = 1; // 0x1
- field public static final java.lang.String PROPERTY_ALGORITHM = "algorithm";
+ field public static final java.lang.String PROPERTY_ALGORITHMS = "algorithms";
field public static final java.lang.String PROPERTY_DESCRIPTION = "description";
field public static final java.lang.String PROPERTY_DEVICE_UNIQUE_ID = "deviceUniqueId";
field public static final java.lang.String PROPERTY_VENDOR = "vendor";
@@ -13931,8 +13932,11 @@ package android.net.wifi {
ctor public WifiEnterpriseConfig(android.net.wifi.WifiEnterpriseConfig);
method public int describeContents();
method public java.lang.String getAnonymousIdentity();
+ method public java.security.cert.X509Certificate getCaCertificate();
+ method public java.security.cert.X509Certificate getClientCertificate();
method public int getEapMethod();
method public java.lang.String getIdentity();
+ method public java.lang.String getPassword();
method public int getPhase2Method();
method public java.lang.String getSubjectMatch();
method public void setAnonymousIdentity(java.lang.String);
@@ -13948,7 +13952,6 @@ package android.net.wifi {
}
public static final class WifiEnterpriseConfig.Eap {
- ctor public WifiEnterpriseConfig.Eap();
field public static final int NONE = -1; // 0xffffffff
field public static final int PEAP = 0; // 0x0
field public static final int PWD = 3; // 0x3
@@ -13957,7 +13960,6 @@ package android.net.wifi {
}
public static final class WifiEnterpriseConfig.Phase2 {
- ctor public WifiEnterpriseConfig.Phase2();
field public static final int GTC = 4; // 0x4
field public static final int MSCHAP = 2; // 0x2
field public static final int MSCHAPV2 = 3; // 0x3
@@ -13996,7 +13998,7 @@ package android.net.wifi {
method public deprecated android.net.DhcpInfo getDhcpInfo();
method public java.util.List<android.net.wifi.ScanResult> getScanResults();
method public int getWifiState();
- method public boolean isScanningAlwaysAvailable();
+ method public boolean isScanAlwaysAvailable();
method public boolean isWifiEnabled();
method public boolean pingSupplicant();
method public boolean reassociate();
@@ -16758,7 +16760,7 @@ package android.os {
field public static final int ICE_CREAM_SANDWICH_MR1 = 15; // 0xf
field public static final int JELLY_BEAN = 16; // 0x10
field public static final int JELLY_BEAN_MR1 = 17; // 0x11
- field public static final int JELLY_BEAN_MR2 = 10000; // 0x2710
+ field public static final int JELLY_BEAN_MR2 = 18; // 0x12
}
public final class Bundle implements java.lang.Cloneable android.os.Parcelable {
@@ -16947,7 +16949,7 @@ package android.os {
method public static void startMethodTracing(java.lang.String, int);
method public static void startMethodTracing(java.lang.String, int, int);
method public static void startNativeTracing();
- method public static void stopAllocCounting();
+ method public static deprecated void stopAllocCounting();
method public static void stopMethodTracing();
method public static void stopNativeTracing();
method public static long threadCpuTimeNanos();
@@ -17523,16 +17525,17 @@ package android.os {
public class StatFs {
ctor public StatFs(java.lang.String);
- method public int getAvailableBlocks();
+ method public deprecated int getAvailableBlocks();
method public long getAvailableBlocksLong();
method public long getAvailableBytes();
- method public int getBlockCount();
+ method public deprecated int getBlockCount();
method public long getBlockCountLong();
- method public int getBlockSize();
+ method public deprecated int getBlockSize();
method public long getBlockSizeLong();
- method public int getFreeBlocks();
+ method public deprecated int getFreeBlocks();
method public long getFreeBlocksLong();
method public long getFreeBytes();
+ method public long getTotalBytes();
method public void restat(java.lang.String);
}
@@ -20296,7 +20299,6 @@ package android.renderscript {
method public deprecated synchronized void resize(int);
method public void setFromFieldPacker(int, android.renderscript.FieldPacker);
method public void setFromFieldPacker(int, int, android.renderscript.FieldPacker);
- method public void setIoInputNotificationHandler(android.renderscript.Allocation.IoInputNotifier);
method public void setSurface(android.view.Surface);
method public void syncAll(int);
field public static final int USAGE_GRAPHICS_CONSTANTS = 8; // 0x8
@@ -20309,10 +20311,6 @@ package android.renderscript {
field public static final int USAGE_SHARED = 128; // 0x80
}
- public static abstract interface Allocation.IoInputNotifier {
- method public abstract void onBufferAvailable(android.renderscript.Allocation);
- }
-
public static final class Allocation.MipmapControl extends java.lang.Enum {
method public static android.renderscript.Allocation.MipmapControl valueOf(java.lang.String);
method public static final android.renderscript.Allocation.MipmapControl[] values();
@@ -20895,13 +20893,6 @@ package android.renderscript {
method public android.renderscript.Script.LaunchOptions setX(int, int);
method public android.renderscript.Script.LaunchOptions setY(int, int);
method public android.renderscript.Script.LaunchOptions setZ(int, int);
- field protected int strategy;
- field protected int xend;
- field protected int xstart;
- field protected int yend;
- field protected int ystart;
- field protected int zend;
- field protected int zstart;
}
public class ScriptC extends android.renderscript.Script {
@@ -21127,37 +21118,6 @@ package android.sax {
package android.security {
- public final class AndroidKeyPairGeneratorSpec implements java.security.spec.AlgorithmParameterSpec {
- method public android.content.Context getContext();
- method public java.util.Date getEndDate();
- method public java.lang.String getKeystoreAlias();
- method public java.math.BigInteger getSerialNumber();
- method public java.util.Date getStartDate();
- method public javax.security.auth.x500.X500Principal getSubjectDN();
- method public boolean isEncryptionRequired();
- }
-
- public static final class AndroidKeyPairGeneratorSpec.Builder {
- ctor public AndroidKeyPairGeneratorSpec.Builder(android.content.Context);
- method public android.security.AndroidKeyPairGeneratorSpec build();
- method public android.security.AndroidKeyPairGeneratorSpec.Builder setAlias(java.lang.String);
- method public android.security.AndroidKeyPairGeneratorSpec.Builder setEncryptionRequired();
- method public android.security.AndroidKeyPairGeneratorSpec.Builder setEndDate(java.util.Date);
- method public android.security.AndroidKeyPairGeneratorSpec.Builder setSerialNumber(java.math.BigInteger);
- method public android.security.AndroidKeyPairGeneratorSpec.Builder setStartDate(java.util.Date);
- method public android.security.AndroidKeyPairGeneratorSpec.Builder setSubject(javax.security.auth.x500.X500Principal);
- }
-
- public final class AndroidKeyStoreParameter implements java.security.KeyStore.ProtectionParameter {
- method public boolean isEncryptionRequired();
- }
-
- public static final class AndroidKeyStoreParameter.Builder {
- ctor public AndroidKeyStoreParameter.Builder(android.content.Context);
- method public android.security.AndroidKeyStoreParameter build();
- method public android.security.AndroidKeyStoreParameter.Builder setEncryptionRequired();
- }
-
public final class KeyChain {
ctor public KeyChain();
method public static void choosePrivateKeyAlias(android.app.Activity, android.security.KeyChainAliasCallback, java.lang.String[], java.security.Principal[], java.lang.String, int, java.lang.String);
@@ -21183,6 +21143,37 @@ package android.security {
ctor public KeyChainException(java.lang.Throwable);
}
+ public final class KeyPairGeneratorSpec implements java.security.spec.AlgorithmParameterSpec {
+ method public android.content.Context getContext();
+ method public java.util.Date getEndDate();
+ method public java.lang.String getKeystoreAlias();
+ method public java.math.BigInteger getSerialNumber();
+ method public java.util.Date getStartDate();
+ method public javax.security.auth.x500.X500Principal getSubjectDN();
+ method public boolean isEncryptionRequired();
+ }
+
+ public static final class KeyPairGeneratorSpec.Builder {
+ ctor public KeyPairGeneratorSpec.Builder(android.content.Context);
+ method public android.security.KeyPairGeneratorSpec build();
+ method public android.security.KeyPairGeneratorSpec.Builder setAlias(java.lang.String);
+ method public android.security.KeyPairGeneratorSpec.Builder setEncryptionRequired();
+ method public android.security.KeyPairGeneratorSpec.Builder setEndDate(java.util.Date);
+ method public android.security.KeyPairGeneratorSpec.Builder setSerialNumber(java.math.BigInteger);
+ method public android.security.KeyPairGeneratorSpec.Builder setStartDate(java.util.Date);
+ method public android.security.KeyPairGeneratorSpec.Builder setSubject(javax.security.auth.x500.X500Principal);
+ }
+
+ public final class KeyStoreParameter implements java.security.KeyStore.ProtectionParameter {
+ method public boolean isEncryptionRequired();
+ }
+
+ public static final class KeyStoreParameter.Builder {
+ ctor public KeyStoreParameter.Builder(android.content.Context);
+ method public android.security.KeyStoreParameter build();
+ method public android.security.KeyStoreParameter.Builder setEncryptionRequired(boolean);
+ }
+
}
package android.service.dreams {
@@ -21237,8 +21228,9 @@ package android.service.notification {
public abstract class NotificationListenerService extends android.app.Service {
ctor public NotificationListenerService();
- method public final void clearAllNotifications();
- method public final void clearNotification(java.lang.String, java.lang.String, int);
+ method public final void cancelAllNotifications();
+ method public final void cancelNotification(java.lang.String, java.lang.String, int);
+ method public android.service.notification.StatusBarNotification[] getActiveNotifications();
method public android.os.IBinder onBind(android.content.Intent);
method public abstract void onNotificationPosted(android.service.notification.StatusBarNotification);
method public abstract void onNotificationRemoved(android.service.notification.StatusBarNotification);
@@ -21250,17 +21242,16 @@ package android.service.notification {
ctor public StatusBarNotification(android.os.Parcel);
method public android.service.notification.StatusBarNotification clone();
method public int describeContents();
+ method public int getId();
+ method public android.app.Notification getNotification();
+ method public java.lang.String getPackageName();
+ method public long getPostTime();
+ method public java.lang.String getTag();
method public int getUserId();
method public boolean isClearable();
method public boolean isOngoing();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
- field public final int id;
- field public final android.app.Notification notification;
- field public final java.lang.String pkg;
- field public final long postTime;
- field public final java.lang.String tag;
- field public final android.os.UserHandle user;
}
}
@@ -22732,6 +22723,28 @@ package android.text {
method public static int getSize(android.view.View);
}
+ public final class BidiFormatter {
+ method public static android.text.BidiFormatter getInstance();
+ method public static android.text.BidiFormatter getInstance(boolean);
+ method public static android.text.BidiFormatter getInstance(java.util.Locale);
+ method public boolean getStereoReset();
+ method public boolean isRtl(java.lang.String);
+ method public boolean isRtlContext();
+ method public java.lang.String unicodeWrap(java.lang.String, android.text.TextDirectionHeuristic, boolean);
+ method public java.lang.String unicodeWrap(java.lang.String, android.text.TextDirectionHeuristic);
+ method public java.lang.String unicodeWrap(java.lang.String, boolean);
+ method public java.lang.String unicodeWrap(java.lang.String);
+ }
+
+ public static final class BidiFormatter.Builder {
+ ctor public BidiFormatter.Builder();
+ ctor public BidiFormatter.Builder(boolean);
+ ctor public BidiFormatter.Builder(java.util.Locale);
+ method public android.text.BidiFormatter build();
+ method public android.text.BidiFormatter.Builder setTextDirectionHeuristic(android.text.TextDirectionHeuristic);
+ method public android.text.BidiFormatter.Builder stereoReset(boolean);
+ }
+
public class BoringLayout extends android.text.Layout implements android.text.TextUtils.EllipsizeCallback {
ctor public BoringLayout(java.lang.CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean);
ctor public BoringLayout(java.lang.CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean, android.text.TextUtils.TruncateAt, int);
@@ -23226,49 +23239,6 @@ package android.text {
}
-package android.text.bidi {
-
- public final class BidiFormatter {
- method public java.lang.String dirAttr(java.lang.String);
- method public java.lang.String dirAttr(java.lang.String, android.text.TextDirectionHeuristic);
- method public java.lang.String dirAttr(boolean);
- method public java.lang.String dirAttrValue(java.lang.String);
- method public java.lang.String dirAttrValue(java.lang.String, android.text.TextDirectionHeuristic);
- method public java.lang.String dirAttrValue(boolean);
- method public java.lang.String endEdge();
- method public static android.text.bidi.BidiFormatter getInstance();
- method public static android.text.bidi.BidiFormatter getInstance(boolean);
- method public static android.text.bidi.BidiFormatter getInstance(java.util.Locale);
- method public boolean getStereoReset();
- method public boolean isRtl(java.lang.String);
- method public boolean isRtlContext();
- method public java.lang.String mark();
- method public java.lang.String markAfter(java.lang.String);
- method public java.lang.String markAfter(java.lang.String, android.text.TextDirectionHeuristic);
- method public java.lang.String markBefore(java.lang.String);
- method public java.lang.String markBefore(java.lang.String, android.text.TextDirectionHeuristic);
- method public java.lang.String spanWrap(java.lang.String, android.text.TextDirectionHeuristic, boolean);
- method public java.lang.String spanWrap(java.lang.String, android.text.TextDirectionHeuristic);
- method public java.lang.String spanWrap(java.lang.String, boolean);
- method public java.lang.String spanWrap(java.lang.String);
- method public java.lang.String startEdge();
- method public java.lang.String unicodeWrap(java.lang.String, android.text.TextDirectionHeuristic, boolean);
- method public java.lang.String unicodeWrap(java.lang.String, android.text.TextDirectionHeuristic);
- method public java.lang.String unicodeWrap(java.lang.String, boolean);
- method public java.lang.String unicodeWrap(java.lang.String);
- }
-
- public static final class BidiFormatter.Builder {
- ctor public BidiFormatter.Builder();
- ctor public BidiFormatter.Builder(boolean);
- ctor public BidiFormatter.Builder(java.util.Locale);
- method public android.text.bidi.BidiFormatter build();
- method public android.text.bidi.BidiFormatter.Builder setTextDirectionHeuristic(android.text.TextDirectionHeuristic);
- method public android.text.bidi.BidiFormatter.Builder stereoReset(boolean);
- }
-
-}
-
package android.text.format {
public class DateFormat {
@@ -24447,17 +24417,6 @@ package android.util {
method public void set(T, V);
}
- public class PropertyValueModel extends android.util.ValueModel {
- method public T get();
- method public H getHost();
- method public android.util.Property<H, T> getProperty();
- method public java.lang.Class<T> getType();
- method public static android.util.PropertyValueModel<H, T> of(H, android.util.Property<H, T>);
- method public static android.util.PropertyValueModel<H, T> of(H, java.lang.Class<T>, java.lang.String);
- method public static android.util.PropertyValueModel of(java.lang.Object, java.lang.String);
- method public void set(T);
- }
-
public class SparseArray implements java.lang.Cloneable {
ctor public SparseArray();
ctor public SparseArray(int);
@@ -24624,14 +24583,6 @@ package android.util {
field public int type;
}
- public abstract class ValueModel {
- ctor protected ValueModel();
- method public abstract T get();
- method public abstract java.lang.Class<T> getType();
- method public abstract void set(T);
- field public static final android.util.ValueModel EMPTY;
- }
-
public class Xml {
method public static android.util.AttributeSet asAttributeSet(org.xmlpull.v1.XmlPullParser);
method public static android.util.Xml.Encoding findEncodingByName(java.lang.String) throws java.io.UnsupportedEncodingException;
@@ -27289,7 +27240,7 @@ package android.view.accessibility {
method public java.lang.CharSequence getText();
method public int getTextSelectionEnd();
method public int getTextSelectionStart();
- method public java.lang.CharSequence getViewIdResourceName();
+ method public java.lang.String getViewIdResourceName();
method public int getWindowId();
method public boolean isAccessibilityFocused();
method public boolean isCheckable();
@@ -27340,7 +27291,7 @@ package android.view.accessibility {
method public void setSource(android.view.View, int);
method public void setText(java.lang.CharSequence);
method public void setTextSelection(int, int);
- method public void setViewIdResourceName(java.lang.CharSequence);
+ method public void setViewIdResourceName(java.lang.String);
method public void setVisibleToUser(boolean);
method public void writeToParcel(android.os.Parcel, int);
field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
@@ -29097,12 +29048,10 @@ package android.widget {
method public abstract void onSelectedDayChange(android.widget.CalendarView, int, int, int);
}
- public class CheckBox extends android.widget.CompoundButton implements android.widget.ValueEditor {
+ public class CheckBox extends android.widget.CompoundButton {
ctor public CheckBox(android.content.Context);
ctor public CheckBox(android.content.Context, android.util.AttributeSet);
ctor public CheckBox(android.content.Context, android.util.AttributeSet, int);
- method public android.util.ValueModel<java.lang.Boolean> getValueModel();
- method public void setValueModel(android.util.ValueModel<java.lang.Boolean>);
}
public abstract interface Checkable {
@@ -29275,16 +29224,14 @@ package android.widget {
method public void setSize(int, int);
}
- public class EditText extends android.widget.TextView implements android.widget.ValueEditor {
+ public class EditText extends android.widget.TextView {
ctor public EditText(android.content.Context);
ctor public EditText(android.content.Context, android.util.AttributeSet);
ctor public EditText(android.content.Context, android.util.AttributeSet, int);
method public void extendSelection(int);
- method public android.util.ValueModel<java.lang.CharSequence> getValueModel();
method public void selectAll();
method public void setSelection(int, int);
method public void setSelection(int);
- method public void setValueModel(android.util.ValueModel<java.lang.CharSequence>);
}
public abstract interface ExpandableListAdapter {
@@ -30313,13 +30260,11 @@ package android.widget {
method public abstract java.lang.Object[] getSections();
}
- public class SeekBar extends android.widget.AbsSeekBar implements android.widget.ValueEditor {
+ public class SeekBar extends android.widget.AbsSeekBar {
ctor public SeekBar(android.content.Context);
ctor public SeekBar(android.content.Context, android.util.AttributeSet);
ctor public SeekBar(android.content.Context, android.util.AttributeSet, int);
- method public android.util.ValueModel<java.lang.Integer> getValueModel();
method public void setOnSeekBarChangeListener(android.widget.SeekBar.OnSeekBarChangeListener);
- method public void setValueModel(android.util.ValueModel<java.lang.Integer>);
}
public static abstract interface SeekBar.OnSeekBarChangeListener {
@@ -30907,11 +30852,6 @@ package android.widget {
method public android.widget.TextView getText2();
}
- public abstract interface ValueEditor {
- method public abstract android.util.ValueModel<T> getValueModel();
- method public abstract void setValueModel(android.util.ValueModel<T>);
- }
-
public class VideoView extends android.view.SurfaceView implements android.widget.MediaController.MediaPlayerControl {
ctor public VideoView(android.content.Context);
ctor public VideoView(android.content.Context, android.util.AttributeSet);
diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp
index 90bcb0fbdd23..28752a5315ad 100644
--- a/cmds/app_process/app_main.cpp
+++ b/cmds/app_process/app_main.cpp
@@ -7,6 +7,7 @@
#define LOG_TAG "appproc"
+#include <cutils/properties.h>
#include <binder/IPCThreadState.h>
#include <binder/ProcessState.h>
#include <utils/Log.h>
@@ -148,7 +149,10 @@ int main(int argc, char* const argv[])
* This breaks some programs which improperly embed
* an out of date copy of Android's linker.
*/
- if (getenv("NO_ADDR_COMPAT_LAYOUT_FIXUP") == NULL) {
+ char value[PROPERTY_VALUE_MAX];
+ property_get("ro.kernel.qemu", value, "");
+ bool is_qemu = (strcmp(value, "1") == 0);
+ if ((getenv("NO_ADDR_COMPAT_LAYOUT_FIXUP") == NULL) && !is_qemu) {
int current = personality(0xFFFFFFFF);
if ((current & ADDR_COMPAT_LAYOUT) == 0) {
personality(current | ADDR_COMPAT_LAYOUT);
diff --git a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
index 40f45b780485..de58a3331519 100644
--- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
+++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
@@ -444,8 +444,8 @@ public class AccessibilityServiceInfo implements Parcelable {
mCapabilities |= CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION;
}
if (asAttributes.getBoolean(com.android.internal.R.styleable
- .AccessibilityService_canRequestEnhancedWebAccessibility, false)) {
- mCapabilities |= CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY;
+ .AccessibilityService_canRequestEnhancedWebAccessibility, false)) {
+ mCapabilities |= CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY;
}
if (asAttributes.getBoolean(com.android.internal.R.styleable
.AccessibilityService_canRequestFilterKeyEvents, false)) {
@@ -557,6 +557,23 @@ public class AccessibilityServiceInfo implements Parcelable {
}
/**
+ * Sets the bit mask of capabilities this accessibility service has such as
+ * being able to retrieve the active window content, etc.
+ *
+ * @param capabilities The capability bit mask.
+ *
+ * @see #CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT
+ * @see #CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION
+ * @see #CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY
+ * @see #CAPABILITY_FILTER_KEY_EVENTS
+ *
+ * @hide
+ */
+ public void setCapabilities(int capabilities) {
+ mCapabilities = capabilities;
+ }
+
+ /**
* Gets the non-localized description of the accessibility service.
* <p>
* <strong>Statically set from
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java
index 241a64af65ae..b4a12c4bdbff 100644
--- a/core/java/android/accounts/AccountManager.java
+++ b/core/java/android/accounts/AccountManager.java
@@ -405,6 +405,23 @@ public class AccountManager {
}
/**
+ * Returns the accounts visible to the specified package, in an environment where some apps
+ * are not authorized to view all accounts. This method can only be called by system apps.
+ * @param type The type of accounts to return, null to retrieve all accounts
+ * @param packageName The package name of the app for which the accounts are to be returned
+ * @return An array of {@link Account}, one per matching account. Empty
+ * (never null) if no accounts of the specified type have been added.
+ */
+ public Account[] getAccountsByTypeForPackage(String type, String packageName) {
+ try {
+ return mService.getAccountsByTypeForPackage(type, packageName);
+ } catch (RemoteException re) {
+ // possible security exception
+ throw new RuntimeException(re);
+ }
+ }
+
+ /**
* Lists all accounts of a particular type. The account type is a
* string token corresponding to the authenticator and useful domain
* of the account. For example, there are types corresponding to Google
diff --git a/core/java/android/accounts/ChooseTypeAndAccountActivity.java b/core/java/android/accounts/ChooseTypeAndAccountActivity.java
index 2aba16339a34..58eb66f8d390 100644
--- a/core/java/android/accounts/ChooseTypeAndAccountActivity.java
+++ b/core/java/android/accounts/ChooseTypeAndAccountActivity.java
@@ -34,13 +34,11 @@ import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
-import android.widget.Toast;
import com.android.internal.R;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
@@ -110,6 +108,7 @@ public class ChooseTypeAndAccountActivity extends Activity
private static final String KEY_INSTANCE_STATE_EXISTING_ACCOUNTS = "existingAccounts";
private static final String KEY_INSTANCE_STATE_SELECTED_ACCOUNT_NAME = "selectedAccountName";
private static final String KEY_INSTANCE_STATE_SELECTED_ADD_ACCOUNT = "selectedAddAccount";
+ private static final String KEY_INSTANCE_STATE_ACCOUNT_LIST = "accountList";
private static final int SELECTED_ITEM_NONE = -1;
@@ -169,6 +168,7 @@ public class ChooseTypeAndAccountActivity extends Activity
mSelectedAddNewAccount = savedInstanceState.getBoolean(
KEY_INSTANCE_STATE_SELECTED_ADD_ACCOUNT, false);
+ mAccounts = savedInstanceState.getParcelableArrayList(KEY_INSTANCE_STATE_ACCOUNT_LIST);
} else {
mPendingRequest = REQUEST_NULL;
mExistingAccounts = null;
@@ -266,6 +266,7 @@ public class ChooseTypeAndAccountActivity extends Activity
mAccounts.get(mSelectedItemIndex).name);
}
}
+ outState.putParcelableArrayList(KEY_INSTANCE_STATE_ACCOUNT_LIST, mAccounts);
}
public void onCancelButtonClicked(View view) {
diff --git a/core/java/android/accounts/IAccountManager.aidl b/core/java/android/accounts/IAccountManager.aidl
index 81418132d5c8..86e279f3d005 100644
--- a/core/java/android/accounts/IAccountManager.aidl
+++ b/core/java/android/accounts/IAccountManager.aidl
@@ -32,6 +32,7 @@ interface IAccountManager {
AuthenticatorDescription[] getAuthenticatorTypes();
Account[] getAccounts(String accountType);
Account[] getAccountsForPackage(String packageName, int uid);
+ Account[] getAccountsByTypeForPackage(String type, String packageName);
Account[] getAccountsAsUser(String accountType, int userId);
void hasFeatures(in IAccountManagerResponse response, in Account account, in String[] features);
void getAccountsByFeatures(in IAccountManagerResponse response, String accountType, in String[] features);
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index 92ec3adf0698..9f933ca66c21 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -44,6 +44,8 @@ interface INotificationManager
void registerListener(in INotificationListener listener, in ComponentName component, int userid);
void unregisterListener(in INotificationListener listener, int userid);
- void clearNotificationFromListener(in INotificationListener token, String pkg, String tag, int id);
- void clearAllNotificationsFromListener(in INotificationListener token);
+ void cancelNotificationFromListener(in INotificationListener token, String pkg, String tag, int id);
+ void cancelAllNotificationsFromListener(in INotificationListener token);
+
+ StatusBarNotification[] getActiveNotificationsFromListener(in INotificationListener token);
} \ No newline at end of file
diff --git a/core/java/android/app/NativeActivity.java b/core/java/android/app/NativeActivity.java
index 7d8a36e34f5a..63c6acd4f396 100644
--- a/core/java/android/app/NativeActivity.java
+++ b/core/java/android/app/NativeActivity.java
@@ -27,7 +27,6 @@ import android.os.Environment;
import android.os.Looper;
import android.os.MessageQueue;
import android.util.AttributeSet;
-import android.view.InputChannel;
import android.view.InputQueue;
import android.view.KeyEvent;
import android.view.Surface;
@@ -111,11 +110,9 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback2,
int format, int width, int height);
private native void onSurfaceRedrawNeededNative(int handle, Surface surface);
private native void onSurfaceDestroyedNative(int handle);
- private native void onInputChannelCreatedNative(int handle, InputChannel channel);
- private native void onInputChannelDestroyedNative(int handle, InputChannel channel);
+ private native void onInputQueueCreatedNative(int handle, int queuePtr);
+ private native void onInputQueueDestroyedNative(int handle, int queuePtr);
private native void onContentRectChangedNative(int handle, int x, int y, int w, int h);
- private native void dispatchKeyEventNative(int handle, KeyEvent event);
- private native void finishPreDispatchKeyEventNative(int handle, int seq, boolean handled);
static class NativeContentView extends View {
NativeActivity mActivity;
@@ -197,7 +194,7 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback2,
mCurSurfaceHolder = null;
}
if (mCurInputQueue != null) {
- onInputChannelDestroyedNative(mNativeHandle, mCurInputQueue.getInputChannel());
+ onInputQueueDestroyedNative(mNativeHandle, mCurInputQueue.getNativePtr());
mCurInputQueue = null;
}
unloadNativeCode(mNativeHandle);
@@ -261,18 +258,6 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback2,
}
}
- @Override
- public boolean dispatchKeyEvent(KeyEvent event) {
- if (mDispatchingUnhandledKey) {
- return super.dispatchKeyEvent(event);
- } else {
- // Key events from the IME do not go through the input channel;
- // we need to intercept them here to hand to the application.
- dispatchKeyEventNative(mNativeHandle, event);
- return true;
- }
- }
-
public void surfaceCreated(SurfaceHolder holder) {
if (!mDestroyed) {
mCurSurfaceHolder = holder;
@@ -304,14 +289,14 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback2,
public void onInputQueueCreated(InputQueue queue) {
if (!mDestroyed) {
mCurInputQueue = queue;
- onInputChannelCreatedNative(mNativeHandle, queue.getInputChannel());
+ onInputQueueCreatedNative(mNativeHandle, queue.getNativePtr());
}
}
public void onInputQueueDestroyed(InputQueue queue) {
- mCurInputQueue = null;
if (!mDestroyed) {
- onInputChannelDestroyedNative(mNativeHandle, queue.getInputChannel());
+ onInputQueueDestroyedNative(mNativeHandle, queue.getNativePtr());
+ mCurInputQueue = null;
}
}
@@ -332,25 +317,6 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback2,
}
}
- boolean dispatchUnhandledKeyEvent(KeyEvent event) {
- try {
- mDispatchingUnhandledKey = true;
- View decor = getWindow().getDecorView();
- if (decor != null) {
- return decor.dispatchKeyEvent(event);
- } else {
- return false;
- }
- } finally {
- mDispatchingUnhandledKey = false;
- }
- }
-
- void preDispatchKeyEvent(KeyEvent event, int seq) {
- // FIXME: Input dispatch should be redirected back through ViewRootImpl again.
- finishPreDispatchKeyEventNative(mNativeHandle, seq, false);
- }
-
void setWindowFlags(int flags, int mask) {
getWindow().setFlags(flags, mask);
}
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 8d994c43a1ed..2e328b2c55e2 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -635,11 +635,16 @@ public class Notification implements Parcelable
@Override
public Notification clone() {
Notification that = new Notification();
- cloneInto(that);
+ cloneInto(that, true);
return that;
}
- private void cloneInto(Notification that) {
+ /**
+ * Copy all (or if heavy is false, all except Bitmaps and RemoteViews) members
+ * of this into that.
+ * @hide
+ */
+ public void cloneInto(Notification that, boolean heavy) {
that.when = this.when;
that.icon = this.icon;
that.number = this.number;
@@ -652,13 +657,13 @@ public class Notification implements Parcelable
if (this.tickerText != null) {
that.tickerText = this.tickerText.toString();
}
- if (this.tickerView != null) {
+ if (heavy && this.tickerView != null) {
that.tickerView = this.tickerView.clone();
}
- if (this.contentView != null) {
+ if (heavy && this.contentView != null) {
that.contentView = this.contentView.clone();
}
- if (this.largeIcon != null) {
+ if (heavy && this.largeIcon != null) {
that.largeIcon = Bitmap.createBitmap(this.largeIcon);
}
that.iconLevel = this.iconLevel;
@@ -690,7 +695,6 @@ public class Notification implements Parcelable
if (this.extras != null) {
that.extras = new Bundle(this.extras);
-
}
if (this.actions != null) {
@@ -700,9 +704,30 @@ public class Notification implements Parcelable
}
}
- if (this.bigContentView != null) {
+ if (heavy && this.bigContentView != null) {
that.bigContentView = this.bigContentView.clone();
}
+
+ if (!heavy) {
+ that.lightenPayload(); // will clean out extras
+ }
+ }
+
+ /**
+ * Removes heavyweight parts of the Notification object for archival or for sending to
+ * listeners when the full contents are not necessary.
+ * @hide
+ */
+ public final void lightenPayload() {
+ tickerView = null;
+ contentView = null;
+ bigContentView = null;
+ largeIcon = null;
+ if (extras != null) {
+ extras.remove(Notification.EXTRA_LARGE_ICON);
+ extras.remove(Notification.EXTRA_LARGE_ICON_BIG);
+ extras.remove(Notification.EXTRA_PICTURE);
+ }
}
public int describeContents() {
@@ -1706,7 +1731,7 @@ public class Notification implements Parcelable
* @hide
*/
public Notification buildInto(Notification n) {
- build().cloneInto(n);
+ build().cloneInto(n, true);
return n;
}
}
diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java
index 05b79c1d7a8e..498fa4264fe5 100644
--- a/core/java/android/app/UiAutomation.java
+++ b/core/java/android/app/UiAutomation.java
@@ -443,18 +443,25 @@ public final class UiAutomation {
*/
public AccessibilityEvent executeAndWaitForEvent(Runnable command,
AccessibilityEventFilter filter, long timeoutMillis) throws TimeoutException {
+ // Acquire the lock and prepare for receiving events.
synchronized (mLock) {
throwIfNotConnectedLocked();
-
mEventQueue.clear();
// Prepare to wait for an event.
mWaitingForEventDelivery = true;
+ }
- // We will ignore events from previous interactions.
- final long executionStartTimeMillis = SystemClock.uptimeMillis();
+ // Note: We have to release the lock since calling out with this lock held
+ // can bite. We will correctly filter out events from other interactions,
+ // so starting to collect events before running the action is just fine.
- // Execute the command.
- command.run();
+ // We will ignore events from previous interactions.
+ final long executionStartTimeMillis = SystemClock.uptimeMillis();
+ // Execute the command *without* the lock being held.
+ command.run();
+
+ // Acquire the lock and wait for the event.
+ synchronized (mLock) {
try {
// Wait for the event.
final long startTimeMillis = SystemClock.uptimeMillis();
@@ -463,7 +470,7 @@ public final class UiAutomation {
while (!mEventQueue.isEmpty()) {
AccessibilityEvent event = mEventQueue.remove(0);
// Ignore events from previous interactions.
- if (event.getEventTime() <= executionStartTimeMillis) {
+ if (event.getEventTime() < executionStartTimeMillis) {
continue;
}
if (filter.accept(event)) {
diff --git a/core/java/android/app/UiAutomationConnection.java b/core/java/android/app/UiAutomationConnection.java
index 97c7ff3ea86b..607930c0be44 100644
--- a/core/java/android/app/UiAutomationConnection.java
+++ b/core/java/android/app/UiAutomationConnection.java
@@ -163,6 +163,10 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub {
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
info.flags |= AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS
| AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS;
+ info.setCapabilities(AccessibilityServiceInfo.CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT
+ | AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION
+ | AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY
+ | AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS);
try {
// Calling out with a lock held is fine since if the system
// process is gone the client calling in will be killed.
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 8284b2c0a5e7..17e8dd968006 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -1537,14 +1537,21 @@ public class DevicePolicyManager {
return false;
}
+
/**
- * Used to determine if a particular package has been registered as a Device Owner admin.
- * Device Owner admins cannot be deactivated by the user unless the Device Owner itself allows
- * it. And Device Owner packages cannot be uninstalled, once registered.
- * @param packageName the package name to check against the registered device owner.
- * @return whether or not the package is registered as the Device Owner.
+ * Used to determine if a particular package has been registered as a Device Owner app.
+ * A device owner app is a special device admin that cannot be deactivated by the user, once
+ * activated as a device admin. It also cannot be uninstalled. To check if a particular
+ * package is currently registered as the device owner app, pass in the package name from
+ * {@link Context#getPackageName()} to this method.<p/>This is useful for device
+ * admin apps that want to check if they are also registered as the device owner app. The
+ * exact mechanism by which a device admin app is registered as a device owner app is defined by
+ * the setup process.
+ * @param packageName the package name of the app, to compare with the registered device owner
+ * app, if any.
+ * @return whether or not the package is registered as the device owner app.
*/
- public boolean isDeviceOwner(String packageName) {
+ public boolean isDeviceOwnerApp(String packageName) {
if (mService != null) {
try {
return mService.isDeviceOwner(packageName);
@@ -1555,6 +1562,14 @@ public class DevicePolicyManager {
return false;
}
+ /**
+ * @hide
+ * Redirect to isDeviceOwnerApp.
+ */
+ public boolean isDeviceOwner(String packageName) {
+ return isDeviceOwnerApp(packageName);
+ }
+
/** @hide */
public String getDeviceOwner() {
if (mService != null) {
diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java
index 37fddcb7e7d1..67c772bc0086 100644
--- a/core/java/android/app/backup/BackupAgent.java
+++ b/core/java/android/app/backup/BackupAgent.java
@@ -17,12 +17,15 @@
package android.app.backup;
import android.app.IBackupAgent;
+import android.app.QueuedWork;
import android.app.backup.IBackupManager;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.pm.ApplicationInfo;
import android.os.Binder;
+import android.os.Handler;
import android.os.IBinder;
+import android.os.Looper;
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.RemoteException;
@@ -33,6 +36,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.LinkedList;
+import java.util.concurrent.CountDownLatch;
import libcore.io.ErrnoException;
import libcore.io.Libcore;
@@ -122,6 +126,32 @@ public abstract class BackupAgent extends ContextWrapper {
/** @hide */
public static final int TYPE_SYMLINK = 3;
+ Handler mHandler = null;
+
+ class SharedPrefsSynchronizer implements Runnable {
+ public final CountDownLatch mLatch = new CountDownLatch(1);
+
+ @Override
+ public void run() {
+ QueuedWork.waitToFinish();
+ mLatch.countDown();
+ }
+ };
+
+ // Syncing shared preferences deferred writes needs to happen on the main looper thread
+ private void waitForSharedPrefs() {
+ if (mHandler == null) {
+ mHandler = new Handler(Looper.getMainLooper());
+ }
+
+ final SharedPrefsSynchronizer s = new SharedPrefsSynchronizer();
+ mHandler.postAtFrontOfQueue(s);
+ try {
+ s.mLatch.await();
+ } catch (InterruptedException e) { /* ignored */ }
+ }
+
+
public BackupAgent() {
super(null);
}
@@ -542,6 +572,11 @@ public abstract class BackupAgent extends ContextWrapper {
Log.d(TAG, "onBackup (" + BackupAgent.this.getClass().getName() + ") threw", ex);
throw ex;
} finally {
+ // Ensure that any SharedPreferences writes have landed after the backup,
+ // in case the app code has side effects (since apps cannot provide this
+ // guarantee themselves).
+ waitForSharedPrefs();
+
Binder.restoreCallingIdentity(ident);
try {
callbackBinder.opComplete(token);
@@ -569,6 +604,9 @@ public abstract class BackupAgent extends ContextWrapper {
Log.d(TAG, "onRestore (" + BackupAgent.this.getClass().getName() + ") threw", ex);
throw ex;
} finally {
+ // Ensure that any side-effect SharedPreferences writes have landed
+ waitForSharedPrefs();
+
Binder.restoreCallingIdentity(ident);
try {
callbackBinder.opComplete(token);
@@ -586,6 +624,10 @@ public abstract class BackupAgent extends ContextWrapper {
if (DEBUG) Log.v(TAG, "doFullBackup() invoked");
+ // Ensure that any SharedPreferences writes have landed *before*
+ // we potentially try to back up the underlying files directly.
+ waitForSharedPrefs();
+
try {
BackupAgent.this.onFullBackup(new FullBackupDataOutput(data));
} catch (IOException ex) {
@@ -595,6 +637,9 @@ public abstract class BackupAgent extends ContextWrapper {
Log.d(TAG, "onBackup (" + BackupAgent.this.getClass().getName() + ") threw", ex);
throw ex;
} finally {
+ // ... and then again after, as in the doBackup() case
+ waitForSharedPrefs();
+
// Send the EOD marker indicating that there is no more data
// forthcoming from this agent.
try {
@@ -624,6 +669,9 @@ public abstract class BackupAgent extends ContextWrapper {
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
+ // Ensure that any side-effect SharedPreferences writes have landed
+ waitForSharedPrefs();
+
Binder.restoreCallingIdentity(ident);
try {
callbackBinder.opComplete(token);
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 3498bb8e47be..cfbfb48d4a1f 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -1434,7 +1434,7 @@ public final class BluetoothAdapter {
* <p>Results of the scan are reported using the
* {@link LeScanCallback#onLeScan} callback.
*
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission.
*
* @param callback the callback LE scan results are delivered
* @return true, if the scan was started successfully
@@ -1450,7 +1450,7 @@ public final class BluetoothAdapter {
* <p>Devices which advertise all specified services are reported using the
* {@link LeScanCallback#onLeScan} callback.
*
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission.
*
* @param serviceUuids Array of services to look for
* @param callback the callback LE scan results are delivered
@@ -1490,7 +1490,7 @@ public final class BluetoothAdapter {
/**
* Stops an ongoing Bluetooth LE device scan.
*
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission.
*
* @param callback used to identify which scan to stop
* must be the same handle used to start the scan
diff --git a/core/java/android/content/ContentValues.aidl b/core/java/android/content/ContentValues.aidl
new file mode 100644
index 000000000000..23d51d84e5a9
--- /dev/null
+++ b/core/java/android/content/ContentValues.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content;
+
+parcelable ContentValues;
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 1ab1eb8e90aa..67bd952c3534 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -2425,8 +2425,8 @@ public class Intent implements Parcelable, Cloneable {
* which is of type <code>ArrayList&lt;RestrictionEntry&gt;</code>. It can also
* contain an extra {@link #EXTRA_RESTRICTIONS_INTENT}, which is of type <code>Intent</code>.
* The activity specified by that intent will be launched for a result which must contain
- * the extra {@link #EXTRA_RESTRICTIONS_LIST}. The keys and values of the returned restrictions
- * will be persisted.
+ * one of the extras {@link #EXTRA_RESTRICTIONS_LIST} or {@link #EXTRA_RESTRICTIONS_BUNDLE}.
+ * The keys and values of the returned restrictions will be persisted.
* @see RestrictionEntry
*/
public static final String ACTION_GET_RESTRICTION_ENTRIES =
diff --git a/core/java/android/content/RestrictionEntry.java b/core/java/android/content/RestrictionEntry.java
index af903858dc7c..217cf763b9a1 100644
--- a/core/java/android/content/RestrictionEntry.java
+++ b/core/java/android/content/RestrictionEntry.java
@@ -60,6 +60,7 @@ public class RestrictionEntry implements Parcelable {
* and the corresponding values, respectively.
* The presentation could imply that values in lower array indices are included when a
* particular value is chosen.
+ * @hide
*/
public static final int TYPE_CHOICE_LEVEL = 3;
@@ -102,7 +103,7 @@ public class RestrictionEntry implements Parcelable {
private String[] currentValues;
/**
- * Constructor for {@link #TYPE_CHOICE} and {@link #TYPE_CHOICE_LEVEL} types.
+ * Constructor for {@link #TYPE_CHOICE} type.
* @param key the unique key for this restriction
* @param selectedString the current value
*/
@@ -206,7 +207,7 @@ public class RestrictionEntry implements Parcelable {
* shown to the user. Values will be chosen from this list as the user's selection and the
* selected values can be retrieved by a call to {@link #getAllSelectedStrings()}, or
* {@link #getSelectedString()}, depending on whether it is a multi-select type or choice type.
- * This method is not relevant for types other than {@link #TYPE_CHOICE_LEVEL},
+ * This method is not relevant for types other than
* {@link #TYPE_CHOICE}, and {@link #TYPE_MULTI_SELECT}.
* @param choiceValues an array of Strings which will be the selected values for the user's
* selections.
@@ -241,7 +242,7 @@ public class RestrictionEntry implements Parcelable {
* user selects one or more of these choices, the corresponding value from the possible values
* are stored as the selected strings. The size of this array must match the size of the array
* set in {@link #setChoiceValues(String[])}. This method is not relevant for types other
- * than {@link #TYPE_CHOICE_LEVEL}, {@link #TYPE_CHOICE}, and {@link #TYPE_MULTI_SELECT}.
+ * than {@link #TYPE_CHOICE}, and {@link #TYPE_MULTI_SELECT}.
* @param choiceEntries the list of user-visible choices.
* @see #setChoiceValues(String[])
*/
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 30bdfef6e4bd..4266d85f08e3 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -870,6 +870,14 @@ public abstract class PackageManager {
/**
* Feature for {@link #getSystemAvailableFeatures} and
+ * {@link #hasSystemFeature}: The device is capable of communicating with
+ * other devices via Bluetooth Low Energy radio.
+ */
+ @SdkConstant(SdkConstantType.FEATURE)
+ public static final String FEATURE_BLUETOOTH_LE = "android.hardware.bluetooth_le";
+
+ /**
+ * Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device has a camera facing away
* from the screen.
*/
diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java
index 86d6ee77ae7e..905ae0ddec87 100644
--- a/core/java/android/content/res/Configuration.java
+++ b/core/java/android/content/res/Configuration.java
@@ -1219,12 +1219,12 @@ public final class Configuration implements Parcelable, Comparable<Configuration
* Return the layout direction. Will be either {@link View#LAYOUT_DIRECTION_LTR} or
* {@link View#LAYOUT_DIRECTION_RTL}.
*
- * @return the layout direction
+ * @return Returns {@link View#LAYOUT_DIRECTION_RTL} if the configuration
+ * is {@link #SCREENLAYOUT_LAYOUTDIR_RTL}, otherwise {@link View#LAYOUT_DIRECTION_LTR}.
*/
public int getLayoutDirection() {
- // We need to substract one here as the configuration values are using "0" as undefined thus
- // having LRT set to "1" and RTL set to "2"
- return ((screenLayout&SCREENLAYOUT_LAYOUTDIR_MASK) >> SCREENLAYOUT_LAYOUTDIR_SHIFT) - 1;
+ return (screenLayout&SCREENLAYOUT_LAYOUTDIR_MASK) == SCREENLAYOUT_LAYOUTDIR_RTL
+ ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR;
}
/**
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index d64bff980e68..42f4faf550bf 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -17,6 +17,7 @@
package android.content.res;
import android.os.Trace;
+import android.view.View;
import com.android.internal.util.XmlUtils;
import org.xmlpull.v1.XmlPullParser;
@@ -80,16 +81,16 @@ public class Resources {
private static final Object sSync = new Object();
/*package*/ static Resources mSystem = null;
-
+
// Information about preloaded resources. Note that they are not
// protected by a lock, because while preloading in zygote we are all
// single-threaded, and after that these are immutable.
- private static final LongSparseArray<Drawable.ConstantState> sPreloadedDrawables
+ private static final LongSparseArray<Drawable.ConstantState>[] sPreloadedDrawables;
+ private static final LongSparseArray<Drawable.ConstantState> sPreloadedColorDrawables
= new LongSparseArray<Drawable.ConstantState>();
private static final LongSparseArray<ColorStateList> sPreloadedColorStateLists
= new LongSparseArray<ColorStateList>();
- private static final LongSparseArray<Drawable.ConstantState> sPreloadedColorDrawables
- = new LongSparseArray<Drawable.ConstantState>();
+
private static boolean sPreloaded;
private static int sPreloadedDensity;
@@ -120,6 +121,12 @@ public class Resources {
private CompatibilityInfo mCompatibilityInfo;
+ static {
+ sPreloadedDrawables = new LongSparseArray[2];
+ sPreloadedDrawables[0] = new LongSparseArray<Drawable.ConstantState>();
+ sPreloadedDrawables[1] = new LongSparseArray<Drawable.ConstantState>();
+ }
+
/** @hide */
public static int selectDefaultTheme(int curTheme, int targetSdkVersion) {
return selectSystemTheme(curTheme, targetSdkVersion,
@@ -1978,12 +1985,14 @@ public class Resources {
}
}
- static private final int VARYING_CONFIGS = ActivityInfo.activityInfoConfigToNative(
- ActivityInfo.CONFIG_LAYOUT_DIRECTION);
-
- private boolean verifyPreloadConfig(int changingConfigurations, int resourceId, String name) {
+ private boolean verifyPreloadConfig(int changingConfigurations, int allowVarying,
+ int resourceId, String name) {
+ // We allow preloading of resources even if they vary by font scale (which
+ // doesn't impact resource selection) or density (which we handle specially by
+ // simply turning off all preloading), as well as any other configs specified
+ // by the caller.
if (((changingConfigurations&~(ActivityInfo.CONFIG_FONT_SCALE |
- ActivityInfo.CONFIG_DENSITY)) & VARYING_CONFIGS) != 0) {
+ ActivityInfo.CONFIG_DENSITY)) & ~allowVarying) != 0) {
String resName;
try {
resName = getResourceName(resourceId);
@@ -1995,9 +2004,23 @@ public class Resources {
+ " (" + resName + ") that varies with configuration!!");
return false;
}
+ if (TRACE_FOR_PRELOAD) {
+ String resName;
+ try {
+ resName = getResourceName(resourceId);
+ } catch (NotFoundException e) {
+ resName = "?";
+ }
+ Log.w(TAG, "Preloading " + name + " resource #0x"
+ + Integer.toHexString(resourceId)
+ + " (" + resName + ")");
+ }
return true;
}
+ static private final int LAYOUT_DIR_CONFIG = ActivityInfo.activityInfoConfigToNative(
+ ActivityInfo.CONFIG_LAYOUT_DIRECTION);
+
/*package*/ Drawable loadDrawable(TypedValue value, int id)
throws NotFoundException {
@@ -2022,11 +2045,12 @@ public class Resources {
if (dr != null) {
return dr;
}
-
- Drawable.ConstantState cs = isColorDrawable
- ? sPreloadedColorDrawables.get(key)
- : (sPreloadedDensity == mConfiguration.densityDpi
- ? sPreloadedDrawables.get(key) : null);
+ Drawable.ConstantState cs;
+ if (isColorDrawable) {
+ cs = sPreloadedColorDrawables.get(key);
+ } else {
+ cs = sPreloadedDrawables[mConfiguration.getLayoutDirection()].get(key);
+ }
if (cs != null) {
dr = cs.newDrawable(this);
} else {
@@ -2100,11 +2124,26 @@ public class Resources {
cs = dr.getConstantState();
if (cs != null) {
if (mPreloading) {
- if (verifyPreloadConfig(cs.getChangingConfigurations(), value.resourceId, "drawable")) {
- if (isColorDrawable) {
+ final int changingConfigs = cs.getChangingConfigurations();
+ if (isColorDrawable) {
+ if (verifyPreloadConfig(changingConfigs, 0, value.resourceId,
+ "drawable")) {
sPreloadedColorDrawables.put(key, cs);
- } else {
- sPreloadedDrawables.put(key, cs);
+ }
+ } else {
+ if (verifyPreloadConfig(changingConfigs,
+ LAYOUT_DIR_CONFIG, value.resourceId, "drawable")) {
+ if ((changingConfigs&LAYOUT_DIR_CONFIG) == 0) {
+ // If this resource does not vary based on layout direction,
+ // we can put it in all of the preload maps.
+ sPreloadedDrawables[0].put(key, cs);
+ sPreloadedDrawables[1].put(key, cs);
+ } else {
+ // Otherwise, only in the layout dir we loaded it for.
+ final LongSparseArray<Drawable.ConstantState> preloads
+ = sPreloadedDrawables[mConfiguration.getLayoutDirection()];
+ preloads.put(key, cs);
+ }
}
}
} else {
@@ -2170,7 +2209,8 @@ public class Resources {
csl = ColorStateList.valueOf(value.data);
if (mPreloading) {
- if (verifyPreloadConfig(value.changingConfigurations, value.resourceId, "color")) {
+ if (verifyPreloadConfig(value.changingConfigurations, 0, value.resourceId,
+ "color")) {
sPreloadedColorStateLists.put(key, csl);
}
}
@@ -2219,7 +2259,8 @@ public class Resources {
if (csl != null) {
if (mPreloading) {
- if (verifyPreloadConfig(value.changingConfigurations, value.resourceId, "color")) {
+ if (verifyPreloadConfig(value.changingConfigurations, 0, value.resourceId,
+ "color")) {
sPreloadedColorStateLists.put(key, csl);
}
} else {
diff --git a/core/java/android/database/CursorWindow.aidl b/core/java/android/database/CursorWindow.aidl
new file mode 100644
index 000000000000..580935520631
--- /dev/null
+++ b/core/java/android/database/CursorWindow.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.database;
+
+parcelable CursorWindow;
diff --git a/core/java/android/net/DhcpInfo.java b/core/java/android/net/DhcpInfo.java
index 2b359ebc1156..ab4cd9b9ef76 100644
--- a/core/java/android/net/DhcpInfo.java
+++ b/core/java/android/net/DhcpInfo.java
@@ -22,8 +22,7 @@ import java.net.InetAddress;
/**
* A simple object for retrieving the results of a DHCP request.
- * @deprecated - use LinkProperties - To be removed 11/2013
- * STOPSHIP - make sure we expose LinkProperties through ConnectivityManager
+ * @deprecated - use LinkProperties - To be removed 11/2014
*/
public class DhcpInfo implements Parcelable {
public int ipAddress;
diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl
index 9e9b43d9ab6f..e5d6e5118b59 100644
--- a/core/java/android/net/IConnectivityManager.aidl
+++ b/core/java/android/net/IConnectivityManager.aidl
@@ -129,4 +129,6 @@ interface IConnectivityManager
void captivePortalCheckComplete(in NetworkInfo info);
void supplyMessenger(int networkType, in Messenger messenger);
+
+ int findConnectionTypeForIface(in String iface);
}
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index 97ac8626113b..6c9f2d1d0728 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -433,9 +433,9 @@ public class Build {
public static final int JELLY_BEAN_MR1 = 17;
/**
- * Android 4.X: Jelly Bean MR2, the revenge of the beans.
+ * Android 4.3: Jelly Bean MR2, the revenge of the beans.
*/
- public static final int JELLY_BEAN_MR2 = CUR_DEVELOPMENT;
+ public static final int JELLY_BEAN_MR2 = 18;
}
/** The type of build, like "user" or "eng". */
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index 2e77237451ce..fd01da9f8afa 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -577,6 +577,7 @@ href="{@docRoot}guide/developing/tools/traceview.html">Traceview: A Graphical Lo
*
* @see #startAllocCounting()
*/
+ @Deprecated
public static void stopAllocCounting() {
VMDebug.stopAllocCounting();
}
diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java
index d9846ecb2b21..61eef1f16997 100644
--- a/core/java/android/os/Environment.java
+++ b/core/java/android/os/Environment.java
@@ -51,6 +51,7 @@ public class Environment {
private static final String SYSTEM_PROPERTY_EFS_ENABLED = "persist.security.efs.enabled";
private static UserEnvironment sCurrentUser;
+ private static boolean sUserRequired;
private static final Object sLock = new Object();
@@ -223,7 +224,7 @@ public class Environment {
* @hide
*/
public static File getMediaStorageDirectory() {
- throwIfSystem();
+ throwIfUserRequired();
return sCurrentUser.getMediaStorageDirectory();
}
@@ -318,7 +319,7 @@ public class Environment {
* @see #isExternalStorageRemovable()
*/
public static File getExternalStorageDirectory() {
- throwIfSystem();
+ throwIfUserRequired();
return sCurrentUser.getExternalStorageDirectory();
}
@@ -465,7 +466,7 @@ public class Environment {
* using it such as with {@link File#mkdirs File.mkdirs()}.
*/
public static File getExternalStoragePublicDirectory(String type) {
- throwIfSystem();
+ throwIfUserRequired();
return sCurrentUser.getExternalStoragePublicDirectory(type);
}
@@ -474,7 +475,7 @@ public class Environment {
* @hide
*/
public static File getExternalStorageAndroidDataDir() {
- throwIfSystem();
+ throwIfUserRequired();
return sCurrentUser.getExternalStorageAndroidDataDir();
}
@@ -483,7 +484,7 @@ public class Environment {
* @hide
*/
public static File getExternalStorageAppDataDirectory(String packageName) {
- throwIfSystem();
+ throwIfUserRequired();
return sCurrentUser.getExternalStorageAppDataDirectory(packageName);
}
@@ -492,7 +493,7 @@ public class Environment {
* @hide
*/
public static File getExternalStorageAppMediaDirectory(String packageName) {
- throwIfSystem();
+ throwIfUserRequired();
return sCurrentUser.getExternalStorageAppMediaDirectory(packageName);
}
@@ -501,7 +502,7 @@ public class Environment {
* @hide
*/
public static File getExternalStorageAppObbDirectory(String packageName) {
- throwIfSystem();
+ throwIfUserRequired();
return sCurrentUser.getExternalStorageAppObbDirectory(packageName);
}
@@ -510,7 +511,7 @@ public class Environment {
* @hide
*/
public static File getExternalStorageAppFilesDirectory(String packageName) {
- throwIfSystem();
+ throwIfUserRequired();
return sCurrentUser.getExternalStorageAppFilesDirectory(packageName);
}
@@ -519,7 +520,7 @@ public class Environment {
* @hide
*/
public static File getExternalStorageAppCacheDirectory(String packageName) {
- throwIfSystem();
+ throwIfUserRequired();
return sCurrentUser.getExternalStorageAppCacheDirectory(packageName);
}
@@ -650,9 +651,15 @@ public class Environment {
}
}
- private static void throwIfSystem() {
- if (Process.myUid() == Process.SYSTEM_UID) {
- Log.wtf(TAG, "Static storage paths aren't available from AID_SYSTEM", new Throwable());
+ /** {@hide} */
+ public static void setUserRequired(boolean userRequired) {
+ sUserRequired = userRequired;
+ }
+
+ private static void throwIfUserRequired() {
+ if (sUserRequired) {
+ Log.wtf(TAG, "Path requests must specify a user by using UserEnvironment",
+ new Throwable());
}
}
diff --git a/core/java/android/os/StatFs.java b/core/java/android/os/StatFs.java
index 60ec0d77be88..2314057a379a 100644
--- a/core/java/android/os/StatFs.java
+++ b/core/java/android/os/StatFs.java
@@ -57,9 +57,9 @@ public class StatFs {
}
/**
- * The size, in bytes, of a block on the file system. This corresponds to
- * the Unix {@code statfs.f_bsize} field.
+ * @deprecated Use {@link #getBlockSizeLong()} instead.
*/
+ @Deprecated
public int getBlockSize() {
return (int) mStat.f_bsize;
}
@@ -73,27 +73,25 @@ public class StatFs {
}
/**
- * The total number of blocks on the file system. This corresponds to the
- * Unix {@code statfs.f_blocks} field.
+ * @deprecated Use {@link #getBlockCountLong()} instead.
*/
+ @Deprecated
public int getBlockCount() {
return (int) mStat.f_blocks;
}
/**
- * The size, in bytes, of a block on the file system. This corresponds to
- * the Unix {@code statfs.f_bsize} field.
+ * The total number of blocks on the file system. This corresponds to the
+ * Unix {@code statfs.f_blocks} field.
*/
public long getBlockCountLong() {
return mStat.f_blocks;
}
/**
- * The total number of blocks that are free on the file system, including
- * reserved blocks (that are not available to normal applications). This
- * corresponds to the Unix {@code statfs.f_bfree} field. Most applications
- * will want to use {@link #getAvailableBlocks()} instead.
+ * @deprecated Use {@link #getFreeBlocksLong()} instead.
*/
+ @Deprecated
public int getFreeBlocks() {
return (int) mStat.f_bfree;
}
@@ -109,17 +107,18 @@ public class StatFs {
}
/**
- * The number of bytes that are free on the file system, including
- * reserved blocks (that are not available to normal applications).
+ * The number of bytes that are free on the file system, including reserved
+ * blocks (that are not available to normal applications). Most applications
+ * will want to use {@link #getAvailableBytes()} instead.
*/
public long getFreeBytes() {
return mStat.f_bfree * mStat.f_bsize;
}
/**
- * The number of blocks that are free on the file system and available to
- * applications. This corresponds to the Unix {@code statfs.f_bavail} field.
+ * @deprecated Use {@link #getAvailableBlocksLong()} instead.
*/
+ @Deprecated
public int getAvailableBlocks() {
return (int) mStat.f_bavail;
}
@@ -139,4 +138,11 @@ public class StatFs {
public long getAvailableBytes() {
return mStat.f_bavail * mStat.f_bsize;
}
+
+ /**
+ * The total number of bytes supported by the file system.
+ */
+ public long getTotalBytes() {
+ return mStat.f_blocks * mStat.f_bsize;
+ }
}
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index 86bab2a23063..5031d3cc9b5e 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -55,10 +55,17 @@ public abstract class NotificationListenerService extends Service {
* <P>
* This might occur because the user has dismissed the notification using system UI (or another
* notification listener) or because the app has withdrawn the notification.
+ * <P>
+ * NOTE: The {@link StatusBarNotification} object you receive will be "light"; that is, the
+ * {@link StatusBarNotification#notification} member may be missing some heavyweight
+ * fields such as {@link android.app.Notification#contentView} and
+ * {@link android.app.Notification#largeIcon}. However, all other fields on
+ * {@link StatusBarNotification}, sufficient to match this call with a prior call to
+ * {@link #onNotificationPosted(StatusBarNotification)}, will be intact.
*
- * @param sbn A data structure encapsulating the original {@link android.app.Notification}
- * object as well as its identifying information (tag and id) and source
- * (package name).
+ * @param sbn A data structure encapsulating at least the original information (tag and id)
+ * and source (package name) used to post the {@link android.app.Notification} that
+ * was just removed.
*/
public abstract void onNotificationRemoved(StatusBarNotification sbn);
@@ -90,9 +97,9 @@ public abstract class NotificationListenerService extends Service {
* @param id ID of the notification as specified by the notifying app in
* {@link android.app.NotificationManager#notify(String, int, android.app.Notification)}.
*/
- public final void clearNotification(String pkg, String tag, int id) {
+ public final void cancelNotification(String pkg, String tag, int id) {
try {
- getNotificationInterface().clearNotificationFromListener(mWrapper, pkg, tag, id);
+ getNotificationInterface().cancelNotificationFromListener(mWrapper, pkg, tag, id);
} catch (android.os.RemoteException ex) {
Log.v(TAG, "Unable to contact notification manager", ex);
}
@@ -107,14 +114,29 @@ public abstract class NotificationListenerService extends Service {
* upon being informed, the notification manager will actually remove all active notifications
* and you will get multiple {@link #onNotificationRemoved(StatusBarNotification)} callbacks.
*
- * {@see #clearNotification(String, String, int)}
+ * {@see #cancelNotification(String, String, int)}
+ */
+ public final void cancelAllNotifications() {
+ try {
+ getNotificationInterface().cancelAllNotificationsFromListener(mWrapper);
+ } catch (android.os.RemoteException ex) {
+ Log.v(TAG, "Unable to contact notification manager", ex);
+ }
+ }
+
+ /**
+ * Request the list of outstanding notifications (that is, those that are visible to the
+ * current user). Useful when starting up and you don't know what's already been posted.
+ *
+ * @return An array of active notifications.
*/
- public final void clearAllNotifications() {
+ public StatusBarNotification[] getActiveNotifications() {
try {
- getNotificationInterface().clearAllNotificationsFromListener(mWrapper);
+ return getNotificationInterface().getActiveNotificationsFromListener(mWrapper);
} catch (android.os.RemoteException ex) {
Log.v(TAG, "Unable to contact notification manager", ex);
}
+ return null;
}
@Override
diff --git a/core/java/android/service/notification/StatusBarNotification.java b/core/java/android/service/notification/StatusBarNotification.java
index ef5f8c4ac911..e8cc24b9933b 100644
--- a/core/java/android/service/notification/StatusBarNotification.java
+++ b/core/java/android/service/notification/StatusBarNotification.java
@@ -26,35 +26,21 @@ import android.os.UserHandle;
* the status bar and any {@link android.service.notification.NotificationListenerService}s.
*/
public class StatusBarNotification implements Parcelable {
- /** The package of the app that posted the notification. */
- public final String pkg;
- /** The id supplied to {@link android.app.NotificationManager#notify}. */
- public final int id;
- /** The tag supplied to {@link android.app.NotificationManager#notify}, or null if no tag
- * was specified. */
- public final String tag;
+ private final String pkg;
+ private final int id;
+ private final String tag;
- /** The notifying app's calling uid. @hide */
- public final int uid;
- /** The notifying app's base package. @hide */
- public final String basePkg;
- /** @hide */
- public final int initialPid;
+ private final int uid;
+ private final String basePkg;
+ private final int initialPid;
// TODO: make this field private and move callers to an accessor that
// ensures sourceUser is applied.
- /** The {@link android.app.Notification} supplied to
- * {@link android.app.NotificationManager#notify}. */
- public final Notification notification;
- /** The {@link android.os.UserHandle} for whom this notification is intended. */
- public final UserHandle user;
- /** The time (in {@link System#currentTimeMillis} time) the notification was posted,
- * which may be different than {@link android.app.Notification#when}.
- */
- public final long postTime;
+ private final Notification notification;
+ private final UserHandle user;
+ private final long postTime;
- /** @hide */
- public final int score;
+ private final int score;
/** This is temporarily needed for the JB MR1 PDK.
* @hide */
@@ -152,6 +138,17 @@ public class StatusBarNotification implements Parcelable {
}
};
+ /**
+ * @hide
+ */
+ public StatusBarNotification cloneLight() {
+ final Notification no = new Notification();
+ this.notification.cloneInto(no, false); // light copy
+ return new StatusBarNotification(this.pkg, this.basePkg,
+ this.id, this.tag, this.uid, this.initialPid,
+ this.score, no, this.user, this.postTime);
+ }
+
@Override
public StatusBarNotification clone() {
return new StatusBarNotification(this.pkg, this.basePkg,
@@ -187,4 +184,61 @@ public class StatusBarNotification implements Parcelable {
public int getUserId() {
return this.user.getIdentifier();
}
+
+ /** The package of the app that posted the notification. */
+ public String getPackageName() {
+ return pkg;
+ }
+
+ /** The id supplied to {@link android.app.NotificationManager#notify}. */
+ public int getId() {
+ return id;
+ }
+
+ /** The tag supplied to {@link android.app.NotificationManager#notify}, or null if no tag
+ * was specified. */
+ public String getTag() {
+ return tag;
+ }
+
+ /** The notifying app's calling uid. @hide */
+ public int getUid() {
+ return uid;
+ }
+
+ /** The notifying app's base package. @hide */
+ public String getBasePkg() {
+ return basePkg;
+ }
+
+ /** @hide */
+ public int getInitialPid() {
+ return initialPid;
+ }
+
+ /** The {@link android.app.Notification} supplied to
+ * {@link android.app.NotificationManager#notify}. */
+ public Notification getNotification() {
+ return notification;
+ }
+
+ /**
+ * The {@link android.os.UserHandle} for whom this notification is intended.
+ * @hide
+ */
+ public UserHandle getUser() {
+ return user;
+ }
+
+ /** The time (in {@link System#currentTimeMillis} time) the notification was posted,
+ * which may be different than {@link android.app.Notification#when}.
+ */
+ public long getPostTime() {
+ return postTime;
+ }
+
+ /** @hide */
+ public int getScore() {
+ return score;
+ }
}
diff --git a/core/java/android/text/bidi/BidiFormatter.java b/core/java/android/text/BidiFormatter.java
index 7a08213c5280..3fab35b56795 100644
--- a/core/java/android/text/bidi/BidiFormatter.java
+++ b/core/java/android/text/BidiFormatter.java
@@ -14,18 +14,14 @@
* limitations under the License.
*/
-package android.text.bidi;
+package android.text;
-import android.text.TextDirectionHeuristic;
-import android.text.TextDirectionHeuristics;
-import android.text.TextUtils;
import android.view.View;
import static android.text.TextDirectionHeuristics.FIRSTSTRONG_LTR;
import java.util.Locale;
-
/**
* Utility class for formatting text for display in a potentially opposite-directionality context
* without garbling. The directionality of the context is set at formatter creation and the
@@ -34,14 +30,12 @@ import java.util.Locale;
* <p>
* 1. Bidi Wrapping
* When text in one language is mixed into a document in another, opposite-directionality language,
- * e.g. when an English business name is embedded in a Hebrew web page, both the inserted string
+ * e.g. when an English business name is embedded in some Hebrew text, both the inserted string
* and the text surrounding it may be displayed incorrectly unless the inserted string is explicitly
* separated from the surrounding text in a "wrapper" that:
* <p>
- * - Declares its directionality so that the string is displayed correctly. This can be done in HTML
- * markup (e.g. a 'span dir="rtl"' element) by {@link #spanWrap} and similar methods, or - only in
- * contexts where markup can't be used - in Unicode bidi formatting codes by {@link #unicodeWrap}
- * and similar methods.
+ * - Declares its directionality so that the string is displayed correctly. This can be done in
+ * Unicode bidi formatting codes by {@link #unicodeWrap} and similar methods.
* <p>
* - Isolates the string's directionality, so it does not unduly affect the surrounding content.
* Currently, this can only be done using invisible Unicode characters of the same direction as
@@ -80,16 +74,6 @@ import java.util.Locale;
* estimated at run-time. The bidi formatter can do this automatically using the default
* first-strong estimation algorithm. It can also be configured to use a custom directionality
* estimation object.
- * <p>
- * 3. Escaping
- * When wrapping plain text - i.e. text that is not already HTML or HTML-escaped - in HTML markup,
- * the text must first be HTML-escaped to prevent XSS attacks and other nasty business. This of
- * course is always true, but the escaping can not be done after the string has already been wrapped
- * in markup, so the bidi formatter also serves as a last chance and includes escaping services.
- * <p>
- * Thus, in a single call, the formatter will escape the input string as specified, determine its
- * directionality, and wrap it as necessary. It is then up to the caller to insert the return value
- * in the output.
*/
public final class BidiFormatter {
@@ -134,36 +118,6 @@ public final class BidiFormatter {
private static final String RLM_STRING = Character.toString(RLM);
/**
- * "ltr" string constant.
- */
- private static final String LTR_STRING = "ltr";
-
- /**
- * "rtl" string constant.
- */
- private static final String RTL_STRING = "rtl";
-
- /**
- * "dir=\"ltr\"" string constant.
- */
- private static final String DIR_LTR_STRING = "dir=\"ltr\"";
-
- /**
- * "dir=\"rtl\"" string constant.
- */
- private static final String DIR_RTL_STRING = "dir=\"rtl\"";
-
- /**
- * "right" string constant.
- */
- private static final String RIGHT = "right";
-
- /**
- * "left" string constant.
- */
- private static final String LEFT = "left";
-
- /**
* Empty string constant.
*/
private static final String EMPTY_STRING = "";
@@ -325,102 +279,21 @@ public final class BidiFormatter {
}
/**
- * Returns "rtl" if {@code str}'s estimated directionality is RTL, and "ltr" if it is LTR.
- *
- * @param str String whose directionality is to be estimated.
- * @return "rtl" if {@code str}'s estimated directionality is RTL, and "ltr" otherwise.
- */
- public String dirAttrValue(String str) {
- return dirAttrValue(isRtl(str));
- }
-
- /**
- * Operates like {@link #dirAttrValue(String)}, but uses a given heuristic to estimate the
- * {@code str}'s directionality.
- *
- * @param str String whose directionality is to be estimated.
- * @param heuristic The text direction heuristic that will be used to estimate the {@code str}'s
- * directionality.
- * @return "rtl" if {@code str}'s estimated directionality is RTL, and "ltr" otherwise.
- */
- public String dirAttrValue(String str, TextDirectionHeuristic heuristic) {
- return dirAttrValue(heuristic.isRtl(str, 0, str.length()));
- }
-
- /**
- * Returns "rtl" if the given directionality is RTL, and "ltr" if it is LTR.
- *
- * @param isRtl Whether the directionality is RTL or not.
- * @return "rtl" if the given directionality is RTL, and "ltr" otherwise.
- */
- public String dirAttrValue(boolean isRtl) {
- return isRtl ? RTL_STRING : LTR_STRING;
- }
-
- /**
- * Returns "dir=\"ltr\"" or "dir=\"rtl\"", depending on {@code str}'s estimated directionality,
- * if it is not the same as the context directionality. Otherwise, returns the empty string.
- *
- * @param str String whose directionality is to be estimated.
- * @return "dir=\"rtl\"" for RTL text in non-RTL context; "dir=\"ltr\"" for LTR text in non-LTR
- * context; else, the empty string.
- */
- public String dirAttr(String str) {
- return dirAttr(isRtl(str));
- }
-
- /**
- * Operates like {@link #dirAttr(String)}, but uses a given heuristic to estimate the
- * {@code str}'s directionality.
- *
- * @param str String whose directionality is to be estimated.
- * @param heuristic The text direction heuristic that will be used to estimate the {@code str}'s
- * directionality.
- * @return "dir=\"rtl\"" for RTL text in non-RTL context; "dir=\"ltr\"" for LTR text in non-LTR
- * context; else, the empty string.
- */
- public String dirAttr(String str, TextDirectionHeuristic heuristic) {
- return dirAttr(heuristic.isRtl(str, 0, str.length()));
- }
-
- /**
- * Returns "dir=\"ltr\"" or "dir=\"rtl\"", depending on the given directionality, if it is not
- * the same as the context directionality. Otherwise, returns the empty string.
- *
- * @param isRtl Whether the directionality is RTL or not
- * @return "dir=\"rtl\"" for RTL text in non-RTL context; "dir=\"ltr\"" for LTR text in non-LTR
- * context; else, the empty string.
- */
- public String dirAttr(boolean isRtl) {
- return (isRtl != mIsRtlContext) ? (isRtl ? DIR_RTL_STRING : DIR_LTR_STRING) : EMPTY_STRING;
- }
-
- /**
* Returns a Unicode bidi mark matching the context directionality (LRM or RLM) if either the
* overall or the exit directionality of a given string is opposite to the context directionality.
* Putting this after the string (including its directionality declaration wrapping) prevents it
* from "sticking" to other opposite-directionality text or a number appearing after it inline
* with only neutral content in between. Otherwise returns the empty string. While the exit
* directionality is determined by scanning the end of the string, the overall directionality is
- * given explicitly in {@code dir}.
- *
- * @param str String after which the mark may need to appear.
- * @return LRM for RTL text in LTR context; RLM for LTR text in RTL context;
- * else, the empty string.
- */
- public String markAfter(String str) {
- return markAfter(str, mDefaultTextDirectionHeuristic);
- }
-
- /**
- * Operates like {@link #markAfter(String)}, but uses a given heuristic to estimate the
- * {@code str}'s directionality.
+ * given explicitly by a heuristic to estimate the {@code str}'s directionality.
*
* @param str String after which the mark may need to appear.
* @param heuristic The text direction heuristic that will be used to estimate the {@code str}'s
* directionality.
* @return LRM for RTL text in LTR context; RLM for LTR text in RTL context;
* else, the empty string.
+ *
+ * @hide
*/
public String markAfter(String str, TextDirectionHeuristic heuristic) {
final boolean isRtl = heuristic.isRtl(str, 0, str.length());
@@ -438,28 +311,18 @@ public final class BidiFormatter {
* Returns a Unicode bidi mark matching the context directionality (LRM or RLM) if either the
* overall or the entry directionality of a given string is opposite to the context
* directionality. Putting this before the string (including its directionality declaration
- * wrapping) prevents it from "sticking" to other opposite-directionality text appearing before it
- * inline with only neutral content in between. Otherwise returns the empty string. While the
+ * wrapping) prevents it from "sticking" to other opposite-directionality text appearing before
+ * it inline with only neutral content in between. Otherwise returns the empty string. While the
* entry directionality is determined by scanning the beginning of the string, the overall
- * directionality is given explicitly in {@code dir}.
- *
- * @param str String before which the mark may need to appear.
- * @return LRM for RTL text in LTR context; RLM for LTR text in RTL context;
- * else, the empty string.
- */
- public String markBefore(String str) {
- return markBefore(str, mDefaultTextDirectionHeuristic);
- }
-
- /**
- * Operates like {@link #markBefore(String)}, but uses a given heuristic to estimate the
- * {@code str}'s directionality.
+ * directionality is given explicitly by a heuristic to estimate the {@code str}'s directionality.
*
* @param str String before which the mark may need to appear.
* @param heuristic The text direction heuristic that will be used to estimate the {@code str}'s
* directionality.
* @return LRM for RTL text in LTR context; RLM for LTR text in RTL context;
* else, the empty string.
+ *
+ * @hide
*/
public String markBefore(String str, TextDirectionHeuristic heuristic) {
final boolean isRtl = heuristic.isRtl(str, 0, str.length());
@@ -474,30 +337,6 @@ public final class BidiFormatter {
}
/**
- * Returns the Unicode bidi mark matching the context directionality (LRM for LTR context
- * directionality, RLM for RTL context directionality).
- */
- public String mark() {
- return mIsRtlContext ? RLM_STRING : LRM_STRING;
- }
-
- /**
- * Returns "right" for RTL context directionality. Otherwise for LTR context directionality
- * returns "left".
- */
- public String startEdge() {
- return mIsRtlContext ? RIGHT : LEFT;
- }
-
- /**
- * Returns "left" for RTL context directionality. Otherwise for LTR context directionality
- * returns "right".
- */
- public String endEdge() {
- return mIsRtlContext ? LEFT : RIGHT;
- }
-
- /**
* Estimates the directionality of a string using the default text direction heuristic.
*
* @param str String whose directionality is to be estimated.
@@ -509,95 +348,9 @@ public final class BidiFormatter {
}
/**
- * Formats a given string of unknown directionality for use in HTML output of the context
- * directionality, so an opposite-directionality string is neither garbled nor garbles its
- * surroundings.
- * <p>
- * The algorithm: estimates the directionality of the given string using the given heuristic.
- * If the directionality is known, pass TextDirectionHeuristics.LTR or RTL for heuristic.
- * In case its directionality doesn't match the context directionality, wraps it with a 'span'
- * element and adds a "dir" attribute (either 'dir=\"rtl\"' or 'dir=\"ltr\"').
- * <p>
- * If {@code isolate}, directionally isolates the string so that it does not garble its
- * surroundings. Currently, this is done by "resetting" the directionality after the string by
- * appending a trailing Unicode bidi mark matching the context directionality (LRM or RLM) when
- * either the overall directionality or the exit directionality of the string is opposite to that
- * of the context. If the formatter was built using {@link Builder#stereoReset(boolean)} and
- * passing "true" as an argument, also prepends a Unicode bidi mark matching the context
- * directionality when either the overall directionality or the entry directionality of the
- * string is opposite to that of the context.
- * <p>
- *
- * @param str The input string.
- * @param heuristic The algorithm to be used to estimate the string's overall direction.
- * @param isolate Whether to directionally isolate the string to prevent it from garbling the
- * content around it.
- * @return Input string after applying the above processing.
- */
- public String spanWrap(String str, TextDirectionHeuristic heuristic, boolean isolate) {
- final boolean isRtl = heuristic.isRtl(str, 0, str.length());
- String origStr = str;
- str = TextUtils.htmlEncode(str);
-
- StringBuilder result = new StringBuilder();
- if (getStereoReset() && isolate) {
- result.append(markBefore(origStr,
- isRtl ? TextDirectionHeuristics.RTL : TextDirectionHeuristics.LTR));
- }
- if (isRtl != mIsRtlContext) {
- result.append("<span ").append(dirAttr(isRtl)).append('>').append(str).append("</span>");
- } else {
- result.append(str);
- }
- if (isolate) {
- result.append(markAfter(origStr,
- isRtl ? TextDirectionHeuristics.RTL : TextDirectionHeuristics.LTR));
- }
- return result.toString();
- }
-
- /**
- * Operates like {@link #spanWrap(String, TextDirectionHeuristic, boolean)}, but assumes
- * {@code isolate} is true.
- *
- * @param str The input string.
- * @param heuristic The algorithm to be used to estimate the string's overall direction.
- * @return Input string after applying the above processing.
- */
- public String spanWrap(String str, TextDirectionHeuristic heuristic) {
- return spanWrap(str, heuristic, true /* isolate */);
- }
-
- /**
- * Operates like {@link #spanWrap(String, TextDirectionHeuristic, boolean)}, but uses the
- * formatter's default direction estimation algorithm.
- *
- * @param str The input string.
- * @param isolate Whether to directionally isolate the string to prevent it from garbling the
- * content around it
- * @return Input string after applying the above processing.
- */
- public String spanWrap(String str, boolean isolate) {
- return spanWrap(str, mDefaultTextDirectionHeuristic, isolate);
- }
-
- /**
- * Operates like {@link #spanWrap(String, TextDirectionHeuristic, boolean)}, but uses the
- * formatter's default direction estimation algorithm and assumes {@code isolate} is true.
- *
- * @param str The input string.
- * @return Input string after applying the above processing.
- */
- public String spanWrap(String str) {
- return spanWrap(str, mDefaultTextDirectionHeuristic, true /* isolate */);
- }
-
- /**
* Formats a string of given directionality for use in plain-text output of the context
* directionality, so an opposite-directionality string is neither garbled nor garbles its
- * surroundings. As opposed to {@link #spanWrap}, this makes use of Unicode bidi
- * formatting characters. In HTML, its *only* valid use is inside of elements that do not allow
- * markup, e.g. the 'option' and 'title' elements.
+ * surroundings. This makes use of Unicode bidi formatting characters.
* <p>
* The algorithm: In case the given directionality doesn't match the context directionality, wraps
* the string with Unicode bidi formatting characters: RLE+{@code str}+PDF for RTL text, or
diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java
index 2ab9bf819a13..e2035c2afe1f 100644
--- a/core/java/android/text/TextUtils.java
+++ b/core/java/android/text/TextUtils.java
@@ -44,6 +44,7 @@ import android.text.style.TextAppearanceSpan;
import android.text.style.TypefaceSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
+import android.util.Log;
import android.util.Printer;
import android.view.View;
@@ -57,6 +58,8 @@ import java.util.Locale;
import java.util.regex.Pattern;
public class TextUtils {
+ private static final String TAG = "TextUtils";
+
private TextUtils() { /* cannot be instantiated */ }
@@ -550,6 +553,8 @@ public class TextUtils {
/** @hide */
public static final int ALIGNMENT_SPAN = 1;
/** @hide */
+ public static final int FIRST_SPAN = ALIGNMENT_SPAN;
+ /** @hide */
public static final int FOREGROUND_COLOR_SPAN = 2;
/** @hide */
public static final int RELATIVE_SIZE_SPAN = 3;
@@ -593,6 +598,8 @@ public class TextUtils {
public static final int EASY_EDIT_SPAN = 22;
/** @hide */
public static final int LOCALE_SPAN = 23;
+ /** @hide */
+ public static final int LAST_SPAN = LOCALE_SPAN;
/**
* Flatten a CharSequence and whatever styles can be copied across processes
@@ -622,9 +629,16 @@ public class TextUtils {
if (prop instanceof ParcelableSpan) {
ParcelableSpan ps = (ParcelableSpan)prop;
- p.writeInt(ps.getSpanTypeId());
- ps.writeToParcel(p, parcelableFlags);
- writeWhere(p, sp, o);
+ int spanTypeId = ps.getSpanTypeId();
+ if (spanTypeId < FIRST_SPAN || spanTypeId > LAST_SPAN) {
+ Log.e(TAG, "external class \"" + ps.getClass().getSimpleName()
+ + "\" is attempting to use the frameworks-only ParcelableSpan"
+ + " interface");
+ } else {
+ p.writeInt(spanTypeId);
+ ps.writeToParcel(p, parcelableFlags);
+ writeWhere(p, sp, o);
+ }
}
}
diff --git a/core/java/android/util/PropertyValueModel.java b/core/java/android/util/PropertyValueModel.java
deleted file mode 100755
index eb9c47d0c379..000000000000
--- a/core/java/android/util/PropertyValueModel.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.util;
-
-/**
- * A value model for a {@link Property property} of a host object. This class can be used for
- * both reflective and non-reflective property implementations.
- *
- * @param <H> the host type, where the host is the object that holds this property
- * @param <T> the value type
- *
- * @see Property
- * @see ValueModel
- */
-public class PropertyValueModel<H, T> extends ValueModel<T> {
- private final H mHost;
- private final Property<H, T> mProperty;
-
- private PropertyValueModel(H host, Property<H, T> property) {
- mProperty = property;
- mHost = host;
- }
-
- /**
- * Returns the host.
- *
- * @return the host
- */
- public H getHost() {
- return mHost;
- }
-
- /**
- * Returns the property.
- *
- * @return the property
- */
- public Property<H, T> getProperty() {
- return mProperty;
- }
-
- @Override
- public Class<T> getType() {
- return mProperty.getType();
- }
-
- @Override
- public T get() {
- return mProperty.get(mHost);
- }
-
- @Override
- public void set(T value) {
- mProperty.set(mHost, value);
- }
-
- /**
- * Return an appropriate PropertyValueModel for this host and property.
- *
- * @param host the host
- * @param property the property
- * @return the value model
- */
- public static <H, T> PropertyValueModel<H, T> of(H host, Property<H, T> property) {
- return new PropertyValueModel<H, T>(host, property);
- }
-
- /**
- * Return a PropertyValueModel for this {@code host} and a
- * reflective property, constructed from this {@code propertyType} and {@code propertyName}.
- *
- * @param host
- * @param propertyType the property type
- * @param propertyName the property name
- * @return a value model with this host and a reflective property with this type and name
- *
- * @see Property#of
- */
- public static <H, T> PropertyValueModel<H, T> of(H host, Class<T> propertyType,
- String propertyName) {
- return of(host, Property.of((Class<H>) host.getClass(), propertyType, propertyName));
- }
-
- private static Class getNullaryMethodReturnType(Class c, String name) {
- try {
- return c.getMethod(name).getReturnType();
- } catch (NoSuchMethodException e) {
- return null;
- }
- }
-
- private static Class getFieldType(Class c, String name) {
- try {
- return c.getField(name).getType();
- } catch (NoSuchFieldException e) {
- return null;
- }
- }
-
- private static String capitalize(String name) {
- if (name.isEmpty()) {
- return name;
- }
- return Character.toUpperCase(name.charAt(0)) + name.substring(1);
- }
-
- /**
- * Return a PropertyValueModel for this {@code host} and and {@code propertyName}.
- *
- * @param host the host
- * @param propertyName the property name
- * @return a value model with this host and a reflective property with this name
- */
- public static PropertyValueModel of(Object host, String propertyName) {
- Class clazz = host.getClass();
- String suffix = capitalize(propertyName);
- Class propertyType = getNullaryMethodReturnType(clazz, "get" + suffix);
- if (propertyType == null) {
- propertyType = getNullaryMethodReturnType(clazz, "is" + suffix);
- }
- if (propertyType == null) {
- propertyType = getFieldType(clazz, propertyName);
- }
- if (propertyType == null) {
- throw new NoSuchPropertyException(propertyName);
- }
- return of(host, propertyType, propertyName);
- }
-}
diff --git a/core/java/android/util/ValueModel.java b/core/java/android/util/ValueModel.java
deleted file mode 100755
index 4789682ea496..000000000000
--- a/core/java/android/util/ValueModel.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.util;
-
-/**
- * A ValueModel is an abstraction for a 'slot' or place in memory in which a value
- * may be stored and retrieved. A common implementation of ValueModel is a regular property of
- * an object, whose value may be retrieved by calling the appropriate <em>getter</em>
- * method and set by calling the corresponding <em>setter</em> method.
- *
- * @param <T> the value type
- *
- * @see PropertyValueModel
- */
-public abstract class ValueModel<T> {
- /**
- * The empty model should be used in place of {@code null} to indicate that a
- * model has not been set. The empty model has no value and does nothing when it is set.
- */
- public static final ValueModel EMPTY = new ValueModel() {
- @Override
- public Class getType() {
- return Object.class;
- }
-
- @Override
- public Object get() {
- return null;
- }
-
- @Override
- public void set(Object value) {
-
- }
- };
-
- protected ValueModel() {
- }
-
- /**
- * Returns the type of this property.
- *
- * @return the property type
- */
- public abstract Class<T> getType();
-
- /**
- * Returns the value of this property.
- *
- * @return the property value
- */
- public abstract T get();
-
- /**
- * Sets the value of this property.
- *
- * @param value the new value for this property
- */
- public abstract void set(T value);
-} \ No newline at end of file
diff --git a/core/java/android/view/DisplayList.java b/core/java/android/view/DisplayList.java
index 3bad98ef6770..2d24c1ea42fa 100644
--- a/core/java/android/view/DisplayList.java
+++ b/core/java/android/view/DisplayList.java
@@ -285,9 +285,9 @@ public abstract class DisplayList {
* Set whether the display list should clip itself to its bounds. This property is controlled by
* the view's parent.
*
- * @param clipChildren true if the display list should clip to its bounds
+ * @param clipToBounds true if the display list should clip to its bounds
*/
- public abstract void setClipChildren(boolean clipChildren);
+ public abstract void setClipToBounds(boolean clipToBounds);
/**
* Set the static matrix on the display list. The specified matrix is combined with other
diff --git a/core/java/android/view/GLES20DisplayList.java b/core/java/android/view/GLES20DisplayList.java
index 9c5cdb2bd2c4..3272504fbfa6 100644
--- a/core/java/android/view/GLES20DisplayList.java
+++ b/core/java/android/view/GLES20DisplayList.java
@@ -137,9 +137,9 @@ class GLES20DisplayList extends DisplayList {
}
@Override
- public void setClipChildren(boolean clipChildren) {
+ public void setClipToBounds(boolean clipToBounds) {
if (hasNativeDisplayList()) {
- nSetClipChildren(mFinalizer.mNativeDisplayList, clipChildren);
+ nSetClipToBounds(mFinalizer.mNativeDisplayList, clipToBounds);
}
}
@@ -450,7 +450,7 @@ class GLES20DisplayList extends DisplayList {
private static native void nSetPivotY(int displayList, float pivotY);
private static native void nSetPivotX(int displayList, float pivotX);
private static native void nSetCaching(int displayList, boolean caching);
- private static native void nSetClipChildren(int displayList, boolean clipChildren);
+ private static native void nSetClipToBounds(int displayList, boolean clipToBounds);
private static native void nSetAlpha(int displayList, float alpha);
private static native void nSetHasOverlappingRendering(int displayList,
boolean hasOverlappingRendering);
diff --git a/core/java/android/view/InputDevice.java b/core/java/android/view/InputDevice.java
index 2595ee5fdf29..2a761c1b380f 100644
--- a/core/java/android/view/InputDevice.java
+++ b/core/java/android/view/InputDevice.java
@@ -533,7 +533,6 @@ public final class InputDevice implements Parcelable {
*
* @see MotionEvent#AXIS_X
* @see MotionEvent#AXIS_Y
- * @see #getSupportedAxes()
*/
public MotionRange getMotionRange(int axis) {
final int numRanges = mMotionRanges.size();
@@ -559,7 +558,6 @@ public final class InputDevice implements Parcelable {
*
* @see MotionEvent#AXIS_X
* @see MotionEvent#AXIS_Y
- * @see #getSupportedAxes()
*/
public MotionRange getMotionRange(int axis, int source) {
final int numRanges = mMotionRanges.size();
diff --git a/core/java/android/view/InputEvent.java b/core/java/android/view/InputEvent.java
index 24c3128147cf..07a937c6f474 100644
--- a/core/java/android/view/InputEvent.java
+++ b/core/java/android/view/InputEvent.java
@@ -70,7 +70,6 @@ public abstract class InputEvent implements Parcelable {
* Gets the source of the event.
*
* @return The event source or {@link InputDevice#SOURCE_UNKNOWN} if unknown.
- * @see InputDevice#getSourceInfo
*/
public abstract int getSource();
diff --git a/core/java/android/view/InputQueue.java b/core/java/android/view/InputQueue.java
index 909a3b2b9d24..e3de89d1cc00 100644
--- a/core/java/android/view/InputQueue.java
+++ b/core/java/android/view/InputQueue.java
@@ -16,11 +16,127 @@
package android.view;
+import dalvik.system.CloseGuard;
+
+import android.os.Handler;
+import android.os.Looper;
+import android.os.MessageQueue;
+import android.util.Pools.Pool;
+import android.util.Pools.SimplePool;
+import android.util.SparseArray;
+
+import java.lang.ref.WeakReference;
+
/**
* An input queue provides a mechanism for an application to receive incoming
* input events. Currently only usable from native code.
*/
public final class InputQueue {
+ private final SparseArray<ActiveInputEvent> mActiveEventArray =
+ new SparseArray<ActiveInputEvent>(20);
+ private final Pool<ActiveInputEvent> mActiveInputEventPool =
+ new SimplePool<ActiveInputEvent>(20);
+
+ private final CloseGuard mCloseGuard = CloseGuard.get();
+
+ private int mPtr;
+
+ private static native int nativeInit(WeakReference<InputQueue> weakQueue,
+ MessageQueue messageQueue);
+ private static native int nativeSendKeyEvent(int ptr, KeyEvent e, boolean preDispatch);
+ private static native int nativeSendMotionEvent(int ptr, MotionEvent e);
+ private static native void nativeDispose(int ptr);
+
+ /** @hide */
+ public InputQueue() {
+ mPtr = nativeInit(new WeakReference<InputQueue>(this), Looper.myQueue());
+
+ mCloseGuard.open("dispose");
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ try {
+ dispose(true);
+ } finally {
+ super.finalize();
+ }
+ }
+
+ /** @hide */
+ public void dispose() {
+ dispose(false);
+ }
+
+ /** @hide */
+ public void dispose(boolean finalized) {
+ if (mCloseGuard != null) {
+ if (finalized) {
+ mCloseGuard.warnIfOpen();
+ }
+ mCloseGuard.close();
+ }
+
+ if (mPtr != 0) {
+ nativeDispose(mPtr);
+ mPtr = 0;
+ }
+ }
+
+ /** @hide */
+ public int getNativePtr() {
+ return mPtr;
+ }
+
+ /** @hide */
+ public void sendInputEvent(InputEvent e, Object token, boolean predispatch,
+ FinishedInputEventCallback callback) {
+ ActiveInputEvent event = obtainActiveInputEvent(token, callback);
+ int id;
+ if (e instanceof KeyEvent) {
+ id = nativeSendKeyEvent(mPtr, (KeyEvent) e, predispatch);
+ } else {
+ id = nativeSendMotionEvent(mPtr, (MotionEvent) e);
+ }
+ mActiveEventArray.put(id, event);
+ }
+
+ private void finishInputEvent(int id, boolean handled) {
+ int index = mActiveEventArray.indexOfKey(id);
+ if (index >= 0) {
+ ActiveInputEvent e = mActiveEventArray.valueAt(index);
+ mActiveEventArray.removeAt(index);
+ e.mCallback.onFinishedInputEvent(e.mToken, handled);
+ recycleActiveInputEvent(e);
+ }
+ }
+
+ private ActiveInputEvent obtainActiveInputEvent(Object token,
+ FinishedInputEventCallback callback) {
+ ActiveInputEvent e = mActiveInputEventPool.acquire();
+ if (e == null) {
+ e = new ActiveInputEvent();
+ }
+ e.mToken = token;
+ e.mCallback = callback;
+ return e;
+ }
+
+ private void recycleActiveInputEvent(ActiveInputEvent e) {
+ e.recycle();
+ mActiveInputEventPool.release(e);
+ }
+
+ private final class ActiveInputEvent {
+ public Object mToken;
+ public FinishedInputEventCallback mCallback;
+
+ public void recycle() {
+ mToken = null;
+ mCallback = null;
+ }
+ }
+
/**
* Interface to receive notification of when an InputQueue is associated
* and dissociated with a thread.
@@ -31,7 +147,7 @@ public final class InputQueue {
* thread making this call, so it can start receiving events from it.
*/
void onInputQueueCreated(InputQueue queue);
-
+
/**
* Called when the given InputQueue is no longer associated with
* the thread and thus not dispatching events.
@@ -39,15 +155,9 @@ public final class InputQueue {
void onInputQueueDestroyed(InputQueue queue);
}
- final InputChannel mChannel;
-
- /** @hide */
- public InputQueue(InputChannel channel) {
- mChannel = channel;
- }
-
/** @hide */
- public InputChannel getInputChannel() {
- return mChannel;
+ public static interface FinishedInputEventCallback {
+ void onFinishedInputEvent(Object token, boolean handled);
}
+
}
diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java
index bb533bf0f74c..0546d249dbe3 100644
--- a/core/java/android/view/KeyEvent.java
+++ b/core/java/android/view/KeyEvent.java
@@ -1233,6 +1233,12 @@ public class KeyEvent extends InputEvent implements Parcelable {
public static final int FLAG_FALLBACK = 0x400;
/**
+ * Signifies that the key is being predispatched.
+ * @hide
+ */
+ public static final int FLAG_PREDISPATCH = 0x20000000;
+
+ /**
* Private control to determine when an app is tracking a key sequence.
* @hide
*/
@@ -2816,7 +2822,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
*
* @param symbolicName The symbolic name of the keycode.
* @return The keycode or {@link #KEYCODE_UNKNOWN} if not found.
- * @see #keycodeToString
+ * @see #keycodeToString(int)
*/
public static int keyCodeFromString(String symbolicName) {
if (symbolicName == null) {
diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java
index 78fa2d77b8fd..ee3609769615 100644
--- a/core/java/android/view/MotionEvent.java
+++ b/core/java/android/view/MotionEvent.java
@@ -1947,8 +1947,6 @@ public final class MotionEvent extends InputEvent implements Parcelable {
* @see #TOOL_TYPE_FINGER
* @see #TOOL_TYPE_STYLUS
* @see #TOOL_TYPE_MOUSE
- * @see #TOOL_TYPE_INDIRECT_FINGER
- * @see #TOOL_TYPE_INDIRECT_STYLUS
*/
public final int getToolType(int pointerIndex) {
return nativeGetToolType(mNativePtr, pointerIndex);
@@ -2190,7 +2188,7 @@ public final class MotionEvent extends InputEvent implements Parcelable {
* on the screen, before it had been adjusted for the containing window
* and views.
*
- * @see getX()
+ * @see #getX(int)
* @see #AXIS_X
*/
public final float getRawX() {
@@ -2203,7 +2201,7 @@ public final class MotionEvent extends InputEvent implements Parcelable {
* on the screen, before it had been adjusted for the containing window
* and views.
*
- * @see getY()
+ * @see #getY(int)
* @see #AXIS_Y
*/
public final float getRawY() {
@@ -3063,7 +3061,7 @@ public final class MotionEvent extends InputEvent implements Parcelable {
*
* @param symbolicName The symbolic name of the axis.
* @return The axis or -1 if not found.
- * @see #keycodeToString
+ * @see KeyEvent#keycodeToString(int)
*/
public static int axisFromString(String symbolicName) {
if (symbolicName == null) {
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index be26d20d5350..558924466047 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -2915,14 +2915,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @hide
*/
- int mUserPaddingLeftInitial = 0;
+ int mUserPaddingLeftInitial;
/**
* Cache initial right padding.
*
* @hide
*/
- int mUserPaddingRightInitial = 0;
+ int mUserPaddingRightInitial;
/**
* Default undefined padding
@@ -3388,11 +3388,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
break;
case com.android.internal.R.styleable.View_paddingStart:
startPadding = a.getDimensionPixelSize(attr, UNDEFINED_PADDING);
- startPaddingDefined = true;
+ startPaddingDefined = (startPadding != UNDEFINED_PADDING);
break;
case com.android.internal.R.styleable.View_paddingEnd:
endPadding = a.getDimensionPixelSize(attr, UNDEFINED_PADDING);
- endPaddingDefined = true;
+ endPaddingDefined = (endPadding != UNDEFINED_PADDING);
break;
case com.android.internal.R.styleable.View_scrollX:
x = a.getDimensionPixelOffset(attr, 0);
@@ -3712,10 +3712,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
// Padding from the background drawable is stored at this point in mUserPaddingLeftInitial
// and mUserPaddingRightInitial) so drawable padding will be used as ultimate default if
// defined.
- if (leftPaddingDefined) {
+ final boolean hasRelativePadding = startPaddingDefined || endPaddingDefined;
+
+ if (leftPaddingDefined && !hasRelativePadding) {
mUserPaddingLeftInitial = leftPadding;
}
- if (rightPaddingDefined) {
+ if (rightPaddingDefined && !hasRelativePadding) {
mUserPaddingRightInitial = rightPadding;
}
}
@@ -6615,12 +6617,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @hide
*/
public void clearAccessibilityFocus() {
- if ((mPrivateFlags2 & PFLAG2_ACCESSIBILITY_FOCUSED) != 0) {
- mPrivateFlags2 &= ~PFLAG2_ACCESSIBILITY_FOCUSED;
- invalidate();
- sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED);
- notifyAccessibilityStateChanged();
- }
+ clearAccessibilityFocusNoCallbacks();
// Clear the global reference of accessibility focus if this
// view or any of its descendants had accessibility focus.
ViewRootImpl viewRootImpl = getViewRootImpl();
@@ -6667,6 +6664,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
if ((mPrivateFlags2 & PFLAG2_ACCESSIBILITY_FOCUSED) != 0) {
mPrivateFlags2 &= ~PFLAG2_ACCESSIBILITY_FOCUSED;
invalidate();
+ sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED);
+ notifyAccessibilityStateChanged();
}
}
@@ -8694,7 +8693,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
/**
* Change the view's z order in the tree, so it's on top of other sibling
- * views
+ * views. This ordering change may affect layout, if the parent container
+ * uses an order-dependent layout scheme (e.g., LinearLayout). This
+ * method should be followed by calls to {@link #requestLayout()} and
+ * {@link View#invalidate()} on the parent.
+ *
+ * @see ViewGroup#bringChildToFront(View)
*/
public void bringToFront() {
if (mParent != null) {
@@ -11952,26 +11956,30 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
// left / right or right / left depending on the resolved layout direction.
// If start / end padding are not defined, use the left / right ones.
int resolvedLayoutDirection = getLayoutDirection();
- // Set user padding to initial values ...
- mUserPaddingLeft = mUserPaddingLeftInitial;
- mUserPaddingRight = mUserPaddingRightInitial;
- // ... then resolve it.
switch (resolvedLayoutDirection) {
case LAYOUT_DIRECTION_RTL:
if (mUserPaddingStart != UNDEFINED_PADDING) {
mUserPaddingRight = mUserPaddingStart;
+ } else {
+ mUserPaddingRight = mUserPaddingRightInitial;
}
if (mUserPaddingEnd != UNDEFINED_PADDING) {
mUserPaddingLeft = mUserPaddingEnd;
+ } else {
+ mUserPaddingLeft = mUserPaddingLeftInitial;
}
break;
case LAYOUT_DIRECTION_LTR:
default:
if (mUserPaddingStart != UNDEFINED_PADDING) {
mUserPaddingLeft = mUserPaddingStart;
+ } else {
+ mUserPaddingLeft = mUserPaddingLeftInitial;
}
if (mUserPaddingEnd != UNDEFINED_PADDING) {
mUserPaddingRight = mUserPaddingEnd;
+ } else {
+ mUserPaddingRight = mUserPaddingRightInitial;
}
}
@@ -13489,8 +13497,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
displayList.setLeftTopRightBottom(mLeft, mTop, mRight, mBottom);
displayList.setHasOverlappingRendering(hasOverlappingRendering());
if (mParent instanceof ViewGroup) {
- displayList.setClipChildren(
- (((ViewGroup)mParent).mGroupFlags & ViewGroup.FLAG_CLIP_CHILDREN) != 0);
+ displayList.setClipToBounds(
+ (((ViewGroup) mParent).mGroupFlags & ViewGroup.FLAG_CLIP_CHILDREN) != 0);
}
float alpha = 1;
if (mParent instanceof ViewGroup && (((ViewGroup) mParent).mGroupFlags &
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index bf502dda9f2f..c7ce99955e5d 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -3109,7 +3109,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
for (int i = 0; i < mChildrenCount; ++i) {
View child = getChildAt(i);
if (child.mDisplayList != null) {
- child.mDisplayList.setClipChildren(clipChildren);
+ child.mDisplayList.setClipToBounds(clipChildren);
}
}
}
@@ -4279,6 +4279,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
FLAG_OPTIMIZE_INVALIDATE) {
dirty.offset(location[CHILD_LEFT_INDEX] - mScrollX,
location[CHILD_TOP_INDEX] - mScrollY);
+ if ((mGroupFlags & FLAG_CLIP_CHILDREN) == 0) {
+ dirty.union(0, 0, mRight - mLeft, mBottom - mTop);
+ }
final int left = mLeft;
final int top = mTop;
@@ -4378,6 +4381,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
if ((mPrivateFlags & PFLAG_DRAWN) == PFLAG_DRAWN ||
(mPrivateFlags & PFLAG_DRAWING_CACHE_VALID) == PFLAG_DRAWING_CACHE_VALID) {
dirty.offset(left - mScrollX, top - mScrollY);
+ if ((mGroupFlags & FLAG_CLIP_CHILDREN) == 0) {
+ dirty.union(0, 0, mRight - mLeft, mBottom - mTop);
+ }
if ((mGroupFlags & FLAG_CLIP_CHILDREN) == 0 ||
dirty.intersect(0, 0, mRight - mLeft, mBottom - mTop)) {
diff --git a/core/java/android/view/ViewParent.java b/core/java/android/view/ViewParent.java
index 4b70bc0c7e37..d79aa7efad4d 100644
--- a/core/java/android/view/ViewParent.java
+++ b/core/java/android/view/ViewParent.java
@@ -146,9 +146,13 @@ public interface ViewParent {
public View focusSearch(View v, int direction);
/**
- * Change the z order of the child so it's on top of all other children
+ * Change the z order of the child so it's on top of all other children.
+ * This ordering change may affect layout, if this container
+ * uses an order-dependent layout scheme (e.g., LinearLayout). This
+ * method should be followed by calls to {@link #requestLayout()} and
+ * {@link View#invalidate()} on this parent.
*
- * @param child
+ * @param child The child to bring to the top of the z order
*/
public void bringChildToFront(View child);
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index f03c07751d19..7ecb52ed0c52 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -597,12 +597,11 @@ public final class ViewRootImpl implements ViewParent,
}
if (mInputChannel != null) {
if (mInputQueueCallback != null) {
- mInputQueue = new InputQueue(mInputChannel);
+ mInputQueue = new InputQueue();
mInputQueueCallback.onInputQueueCreated(mInputQueue);
- } else {
- mInputEventReceiver = new WindowInputEventReceiver(mInputChannel,
- Looper.myLooper());
}
+ mInputEventReceiver = new WindowInputEventReceiver(mInputChannel,
+ Looper.myLooper());
}
view.assignParent(this);
@@ -2822,9 +2821,11 @@ public final class ViewRootImpl implements ViewParent,
if (mInputQueueCallback != null && mInputQueue != null) {
mInputQueueCallback.onInputQueueDestroyed(mInputQueue);
+ mInputQueue.dispose();
mInputQueueCallback = null;
mInputQueue = null;
- } else if (mInputEventReceiver != null) {
+ }
+ if (mInputEventReceiver != null) {
mInputEventReceiver.dispose();
mInputEventReceiver = null;
}
@@ -3347,6 +3348,15 @@ public final class ViewRootImpl implements ViewParent,
if ((q.mFlags & QueuedInputEvent.FLAG_FINISHED) != 0) {
forward(q);
} else if (mView == null || !mAdded) {
+ Slog.w(TAG, "Dropping event due to root view being removed: " + q.mEvent);
+ finish(q, false);
+ } else if (!mAttachInfo.mHasWindowFocus &&
+ !q.mEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER) &&
+ !isTerminalInputEvent(q.mEvent)) {
+ // If this is a focused event and the window doesn't currently have input focus,
+ // then drop this event. This could be an event that came back from the previous
+ // stage but the window has lost focus in the meantime.
+ Slog.w(TAG, "Dropping event due to no window focus: " + q.mEvent);
finish(q, false);
} else {
apply(q, onProcess(q));
@@ -3547,15 +3557,30 @@ public final class ViewRootImpl implements ViewParent,
* Delivers pre-ime input events to a native activity.
* Does not support pointer events.
*/
- final class NativePreImeInputStage extends AsyncInputStage {
+ final class NativePreImeInputStage extends AsyncInputStage
+ implements InputQueue.FinishedInputEventCallback {
public NativePreImeInputStage(InputStage next, String traceCounter) {
super(next, traceCounter);
}
@Override
protected int onProcess(QueuedInputEvent q) {
+ if (mInputQueue != null && q.mEvent instanceof KeyEvent) {
+ mInputQueue.sendInputEvent(q.mEvent, q, true, this);
+ return DEFER;
+ }
return FORWARD;
}
+
+ @Override
+ public void onFinishedInputEvent(Object token, boolean handled) {
+ QueuedInputEvent q = (QueuedInputEvent)token;
+ if (handled) {
+ finish(q, true);
+ return;
+ }
+ forward(q);
+ }
}
/**
@@ -3621,16 +3646,6 @@ public final class ViewRootImpl implements ViewParent,
finish(q, true);
return;
}
-
- // If the window doesn't currently have input focus, then drop
- // this event. This could be an event that came back from the
- // IME dispatch but the window has lost focus in the meantime.
- if (!mAttachInfo.mHasWindowFocus && !isTerminalInputEvent(q.mEvent)) {
- Slog.w(TAG, "Dropping event due to no window focus: " + q.mEvent);
- finish(q, false);
- return;
- }
-
forward(q);
}
}
@@ -3702,15 +3717,30 @@ public final class ViewRootImpl implements ViewParent,
/**
* Delivers post-ime input events to a native activity.
*/
- final class NativePostImeInputStage extends AsyncInputStage {
+ final class NativePostImeInputStage extends AsyncInputStage
+ implements InputQueue.FinishedInputEventCallback {
public NativePostImeInputStage(InputStage next, String traceCounter) {
super(next, traceCounter);
}
@Override
protected int onProcess(QueuedInputEvent q) {
+ if (mInputQueue != null) {
+ mInputQueue.sendInputEvent(q.mEvent, q, false, this);
+ return DEFER;
+ }
return FORWARD;
}
+
+ @Override
+ public void onFinishedInputEvent(Object token, boolean handled) {
+ QueuedInputEvent q = (QueuedInputEvent)token;
+ if (handled) {
+ finish(q, true);
+ return;
+ }
+ forward(q);
+ }
}
/**
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 0212482f8961..d52b1f3f21fe 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -1274,10 +1274,11 @@ public interface WindowManager extends ViewManager {
public static final int ROTATION_ANIMATION_JUMPCUT = 2;
/**
- * Define the animation used on this window for entry or exit following
- * a rotation. This only works if the incoming and outgoing topmost
+ * Define the exit and entry animations used on this window when the device is rotated.
+ * This only has an affect if the incoming and outgoing topmost
* opaque windows have the #FLAG_FULLSCREEN bit set and are not covered
- * by other windows.
+ * by other windows. All other situations default to the
+ * {@link #ROTATION_ANIMATION_ROTATE} behavior.
*
* @see #ROTATION_ANIMATION_ROTATE
* @see #ROTATION_ANIMATION_CROSSFADE
@@ -1362,7 +1363,7 @@ public interface WindowManager extends ViewManager {
/**
* Control special features of the input subsystem.
*
- * @see #INPUT_FEATURE_DISABLE_TOUCH_PAD_GESTURES
+ * @see #INPUT_FEATURE_DISABLE_POINTER_GESTURES
* @see #INPUT_FEATURE_NO_INPUT_CHANNEL
* @see #INPUT_FEATURE_DISABLE_USER_ACTIVITY
* @hide
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index ad87fcbc6ce0..d9c9b69bfced 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -473,7 +473,7 @@ public class AccessibilityNodeInfo implements Parcelable {
private CharSequence mClassName;
private CharSequence mText;
private CharSequence mContentDescription;
- private CharSequence mViewIdResourceName;
+ private String mViewIdResourceName;
private final SparseLongArray mChildNodeIds = new SparseLongArray();
private int mActions;
@@ -1541,7 +1541,7 @@ public class AccessibilityNodeInfo implements Parcelable {
*
* @param viewIdResName The id resource name.
*/
- public void setViewIdResourceName(CharSequence viewIdResName) {
+ public void setViewIdResourceName(String viewIdResName) {
enforceNotSealed();
mViewIdResourceName = viewIdResName;
}
@@ -1558,7 +1558,7 @@ public class AccessibilityNodeInfo implements Parcelable {
* @return The id resource name.
*/
- public CharSequence getViewIdResourceName() {
+ public String getViewIdResourceName() {
return mViewIdResourceName;
}
@@ -1841,7 +1841,7 @@ public class AccessibilityNodeInfo implements Parcelable {
parcel.writeCharSequence(mClassName);
parcel.writeCharSequence(mText);
parcel.writeCharSequence(mContentDescription);
- parcel.writeCharSequence(mViewIdResourceName);
+ parcel.writeString(mViewIdResourceName);
parcel.writeInt(mTextSelectionStart);
parcel.writeInt(mTextSelectionEnd);
@@ -1923,7 +1923,7 @@ public class AccessibilityNodeInfo implements Parcelable {
mClassName = parcel.readCharSequence();
mText = parcel.readCharSequence();
mContentDescription = parcel.readCharSequence();
- mViewIdResourceName = parcel.readCharSequence();
+ mViewIdResourceName = parcel.readString();
mTextSelectionStart = parcel.readInt();
mTextSelectionEnd = parcel.readInt();
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfoCache.java b/core/java/android/view/accessibility/AccessibilityNodeInfoCache.java
index 14954bea735a..28518aab8ab9 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfoCache.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfoCache.java
@@ -83,6 +83,7 @@ public class AccessibilityNodeInfoCache {
} break;
case AccessibilityEvent.TYPE_VIEW_FOCUSED:
case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED:
+ case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED:
case AccessibilityEvent.TYPE_VIEW_SELECTED:
case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED:
case AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED: {
diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java
index bfca5e51f0db..ce886f289a79 100644
--- a/core/java/android/webkit/BrowserFrame.java
+++ b/core/java/android/webkit/BrowserFrame.java
@@ -70,7 +70,6 @@ class BrowserFrame extends Handler {
* request's LoadListener
*/
private final static int MAX_OUTSTANDING_REQUESTS = 300;
- private final static String SCHEME_HOST_DELIMITER = "://";
private final CallbackProxy mCallbackProxy;
private final WebSettingsClassic mSettings;
@@ -499,14 +498,10 @@ class BrowserFrame extends Handler {
.getCurrentItem();
if (item != null) {
WebAddress uri = new WebAddress(item.getUrl());
- String schemePlusHost = uri.getScheme() + SCHEME_HOST_DELIMITER +
- uri.getHost();
- String[] up = mDatabase.getUsernamePassword(
- schemePlusHost);
- if (up == null) { // no row found, try again using the legacy method
- schemePlusHost = uri.getScheme() + uri.getHost();
- up = mDatabase.getUsernamePassword(schemePlusHost);
- }
+ String schemePlusHost = uri.getScheme() + uri.getHost();
+ String[] up =
+ WebViewDatabaseClassic.getInstance(mContext)
+ .getUsernamePassword(schemePlusHost);
if (up != null && up[0] != null) {
setUsernamePassword(up[0], up[1]);
}
@@ -824,7 +819,7 @@ class BrowserFrame extends Handler {
}
WebAddress uri = new WebAddress(mCallbackProxy
.getBackForwardList().getCurrentItem().getUrl());
- String schemePlusHost = uri.getScheme() + SCHEME_HOST_DELIMITER + uri.getHost();
+ String schemePlusHost = uri.getScheme() + uri.getHost();
// Check to see if the username & password appear in
// the post data (there could be another form on the
// page and that was posted instead.
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index afa4894edffd..49987428ceef 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -581,8 +581,7 @@ public class WebView extends AbsoluteLayout
* forms. Note that this is unrelated to the credentials used for HTTP
* authentication.
*
- * @param host the host that required the credentials. It is recommended that
- * the host is given using scheme://hostname format.
+ * @param host the host that required the credentials
* @param username the username for the given host
* @param password the password for the given host
* @see WebViewDatabase#clearUsernamePassword
diff --git a/core/java/android/webkit/WebViewDatabaseClassic.java b/core/java/android/webkit/WebViewDatabaseClassic.java
index 5ad4fa541b3a..be0102874ff8 100644
--- a/core/java/android/webkit/WebViewDatabaseClassic.java
+++ b/core/java/android/webkit/WebViewDatabaseClassic.java
@@ -37,7 +37,7 @@ final class WebViewDatabaseClassic extends WebViewDatabase {
private static final String DATABASE_FILE = "webview.db";
private static final String CACHE_DATABASE_FILE = "webviewCache.db";
- private static final int DATABASE_VERSION = 12;
+ private static final int DATABASE_VERSION = 11;
// 2 -> 3 Modified Cache table to allow cache of redirects
// 3 -> 4 Added Oma-Downloads table
// 4 -> 5 Modified Cache table to support persistent contentLength
@@ -50,7 +50,6 @@ final class WebViewDatabaseClassic extends WebViewDatabase {
// 10 -> 11 Drop cookies and cache now managed by the chromium stack,
// and update the form data table to use the new format
// implemented for b/5265606.
- // 11 -> 12 Add a delimiter between scheme and host when storing passwords
private static WebViewDatabaseClassic sInstance = null;
private static final Object sInstanceLock = new Object();
@@ -170,23 +169,11 @@ final class WebViewDatabaseClassic extends WebViewDatabase {
private static void upgradeDatabase() {
upgradeDatabaseToV10();
upgradeDatabaseFromV10ToV11();
- upgradeDatabaseFromV11ToV12();
// Add future database upgrade functions here, one version at a
// time.
sDatabase.setVersion(DATABASE_VERSION);
}
- private static void upgradeDatabaseFromV11ToV12() {
- int oldVersion = sDatabase.getVersion();
-
- if (oldVersion >= 12) {
- // Nothing to do.
- return;
- }
- // delete the rows in the database.
- sDatabase.delete(mTableNames[TABLE_PASSWORD_ID], null, null);
- }
-
private static void upgradeDatabaseFromV10ToV11() {
int oldVersion = sDatabase.getVersion();
diff --git a/core/java/android/widget/CheckBox.java b/core/java/android/widget/CheckBox.java
index 41ab5f25f6db..f1804f8b97b2 100644
--- a/core/java/android/widget/CheckBox.java
+++ b/core/java/android/widget/CheckBox.java
@@ -20,7 +20,6 @@ import android.content.Context;
import android.util.AttributeSet;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
-import android.util.ValueModel;
/**
@@ -56,9 +55,7 @@ import android.util.ValueModel;
* {@link android.R.styleable#View View Attributes}
* </p>
*/
-public class CheckBox extends CompoundButton implements ValueEditor<Boolean> {
- private ValueModel<Boolean> mValueModel = ValueModel.EMPTY;
-
+public class CheckBox extends CompoundButton {
public CheckBox(Context context) {
this(context, null);
}
@@ -82,22 +79,4 @@ public class CheckBox extends CompoundButton implements ValueEditor<Boolean> {
super.onInitializeAccessibilityNodeInfo(info);
info.setClassName(CheckBox.class.getName());
}
-
- @Override
- public ValueModel<Boolean> getValueModel() {
- return mValueModel;
- }
-
- @Override
- public void setValueModel(ValueModel<Boolean> valueModel) {
- mValueModel = valueModel;
- setChecked(mValueModel.get());
- }
-
- @Override
- public boolean performClick() {
- boolean handled = super.performClick();
- mValueModel.set(isChecked());
- return handled;
- }
}
diff --git a/core/java/android/widget/EditText.java b/core/java/android/widget/EditText.java
index ec812143e15e..57e51c259251 100644
--- a/core/java/android/widget/EditText.java
+++ b/core/java/android/widget/EditText.java
@@ -17,7 +17,6 @@
package android.widget;
import android.content.Context;
-import android.graphics.Rect;
import android.text.Editable;
import android.text.Selection;
import android.text.Spannable;
@@ -25,7 +24,6 @@ import android.text.TextUtils;
import android.text.method.ArrowKeyMovementMethod;
import android.text.method.MovementMethod;
import android.util.AttributeSet;
-import android.util.ValueModel;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
@@ -49,9 +47,7 @@ import android.view.accessibility.AccessibilityNodeInfo;
* {@link android.R.styleable#TextView TextView Attributes},
* {@link android.R.styleable#View View Attributes}
*/
-public class EditText extends TextView implements ValueEditor<CharSequence> {
- private ValueModel<CharSequence> mValueModel = ValueModel.EMPTY;
-
+public class EditText extends TextView {
public EditText(Context context) {
this(context, null);
}
@@ -132,21 +128,4 @@ public class EditText extends TextView implements ValueEditor<CharSequence> {
super.onInitializeAccessibilityNodeInfo(info);
info.setClassName(EditText.class.getName());
}
-
- @Override
- public ValueModel<CharSequence> getValueModel() {
- return mValueModel;
- }
-
- @Override
- public void setValueModel(ValueModel<CharSequence> valueModel) {
- mValueModel = valueModel;
- setText(mValueModel.get());
- }
-
- @Override
- void sendAfterTextChanged(Editable text) {
- super.sendAfterTextChanged(text);
- mValueModel.set(text);
- }
}
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 0aeef63020c7..f57f333817a8 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -1351,7 +1351,7 @@ public class Editor {
} finally {
blockDisplayList.end();
// Same as drawDisplayList below, handled by our TextView's parent
- blockDisplayList.setClipChildren(false);
+ blockDisplayList.setClipToBounds(false);
}
}
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java
index 3df7258ba44c..f940226a1a60 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -226,7 +226,12 @@ public class RelativeLayout extends ViewGroup {
private boolean mMeasureVerticalWithPaddingMargin = false;
// A default width used for RTL measure pass
- private static final int DEFAULT_WIDTH = Integer.MAX_VALUE / 2;
+ /**
+ * Value reduced so as not to interfere with View's measurement spec. flags. See:
+ * {@link View#MEASURED_SIZE_MASK}.
+ * {@link View#MEASURED_STATE_TOO_SMALL}.
+ **/
+ private static final int DEFAULT_WIDTH = 0x00010000;
public RelativeLayout(Context context) {
super(context);
diff --git a/core/java/android/widget/SeekBar.java b/core/java/android/widget/SeekBar.java
index a6486a827af5..2737f9414c46 100644
--- a/core/java/android/widget/SeekBar.java
+++ b/core/java/android/widget/SeekBar.java
@@ -18,7 +18,6 @@ package android.widget;
import android.content.Context;
import android.util.AttributeSet;
-import android.util.ValueModel;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
@@ -34,7 +33,7 @@ import android.view.accessibility.AccessibilityNodeInfo;
*
* @attr ref android.R.styleable#SeekBar_thumb
*/
-public class SeekBar extends AbsSeekBar implements ValueEditor<Integer> {
+public class SeekBar extends AbsSeekBar {
/**
* A callback that notifies clients when the progress level has been
@@ -70,9 +69,8 @@ public class SeekBar extends AbsSeekBar implements ValueEditor<Integer> {
void onStopTrackingTouch(SeekBar seekBar);
}
- private ValueModel<Integer> mValueModel = ValueModel.EMPTY;
private OnSeekBarChangeListener mOnSeekBarChangeListener;
-
+
public SeekBar(Context context) {
this(context, null);
}
@@ -91,23 +89,9 @@ public class SeekBar extends AbsSeekBar implements ValueEditor<Integer> {
if (mOnSeekBarChangeListener != null) {
mOnSeekBarChangeListener.onProgressChanged(this, getProgress(), fromUser);
- if (fromUser) {
- mValueModel.set(getProgress());
- }
}
}
- @Override
- public ValueModel<Integer> getValueModel() {
- return mValueModel;
- }
-
- @Override
- public void setValueModel(ValueModel<Integer> valueModel) {
- mValueModel = valueModel;
- setProgress(mValueModel.get());
- }
-
/**
* Sets a listener to receive notifications of changes to the SeekBar's progress level. Also
* provides notifications of when the user starts and stops a touch gesture within the SeekBar.
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 1246051a09bf..9e3f87f447bc 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -8042,7 +8042,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
info.setEditable(true);
}
- if (TextUtils.isEmpty(getContentDescription()) && !TextUtils.isEmpty(mText)) {
+ if (!TextUtils.isEmpty(mText)) {
info.addAction(AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY);
info.addAction(AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY);
info.setMovementGranularities(AccessibilityNodeInfo.MOVEMENT_GRANULARITY_CHARACTER
@@ -8051,6 +8051,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
| AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH
| AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
}
+
if (isFocused()) {
if (canSelectText()) {
info.addAction(AccessibilityNodeInfo.ACTION_SET_SELECTION);
@@ -8655,13 +8656,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
*/
@Override
public CharSequence getIterableTextForAccessibility() {
- if (!TextUtils.isEmpty(mText)) {
- if (!(mText instanceof Spannable)) {
- setText(mText, BufferType.SPANNABLE);
- }
- return mText;
+ if (!(mText instanceof Spannable)) {
+ setText(mText, BufferType.SPANNABLE);
}
- return super.getIterableTextForAccessibility();
+ return mText;
}
/**
@@ -8697,13 +8695,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
*/
@Override
public int getAccessibilitySelectionStart() {
- if (TextUtils.isEmpty(getContentDescription())) {
- final int selectionStart = getSelectionStart();
- if (selectionStart >= 0) {
- return selectionStart;
- }
- }
- return ACCESSIBILITY_CURSOR_POSITION_UNDEFINED;
+ return getSelectionStart();
}
/**
@@ -8718,13 +8710,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
*/
@Override
public int getAccessibilitySelectionEnd() {
- if (TextUtils.isEmpty(getContentDescription())) {
- final int selectionEnd = getSelectionEnd();
- if (selectionEnd >= 0) {
- return selectionEnd;
- }
- }
- return ACCESSIBILITY_CURSOR_POSITION_UNDEFINED;
+ return getSelectionEnd();
}
/**
diff --git a/core/java/android/widget/ValueEditor.java b/core/java/android/widget/ValueEditor.java
deleted file mode 100755
index 2b91abf9b8ff..000000000000
--- a/core/java/android/widget/ValueEditor.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget;
-
-import android.util.ValueModel;
-
-/**
- * An interface for editors of simple values. Classes implementing this interface are normally
- * UI controls (subclasses of {@link android.view.View View}) that can provide a suitable
- * user interface to display and edit values of the specified type. This interface is
- * intended to describe editors for simple types, like {@code boolean}, {@code int} or
- * {@code String}, where the values themselves are immutable.
- * <p>
- * For example, {@link android.widget.CheckBox CheckBox} implements
- * this interface for the Boolean type as it is capable of providing an appropriate
- * mechanism for displaying and changing the value of a Boolean property.
- *
- * @param <T> the value type that this editor supports
- */
-public interface ValueEditor<T> {
- /**
- * Return the last value model that was set. If no value model has been set, the editor
- * should return the value {@link android.util.ValueModel#EMPTY}.
- *
- * @return the value model
- */
- public ValueModel<T> getValueModel();
-
- /**
- * Sets the value model for this editor. When the value model is set, the editor should
- * retrieve the value from the value model, using {@link android.util.ValueModel#get()},
- * and set its internal state accordingly. Likewise, when the editor's internal state changes
- * it should update the value model by calling {@link android.util.ValueModel#set(T)}
- * with the appropriate value.
- *
- * @param valueModel the new value model for this editor.
- */
- public void setValueModel(ValueModel<T> valueModel);
-}
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index efb59eff2371..edc0baf251e8 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -46,6 +46,7 @@ LOCAL_SRC_FILES:= \
android_view_InputDevice.cpp \
android_view_InputEventReceiver.cpp \
android_view_InputEventSender.cpp \
+ android_view_InputQueue.cpp \
android_view_KeyEvent.cpp \
android_view_KeyCharacterMap.cpp \
android_view_HardwareRenderer.cpp \
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 1300d0153967..3b6b1608db00 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -164,6 +164,7 @@ extern int register_android_view_InputChannel(JNIEnv* env);
extern int register_android_view_InputDevice(JNIEnv* env);
extern int register_android_view_InputEventReceiver(JNIEnv* env);
extern int register_android_view_InputEventSender(JNIEnv* env);
+extern int register_android_view_InputQueue(JNIEnv* env);
extern int register_android_view_KeyCharacterMap(JNIEnv *env);
extern int register_android_view_KeyEvent(JNIEnv* env);
extern int register_android_view_MotionEvent(JNIEnv* env);
@@ -1197,6 +1198,7 @@ static const RegJNIRec gRegJNI[] = {
REG_JNI(register_android_view_InputChannel),
REG_JNI(register_android_view_InputEventReceiver),
REG_JNI(register_android_view_InputEventSender),
+ REG_JNI(register_android_view_InputQueue),
REG_JNI(register_android_view_KeyEvent),
REG_JNI(register_android_view_MotionEvent),
REG_JNI(register_android_view_PointerIcon),
diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp
index 17f205ded27a..bcc1573f5034 100644
--- a/core/jni/android/graphics/TextLayoutCache.cpp
+++ b/core/jni/android/graphics/TextLayoutCache.cpp
@@ -622,11 +622,11 @@ hb_utf16_script_run_prev(ScriptRun* run, const uint16_t *chars, size_t len, ssiz
const hb_script_t init_script = code_point_to_script(init_cp);
hb_script_t current_script = init_script;
run->script = init_script;
+ size_t break_iter = *iter;
for (;;) {
if (*iter < 0)
break;
- const ssize_t prev_iter = *iter;
const uint32_t cp = utf16_to_code_point_prev(chars, len, iter);
const hb_script_t script = code_point_to_script(cp);
@@ -635,21 +635,18 @@ hb_utf16_script_run_prev(ScriptRun* run, const uint16_t *chars, size_t len, ssiz
// If we started off as inherited, we take whatever we can find.
run->script = script;
current_script = script;
+ // In cases of script1 + inherited + script2, always group the inherited
+ // with script1.
+ break_iter = *iter;
continue;
} else if (script == HB_SCRIPT_INHERITED) {
- /* BEGIN android-changed
- We apply the same fix for Chrome to Android.
- Chrome team will talk with upsteam about it.
- Just assume that whatever follows this combining character is within
- the same script. This is incorrect if you had language1 + combining
- char + language 2, but that is rare and this code is suspicious
- anyway.
- END android-changed */
continue;
} else {
- *iter = prev_iter;
+ *iter = break_iter;
break;
}
+ } else {
+ break_iter = *iter;
}
}
diff --git a/core/jni/android_app_NativeActivity.cpp b/core/jni/android_app_NativeActivity.cpp
index 21162f43a9fe..9fc01e1adcd7 100644
--- a/core/jni/android_app_NativeActivity.cpp
+++ b/core/jni/android_app_NativeActivity.cpp
@@ -45,8 +45,6 @@ namespace android
{
static struct {
- jmethodID dispatchUnhandledKeyEvent;
- jmethodID preDispatchKeyEvent;
jmethodID finish;
jmethodID setWindowFlags;
jmethodID setWindowFormat;
@@ -63,8 +61,7 @@ struct ActivityWork {
};
enum {
- CMD_DEF_KEY = 1,
- CMD_FINISH,
+ CMD_FINISH = 1,
CMD_SET_WINDOW_FORMAT,
CMD_SET_WINDOW_FLAGS,
CMD_SHOW_SOFT_INPUT,
@@ -101,299 +98,6 @@ static bool read_work(int fd, ActivityWork* outWork) {
return false;
}
-// ------------------------------------------------------------------------
-
-} // namespace android
-
-using namespace android;
-
-AInputQueue::AInputQueue(const sp<InputChannel>& channel, int workWrite) :
- mWorkWrite(workWrite), mConsumer(channel), mSeq(0) {
- int msgpipe[2];
- if (pipe(msgpipe)) {
- ALOGW("could not create pipe: %s", strerror(errno));
- mDispatchKeyRead = mDispatchKeyWrite = -1;
- } else {
- mDispatchKeyRead = msgpipe[0];
- mDispatchKeyWrite = msgpipe[1];
- int result = fcntl(mDispatchKeyRead, F_SETFL, O_NONBLOCK);
- SLOGW_IF(result != 0, "Could not make AInputQueue read pipe "
- "non-blocking: %s", strerror(errno));
- result = fcntl(mDispatchKeyWrite, F_SETFL, O_NONBLOCK);
- SLOGW_IF(result != 0, "Could not make AInputQueue write pipe "
- "non-blocking: %s", strerror(errno));
- }
-}
-
-AInputQueue::~AInputQueue() {
- close(mDispatchKeyRead);
- close(mDispatchKeyWrite);
-}
-
-void AInputQueue::attachLooper(ALooper* looper, int ident,
- ALooper_callbackFunc callback, void* data) {
- mLooper = static_cast<android::Looper*>(looper);
- mLooper->addFd(mConsumer.getChannel()->getFd(),
- ident, ALOOPER_EVENT_INPUT, callback, data);
- mLooper->addFd(mDispatchKeyRead,
- ident, ALOOPER_EVENT_INPUT, callback, data);
-}
-
-void AInputQueue::detachLooper() {
- mLooper->removeFd(mConsumer.getChannel()->getFd());
- mLooper->removeFd(mDispatchKeyRead);
-}
-
-int32_t AInputQueue::hasEvents() {
- struct pollfd pfd[2];
-
- pfd[0].fd = mConsumer.getChannel()->getFd();
- pfd[0].events = POLLIN;
- pfd[0].revents = 0;
- pfd[1].fd = mDispatchKeyRead;
- pfd[1].events = POLLIN;
- pfd[1].revents = 0;
-
- int nfd = poll(pfd, 2, 0);
- if (nfd <= 0) return 0;
- return ((pfd[0].revents & POLLIN) || (pfd[1].revents & POLLIN)) ? 1 : -1;
-}
-
-int32_t AInputQueue::getEvent(AInputEvent** outEvent) {
- *outEvent = NULL;
-
- char byteread;
- ssize_t nRead = read(mDispatchKeyRead, &byteread, 1);
-
- Mutex::Autolock _l(mLock);
-
- if (nRead == 1) {
- if (mDispatchingKeys.size() > 0) {
- KeyEvent* kevent = mDispatchingKeys[0];
- *outEvent = kevent;
- mDispatchingKeys.removeAt(0);
- in_flight_event inflight;
- inflight.event = kevent;
- inflight.seq = -1;
- inflight.finishSeq = 0;
- mInFlightEvents.push(inflight);
- }
-
- bool finishNow = false;
- if (mFinishPreDispatches.size() > 0) {
- finish_pre_dispatch finish(mFinishPreDispatches[0]);
- mFinishPreDispatches.removeAt(0);
- const size_t N = mInFlightEvents.size();
- for (size_t i=0; i<N; i++) {
- const in_flight_event& inflight(mInFlightEvents[i]);
- if (inflight.seq == finish.seq) {
- *outEvent = inflight.event;
- finishNow = finish.handled;
- }
- }
- if (*outEvent == NULL) {
- ALOGW("getEvent couldn't find inflight for seq %d", finish.seq);
- }
- }
-
- if (finishNow) {
- finishEvent(*outEvent, true, false);
- *outEvent = NULL;
- return -1;
- } else if (*outEvent != NULL) {
- return 0;
- }
- }
-
- uint32_t consumerSeq;
- InputEvent* myEvent = NULL;
- status_t res = mConsumer.consume(&mPooledInputEventFactory, true /*consumeBatches*/, -1,
- &consumerSeq, &myEvent);
- if (res != android::OK) {
- if (res != android::WOULD_BLOCK) {
- ALOGW("channel '%s' ~ Failed to consume input event. status=%d",
- mConsumer.getChannel()->getName().string(), res);
- }
- return -1;
- }
-
- if (mConsumer.hasDeferredEvent()) {
- wakeupDispatchLocked();
- }
-
- in_flight_event inflight;
- inflight.event = myEvent;
- inflight.seq = -1;
- inflight.finishSeq = consumerSeq;
- mInFlightEvents.push(inflight);
-
- *outEvent = myEvent;
- return 0;
-}
-
-bool AInputQueue::preDispatchEvent(AInputEvent* event) {
- if (((InputEvent*)event)->getType() != AINPUT_EVENT_TYPE_KEY) {
- // The IME only cares about key events.
- return false;
- }
-
- // For now we only send system keys to the IME... this avoids having
- // critical keys like DPAD go through this path. We really need to have
- // the IME report which keys it wants.
- if (!((KeyEvent*)event)->isSystemKey()) {
- return false;
- }
-
- return preDispatchKey((KeyEvent*)event);
-}
-
-void AInputQueue::finishEvent(AInputEvent* event, bool handled, bool didDefaultHandling) {
- LOG_TRACE("finishEvent: %p handled=%d, didDefaultHandling=%d", event,
- handled ? 1 : 0, didDefaultHandling ? 1 : 0);
-
- if (!handled && !didDefaultHandling
- && ((InputEvent*)event)->getType() == AINPUT_EVENT_TYPE_KEY
- && ((KeyEvent*)event)->hasDefaultAction()) {
- // The app didn't handle this, but it may have a default action
- // associated with it. We need to hand this back to Java to be
- // executed.
- doUnhandledKey((KeyEvent*)event);
- return;
- }
-
- Mutex::Autolock _l(mLock);
-
- const size_t N = mInFlightEvents.size();
- for (size_t i=0; i<N; i++) {
- const in_flight_event& inflight(mInFlightEvents[i]);
- if (inflight.event == event) {
- if (inflight.finishSeq) {
- status_t res = mConsumer.sendFinishedSignal(inflight.finishSeq, handled);
- if (res != android::OK) {
- ALOGW("Failed to send finished signal on channel '%s'. status=%d",
- mConsumer.getChannel()->getName().string(), res);
- }
- }
- mPooledInputEventFactory.recycle(static_cast<InputEvent*>(event));
- mInFlightEvents.removeAt(i);
- return;
- }
- }
-
- ALOGW("finishEvent called for unknown event: %p", event);
-}
-
-void AInputQueue::dispatchEvent(android::KeyEvent* event) {
- Mutex::Autolock _l(mLock);
-
- LOG_TRACE("dispatchEvent: dispatching=%d write=%d\n", mDispatchingKeys.size(),
- mDispatchKeyWrite);
- mDispatchingKeys.add(event);
- wakeupDispatchLocked();
-}
-
-void AInputQueue::finishPreDispatch(int seq, bool handled) {
- Mutex::Autolock _l(mLock);
-
- LOG_TRACE("finishPreDispatch: seq=%d handled=%d\n", seq, handled ? 1 : 0);
- finish_pre_dispatch finish;
- finish.seq = seq;
- finish.handled = handled;
- mFinishPreDispatches.add(finish);
- wakeupDispatchLocked();
-}
-
-KeyEvent* AInputQueue::consumeUnhandledEvent() {
- Mutex::Autolock _l(mLock);
-
- KeyEvent* event = NULL;
- if (mUnhandledKeys.size() > 0) {
- event = mUnhandledKeys[0];
- mUnhandledKeys.removeAt(0);
- }
-
- LOG_TRACE("consumeUnhandledEvent: KeyEvent=%p", event);
- return event;
-}
-
-KeyEvent* AInputQueue::consumePreDispatchingEvent(int* outSeq) {
- Mutex::Autolock _l(mLock);
-
- KeyEvent* event = NULL;
- if (mPreDispatchingKeys.size() > 0) {
- const in_flight_event& inflight(mPreDispatchingKeys[0]);
- event = static_cast<KeyEvent*>(inflight.event);
- *outSeq = inflight.seq;
- mPreDispatchingKeys.removeAt(0);
- }
-
- LOG_TRACE("consumePreDispatchingEvent: KeyEvent=%p", event);
- return event;
-}
-
-KeyEvent* AInputQueue::createKeyEvent() {
- Mutex::Autolock _l(mLock);
-
- return mPooledInputEventFactory.createKeyEvent();
-}
-
-void AInputQueue::doUnhandledKey(KeyEvent* keyEvent) {
- Mutex::Autolock _l(mLock);
-
- LOG_TRACE("Unhandled key: pending=%d write=%d\n", mUnhandledKeys.size(), mWorkWrite);
- if (mUnhandledKeys.size() <= 0 && mWorkWrite >= 0) {
- write_work(mWorkWrite, CMD_DEF_KEY);
- }
- mUnhandledKeys.add(keyEvent);
-}
-
-bool AInputQueue::preDispatchKey(KeyEvent* keyEvent) {
- Mutex::Autolock _l(mLock);
-
- LOG_TRACE("preDispatch key: pending=%d write=%d\n", mPreDispatchingKeys.size(), mWorkWrite);
- const size_t N = mInFlightEvents.size();
- for (size_t i=0; i<N; i++) {
- in_flight_event& inflight(mInFlightEvents.editItemAt(i));
- if (inflight.event == keyEvent) {
- if (inflight.seq >= 0) {
- // This event has already been pre-dispatched!
- LOG_TRACE("Event already pre-dispatched!");
- return false;
- }
- mSeq++;
- if (mSeq < 0) mSeq = 1;
- inflight.seq = mSeq;
-
- if (mPreDispatchingKeys.size() <= 0 && mWorkWrite >= 0) {
- write_work(mWorkWrite, CMD_DEF_KEY);
- }
- mPreDispatchingKeys.add(inflight);
- return true;
- }
- }
-
- ALOGW("preDispatchKey called for unknown event: %p", keyEvent);
- return false;
-}
-
-void AInputQueue::wakeupDispatchLocked() {
-restart:
- char dummy = 0;
- int res = write(mDispatchKeyWrite, &dummy, sizeof(dummy));
- if (res < 0 && errno == EINTR) {
- goto restart;
- }
-
- if (res == sizeof(dummy)) return;
-
- if (res < 0) ALOGW("Failed writing to dispatch fd: %s", strerror(errno));
- else ALOGW("Truncated writing to dispatch fd: %d", res);
-}
-
-namespace android {
-
-// ------------------------------------------------------------------------
-
/*
* Native state for interacting with the NativeActivity class.
*/
@@ -404,8 +108,6 @@ struct NativeCode : public ANativeActivity {
dlhandle = _dlhandle;
createActivityFunc = _createFunc;
nativeWindow = NULL;
- inputChannel = NULL;
- nativeInputQueue = NULL;
mainWorkRead = mainWorkWrite = -1;
}
@@ -419,11 +121,7 @@ struct NativeCode : public ANativeActivity {
if (messageQueue != NULL && mainWorkRead >= 0) {
messageQueue->getLooper()->removeFd(mainWorkRead);
}
- if (nativeInputQueue != NULL) {
- nativeInputQueue->mWorkWrite = -1;
- }
setSurface(NULL);
- setInputChannel(NULL);
if (mainWorkRead >= 0) close(mainWorkRead);
if (mainWorkWrite >= 0) close(mainWorkWrite);
if (dlhandle != NULL) {
@@ -442,26 +140,6 @@ struct NativeCode : public ANativeActivity {
}
}
- status_t setInputChannel(jobject _channel) {
- if (inputChannel != NULL) {
- delete nativeInputQueue;
- env->DeleteGlobalRef(inputChannel);
- }
- inputChannel = NULL;
- nativeInputQueue = NULL;
- if (_channel != NULL) {
- inputChannel = env->NewGlobalRef(_channel);
- sp<InputChannel> ic =
- android_view_InputChannel_getInputChannel(env, _channel);
- if (ic != NULL) {
- nativeInputQueue = new AInputQueue(ic, mainWorkWrite);
- } else {
- return UNKNOWN_ERROR;
- }
- }
- return OK;
- }
-
ANativeActivityCallbacks callbacks;
void* dlhandle;
@@ -475,9 +153,6 @@ struct NativeCode : public ANativeActivity {
int32_t lastWindowWidth;
int32_t lastWindowHeight;
- jobject inputChannel;
- struct AInputQueue* nativeInputQueue;
-
// These are used to wake up the main thread to process work.
int mainWorkRead;
int mainWorkWrite;
@@ -532,38 +207,6 @@ static int mainWorkCallback(int fd, int events, void* data) {
LOG_TRACE("mainWorkCallback: cmd=%d", work.cmd);
switch (work.cmd) {
- case CMD_DEF_KEY: {
- KeyEvent* keyEvent;
- while ((keyEvent=code->nativeInputQueue->consumeUnhandledEvent()) != NULL) {
- jobject inputEventObj = android_view_KeyEvent_fromNative(
- code->env, keyEvent);
- jboolean handled;
- if (inputEventObj) {
- handled = code->env->CallBooleanMethod(code->clazz,
- gNativeActivityClassInfo.dispatchUnhandledKeyEvent, inputEventObj);
- code->messageQueue->raiseAndClearException(
- code->env, "dispatchUnhandledKeyEvent");
- code->env->DeleteLocalRef(inputEventObj);
- } else {
- ALOGE("Failed to obtain key event for dispatchUnhandledKeyEvent.");
- handled = false;
- }
- code->nativeInputQueue->finishEvent(keyEvent, handled, true);
- }
- int seq;
- while ((keyEvent=code->nativeInputQueue->consumePreDispatchingEvent(&seq)) != NULL) {
- jobject inputEventObj = android_view_KeyEvent_fromNative(
- code->env, keyEvent);
- if (inputEventObj) {
- code->env->CallVoidMethod(code->clazz,
- gNativeActivityClassInfo.preDispatchKeyEvent, inputEventObj, seq);
- code->messageQueue->raiseAndClearException(code->env, "preDispatchKeyEvent");
- code->env->DeleteLocalRef(inputEventObj);
- } else {
- ALOGE("Failed to obtain key event for preDispatchKeyEvent.");
- }
- }
- } break;
case CMD_FINISH: {
code->env->CallVoidMethod(code->clazz, gNativeActivityClassInfo.finish);
code->messageQueue->raiseAndClearException(code->env, "finish");
@@ -903,36 +546,28 @@ onSurfaceDestroyed_native(JNIEnv* env, jobject clazz, jint handle, jobject surfa
}
static void
-onInputChannelCreated_native(JNIEnv* env, jobject clazz, jint handle, jobject channel)
+onInputQueueCreated_native(JNIEnv* env, jobject clazz, jint handle, jint queuePtr)
{
LOG_TRACE("onInputChannelCreated_native");
if (handle != 0) {
NativeCode* code = (NativeCode*)handle;
- status_t err = code->setInputChannel(channel);
- if (err != OK) {
- jniThrowException(env, "java/lang/IllegalStateException",
- "Error setting input channel");
- return;
- }
if (code->callbacks.onInputQueueCreated != NULL) {
- code->callbacks.onInputQueueCreated(code,
- code->nativeInputQueue);
+ AInputQueue* queue = reinterpret_cast<AInputQueue*>(queuePtr);
+ code->callbacks.onInputQueueCreated(code, queue);
}
}
}
static void
-onInputChannelDestroyed_native(JNIEnv* env, jobject clazz, jint handle, jobject channel)
+onInputQueueDestroyed_native(JNIEnv* env, jobject clazz, jint handle, jint queuePtr)
{
LOG_TRACE("onInputChannelDestroyed_native");
if (handle != 0) {
NativeCode* code = (NativeCode*)handle;
- if (code->nativeInputQueue != NULL
- && code->callbacks.onInputQueueDestroyed != NULL) {
- code->callbacks.onInputQueueDestroyed(code,
- code->nativeInputQueue);
+ if (code->callbacks.onInputQueueDestroyed != NULL) {
+ AInputQueue* queue = reinterpret_cast<AInputQueue*>(queuePtr);
+ code->callbacks.onInputQueueDestroyed(code, queue);
}
- code->setInputChannel(NULL);
}
}
@@ -954,38 +589,6 @@ onContentRectChanged_native(JNIEnv* env, jobject clazz, jint handle,
}
}
-static void
-dispatchKeyEvent_native(JNIEnv* env, jobject clazz, jint handle, jobject eventObj)
-{
- LOG_TRACE("dispatchKeyEvent_native");
- if (handle != 0) {
- NativeCode* code = (NativeCode*)handle;
- if (code->nativeInputQueue != NULL) {
- KeyEvent* event = code->nativeInputQueue->createKeyEvent();
- status_t status = android_view_KeyEvent_toNative(env, eventObj, event);
- if (status) {
- delete event;
- jniThrowRuntimeException(env, "Could not read contents of KeyEvent object.");
- return;
- }
- code->nativeInputQueue->dispatchEvent(event);
- }
- }
-}
-
-static void
-finishPreDispatchKeyEvent_native(JNIEnv* env, jobject clazz, jint handle,
- jint seq, jboolean handled)
-{
- LOG_TRACE("finishPreDispatchKeyEvent_native");
- if (handle != 0) {
- NativeCode* code = (NativeCode*)handle;
- if (code->nativeInputQueue != NULL) {
- code->nativeInputQueue->finishPreDispatch(seq, handled ? true : false);
- }
- }
-}
-
static const JNINativeMethod g_methods[] = {
{ "loadNativeCode", "(Ljava/lang/String;Ljava/lang/String;Landroid/os/MessageQueue;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILandroid/content/res/AssetManager;[B)I",
(void*)loadNativeCode_native },
@@ -1002,11 +605,11 @@ static const JNINativeMethod g_methods[] = {
{ "onSurfaceChangedNative", "(ILandroid/view/Surface;III)V", (void*)onSurfaceChanged_native },
{ "onSurfaceRedrawNeededNative", "(ILandroid/view/Surface;)V", (void*)onSurfaceRedrawNeeded_native },
{ "onSurfaceDestroyedNative", "(I)V", (void*)onSurfaceDestroyed_native },
- { "onInputChannelCreatedNative", "(ILandroid/view/InputChannel;)V", (void*)onInputChannelCreated_native },
- { "onInputChannelDestroyedNative", "(ILandroid/view/InputChannel;)V", (void*)onInputChannelDestroyed_native },
+ { "onInputQueueCreatedNative", "(II)V",
+ (void*)onInputQueueCreated_native },
+ { "onInputQueueDestroyedNative", "(II)V",
+ (void*)onInputQueueDestroyed_native },
{ "onContentRectChangedNative", "(IIIII)V", (void*)onContentRectChanged_native },
- { "dispatchKeyEventNative", "(ILandroid/view/KeyEvent;)V", (void*)dispatchKeyEvent_native },
- { "finishPreDispatchKeyEventNative", "(IIZ)V", (void*)finishPreDispatchKeyEvent_native },
};
static const char* const kNativeActivityPathName = "android/app/NativeActivity";
@@ -1025,13 +628,6 @@ int register_android_app_NativeActivity(JNIEnv* env)
jclass clazz;
FIND_CLASS(clazz, kNativeActivityPathName);
- GET_METHOD_ID(gNativeActivityClassInfo.dispatchUnhandledKeyEvent,
- clazz,
- "dispatchUnhandledKeyEvent", "(Landroid/view/KeyEvent;)Z");
- GET_METHOD_ID(gNativeActivityClassInfo.preDispatchKeyEvent,
- clazz,
- "preDispatchKeyEvent", "(Landroid/view/KeyEvent;I)V");
-
GET_METHOD_ID(gNativeActivityClassInfo.finish,
clazz,
"finish", "()V");
diff --git a/core/jni/android_view_GLES20DisplayList.cpp b/core/jni/android_view_GLES20DisplayList.cpp
index f7a5302ea2b0..4ce2e24730c8 100644
--- a/core/jni/android_view_GLES20DisplayList.cpp
+++ b/core/jni/android_view_GLES20DisplayList.cpp
@@ -84,9 +84,9 @@ static void android_view_GLES20DisplayList_setAnimationMatrix(JNIEnv* env,
displayList->setAnimationMatrix(matrix);
}
-static void android_view_GLES20DisplayList_setClipChildren(JNIEnv* env,
- jobject clazz, DisplayList* displayList, jboolean clipChildren) {
- displayList->setClipChildren(clipChildren);
+static void android_view_GLES20DisplayList_setClipToBounds(JNIEnv* env,
+ jobject clazz, DisplayList* displayList, jboolean clipToBounds) {
+ displayList->setClipToBounds(clipToBounds);
}
static void android_view_GLES20DisplayList_setAlpha(JNIEnv* env,
@@ -308,7 +308,7 @@ static JNINativeMethod gMethods[] = {
{ "nSetCaching", "(IZ)V", (void*) android_view_GLES20DisplayList_setCaching },
{ "nSetStaticMatrix", "(II)V", (void*) android_view_GLES20DisplayList_setStaticMatrix },
{ "nSetAnimationMatrix", "(II)V", (void*) android_view_GLES20DisplayList_setAnimationMatrix },
- { "nSetClipChildren", "(IZ)V", (void*) android_view_GLES20DisplayList_setClipChildren },
+ { "nSetClipToBounds", "(IZ)V", (void*) android_view_GLES20DisplayList_setClipToBounds },
{ "nSetAlpha", "(IF)V", (void*) android_view_GLES20DisplayList_setAlpha },
{ "nSetHasOverlappingRendering", "(IZ)V",
(void*) android_view_GLES20DisplayList_setHasOverlappingRendering },
diff --git a/core/jni/android_view_InputQueue.cpp b/core/jni/android_view_InputQueue.cpp
new file mode 100644
index 000000000000..ec56afa58795
--- /dev/null
+++ b/core/jni/android_view_InputQueue.cpp
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "InputQueue"
+
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <android/input.h>
+#include <android_runtime/AndroidRuntime.h>
+#include <android_runtime/android_view_InputQueue.h>
+#include <androidfw/Input.h>
+#include <utils/Looper.h>
+#include <utils/TypeHelpers.h>
+#include <ScopedLocalRef.h>
+
+#include "JNIHelp.h"
+#include "android_os_MessageQueue.h"
+#include "android_view_KeyEvent.h"
+#include "android_view_MotionEvent.h"
+
+namespace android {
+
+static struct {
+ jmethodID finishInputEvent;
+} gInputQueueClassInfo;
+
+enum {
+ MSG_FINISH_INPUT = 1,
+};
+
+InputQueue::InputQueue(jobject inputQueueObj, const sp<Looper>& looper,
+ int dispatchReadFd, int dispatchWriteFd) :
+ mDispatchReadFd(dispatchReadFd), mDispatchWriteFd(dispatchWriteFd),
+ mDispatchLooper(looper), mHandler(new WeakMessageHandler(this)) {
+ JNIEnv* env = AndroidRuntime::getJNIEnv();
+ mInputQueueWeakGlobal = env->NewGlobalRef(inputQueueObj);
+}
+
+InputQueue::~InputQueue() {
+ mDispatchLooper->removeMessages(mHandler);
+ JNIEnv* env = AndroidRuntime::getJNIEnv();
+ env->DeleteGlobalRef(mInputQueueWeakGlobal);
+ close(mDispatchReadFd);
+ close(mDispatchWriteFd);
+}
+
+void InputQueue::attachLooper(Looper* looper, int ident,
+ ALooper_callbackFunc callback, void* data) {
+ Mutex::Autolock _l(mLock);
+ for (size_t i = 0; i < mAppLoopers.size(); i++) {
+ if (looper == mAppLoopers[i]) {
+ return;
+ }
+ }
+ mAppLoopers.push(looper);
+ looper->addFd(mDispatchReadFd, ident, ALOOPER_EVENT_INPUT, callback, data);
+}
+
+void InputQueue::detachLooper() {
+ Mutex::Autolock _l(mLock);
+ detachLooperLocked();
+}
+
+void InputQueue::detachLooperLocked() {
+ for (size_t i = 0; i < mAppLoopers.size(); i++) {
+ mAppLoopers[i]->removeFd(mDispatchReadFd);
+ }
+ mAppLoopers.clear();
+}
+
+bool InputQueue::hasEvents() {
+ Mutex::Autolock _l(mLock);
+ return mPendingEvents.size() > 0;
+}
+
+status_t InputQueue::getEvent(InputEvent** outEvent) {
+ Mutex::Autolock _l(mLock);
+ *outEvent = NULL;
+ if (!mPendingEvents.isEmpty()) {
+ *outEvent = mPendingEvents[0];
+ mPendingEvents.removeAt(0);
+ }
+
+ if (mPendingEvents.isEmpty()) {
+ char byteread[16];
+ ssize_t nRead;
+ do {
+ nRead = TEMP_FAILURE_RETRY(read(mDispatchReadFd, &byteread, sizeof(byteread)));
+ if (nRead < 0 && errno != EAGAIN) {
+ ALOGW("Failed to read from native dispatch pipe: %s", strerror(errno));
+ }
+ } while (nRead > 0);
+ }
+
+ return *outEvent != NULL ? OK : WOULD_BLOCK;
+}
+
+bool InputQueue::preDispatchEvent(InputEvent* e) {
+ if (e->getType() == AINPUT_EVENT_TYPE_KEY) {
+ KeyEvent* keyEvent = static_cast<KeyEvent*>(e);
+ if (keyEvent->getFlags() & AKEY_EVENT_FLAG_PREDISPATCH) {
+ finishEvent(e, false);
+ return true;
+ }
+ }
+ return false;
+}
+
+void InputQueue::finishEvent(InputEvent* event, bool handled) {
+ Mutex::Autolock _l(mLock);
+ mFinishedEvents.push(key_value_pair_t<InputEvent*, bool>(event, handled));
+ if (mFinishedEvents.size() == 1) {
+ mDispatchLooper->sendMessage(this, Message(MSG_FINISH_INPUT));
+ }
+}
+
+void InputQueue::handleMessage(const Message& message) {
+ switch(message.what) {
+ case MSG_FINISH_INPUT:
+ JNIEnv* env = AndroidRuntime::getJNIEnv();
+ ScopedLocalRef<jobject> inputQueueObj(env, jniGetReferent(env, mInputQueueWeakGlobal));
+ if (!inputQueueObj.get()) {
+ ALOGW("InputQueue was finalized without being disposed");
+ return;
+ }
+ while (true) {
+ InputEvent* event;
+ bool handled;
+ {
+ Mutex::Autolock _l(mLock);
+ if (mFinishedEvents.isEmpty()) {
+ break;
+ }
+ event = mFinishedEvents[0].getKey();
+ handled = mFinishedEvents[0].getValue();
+ mFinishedEvents.removeAt(0);
+ }
+ env->CallVoidMethod(inputQueueObj.get(), gInputQueueClassInfo.finishInputEvent,
+ reinterpret_cast<jint>(event), handled);
+ recycleInputEvent(event);
+ }
+ break;
+ }
+}
+
+void InputQueue::recycleInputEvent(InputEvent* event) {
+ mPooledInputEventFactory.recycle(event);
+}
+
+KeyEvent* InputQueue::createKeyEvent() {
+ return mPooledInputEventFactory.createKeyEvent();
+}
+
+MotionEvent* InputQueue::createMotionEvent() {
+ return mPooledInputEventFactory.createMotionEvent();
+}
+
+void InputQueue::enqueueEvent(InputEvent* event) {
+ Mutex::Autolock _l(mLock);
+ mPendingEvents.push(event);
+ if (mPendingEvents.size() == 1) {
+ char dummy = 0;
+ int res = TEMP_FAILURE_RETRY(write(mDispatchWriteFd, &dummy, sizeof(dummy)));
+ if (res < 0 && errno != EAGAIN) {
+ ALOGW("Failed writing to dispatch fd: %s", strerror(errno));
+ }
+ }
+}
+
+InputQueue* InputQueue::createQueue(jobject inputQueueObj, const sp<Looper>& looper) {
+ int pipeFds[2];
+ if (pipe(pipeFds)) {
+ ALOGW("Could not create native input dispatching pipe: %s", strerror(errno));
+ return NULL;
+ }
+ fcntl(pipeFds[0], F_SETFL, O_NONBLOCK);
+ fcntl(pipeFds[1], F_SETFL, O_NONBLOCK);
+ return new InputQueue(inputQueueObj, looper, pipeFds[0], pipeFds[1]);
+}
+
+static jint nativeInit(JNIEnv* env, jobject clazz, jobject queueWeak, jobject jMsgQueue) {
+ sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, jMsgQueue);
+ if (messageQueue == NULL) {
+ jniThrowRuntimeException(env, "MessageQueue is not initialized.");
+ return 0;
+ }
+ sp<InputQueue> queue = InputQueue::createQueue(queueWeak, messageQueue->getLooper());
+ if (!queue.get()) {
+ jniThrowRuntimeException(env, "InputQueue failed to initialize");
+ return 0;
+ }
+ queue->incStrong(&gInputQueueClassInfo);
+ return reinterpret_cast<jint>(queue.get());
+}
+
+static void nativeDispose(JNIEnv* env, jobject clazz, jint ptr) {
+ sp<InputQueue> queue = reinterpret_cast<InputQueue*>(ptr);
+ queue->detachLooper();
+ queue->decStrong(&gInputQueueClassInfo);
+}
+
+static jint nativeSendKeyEvent(JNIEnv* env, jobject clazz, jint ptr, jobject eventObj,
+ jboolean predispatch) {
+ InputQueue* queue = reinterpret_cast<InputQueue*>(ptr);
+ KeyEvent* event = queue->createKeyEvent();
+ status_t status = android_view_KeyEvent_toNative(env, eventObj, event);
+ if (status) {
+ queue->recycleInputEvent(event);
+ jniThrowRuntimeException(env, "Could not read contents of KeyEvent object.");
+ return -1;
+ }
+
+ if (predispatch) {
+ event->setFlags(event->getFlags() | AKEY_EVENT_FLAG_PREDISPATCH);
+ }
+
+ queue->enqueueEvent(event);
+ return reinterpret_cast<jint>(event);
+}
+
+static jint nativeSendMotionEvent(JNIEnv* env, jobject clazz, jint ptr, jobject eventObj) {
+ sp<InputQueue> queue = reinterpret_cast<InputQueue*>(ptr);
+ MotionEvent* originalEvent = android_view_MotionEvent_getNativePtr(env, eventObj);
+ if (!originalEvent) {
+ jniThrowRuntimeException(env, "Could not obtain MotionEvent pointer.");
+ return -1;
+ }
+ MotionEvent* event = queue->createMotionEvent();
+ event->copyFrom(originalEvent, true /* keepHistory */);
+ queue->enqueueEvent(event);
+ return reinterpret_cast<jint>(event);
+}
+
+static const JNINativeMethod g_methods[] = {
+ { "nativeInit", "(Ljava/lang/ref/WeakReference;Landroid/os/MessageQueue;)I",
+ (void*) nativeInit },
+ { "nativeDispose", "(I)V", (void*) nativeDispose },
+ { "nativeSendKeyEvent", "(ILandroid/view/KeyEvent;Z)I", (void*) nativeSendKeyEvent },
+ { "nativeSendMotionEvent", "(ILandroid/view/MotionEvent;)I", (void*) nativeSendMotionEvent },
+};
+
+static const char* const kInputQueuePathName = "android/view/InputQueue";
+
+#define FIND_CLASS(var, className) \
+ do { \
+ var = env->FindClass(className); \
+ LOG_FATAL_IF(! var, "Unable to find class %s", className); \
+ } while(0)
+
+#define GET_METHOD_ID(var, clazz, methodName, fieldDescriptor) \
+ do { \
+ var = env->GetMethodID(clazz, methodName, fieldDescriptor); \
+ LOG_FATAL_IF(! var, "Unable to find method" methodName); \
+ } while(0)
+
+int register_android_view_InputQueue(JNIEnv* env)
+{
+ jclass clazz;
+ FIND_CLASS(clazz, kInputQueuePathName);
+ GET_METHOD_ID(gInputQueueClassInfo.finishInputEvent, clazz, "finishInputEvent", "(IZ)V");
+
+ return AndroidRuntime::registerNativeMethods(
+ env, kInputQueuePathName,
+ g_methods, NELEM(g_methods));
+}
+
+} // namespace android
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index cb14374f13ab..d2895b7293cf 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -938,6 +938,15 @@
android:label="@string/permlab_camera"
android:description="@string/permdesc_camera" />
+ <!-- Allows disabling the transmit-indicator LED that is normally on when
+ a camera is in use by an application.
+ @hide -->
+ <permission android:name="android.permission.CAMERA_DISABLE_TRANSMIT_LED"
+ android:permissionGroup="android.permission-group.CAMERA"
+ android:protectionLevel="signature|system"
+ android:label="@string/permlab_cameraDisableTransmitLed"
+ android:description="@string/permdesc_cameraDisableTransmitLed" />
+
<!-- =========================================== -->
<!-- Permissions associated with telephony state -->
<!-- =========================================== -->
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index f1119e284c8c..b670c46bb71e 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Lees die SD-kaart."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Toeganklikheidseienskappe"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Kenmerke wat bystandtegnologie kan versoek."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Haal venster-inhoud op"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Ondersoek die inhoud van \'n venster waarmee jy interaksie het."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Skakel Verken deur raak aan"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Aangeraakte items sal hardop gesê word en die skerm kan verken word met behulp van gebare."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Skakel verbeterde webtoeganklikheid aan"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Skripte kan geïnstalleer word om program-inhoud meer toeganklik te maak."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Neem teks wat jy tik waar"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Sluit persoonlike data soos kredietkaartnommers en wagwoorde in."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"deaktiveer of verander statusbalk"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Laat die program toe om die statusbalk te deaktiveer en stelselikone by te voeg of te verwyder."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"statusbalk"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Dit laat die houer toe om aan die topvlak-koppelvlak van \'n invoermetode te bind. Dit moet nooit vir normale programme nodig wees nie."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"verbind aan \'n toeganklikheidsdiens"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Dit laat die houer toe om aan die top-koppelvlak van \'n toeganklikheidsdiens te verbind. Behoort nooit vir gewone programme nodig te wees nie."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"versoek verken-met-aanraking"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Laat die houer toe om \'n interaksiemodus te versoek waarin geraakte items hardop uitgespreek word en die UI via handgebare verken kan word."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"versoek verbeterde webtoeganklikheid"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Laat die houer toe om te versoek dat webtoeganklikheidsverbeterings geaktiveer word. Byvoorbeeld, om skripte te installeer om programinhoud meer toeganklik te maak."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"bind aan \'n teksdiens"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Dit laat die houer toe om aan die topvlak-koppelvlak van \'n teksdiens (bv SpellCheckerService) te bind. Dit moet nooit vir normale programme nodig wees nie."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"bind aan \'n VPN-diens"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Herlaai"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Die bladsy by \"<xliff:g id="TITLE">%s</xliff:g>\" sê:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Bevestig navigasie"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Verlaat hierdie bladsy"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Bly op hierdie bladsy"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Is jy seker dat jy weg van hierdie bladsy af wil navigeer?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Bevestig"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Wenk: Dubbeltik om in en uit te zoem."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Outovul"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index d689022c9109..33777842bef7 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"SD ካርድ ድረስ"</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"የተደራሽነት ባህሪያት"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"አጋዥ ቴክኖሎጂ ሊጠይቃቸው የሚችላቸው ባህሪያት።"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"የመስኮት ይዘት ሰርስረው ያውጡ"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"መስተጋበር የሚፈጥሩት የመስኮት ይዘት ይመርምሩ።"</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"በመንካት ያስሱን ያብሩ"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"የተነኩ ንጥሎች ጮክ ተብለው ይነገሩና የጣት ምልክቶችን በመጠቀም ማያ ገጹ ሊታሰስ ይችላል።"</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"የተሻሻለ የድር ተደራሽነት ያብሩ"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"የመተግበሪያ ይዘት ይበልጥ የሚገኙ ለማድረግ ስክሪፕቶች ሊጫኑ ይችላሉ።"</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"የሚተይቡት ጽሑፍ ይመልከቱ"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"እንደ የክሬዲት ካርድ ቁጥሮች እና የይለፍ ቃላት ያሉ የግል ውሂብ ያካትታል።"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"የሁኔቴ አሞሌ አቦዝን ወይም ቀይር"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"የስርዓት አዶዎችን ወደ ሁኔታ አሞሌ ላለማስቻል ወይም ለማከል እና ለማስወገድ ለመተግበሪያው ይፈቅዳሉ፡፡"</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"ኹናቴ አሞሌ"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"ያዡ ግቤት ስልቱን ወደ ከፍተኛ-ደረጃ በይነገጽ ለመጠረዝ ይፈቅዳሉ። ለመደበኛ ትግበራዎች በፍፁም አያስፈልግም።"</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"ከአንድ የተደራሽነት አገልግሎት ጋር እሰር"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"ያዢው ወደ የአንድ ተደራሽነት አገልግሎት ከፍተኛ-ደረጃ በይነገጽ እንዲያስር ይፈቅድለታል። ለመደበኛ መተግበሪያዎች መቼም ቢሆን ሊያስፈልግ አይገባም።"</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"በንክኪ ማሰስን ይጠይቁ"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"ያዢው የተነኩ ንጥሎች ጮክ ተብለው የሚነገሩበት እና በይነገጹ በምልክቶች በኩል ሊታሰስ በሚችሉበት የበይነግንኙነት ሁኒታ እንዲጠይቅ ያስችለዋል።"</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"የተሻሻለ የድር ተደራሽነት ይጠይቁ"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"ያዢው የድር ተደራሽነት ማሻሻያዎች እንዲነቁለት እንዲጠይቅ ያስችለዋል። ለምሳሌ፣ የመተግበሪያ ይዘት ይበልጥ ተደራሽ እንዲሆን የGoogle ስክሪፕቶችን እንዲጫኑ መጠየቅ።"</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"ለፅሁፍ አገልግሎት አሰረ"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"ያዡ ግቤት ለከፍተኛ-ደረጃ የፅሁፍ አገልግሎት ገፅታ ለመጠረዝ ይፈቅዳል። ለመደበኛ ትግበራዎች በፍፁም አያስፈልግም።"</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"ለVPN አገልግሎት ተገዛ"</string>
@@ -804,8 +808,8 @@
<string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"የመክፈቻ ስርዓተ ጥለቱን <xliff:g id="NUMBER_0">%d</xliff:g>ጊዜ በስህተት ስለውታል።"\n\n"እባክህ እንደገና ከ<xliff:g id="NUMBER_1">%d</xliff:g>ሰከንዶች በኋላ ሞክር።"</string>
<string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"<xliff:g id="NUMBER_0">%d</xliff:g>ጊዚያቶች የይለፍ ቃልህን በስህተት ተይበኻል፡፡በ<xliff:g id="NUMBER_1">%d</xliff:g> ሰኮንዶች ውስጥ "\n\n"እንደገና ሞክር፡፡"</string>
<string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"<xliff:g id="NUMBER_0">%d</xliff:g>ጊዚያቶች ፒንህን በስህተት ተይበኻል፡፡በ"\n"ሰኮንዶች ውስጥ "\n"<xliff:g id="NUMBER_1">%d</xliff:g>እንደገና ሞክር፡፡"</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"የመክፈቻ ስርዓተ ጥለቱን <xliff:g id="NUMBER_0">%d</xliff:g>ጊዜ በስህተት ስለኽውዋል።ከ<xliff:g id="NUMBER_1">%d</xliff:g>የበለጠ ያልተሳካ ሙከራ በኋላ፣ የGoogle መግቢያህን ተጠቅመህ ስልኩን እንድትከፍት ትጠየቃለህ።"\n\n"እባክህ እንደገና <xliff:g id="NUMBER_2">%d</xliff:g>ከሰከንዶች በኋላ ሞክር።"</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"የመክፈቻ ስርዓተ ጥለቱን<xliff:g id="NUMBER_0">%d</xliff:g>ጊዜ በስህተት ስለኽውዋል።ከ<xliff:g id="NUMBER_1">%d</xliff:g> የበለጠ ያልተሳካ ሙከራ በኋላ፣ የGoogle መግቢያህን ተጠቅመህ ስልኩን እንድትከፍት ትጠየቃለህ።"\n\n"እባክህ እንደገና ከ<xliff:g id="NUMBER_2">%d</xliff:g> ሰከንዶች በኋላ ሞክር።"</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"የመክፈቻ ስርዓተ ጥለቱን <xliff:g id="NUMBER_0">%d</xliff:g>ጊዜ በስህተት ስለውታል።ከ<xliff:g id="NUMBER_1">%d</xliff:g>የበለጠ ያልተሳካ ሙከራ በኋላ፣ የGoogle መግቢያዎን ተጠቅመው ስልኩን እንዲከከፍቱ ይጠየቃሉ።"\n\n"እባክዎ እንደገና <xliff:g id="NUMBER_2">%d</xliff:g>ከሰከንዶች በኋላ ይሞክሩ።"</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"የመክፈቻ ስርዓተ ጥለቱን<xliff:g id="NUMBER_0">%d</xliff:g>ጊዜ በስህተት ስለውታል።ከ<xliff:g id="NUMBER_1">%d</xliff:g> የበለጠ ያልተሳካ ሙከራ በኋላ፣ የGoogle መግቢያዎን ተጠቅመው ስልኩን እንዲከፍቱ ይጠየቃሉ።"\n\n"እባክዎ እንደገና ከ<xliff:g id="NUMBER_2">%d</xliff:g> ሰከንዶች በኋላ ይሞክሩ።"</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"ይህን tablet <xliff:g id="NUMBER_0">%d</xliff:g> ጊዜ ያህል በስህተት ለማስከፈት ሞክረሃል፡፡ ከ <xliff:g id="NUMBER_1">%d</xliff:g> በላይ ያልተሳኩ ሙከራዎች በኋላ፣ ይህ tablet አሁን በፋብሪካ ነባሪ ቅንጅት ዳግም ይቀናበርና ሁሉም የተጠቃሚው ውሂብ ይጠፋል፡፡"</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"ይህን ስልክ <xliff:g id="NUMBER_0">%d</xliff:g> ጊዜ ያህል በስህተት ለማስከፈት ሞክረሃል፡፡ ከ <xliff:g id="NUMBER_1">%d</xliff:g> በላይ ያልተሳኩ ሙከራዎች በኋላ፣ ይህ ስልክ በፋብሪካ ነባሪ ቅንጅት ዳግም ይቀናበርና ሁሉም የተጠቃሚው ውሂብ ይጠፋል፡፡"</string>
<string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"ይህን tablet <xliff:g id="NUMBER">%d</xliff:g> ጊዜ ያህል በስህተት ለማስከፈት ሞክረሃል፡፡ ይህ tablet አሁን በፋብሪካ ነባሪ ቅንጅት ዳግም ይቀናበራል፡፡"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"ድጋሚ አስነሳ"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"በ«<xliff:g id="TITLE">%s</xliff:g>» ያለው ገጽ ይህን ይላል፦"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"ጃቫስክሪፕት"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"አሰሳን አረጋግጥ"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"ከዚህ ገጽ ውጣ"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"እዚህ ገፅ ላይ ቆይ"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"እርግጠኛ ነዎት ከዚህ ገጽ ወደ ሌላ ቦታ መሄድ ይፈልጋሉ?"</string>
<string name="save_password_label" msgid="6860261758665825069">"አረጋግጥ"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"ጠቃሚ ምክር፦ ለማጉላት እና ለማሳነስ ሁለቴ-መታ አድርግ።"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"ራስ ሙላ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 0c611cdf2e72..163f373b75f6 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"الدخول إلى بطاقة SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"ميزات إمكانية الوصول"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"الميزات التي يمكن للتقنية المساعدة طلبها"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"استرداد محتوى النافذة"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"فحص محتوى نافذة يتم التفاعل معها."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"تشغيل الاستكشاف باللمس"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"سيتم نطق العناصر التي تم لمسها بصوت عال ويمكن استكشاف الشاشة باستخدام الإيماءات."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"تشغيل إمكانية الدخول المحسّن عبر الويب"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"قد يتم تثبيت النصوص البرمجية لتسهيل الدخول إلى المحتوى."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"ملاحظة النص الذي تكتبه"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"يتضمن بيانات شخصية مثل أرقام بطاقات الائتمان وكلمات المرور."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"تعطيل شريط الحالة أو تعديله"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"للسماح للتطبيق بتعطيل شريط الحالة أو إضافة رموز نظام وإزالتها."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"شريط الحالة"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"للسماح للمالك بالالتزام بواجهة المستوى العلوي لأسلوب الإدخال. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"الالتزام بخدمة إمكانية الدخول"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"للسماح للمالك بالالتزام بواجهة المستوى العلوي لخدمة إمكانية الدخول. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"طلب الاستكشاف باللمس"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"للسماح للمالك بطلب وضع التفاعل الذي يتم فيه النطق بالعناصر الملموسة بصوت عالٍ واستكشاف واجهة المستخدم بالإيماءات."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"طلب إمكانية وصول محسنة"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"للسماح للمالك بطلب تمكين تحسينات إمكانية الوصول إلى الويب، مثل تثبيت البرامج النصية لمزيد من تسهيل الدخول إلى محتوى التطبيق."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"الالتزام بخدمة إدخال النصوص"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"للسماح للمالك بالالتزام بواجهة المستوى العلوي لخدمة إدخال النصوص (على سبيل المثال، SpellCheckerService). لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"الالتزام بخدمة VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"إعادة تشغيل"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"تعرض الصفحة في \"<xliff:g id="TITLE">%s</xliff:g>\":"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"جافا سكريبت"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"تأكيد الانتقال"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"مغادرة هذه الصفحة"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"البقاء في هذه الصفحة"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"هل تريد بالتأكيد الانتقال بعيدًا عن هذه الصفحة؟"</string>
<string name="save_password_label" msgid="6860261758665825069">"تأكيد"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"نصيحة: اضغط مرتين للتكبير والتصغير."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"ملء تلقائي"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index eb2033c09dfe..b40d6219db5a 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Доступ да SD-карты."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Спецыяльныя магчымасці"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Функцыі, якія могуць запытаць дадатковыя тэхналогii."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Атрымайце змесцiва акна"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Вывучыце змесцiва акна, з якiм вы працуеце."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Уключыце Explore by Touch"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Элемент, да якiх дакраналiся, могуць быць агучаны, а экран будзе працаваць з жэстамi."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Уключыце паляпшэнне вэб-даступнасці"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Сцэнарыi могуць быць усталяваны, каб зрабіць змесцiва прыкладання больш даступным."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Глядзiце, што набiраеце"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Уключае ў сябе асабістыя дадзеныя, такія як нумары крэдытных карт і паролі."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"адключаць ці змяняць радок стану"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Дазваляе прыкладанням адключаць радок стану або дадаваць і выдаляць сістэмныя значкі."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"радок стану"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Дазваляе ўладальніку прывязвацца да інтэрфейсу верхняга ўзроўню метада ўводу. Не патрабуецца для звычайных прыкладанняў."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"прывязацца да службы доступу"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Дазваляе ўладальніку прывязвацца да інтэрфейсу верхняга ўзроўню службы доступу. Не патрабуецца для звычайных прыкладанняў."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"запытаць даследаванне навобмацак"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Дазваляе ўладальнiку запытваць працу ў рэжыме ўзаемадзеяння, у якiм элементы, да якiх дакранулiся, прагаворваюцца ўслых, а карыстальнiцкi iнтэрфейс можна даследаваць рукамi."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"прасіць пашырэння даступнасці вэб-даступнасцi"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Дазваляе ўладальнiку запытваць уключэнне iнтэрнэт-даступнасцi паляпшэнняў. Напрыклад, усталёўка скрыптаў з Google зробiць кантэнт больш прыдатным для доступу."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"звязаць з тэкставай службай"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Дазваляе ўладальніку прывязвацца да інтэрфейсу верхняга ўзроўню тэкставай паслугі (напрыклад, SpellCheckerService). Ніколі не патрабуецца для звычайных прыкладанняў."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"звязвацца з VPN сэрвісам"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Перазагрузіць"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"На старонцы з адрасам <xliff:g id="TITLE">%s</xliff:g> вызначана:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Пацвердзіце пераход"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Пакінуць гэту старонку"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Заставацца на гэтай старонцы"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Вы ўпэўнены, што хочаце пакiнуць гэту старонку?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Пацвердзіць"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Падказка: двойчы націсніце, каб павялічыць або паменшыць."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Аўтазапаўненне"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 27a0f59516b0..be5edaa07b9a 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Достъп до SD картата."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Функции за достъпност"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Функции, които подпомагащата технология може да заяви."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Извличане на съдържанието от прозореца"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Инспектиране на съдържанието на прозорец, с който взаимодействате."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Включване на изследването чрез докосване"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Докосваните елементи ще бъдат изговаряни на глас и екранът може да бъде изследван посредством жестове."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Включване на подобрената достъпност в мрежата"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Скриптовете може да бъдат инсталирани, за да направят съдържанието от приложенията по-достъпно."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Наблюдение на въвеждания от вас текст"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Включва лични данни, като например номера на кредитни карти и пароли."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"деактивиране или промяна на лентата на състоянието"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Разрешава на приложението да деактивира лентата на състоянието или да добавя и премахва системни икони."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"лента на състоянието"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Разрешава на притежателя да се обвърже с интерфейса от най-високото ниво на метод на въвеждане. Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"обвързване с услуга за достъпност"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Разрешава на притежателя да се обвърже с интерфейса от най-високото ниво на услуга за достъпност. Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"заявяване на изследване чрез докосване"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Разрешава на собственика да заяви режим на взаимодействие, при който докоснатите елементи се изговарят на глас и потребителският интерфейс може да бъде изследван чрез жестове."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"заявяване на подобрена достъпност в мрежата"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Разрешава на собственика да заяви активирането на подобрения на достъпността в мрежата – например инсталирането на скриптове, за да стане съдържанието от приложенията по-достъпно."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"обвързване с текстова услуга"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Разрешава на притежателя да се обвърже с интерфейса от най-високото ниво на текстова услуга (напр. SpellCheckerService). Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"обвързване с услуга за VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Рестартиране"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Страницата на адрес „<xliff:g id="TITLE">%s</xliff:g>“ съобщава:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Потвърждаване на придвижването"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Напускане на тази страница"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Оставане на тази страница"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Наистина ли искате да излезете от тази страница?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Потвърждение"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Съвет: Докоснете двукратно, за да увеличите или намалите мащаба."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Автопоп."</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 4e68a6b0862f..614353d00d42 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -156,7 +156,7 @@
<string name="global_action_power_off" msgid="4471879440839879722">"Apaga"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"Informe d\'error"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Crea informe d\'errors"</string>
- <string name="bugreport_message" msgid="398447048750350456">"Es recopilarà informació sobre l\'estat actual del dispositiu, que s\'enviarà per correu electrònic. Passaran uns quants minuts des de l\'inici de l\'informe d\'errors fins al seu enviament, per la qual cosa et recomanem que tinguis paciència."</string>
+ <string name="bugreport_message" msgid="398447048750350456">"Es recopilarà informació sobre l\'estat actual del dispositiu i se t\'enviarà per correu electrònic. Passaran uns quants minuts des de l\'inici de l\'informe d\'errors fins al seu enviament, per la qual cosa et recomanem que tinguis paciència."</string>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Mode silenciós"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"So desactivat"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"El so està activat"</string>
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Accedeix a la targeta SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Funcions d\'accessibilitat"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Funcions que pot sol·licitar la tecnologia d\'assistència."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar el contingut de les finestres"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contingut d\'una finestra amb la qual estàs interaccionant."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar Exploració tàctil"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Els elements que toquis es diran en veu alta i la pantalla es podrà explorar mitjançant gestos."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Activar l\'accessibilitat web millorada"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"És possible que s\'instal·lin scripts per fer que el contingut de l\'aplicació sigui més accessible."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observar el text que escrius"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Inclou dades personals com ara números de targetes de crèdit i contrasenyes."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"desactivar o modificar la barra d\'estat"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Permet que l\'aplicació desactivi la barra d\'estat o afegeixi i elimini icones del sistema."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"barra d\'estat"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Permet que el titular vinculi a la interfície de nivell superior d\'un mètode d\'entrada. No s\'hauria de necessitar mai per a les aplicacions normals."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"vincular amb un servei d\'accessibilitat"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permet vincular amb la interfície de nivell superior d\'un servei d\'accessibilitat. Les aplicacions normals no haurien de necessitar-ho."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"sol·licitud d\'exploració tàctil"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Permet que el titular sol·liciti un mode d\'interacció en què els elements que es toquin es llegeixin en veu alta i la interfície d\'usuari es pugui explorar mitjançant gestos."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"sol·licitud d\'accessibilitat web millorada"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Permet que el titular sol·liciti l\'activació de les millores per a l\'accessibilitat web. Per exemple, la instal·lació de scripts de Google per fer més accessible el contingut de l\'aplicació."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"vincula a un servei de text"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Permet al titular vincular amb la interfície de nivell superior d\'un servei de text (per exemple, SpellCheckerService). Les aplicacions normals mai no ho haurien de necessitar."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"vincula a un servei de VPN"</string>
@@ -535,7 +539,7 @@
<string name="permlab_setTime" msgid="2021614829591775646">"definir l\'hora"</string>
<string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"Permet que l\'aplicació canviï la zona horària de la tauleta."</string>
<string name="permdesc_setTime" product="default" msgid="1855702730738020">"Permet que l\'aplicació canviï l\'hora del rellotge del telèfon."</string>
- <string name="permlab_setTimeZone" msgid="2945079801013077340">"definir el fus horari"</string>
+ <string name="permlab_setTimeZone" msgid="2945079801013077340">"selecció de zona horària"</string>
<string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Permet que l\'aplicació canviï la zona horària de la tauleta."</string>
<string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Permet que l\'aplicació canviï la zona horària del telèfon."</string>
<string name="permlab_accountManagerService" msgid="4829262349691386986">"actuar com a AccountManagerService"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Reinicia"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"La pàgina de \"<xliff:g id="TITLE">%s</xliff:g>\" diu:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Confirmació de la navegació"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Surt d\'aquesta pàgina"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Queda\'t en aquesta pàgina"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Estàs segur que vols sortir d\'aquesta pàgina?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Confirma"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Consell: Pica dos cops per ampliar i per reduir."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Em. aut."</string>
@@ -1174,7 +1174,7 @@
<string name="sim_added_title" msgid="3719670512889674693">"Addició de la targeta SIM"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Reinicia el dispositiu per accedir a la xarxa de telefonia mòbil."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Reinicia"</string>
- <string name="time_picker_dialog_title" msgid="8349362623068819295">"Estableix l\'hora"</string>
+ <string name="time_picker_dialog_title" msgid="8349362623068819295">"Defineix l\'hora"</string>
<string name="date_picker_dialog_title" msgid="5879450659453782278">"Establiment de data"</string>
<string name="date_time_set" msgid="5777075614321087758">"Defineix"</string>
<string name="date_time_done" msgid="2507683751759308828">"Fet"</string>
@@ -1213,7 +1213,7 @@
<string name="extmedia_format_message" product="default" msgid="14131895027543830">"Es perdran totes les dades d\'aquesta targeta."</string>
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formata"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuració USB activada"</string>
- <string name="adb_active_notification_message" msgid="1016654627626476142">"Toca per desactivar la depuració USB."</string>
+ <string name="adb_active_notification_message" msgid="1016654627626476142">"Toca per desactivar la depuració USB"</string>
<string name="select_input_method" msgid="4653387336791222978">"Selecciona un mètodes d\'entrada"</string>
<string name="configure_input_methods" msgid="9091652157722495116">"Configura els mètodes d\'entrada"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Teclat físic"</string>
@@ -1482,7 +1482,7 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Has dibuixat el patró de desbloqueig <xliff:g id="NUMBER_0">%d</xliff:g> vegades de manera incorrecta. Després de <xliff:g id="NUMBER_1">%d</xliff:g> intents incorrectes més, se\'t demanarà que desbloquegis el telèfon amb un compte de correu electrònic."\n\n" Torna-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%d</xliff:g> segons."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Elimina"</string>
- <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"Vols augmentar el volum per sobre del nivell de seguretat?"\n"Escoltar música a un volum alt durant períodes llargs pot danyar l\'oïda."</string>
+ <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"Vols augmentar el volum per sobre del nivell recomanat?"\n"Escoltar sons a un volum alt durant períodes de temps llargs pot danyar l\'oïda."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Mantén premuts els dos dits per activar l\'accessibilitat."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"S\'ha activat l\'accessibilitat."</string>
<string name="enable_accessibility_canceled" msgid="3833923257966635673">"Accessibilitat cancel·lada."</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index c92d249b76e0..56a4ade11d82 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Přístup ke kartě SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Funkce usnadnění"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Funkce, o které může asistenční technologie požádat."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Načíst obsah okna"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Můžete prozkoumat obsah okna, se kterým pracujete."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Zapnout funkci Prozkoumání dotykem"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Položky, na které klepnete, budou přečteny nahlas a obrazovku bude možné procházet pomocí gest."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Zapnout vylepšené usnadnění přístupu k webu"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Za účelem usnadnění přístupu k obsahu aplikací mohou být nainstalovány skripty."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Sledovat zadávaný text"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Zahrnuje osobní údaje, jako jsou například čísla kreditních karet a hesla."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"zakázání či změny stavového řádku"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Umožňuje aplikaci zakázat stavový řádek nebo přidat či odebrat systémové ikony."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"stavový řádek"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Umožňuje držiteli vázat se na nejvyšší úroveň rozhraní pro zadávání dat. Běžné aplikace by toto oprávnění neměly nikdy požadovat."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"navázat se na službu usnadnění přístupu"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Umožňuje držiteli navázat se na nejvyšší úroveň rozhraní služby usnadnění přístupu. Běžné aplikace by toto oprávnění neměly nikdy požadovat."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"požádat o prozkoumání dotykem"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Umožňuje držiteli požádat o interaktivní režim, ve kterém jsou po dotyku vysloveny názvy položek a uživatelské rozhraní lze poznávat pomocí gest."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"požádat o usnadnění přístupu k webu"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Umožňuje držiteli požádat o aktivaci usnadnění přístupu k webu, například o instalaci skriptů, které usnadňují přístup k obsahu aplikace."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"navázat se na textovou službu"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Umožňuje držiteli připojit se k nejvyšší úrovni rozhraní textové služby (např. SpellCheckerService). Běžné aplikace by toto oprávnění neměly nikdy požadovat."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"navázat se na službu VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Restartovat"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Stránka <xliff:g id="TITLE">%s</xliff:g> uvádí:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Potvrďte přechod"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Opustit stránku"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Zůstat na této stránce"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Opravdu tuto stránku chcete opustit?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Potvrdit"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Tip: Dvojitým klepnutím můžete zobrazení přiblížit nebo oddálit."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Aut.vyp."</string>
@@ -1082,7 +1082,7 @@
<string name="anr_application_process" msgid="8941757607340481057">"Aplikace <xliff:g id="APPLICATION">%1$s</xliff:g> nereaguje. Chcete ji ukončit?"</string>
<string name="anr_process" msgid="6513209874880517125">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> nereaguje."\n\n"Chcete jej ukončit?"</string>
<string name="force_close" msgid="8346072094521265605">"OK"</string>
- <string name="report" msgid="4060218260984795706">"Nahlásit"</string>
+ <string name="report" msgid="4060218260984795706">"Hlášení"</string>
<string name="wait" msgid="7147118217226317732">"Počkat"</string>
<string name="webpage_unresponsive" msgid="3272758351138122503">"Stránka nereaguje."\n\n"Chcete ji zavřít?"</string>
<string name="launch_warning_title" msgid="1547997780506713581">"Přesměrování aplikace"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 29a57761224c..ea82e2b70acd 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Få adgang til SD-kortet."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Tilgængelighedsfunktioner"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Funktioner, som hjælpeteknologier kan anmode om."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"hente indholdet i vinduet"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"undersøge indholdet i et vindue, du interagerer med."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"aktivere Udforsk ved berøring"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"De emner, der trykkes på, læses højt, og skærmen kan udforskes ved hjælp af bevægelser."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"aktivere forbedret webtilgængelighed"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Der installeres muligvis scripts for at gøre appindhold mere tilgængeligt."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"observere tekst, du skriver"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Dette omfatter personlige data såsom kreditkortnumre og adgangskoder."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"deaktiver eller rediger statuslinje"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Tillader, at appen kan deaktivere statusbjælken eller tilføje og fjerne systemikoner."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"statusbjælke"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Tillader, at brugeren kan forpligter sig til en inputmetodes grænseflade på øverste niveau. Bør aldrig være nødvendigt til almindelige apps."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"bind dig til en tilgængelighedstjeneste"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Tillader, at brugeren binder sig til en grænseflade for en tilgængelighedstjeneste på øverste niveau. Bør aldrig være nødvendigt til almindelige apps."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"anmod om udforsk ved berøring"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Tillader brugeren at anmode om en interaktionstilstand, hvor elementer, der berøres, læses op, og brugergrænsefladen kan udforskes via berøringer."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"anmod om bedre webtilgængelighed"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Tillader, at brugeren kan anmode om aktivering af webtilgængelighedsforbedringer. Disse omfatter bl.a. at installering af scripts, der gør appindhold mere tilgængeligt."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"forpligte sig til en sms-tjeneste"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Tillader, at ejeren kan binde en teksttjenestes grænseflade (f. eks. SpellCheckerService) på øverste niveau. Dette bør aldrig være nødvendigt til normale apps."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"bind til en VPN-tjeneste"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Genstart"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"På siden på \"<xliff:g id="TITLE">%s</xliff:g>\" står der:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"Javascript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Bekræft navigation"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Forlad denne side"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Bliv på denne side"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Er du sikker på, at du vil navigere væk fra denne side?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Bekræft"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Tip! Dobbeltklik for at zoome ind eller ud."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autofyld"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index dcf27e3ad367..c4e31d4101fb 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Zugriff auf SD-Karte"</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Funktionen der Bedienungshilfen"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Funktionen, die für Bedienungshilfentechnologie beantragt werden können"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Fensterinhalte abrufen"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Die Inhalte eines Fensters mit dem Sie interagieren werden abgerufen."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\"Tippen &amp; Entdecken\" aktivieren"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Berührte Elemente werden laut vorgelesen und der Bildschirm kann über Gesten erkundet werden."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Verbesserte Web-Bedienung aktivieren"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Skripts können installiert werden, um den Zugriff auf App-Inhalte zu erleichtern."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Text bei der Eingabe beobachten"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Einschließlich persönlicher Daten wie Kreditkartennummern und Passwörter."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"Statusleiste deaktivieren oder ändern"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Ermöglicht der App, die Statusleiste zu deaktivieren oder Systemsymbole hinzuzufügen oder zu entfernen"</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"Statusleiste"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Ermöglicht dem Halter, sich an die Oberfläche einer Eingabemethode auf oberster Ebene zu binden. Sollte nie für normale Apps benötigt werden."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"An eine Bedienungshilfe binden"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Ermöglicht dem Halter, sich an die Oberfläche einer Bedienungshilfe auf oberster Ebene zu binden. Sollte nie für normale Apps benötigt werden."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"Tippen &amp; Entdecken beantragen"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Nutzer darf Interaktionsmodus beantragen, in dem berührte Elemente laut vorgelesen werden und die Benutzeroberfläche über Gesten erkundet werden kann."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"Erweiterte Webbedienungshilfen beantragen"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Nutzer darf Verbesserungen für Webbedienungshilfen beantragen, beispielsweise die Installation von Skripts von Google, um die Nutzerfreundlichkeit des App-Inhalts zu verbessern."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"An einen Textdienst binden"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Ermöglicht dem Halter, sich an die Oberfläche eines Textdienstes auf oberster Ebene zu binden, z. B. eines Rechtschreibprüfungsdienstes. Sollte nie für normale Apps benötigt werden."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"An einen VPN-Dienst binden"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Neustart"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Auf der Seite \"<xliff:g id="TITLE">%s</xliff:g>\" steht:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Navigation bestätigen"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Diese Seite verlassen"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Auf dieser Seite bleiben"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Möchten Sie diese Seite wirklich verlassen?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Bestätigen"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Tipp: Zum Vergrößern und Verkleinern zweimal tippen"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"AutoFill"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 414111d44373..0a8303319b08 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Πρόσβαση στην κάρτα SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Λειτουργίες προσβασιμότητας"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Λειτουργίες που μπορεί να ζητήσει η τεχνολογία υποβοήθησης."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Ανάκτηση του περιεχομένου του παραθύρου"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Έλεγχος του περιεχομένου ενός παραθύρου με το οποίο αλληλεπιδράτε."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ενεργοποίηση της \"Εξερεύνησης με άγγιγμα\""</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Τα στοιχεία που αγγίζετε θα εκφωνούνται και η εξερεύνηση της οθόνης μπορεί να γίνει με κινήσεις."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Ενεργοποίηση της βελτιωμένης προσβασιμότητας ιστού"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Ενδέχεται να εγκατασταθούν σενάρια για τη βελτίωση της πρόσβασης στο περιεχόμενο της εφαρμογής."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Παρακολούθηση του κειμένου που πληκτρολογείτε"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Περιλαμβάνει προσωπικά δεδομένα, όπως είναι οι αριθμοί πιστωτικών καρτών και οι κωδικοί πρόσβασης."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"απενεργοποίηση ή τροποποίηση γραμμής κατάστασης"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Επιτρέπει στην εφαρμογή να απενεργοποιεί τη γραμμή κατάστασης ή να προσθέτει και να αφαιρεί εικονίδια συστήματος."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"γραμμή κατάστασης"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας μεθόδου εισόδου. Δεν απαιτείται για συνήθεις εφαρμογές."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"δέσμευση σε υπηρεσία προσβασιμότητας"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανώτατου επιπέδου μιας υπηρεσίας προσβασιμότητας. Δεν απαιτείται σε κανονικές εφαρμογές."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"αίτημα εξερεύνησης με αφή"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Επιτρέπει στον κάτοχο να ζητήσει μια λειτουργία αλληλεπίδρασης κατά την οποία τα στοιχεία που αγγίζει ο χρήστης εκφωνούνται και είναι δυνατή η εξερεύνηση της διεπαφής χρήστη μέσω αφής."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"αίτημα βελτιωμένης προσβασιμότητας στον ιστό"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Επιτρέπει στον κάτοχο να ζητήσει την ενεργοποίηση βελτιώσεων προσβασιμότητας ιστού. Για παράδειγμα, εγκατάσταση σεναρίων από την Google προκειμένου το περιεχόμενο των εφαρμογών να είναι πιο προσβάσιμο."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"δέσμευση σε υπηρεσία ανταλλαγής μηνυμάτων"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Επιτρέπει στον κάτοχο τη σύνδεση με τη διεπαφή ανωτέρου επιπέδου μιας υπηρεσίας ανταλλαγής μηνυμάτων (π.χ. SpellCheckerService). Δεν είναι απαραίτητο για κανονικές εφαρμογές."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"δέσμευση σε υπηρεσία VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Επανεκκίνηση"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Η σελίδα στον τίτλο \"<xliff:g id="TITLE">%s</xliff:g>\" λέει:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Επιβεβαίωση πλοήγησης"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Αποχώρηση από αυτήν τη σελίδα"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Παραμονή σε αυτήν τη σελίδα"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Είστε βέβαιοι ότι θέλετε να απομακρυνθείτε από αυτήν τη σελίδα;"</string>
<string name="save_password_label" msgid="6860261758665825069">"Επιβεβαίωση"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Συμβουλή: Πατήστε δύο φορές για μεγέθυνση και σμίκρυνση."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Αυτόματη συμπλήρωση"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index d95c1d9dfa58..5793b8aad823 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Access the SD card."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Accessibility features"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Features that assistive technology can request."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Retrieve window content"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspect the content of a window that you\'re interacting with."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Turn on Explore by Touch"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Touched items will be spoken aloud and the screen can be explored using gestures."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Turn on enhanced web accessibility"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Scripts may be installed to make app content more accessible."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observe text that you type"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Includes personal data such as credit card numbers and passwords."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"disable or modify status bar"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Allows the app to disable the status bar or add and remove system icons."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"status bar"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Allows the holder to bind to the top-level interface of an input method. Should never be needed for normal apps."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"bind to an accessibility service"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Allows the holder to bind to the top-level interface of an accessibility service. Should never be needed for normal apps."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"request explore by touch"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Allows the hoder to request an interaction mode in which touched items are spoken aloud and the UI can be explored via gestures."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"request enhanced web accessibility"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Allows the hoder to request enabling of web accessibility enhancements. For example, installing scripts to make app content more accessible."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"bind to a text service"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Allows the holder to bind to the top-level interface of a text service (e.g. SpellCheckerService). Should never be needed for normal applications."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"bind to a VPN service"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Reboot"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"The page at \"<xliff:g id="TITLE">%s</xliff:g>\" says:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Confirm Navigation"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Leave this Page"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Stay on this Page"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Are you sure you want to navigate away from this page?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Confirm"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Tip: double-tap to zoom in and out."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Auto-fill"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 5005d41d0687..ba6f4af62868 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Acceder a la tarjeta SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Funciones de accesibilidad"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Funciones que la tecnología de asistencia puede solicitar."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar el contenido de las ventanas"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contenido de la ventana con la que estés interactuando."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar la Exploración táctil"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Los elementos que toques se dirán en voz alta, y podrás explorar la pantalla mediante gestos."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Activar la accesibilidad web mejorada"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Es posible que se instalen secuencias de comandos para que el contenido de las aplicaciones sea más accesible."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observar el texto que escribes"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Incluye datos personales, como números de tarjeta de crédito y contraseñas."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"desactivar o modificar la barra de estado"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Permite que la aplicación inhabilite la barra de estado o que agregue y elimine íconos del sistema."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"barra de estado"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Permite al propietario vincularse a la interfaz de nivel superior de un método de entrada. Las aplicaciones normales no deberían necesitar este permiso."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"vincular a un servicio de accesibilidad"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permite al propietario vincularse a la interfaz de nivel superior de un servicio de accesibilidad. Las aplicaciones normales no deberían necesitar este permiso."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"solicitar exploración táctil"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Le permite al titular solicitar un modo de interacción en el cual los elementos tocados se pronuncian en voz alta y la IU se puede explorar a través de gestos."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"solicitar accesibilidad mejorada de la Web"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Le permite al titular solicitar la habilitación de las mejoras en la accesibilidad de la Web. Por ejemplo, instalar las secuencias de comandos de Google para hacer el contenido de la aplicación más accesible."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"vincular a un servicio de texto"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Permite al titular vincularse a la interfaz de nivel superior de un servicio de texto (p. ej., SpellCheckerService). Las aplicaciones normales no deberían necesitar este permiso."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"vincular con un servicio de VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Reiniciar"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"La página \"<xliff:g id="TITLE">%s</xliff:g>\" dice:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Confirmar navegación"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Abandonar esta página"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Quedarme en la página"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"¿Confirmas que quieres salir de esta página?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Confirmar"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Consejo: Toca dos veces para acercar y alejar la imagen."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autocompletar"</string>
@@ -1212,8 +1212,8 @@
<string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"Se borrarán todos los archivos guardados en el almacenamiento USB. Esta acción no se puede deshacer."</string>
<string name="extmedia_format_message" product="default" msgid="14131895027543830">"Se perderán todos los datos de tu tarjeta."</string>
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formato"</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración de USB conectada"</string>
- <string name="adb_active_notification_message" msgid="1016654627626476142">"Toca para desactivar la depuración de USB."</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración por USB conectada"</string>
+ <string name="adb_active_notification_message" msgid="1016654627626476142">"Toca para desactivar la depuración por USB."</string>
<string name="select_input_method" msgid="4653387336791222978">"Selecciona el método de entrada"</string>
<string name="configure_input_methods" msgid="9091652157722495116">"Configurar métodos de introducción"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Teclado físico"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index d20f7fa0314b..dc69ed5ac7b8 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -156,7 +156,7 @@
<string name="global_action_power_off" msgid="4471879440839879722">"Apagar"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"Informe de error"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Crear informe de errores"</string>
- <string name="bugreport_message" msgid="398447048750350456">"Se recopilará información sobre el estado actual de tu dispositivo, que se enviará por correo electrónico. Pasarán unos minutos desde que se inicie el informe de errores hasta que se envíe, por lo que te recomendamos que tengas paciencia."</string>
+ <string name="bugreport_message" msgid="398447048750350456">"Se recopilará información sobre el estado actual de tu dispositivo y se enviará por correo electrónico. Pasarán unos minutos desde que empiece a generarse el informe de errores hasta que se envíe, por lo que te recomendamos que tengas paciencia."</string>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Modo silencio"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"El sonido está desactivado. Activar"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"El sonido está activado. Desactivar"</string>
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Acceder a la tarjeta SD"</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Funciones de accesibilidad"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Funciones que pueden solicitar tecnología adaptada"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar el contenido de la ventana"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contenido de una ventana con la que estés interactuando."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar exploración táctil"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Los elementos seleccionados se dirán en voz alta y podrás explorar la pantalla mediante gestos."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Activar accesibilidad web mejorada"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Es posible que se instalen secuencias de comandos para que el contenido de las aplicaciones sea más accesible."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observar el texto que escribes"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Incluye datos personales como números de tarjetas de crédito y contraseñas."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"inhabilitar o modificar la barra de estado"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Permite que la aplicación inhabilite la barra de estado o añada y elimine iconos del sistema."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"barra de estado"</string>
@@ -344,14 +352,10 @@
<string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"Permite que la aplicación proporcione sus propios eventos de entrada (pulsación de teclas, etc.) a otras aplicaciones. Las aplicaciones malintencionadas pueden usar este permiso para controlar el teléfono."</string>
<string name="permlab_readInputState" msgid="469428900041249234">"registrar lo que se escribe y las acciones que se realizan"</string>
<string name="permdesc_readInputState" msgid="8387754901688728043">"Permite que la aplicación sepa las teclas que pulsas incluso cuando interactúas con otra aplicación (como, por ejemplo, al introducir una contraseña). Nunca debería ser necesario para las aplicaciones normales."</string>
- <string name="permlab_bindInputMethod" msgid="3360064620230515776">"enlazar con un método de entrada de texto"</string>
- <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Permite que se enlace con la interfaz de nivel superior de un método de entrada de texto. Las aplicaciones normales no deberían necesitar este permiso."</string>
+ <string name="permlab_bindInputMethod" msgid="3360064620230515776">"enlazar con un método de introducción de texto"</string>
+ <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Permite que se enlace con la interfaz de nivel superior de un método de introducción de texto. Las aplicaciones normales no deberían necesitar este permiso."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"enlazar con un servicio de accesibilidad"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permite enlazar con la interfaz de nivel superior de un servicio de accesibilidad. Las aplicaciones normales no deberían necesitar este permiso."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"Solicitar exploración por tacto"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Permite al titular solicitar un modo de interacción en el que los elementos que se toquen se reproduzcan en voz alta y la interfaz de usuario se pueda explorar mediante gestos."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"Solicitar accesibilidad web mejorada"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Permite que el titular solicite que se habiliten mejoras de accesibilidad web. Por ejemplo, instalar secuencias de comandos de Google para que el contenido de la aplicación sea más accesible."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"enlazar con un servicio de texto"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Permite enlazar con la interfaz de nivel superior de un servicio de texto (por ejemplo, SpellCheckerService). Las aplicaciones normales no deberían necesitar este permiso."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"enlazar con un servicio VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Reiniciar"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"La página \"<xliff:g id="TITLE">%s</xliff:g>\" dice:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Confirmar navegación"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Salir de esta página"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Permanecer en esta página"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"¿Seguro que quieres salir de esta página?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Confirmar"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Sugerencia: toca dos veces para ampliar o reducir el contenido."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autocompletar"</string>
@@ -1053,7 +1053,7 @@
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Selección de texto"</string>
<string name="addToDictionary" msgid="4352161534510057874">"Añadir al diccionario"</string>
<string name="deleteText" msgid="6979668428458199034">"Eliminar"</string>
- <string name="inputMethod" msgid="1653630062304567879">"Método de entrada de texto"</string>
+ <string name="inputMethod" msgid="1653630062304567879">"Método de introducción de texto"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Acciones de texto"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Queda poco espacio"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Es posible que algunas funciones del sistema no funcionen."</string>
@@ -1206,7 +1206,7 @@
<string name="usb_ptp_notification_title" msgid="1960817192216064833">"Conectado como una cámara"</string>
<string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Conectado como instalador"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Conectado a un accesorio USB"</string>
- <string name="usb_notification_message" msgid="2290859399983720271">"Toca para acceder a otras opciones de USB."</string>
+ <string name="usb_notification_message" msgid="2290859399983720271">"Toca para acceder a otras opciones de USB"</string>
<string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"¿Formatear USB?"</string>
<string name="extmedia_format_title" product="default" msgid="3648415921526526069">"¿Formatear la tarjeta SD?"</string>
<string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"Se borrarán todos los archivos almacenados en el almacenamiento USB. Esta acción no se puede deshacer."</string>
@@ -1271,7 +1271,7 @@
<string name="deny" msgid="2081879885755434506">"Denegar"</string>
<string name="permission_request_notification_title" msgid="6486759795926237907">"Permiso solicitado"</string>
<string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"Permiso solicitado"\n"para la cuenta <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
- <string name="input_method_binding_label" msgid="1283557179944992649">"Método de entrada de texto"</string>
+ <string name="input_method_binding_label" msgid="1283557179944992649">"Método de introducción de texto"</string>
<string name="sync_binding_label" msgid="3687969138375092423">"Sincronización"</string>
<string name="accessibility_binding_label" msgid="4148120742096474641">"Accesibilidad"</string>
<string name="wallpaper_binding_label" msgid="1240087844304687662">"Fondo de pantalla"</string>
@@ -1482,7 +1482,7 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Has fallado <xliff:g id="NUMBER_0">%d</xliff:g> veces al dibujar el patrón de desbloqueo. Si fallas otras <xliff:g id="NUMBER_1">%d</xliff:g> veces, deberás usar una cuenta de correo electrónico para desbloquear el teléfono."\n\n" Inténtalo de nuevo en <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Eliminar"</string>
- <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"¿Quieres subir el volumen por encima del nivel recomendado?"\n"Escuchar sonidos a alto volumen durante largos períodos de tiempo puede dañar tus oídos."</string>
+ <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"¿Quieres subir el volumen por encima del nivel recomendado?"\n"Escuchar sonidos a alto volumen durante largos períodos de tiempo puede dañar los oídos."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Mantén la pantalla pulsada con dos dedos para habilitar las funciones de accesibilidad."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Accesibilidad habilitada"</string>
<string name="enable_accessibility_canceled" msgid="3833923257966635673">"Accesibilidad cancelada"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index c30e2a9c1f5c..62ad54664a8c 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Juurdepääs SD-kaardile."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Pääsufunktsioonid"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Funktsioonid, mida saab taotleda abistav tehnoloogia."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Akna sisu toomine"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Tutvuge kasutatava akna sisuga."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Puudutusega sirvimise sisselülitamine"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Puudutatud üksuste nimesid esitatakse häälega ning ekraani saab sirvida puudutustega."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Veebi täiustatud juurdepääsu sisselülitamine"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Rakenduse sisu kättesaadavamaks muutmiseks võidakse installida skripte."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Sisestatud teksti jälgimine"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Sisaldab isiklikke andmeid, nt krediitkaardi numbreid ja paroole."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"keela või muuda olekuriba"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Võimaldab rakendusel keelata olekuriba või lisada ja eemaldada süsteemiikoone."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"olekuriba"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Lubab omanikul siduda sisestusmeetodi ülataseme liidesega. Tavarakenduste puhul ei peaks seda kunagi vaja minema."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"sidumine juurdepääsuteenusega"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Lubab omanikul luua sideme juurdepääsuteenuse ülataseme liidesega. Tavarakenduste puhul ei tohiks seda kunagi vaja minna."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"puudutusega uurimise taotlus"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Võimaldab taotleda suhtlusrežiimi, milles puudutatud üksused valjusti välja öeldakse ja kus kasutajaliidest saab kasutada liigutuste abil."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"täiustatud veebijuurdepääsu taotlus"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Võimaldab taotleda veebijuurdepääsu täiustuste lubamist. Näiteks installida skripte, mis hõlbustavad juurdepääsu rakenduse sisule."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"tekstiteenusega sidumine"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Võimaldab omanikul siduda tekstiteenuse (nt SpellCheckerService) ülataseme liidesega. Tavarakenduste puhul ei peaks seda kunagi vaja minema."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"seo VPN-teenusega"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Taaskäivita"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Leht „<xliff:g id="TITLE">%s</xliff:g>” ütleb järgmist."</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Navigeerimise kinnitamine"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Lahku sellelt lehelt"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Jää sellele lehele"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Kas soovite kindlasti sellelt lehelt lahkuda?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Kinnita"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Vihje: suurendamiseks ja vähendamiseks puudutage kaks korda."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Automaatne täitmine"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index f254b52852e5..0adbc5fa529a 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"به کارت SD دسترسی داشته باشید."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"ویژگی‌های قابلیت دسترسی"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"ویژگی‌هایی که فناوری مفید می‌تواند درخواست کند."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"بازیابی محتوای پنجره"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"محتوای پنجره‌ای را که در حال تعامل با آن هستید بررسی کنید."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"فعال‌سازی کاوش لمسی"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"موارد لمس شده با صدای بلند خوانده می‌شوند و با استفاده از حرکات لمسی می‌توانید صفحه را کاوش کنید."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"فعال‌سازی دسترس‌پذیری پیشرفته برای وب"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"ممکن است جهت افزایش دسترس‌پذیری به محتوای برنامه، اسکریپت‌هایی نصب شود."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"نوشتاری را که تایپ می‌کنید مشاهده نمایید"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"اطلاعات شخصی مانند شماره کارت اعتباری و گذرواژه‌ها را شامل می‌شود."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"غیرفعال کردن یا تغییر نوار وضعیت"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"به برنامه اجازه می‎دهد تا نوار وضعیت را غیرفعال کند یا نمادهای سیستم را اضافه یا حذف کند."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"نوار وضعیت"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"به دارنده این دستگاه اجازه می‎دهد تا به رابط سطح بالای یک روش ورودی متصل شود. این ویژگی هیچگاه برای برنامه‎های معمولی ضروری نمی‎باشد."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"اتصال به سرویس دسترسی"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"به دارنده اجازه می‌دهد که به رابط سطح بالای سرویس دسترسی متصل شود. هرگز برای برنامه‌های معمولی مورد نیاز نیست."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"درخواست کاوش با لمس"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"به دارنده اجازه می‌دهد یک حالت تعاملی را درخواست کند که در این حالت موارد لمس شده به صدای بلند بیان می‌شوند و رابط کاربری از طریق حرکات اشاره قابل کاوش است."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"درخواست افزایش دسترسی به وب"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"به دارنده اجازه می‌دهد فعال کردن افزایش دسترسی به وب را درخواست کند، برای مثال، نصب اسکریپت‌ها، تا محتوای برنامه بیشتر در دسترس باشد."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"اتصال به یک سرویس متنی"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"به دارنده اجازه می‌دهد خود را به یک رابط سطح بالای خدمات متنی مرتبط کند (برای مثال SpellCheckerService). هرگز برای برنامه‌های عادی لازم نیست."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"اتصال به یک سرویس VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"راه‌اندازی مجدد"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"صفحه در \"<xliff:g id="TITLE">%s</xliff:g>\" می‎گوید:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"جاوا اسکریپت"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"تأیید پیمایش"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"ترک این صفحه"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"ماندن در این صفحه"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"مطمئنید می‌خواهید این صفحه را ترک کنید؟"</string>
<string name="save_password_label" msgid="6860261758665825069">"تأیید"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"نکته: برای بزرگنمایی و کوچکنمایی، دو بار ضربه بزنید."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"تکمیل خودکار"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index f75d4743f0bb..28b3ec743ff9 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Käytä SD-korttia."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Esteettömyysominaisuudet"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Ominaisuudet, joiden käyttöönottoa avustava tekniikka voi pyytää."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Nouda ikkunan sisältöä"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Tarkista käyttämäsi ikkunan sisältö."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ota kosketuksella tutkiminen käyttöön"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Kosketetut kohteet sanotaan ääneen ja ruudulla voi liikkua eleiden avulla."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Ota parannettu verkon esteettömyys käyttöön"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Sovellus voi asentaa ohjelmia tehdäkseen sisällöstään esteettömämmän."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Tarkkaile kirjoittamaasi tekstiä"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Sisältää henkilökohtaisia tietoja, kuten luottokortin numeroita ja salasanoja."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"poista tilapalkki käytöstä tai muokkaa tilapalkkia"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Antaa sovelluksen poistaa tilapalkin käytöstä ja lisätä tai poistaa järjestelmäkuvakkeita."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"tilapalkki"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Antaa sovelluksen sitoutua syötetavan ylätason käyttöliittymään. Ei tavallisten sovellusten käyttöön."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"sitoudu esteettömyyspalveluun"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Antaa sovelluksen sitoutua esteettömyyspalvelun ylemmän tason käyttöliittymään. Ei tavallisten sovelluksien käyttöön."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"pyydä kosketuksella tutkimisen käyttöönottoa"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Antaa luvan haltijan pyytää käyttöön vuorovaikutustilaa, jossa kosketettujen kohteiden nimet sanotaan ääneen ja käyttöliittymää voi tutkia eleiden avulla."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"pyydä parannettua verkon esteettömyyttä"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Antaa luvan haltijan pyytää verkon esteettömyysparannuksien käyttöönottoa. Sovellus voi esimerkiksi pyytää Googlen koodikatkelmien asentamista sovelluksen sisällön esteettömyyden parantamiseksi."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"tekstipalveluun sitoutuminen"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Antaa sovelluksen sitoutua tekstipalvelun (kuten SpellCheckerServicen) ylätason liittymään. Ei tavallisten sovellusten käyttöön."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"sitoudu VPN-palveluun"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Käynnistä uudelleen"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Sivu <xliff:g id="TITLE">%s</xliff:g> sanoo:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Vahvista siirtyminen"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Poistu tältä sivulta"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Pysy tällä sivulla"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Haluatko varmasti siirtyä pois tältä sivulta?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Vahvista"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Vinkki: lähennä ja loitonna kaksoisnapauttamalla."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Aut. täyttö"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 4a87fd04e720..c8cf96d50de4 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Accéder à la carte SD"</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Fonctionnalités d\'accessibilité"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Fonctionnalités pouvant être requises dans le cadre des technologies d\'assistance"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Récupérer le contenu d\'une fenêtre"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecter le contenu d\'une fenêtre avec laquelle vous interagissez."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activer la fonctionnalité Explorer au toucher"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Les éléments sélectionnés sont énoncés à voix haute. Vous pouvez explorer l\'écran à l\'aide de gestes."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Activer l\'accessibilité Web améliorée"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Vous pouvez installer des scripts pour rendre le contenu des applications plus accessible."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observer le texte que vous saisissez"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Inclut des données personnelles telles que les numéros de cartes de paiement et les mots de passe."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"Désactivation ou modification de la barre d\'état"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Permet à l\'application de désactiver la barre d\'état, ou d\'ajouter et de supprimer des icônes système."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"barre d\'état"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Permet à l\'application autorisée de s\'associer à l\'interface de plus haut niveau d\'un mode de saisie. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"associer à un service d\'accessibilité"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permet à l\'application autorisée de s\'associer à l\'interface de plus haut niveau d\'un service d\'accessibilité. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"demander l\'activation de la fonctionnalité \"Explorer au toucher\""</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Permet à l\'application de demander l\'activation d\'un mode d\'interaction dans lequel les éléments sur lesquels l\'utilisateur appuie sont énoncés à voix haute et dans lequel l\'utilisateur peut explorer l\'interface à l\'aide de gestes."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"demander des améliorations de la fonctionnalité d\'accessibilité Web"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Permet à l\'application de demander l\'activation d\'améliorations de la fonctionnalité d\'accessibilité Web, telles que l\'installation de scripts pour rendre le contenu des applications plus accessible."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"associer à un service de texte"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Permet à l\'application de s\'associer à l\'interface de haut niveau d\'un service de texte (par exemple, SpellCheckerService). Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"associer à un service VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Redémarrer"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"La page \"<xliff:g id="TITLE">%s</xliff:g>\" indique :"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Quitter la page"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Quitter cette page"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Rester sur cette page"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Voulez-vous vraiment quitter cette page ?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Confirmer"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Conseil : Appuyez deux fois pour faire un zoom avant ou arrière."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Saisie auto"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index b922e401590a..e93d749f4d57 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"SD कार्ड में पहुंचें."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"पहुंच-योग्यता सुविधाएं"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"सहायक प्रौद्योगिकी के द्वारा अनुरोध की जा सकने वाली सुविधाएं."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विंडो सामग्री प्राप्त करें"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"उस विंडो की सामग्री का निरीक्षण करें जिससे आप सहभागिता कर रहे हैं."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"स्पर्श द्वारा एक्सप्लोर करें को चालू करें"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"स्पर्श किए गए आइटम ज़ोर से बोले जाएंगे और स्क्रीन को जेस्चर के उपयोग से एक्सप्लोर किया जा सकेगा."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"एन्हांस की गई वेब पहुंच-योग्यता चालू करें"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"एप्लिकेशन सामग्री को अधिक पहुंच-योग्य बनाने के लिए स्क्रिप्ट इंस्टॉल किए जा सकते हैं."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"आपके द्वारा लिखे हुए पाठ को ध्यान से देखें"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"क्रेडिट कार्ड नंबर और पासवर्ड जैसा व्यक्तिगत डेटा शामिल होता है."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"स्‍थिति बार अक्षम या बदलें"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"एप्लिकेशन को स्थिति बार अक्षम करने या सिस्‍टम आइकन को जोड़ने या निकालने देता है."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"स्‍थिति बार"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"धारक को किसी इनपुट विधि के शीर्ष-स्‍तर इंटरफ़ेस से आबद्ध होने देता है. सामान्‍य एप्‍लिकेशन के लिए कभी भी आवश्‍यक नहीं होना चाहिए."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"पहुंच-योग्‍यता सेवा से आबद्ध करें"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"धारक को किसी पहुंच-योग्यता सेवा के शीर्ष-स्‍तर इंटरफ़ेस से आबद्ध होने देता है. सामान्‍य एप्‍लिकेशन के लिए कभी भी आवश्‍यक नहीं होना चाहिए."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"स्पर्श द्वारा एक्सप्लोर करें का अनुरोध करें"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"धारक को ऐसे सहभागी मोड का अनुरोध करने देती है जिसमें स्पर्श किए गए आइटम ज़ोर से बोले जाते हैं और UI को जेस्चर के द्वारा एक्सप्लोर किया जा सकता है."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"उन्नत वेब पहुंच-योग्यता का अनुरोध करें"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"धारक को वेब पहुंच-योग्यता एन्हांसमेंट सक्षम करने का अनुरोध करने देती है. उदाहरण के लिए, एप्लिकेशन सामग्री को अधिक पहुंच-योग्य बनाने के लिए स्क्रिप्ट इंस्टॉल करना."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"किसी पाठ सेवा पर बने रहें"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"धारक को किसी पाठ सेवा (उदा. SpellCheckerService) के शीर्ष-स्‍तर इंटरफ़ेस पर आबद्ध होने देता है. सामान्‍य एप्‍लिकेशन के लिए कभी भी आवश्‍यक नहीं होना चाहिए."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"किसी VPN सेवा से आबद्ध करें"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"रीबूट करें"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"\'<xliff:g id="TITLE">%s</xliff:g>\' पर यह पृष्ठ दर्शाता है:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"नेविगेशन की पुष्टि करें"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"इस पृष्ठ को छोड़ें"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"इस पृष्ठ पर बने रहें"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"क्या आप वाकई इस पृष्ठ से दूर नेविगेट करना चाहते हैं?"</string>
<string name="save_password_label" msgid="6860261758665825069">"पुष्टि करें"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"युक्ति: ज़ूम इन और आउट करने के लिए डबल-टैप करें."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"स्‍वत: भरण"</string>
@@ -1454,7 +1454,7 @@
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"सिम PIN डालें"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"PIN डालें"</string>
<string name="kg_password_instructions" msgid="5753646556186936819">"पासवर्ड डालें"</string>
- <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"सिम अब अक्षम हो गई है. जारी रखने के लिए PUK कोड डालें. विवरण के लिए वाहक से संपर्क करें."</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"सिम अब अक्षम हो गई है. जारी रखने के लिए PUK कोड डालें. विवरण के लिए कैरियर से संपर्क करें."</string>
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"इच्छित पिन कोड डालें"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"इच्छित पिन कोड की पुष्टि करें"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM कार्ड अनलॉक कर रहा है…"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 128b48c889aa..0f44a7efc8a1 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Pristup SD kartici."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Značajke dostupnosti"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Značajke koje tehnologija za pristupačnost može zahtijevati."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Dohvaćanje sadržaja prozora"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Istražite sadržaj prozora koji upotrebljavate."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Uključivanje značajke Istraži dodirom"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Dodirnute stavke izgovorit će se naglas, a zaslon se može istraživati pokretima."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Uključivanje poboljšane pristupačnosti weba"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Kako bi sadržaj aplikacije bio pristupačniji, mogu se instalirati skripte."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Praćenje teksta koji pišete"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Uključuje osobne podatke kao što su brojevi kreditnih kartica i zaporke."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"onemogućavanje ili izmjena trake statusa"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Aplikaciji omogućuje onemogućavanje trake statusa ili dodavanje i uklanjanje sistemskih ikona."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"traka statusa"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Nositelju omogućuje povezivanje sučelja najviše razine načina unosa. Ne bi smjelo biti potrebno za normalne aplikacije."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"vezivanje uz uslugu dostupnosti"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Nositelju omogućuje vezanje uz sučelje najviše razine usluge dostupnosti. Ne bi smjelo biti potrebno za normalne aplikacije."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"zahtijevaj istraživanje dodirom"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Omogućuje korisniku zahtijevanje načina interakcije u kojem se dodirnute stavke izgovaraju naglas, a korisničko sučelje može se istraživati pokretima."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"zahtijevaj poboljšanu web-dostupnost"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Omogućuje korisniku zahtijevanje omogućivanja poboljšanja za dostupnost na webu. Na primjer, instaliranje skripti kako bi sadržaj aplikacije bio pristupačniji."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"vezanje na tekstualnu uslugu"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Omogućuje korisniku povezivanje s najvišom razinom sučelja tekstualne usluge (npr. SpellCheckerService). Ne bi smjelo biti potrebno za normalne aplikacije."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"vezanje na VPN uslugu"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Ponovno pokreni"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Stranica na adresi \"<xliff:g id="TITLE">%s</xliff:g>\" sadrži sljedeće:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Potvrda kretanja"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Napusti stranicu"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Ostani na ovoj stranici"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Jeste li sigurni da želite napustiti ovu stranicu?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Potvrdi"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Savjet: Dvaput dotaknite za povećavanje i smanjivanje."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Aut.pop."</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 0e0f13aa1a21..c0640208be05 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Az SD-kártya elérése."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Kisegítő lehetőségek funkciói"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"A kisegítő technológia által kérhető funkciók."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Ablaktartalom lekérdezése"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"A használt ablak tartalmának vizsgálata."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Felfedezés érintéssel bekapcsolása"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"A megérintett elemeket a rendszer hangosan kimondja, a képernyő pedig felfedezhető kézmozdulatok használatával."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Webelérhetőség fokozásának bekapcsolása"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Lehet telepíteni szkripteket, hogy az alkalmazástartalmak jobban elérhetők legyenek."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"A gépelt szöveg figyelése"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Tartalmazza a személyes adatokat, például a hitelkártyaszámokat és jelszavakat."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"állapotsor kikapcsolása vagy módosítása"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Lehetővé teszi az alkalmazás számára az állapotsor kikapcsolását, illetve rendszerikonok hozzáadását és eltávolítását."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"állapotsor"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Lehetővé teszi, hogy a tulajdonos kötelezővé tegye egy beviteli mód legfelső szintű felületét. A normál alkalmazásoknak erre soha nincs szüksége."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"csatlakozás egy kisegítő szolgáltatáshoz"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Lehetővé teszi a használó számára, hogy csatlakozzon egy kisegítő szolgáltatás legfelső szintű kezelőfelületéhez. A normál alkalmazásoknak erre soha nincs szükségük."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"felfedezés érintéssel kérése"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Lehetővé teszi a felhasználó számára egy olyan használati mód engedélyezését, amelyben az eszköz kimondja, hogy milyen elemek lettek megérintve, a felhasználói felület pedig felfedezhető kézmozdulatok révén."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"bővített internetes kisegítő lehetőségek kérése"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Lehetővé teszi a felhasználó számára az internetes kisegítő lehetőségek bővítését. Telepíthet például szkripteket, hogy még inkább elérhetővé tegye az alkalmazás tartalmát."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"csatlakozás szövegszolgáltatáshoz"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Lehetővé teszi, hogy a tulajdonos egy szöveges szolgáltatás felső szintjéhez kapcsolódjon (pl. SpellCheckerService). A normál alkalmazásoknak erre soha nincs szüksége."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"csatlakozás egy VPN-szolgáltatáshoz"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Újraindítás"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"A \"<xliff:g id="TITLE">%s</xliff:g>\" címen található oldal szerint:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Navigáció megerősítése"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Oldal elhagyása"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Ezen az oldalon maradok"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Biztosan szeretné elhagyni az oldalt?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Megerősítés"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Tipp: érintse meg kétszer a nagyításhoz és kicsinyítéshez."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Kitöltés"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index fd04f2aa7434..8dbc033eaf59 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Akses kartu SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Fitur aksesibilitas"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Fitur yang dapat diminta oleh teknologi bantu."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Mengambil konten jendela"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Memeriksa konten jendela tempat Anda berinteraksi."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Mengaktifkan Jelajahi dengan Sentuhan"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Item yang disentuh akan diucapkan dengan jelas dan layar dapat dijelajahi menggunakan isyarat."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Mengaktifkan aksesibilitas web yang disempurnakan"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Skrip mungkin dipasang agar konten aplikasi lebih dapat diakses."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Mengamati teks yang Anda ketik"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Meliputi data pribadi seperti nomor kartu kredit dan sandi."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"nonaktifkan atau ubah bilah status"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Mengizinkan apl menonaktifkan bilah status atau menambah dan menghapus ikon sistem."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"bilah status"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Mengizinkan pemegang mengikat antarmuka tingkat tinggi dari suatu metode masukan. Tidak pernah diperlukan oleh apl normal."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"mengikat ke layanan aksesibilitas"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Mengizinkan pemegang untuk mengikat antarmuka tingkat tinggi dari suatu layanan. Tidak pernah diperlukan oleh aplikasi normal."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"meminta penjelajahan dengan sentuhan"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Memungkinkan pemegang meminta mode interaksi yang mana item yang disentuh diucapkan dengan keras dan UI dapat dijelajahi dengan isyarat."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"meminta aksesibilitas web yang disempurnakan"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Memungkinkan pemegang meminta pengaktifan penyempurnaan aksesibilitas web. Contohnya, memasang skrip agar konten aplikasi lebih mudah diakses."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"mengikat ke layanan SMS"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Mengizinkan pemegang mengikat antarmuka tingkat tinggi dari suatu layanan teks (misal: SpellCheckerService). Tidak pernah diperlukan oleh apl normal."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"mengikat ke layanan VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Mulai ulang"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Laman pada \"<xliff:g id="TITLE">%s</xliff:g>\" menyatakan:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Konfirmasi Navigasi"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Keluar dari Laman ini"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Tetap di Laman ini"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Yakin ingin beranjak dari laman ini?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Konfirmasi"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Kiat: Ketuk dua kali untuk memperbesar dan memperkecil."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Isiotomatis"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 7cda28a6c2ea..95b9744224dd 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Accesso alla scheda SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Funzioni di accessibilità"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Funzioni che possono essere richieste dalla tecnologia di ausilio."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperare contenuti finestra"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Esaminare i contenuti di una finestra con cui interagisci."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Attivare Esplora al tocco"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Gli elementi toccati verranno pronunciati ad alta voce e sarà possibile esplorare lo schermo utilizzando i gesti."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Attivare accessibilità web migliorata"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Potrebbero essere installati script per rendere più accessibili i contenuti delle app."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Osservare il testo digitato"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Sono inclusi dati personali come numeri di carte di credito e password."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"disattivare o modificare la barra di stato"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Consente all\'applicazione di disattivare la barra di stato o di aggiungere e rimuovere icone di sistema."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"barra di stato"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Consente l\'associazione di un metodo di inserimento all\'interfaccia principale. Non dovrebbe mai essere necessaria per le normali applicazioni."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"collegamento a un servizio di accessibilità"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Consente al titolare di collegarsi all\'interfaccia di primo livello di un servizio di accessibilità. Non dovrebbe essere mai necessaria per le normali applicazioni."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"richiesta di esplorazione al tocco"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Consente al titolare di richiedere una modalità di interazione con cui gli elementi toccati vengono descritti tramite output vocale e l\'interfaccia utente può essere esplorata tramite gesti."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"richiesta di accessibilità web migliorata"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Consente al titolare di richiedere l\'attivazione dei miglioramenti dell\'accessibilità web, ad esempio l\'installazione di script per rendere più accessibili i contenuti dell\'app."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"associazione a un servizio di testo"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Consente al titolare di collegarsi all\'interfaccia di primo livello di un servizio di testo (ad esempio SpellCheckerService). Non dovrebbe essere mai necessaria per le normali applicazioni."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"associazione a un servizio VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Riavvia"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"La pagina all\'indirizzo \"<xliff:g id="TITLE">%s</xliff:g>\" indica:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Conferma navigazione"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Abbandona questa pagina"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Rimani su questa pagina"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Vuoi abbandonare la pagina?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Conferma"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Suggerimento. Tocca due volte per aumentare e diminuire lo zoom."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Compilazione autom."</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 59b4f650f27b..69fd0e524b55 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"גש לכרטיס SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"תכונות נגישות"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"תכונות שטכנולוגיה מסייעת יכולה לבקש."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"אחזר תוכן של חלון"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"בדוק את התוכן של חלון שאיתו אתה מבצע אינטראקציה."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"הפעל את \'גילוי באמצעות מגע\'"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"פריטים שנגעת בהם ייאמרו בקול וניתן לנווט במסך באמצעות תנועות."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"הפעל גישה משופרת לאינטרנט"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"ייתכן שסקריפטים יותקנו על מנת להקל את הגישה אל תוכן של יישומים."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"הצג טקסט שאתה מקליד"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"כולל נתונים אישיים כמו מספרי כרטיס אשראי וסיסמאות."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"השבת או שנה את שורת המצב"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"מאפשר ליישום להשבית את שורת המצב או להוסיף ולהסיר סמלי מערכת."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"שורת מצב"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"מאפשר למשתמש לבצע איגוד לממשק ברמה עליונה של שיטת קלט. הרשאה זו לעולם אינה נחוצה ליישומים רגילים."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"הכפפה לשירות נגישות"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"מתיר לבעלים להכפיף לממשק ברמה העליונה של שירות זמינות. הרשאה זו אף פעם אינה אמורה להיות נחוצה ליישומים רגילים."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"בקשת גילוי באמצעות מגע"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"מאפשר לבעלים לבקש מצב אינטראקציה שבו נגיעה בפריטים מלווה בהשמעת התיאור שלהם ושניתן לחקור בו את ה-UI באמצעות מחוות."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"בקשת נגישות משופרת לאינטרנט"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"מאפשר לבעלים לבקש הפעלה של שיפורי נגישות לאינטרנט. לדוגמה, התקנת סקריפטים כדי להגביר את הנגישות של תוכן יישומים."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"הכפפה לשירות טקסט"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"מאפשר למשתמש ליצור איגוד לממשק הרמה העליונה של שירות טקסט (למשל, SpellCheckerService). הרשאה זו לעולם אינה נחוצה ליישומים רגילים."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"אגד לשירות VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"אתחל מחדש"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"בדף שבכתובת \'<xliff:g id="TITLE">%s</xliff:g>\' כתוב כך:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"אישור ניווט"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"צא מדף זה"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"הישאר בדף זה"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"האם אתה בטוח שברצונך לנווט אל מחוץ לדף זה?"</string>
<string name="save_password_label" msgid="6860261758665825069">"אשר"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"טיפ: הקש פעמיים כדי להגדיל ולהקטין."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"מילוי אוטומטי"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 4fafb6026bb2..cb03d2b0420c 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"SDカードにアクセスします。"</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"ユーザー補助機能"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"補助テクノロジーがリクエストできる機能です。"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ウィンドウコンテンツの取得"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ユーザーがアクセスしているウィンドウのコンテンツを検査します。"</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"タッチガイドの有効化"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"触れたアイテムが読み上げられ、ジェスチャーで画面のガイドを利用できます。"</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"ウェブアクセシビリティ拡張の有効化"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"アプリコンテンツのアクティビティをもっと向上させるためにスクリプトをインストールできます。"</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"入力テキストの監視"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"クレジットカードの番号やパスワードなどの個人データが含まれます。"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"ステータスバーの無効化や変更"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"ステータスバーの無効化、システムアイコンの追加や削除をアプリに許可します。"</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"ステータスバーへの表示"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"入力方法のトップレベルインターフェースにバインドすることを所有者に許可します。通常のアプリでは不要です。"</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"ユーザー補助サービスにバインド"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"ユーザー補助サービスのトップレベルインターフェースにバインドすることを所有者に許可します。通常のアプリでは不要です。"</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"タッチガイドのリクエスト"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"触れたアイテムが読み上げられ、ジェスチャーでユーザーインターフェースのガイドを利用できる操作モードをリクエストすることを所有者に許可します。"</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"ウェブアクセシビリティ拡張のリクエスト"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"ウェブアクセシビリティの拡張の有効化をリクエストすることを所有者に許可します。たとえば、アプリコンテンツのアクセシビリティをもっと向上させるためにスクリプトをインストールできます。"</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"テキストサービスにバインド"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"テキストサービス(SpellCheckerServiceなど)のトップレベルインターフェースにバインドすることを所有者に許可します。通常のアプリでは不要です。"</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"VPNサービスにバインド"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"再起動"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"<xliff:g id="TITLE">%s</xliff:g> のページ:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"ナビゲーションの確認"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"このページから移動"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"このページのまま"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"このページから移動してもよろしいですか?"</string>
<string name="save_password_label" msgid="6860261758665825069">"確認"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"ヒント: ダブルタップで拡大/縮小できます。"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"自動入力"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index df408806b85a..c199a3c1c871 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -155,8 +155,8 @@
<string name="global_action_lock" msgid="2844945191792119712">"화면 잠금"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"종료"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"버그 신고"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"버그 신고 받기"</string>
- <string name="bugreport_message" msgid="398447048750350456">"이렇게 하면 현재 기기 상태에 대한 정보를 수집하여 이메일 메시지로 전송합니다. 버그 신고를 시작하여 전송할 준비가 되려면 약간 시간이 걸립니다."</string>
+ <string name="bugreport_title" msgid="2667494803742548533">"버그 신고"</string>
+ <string name="bugreport_message" msgid="398447048750350456">"현재 기기 상태에 대한 정보를 수집하여 이메일 메시지로 전송합니다. 버그 신고를 시작하여 전송할 준비가 되려면 약간 시간이 걸립니다."</string>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"무음 모드"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"소리 꺼짐"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"소리 켜짐"</string>
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"SD 카드에 액세스합니다."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"접근성 기능"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"장애인 보조 기술이 요청할 수 있는 기능입니다."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"창 콘텐츠 검색"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"상호작용 중인 창의 콘텐츠를 검사합니다."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"터치하여 탐색 사용"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"항목을 터치하면 소리 내어 알려주며 제스처를 사용하여 화면을 탐색할 수 있습니다."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"향상된 웹 접근성 기능 사용"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"스크립트를 설치하여 앱 콘텐츠에 더 간편하게 액세스할 수 있습니다."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"입력하는 텍스트 살펴보기"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"신용카드 번호와 비밀번호 등의 개인 데이터를 포함합니다."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"상태 표시줄 사용 중지 또는 수정"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"앱이 상태 표시줄을 사용중지하거나 시스템 아이콘을 추가 및 제거할 수 있도록 허용합니다."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"상태 표시줄"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"권한을 가진 프로그램이 입력 방법에 대한 최상위 인터페이스를 사용하도록 허용합니다. 일반 앱에는 필요하지 않습니다."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"접근성 서비스와 연결"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"권한을 가진 프로그램이 접근성 서비스에 대한 최상위 인터페이스를 사용하도록 허용합니다. 일반 앱에는 필요하지 않습니다."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"\'터치하여 탐색\' 요청"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"권한을 가진 프로그램이 터치한 항목을 소리내어 말하고 제스처로 UI를 탐색할 수 있는 상호작용 모드를 요청할 수 있도록 허용합니다."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"웹 접근성 개선 요청"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"권한을 가진 프로그램이 웹 접근성 개선을 요청할 수 있도록 허용합니다. 예를 들어 스크립트를 설치하여 앱 콘텐츠에 더 간편하게 액세스할 수 있습니다."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"텍스트 서비스 연결"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"권한을 가진 프로그램이 텍스트 서비스(예: SpellCheckerService)에 대한 최상위 인터페이스를 사용하도록 허용합니다. 일반 앱에는 필요하지 않습니다."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"VPN 서비스와 연결"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"다시 부팅"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"\'<xliff:g id="TITLE">%s</xliff:g>\' 페이지 내용:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"자바스크립트"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"탐색 확인"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"이 페이지 닫기"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"이 페이지에 머무르기"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"다른 페이지로 이동하시겠습니까?"</string>
<string name="save_password_label" msgid="6860261758665825069">"확인"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"도움말: 확대/축소하려면 두 번 탭합니다."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"자동완성"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index ed317629ae94..3d2f2e6252a1 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Pasiekite SD kortelę."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Pritaikymo neįgaliesiems funkcijos"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Funkcijos, kurių užklausas gali teikti pagalbinė technologija."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Gauti lango turinį"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Tikrinti lango, su kuriuo sąveikaujate, turinį."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Įjungti „Naršyti paliečiant“"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Paliesti elementai bus ištariami garsiai. Be to, ekrane gali būti naršoma naudojant gestus."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Įjungti patobulintą žiniatinklio pasiekiamumą"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Gali būti įdiegti scenarijai, kad būtų lengviau pasiekti programų turinį."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Stebėti jūsų įvedamą tekstą"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Įtraukiami asmeniniai duomenys, pavyzdžiui, kredito kortelių numeriai ir slaptažodžiai."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"išjungti ar keisti būsenos juostą"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Leidžiama programai neleisti būsenos juostos arba pridėti ir pašalinti sistemos piktogramas."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"būsenos juosta"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Leidžiama savininką susaistyti su įvesties metodo aukščiausio lygio sąsaja. Įprastoms programoms to neturėtų prireikti."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"susisaistyti su pasiekiamumo paslauga"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Savininkui leidžiama susisaistyti su aukščiausio lygio pasiekiamumo paslaugos sąsaja. Įprastoms programoms to neturėtų prireikti."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"pateikti užklausą dėl naršymo palietus"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Leidžiama pateikti užklausą dėl sąveikos režimo, kuriam veikiant garsiai pasakomi paliesti elementai ir palietimu galima tyrinėti naudotojo sąsają."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"pateikti užklausą dėl patobulintos prieigos prie žiniatinklio"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Leidžiama pateikti užklausą dėl žiniatinklio pritaikymo neįgaliesiems patobulinimų įgalinimo. Pavyzdžiui, pateikti užklausą dėl scenarijų diegimo, kad programos turinys būtų geriau pritaikytas neįgaliesiems."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"priskirti teksto paslaugą"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Leidžiama savininkui priskirti aukščiausio lygio teksto paslaugos (pvz., „SpellCheckerService“) sąsają. Įprastoms programoms to neturėtų prireikti."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"susaistyti su VPN paslauga"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Pakartotinai įkelti"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Puslapyje šiuo adresu: <xliff:g id="TITLE">%s</xliff:g>, teigiama:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Patvirtinti išėjimą"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Išeiti iš šio puslapio"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Likti šiame puslapyje"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Tikrai norite išeiti iš šio puslapio?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Patvirtinti"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Patarimas: palieskite dukart, kad padidintumėte ar sumažintumėte mastelį."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Automatinis pildymas"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 3f3024232f4a..c7a19abccac3 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Piekļūstiet SD kartei."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Pieejamības funkcijas"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Funkcijas, kuras palīgtehnoloģija var pieprasīt."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Izgūt loga saturu."</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Skatīt tā loga saturu, ar kuru mijiedarbojaties."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktivizēt funkciju “Pārlūkot pieskaroties”."</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Tiks izrunāti to vienumu nosaukumi, kuriem pieskarsieties, un ekrānu varēsiet pārlūkot ar žestiem."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Ieslēgt uzlaboto tīmekļa pieejamību."</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Var tikt instalēti skripti, lai padarītu lietotņu saturu pieejamāku."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Skatīt ierakstīto tekstu."</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Ietver personas datus, piemēram, kredītkartes numurus un paroles."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"atspējot vai pārveidot statusa joslu"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Ļauj lietotnei atspējot statusa joslu vai pievienot un noņemt sistēmas ikonas."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"statusa josla"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Ļauj īpašniekam izveidot saiti ar ievades metodes augstākā līmeņa saskarni. Parastajām lietotnēm tas nekad nav nepieciešams."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"saistīt ar pieejamības pakalpojumu"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Ļauj īpašniekam izveidot saiti ar pieejamības pakalpojuma augšējā līmeņa saskarni. Parastajām lietotnēm šī atļauja nav nepieciešama."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"pieprasīt funkciju “Pārlūkot pieskaroties”"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Ļauj pieprasīt mijiedarbības režīmu. Izmantojot šo režīmu, vienumi, kuriem pieskaraties, tiek izrunāti skaļi, un lietotāja saskarni var pārlūkot ar žestiem."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"pieprasīt uzlabotu tīmekļa pieejamību"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Ļauj pieprasīt tīmekļa pieejamības uzlabojumu iespējošanu, piemēram, ļauj instalēt skriptus, lai padarītu lietotnes saturu pieejamāku."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"saistīt ar īsziņu pakalpojumu"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Ļauj īpašniekam veikt saistīšanu ar īsziņu pakalpojuma augstākā līmeņa saskarni (piem., SpellCheckerService). Parastajām lietotnēm tas nekad nav nepieciešams."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"saistīt ar VPN pakalpojumu"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Atsāknēt"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Lapā <xliff:g id="TITLE">%s</xliff:g> ir teikts:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Navigācijas apstiprināšana"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Pamest šo lapu"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Palikt šajā lapā"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Vai tiešām vēlaties pamest šo lapu?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Apstiprināt"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Padoms. Divreiz pieskarieties, lai tuvinātu un tālinātu."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Automātiskā aizpilde"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 5f49ed39ae35..157c1ec346aa 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Akses kad SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Ciri kebolehaksesan"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Ciri yang boleh diminta oleh teknologi bantuan."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Dapatkan kembali kandungan tetingkap"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Periksa kandungan tetingkap yang berinteraksi dengan anda."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Hidupkan Jelajah melalui Sentuhan"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Item yang disentuh akan disebut dengan kuat dan skrin boleh dijelajah menggunakan gerak isyarat."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Hidupkan kebolehcapaian web dipertingkat"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Skrip boleh dipasang untuk menjadikan kandungan apl lebih mudah diakses."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Perhatikan teks yang anda taip"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Berserta data peribadi seperti nombor kad kredit dan kata laluan."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"lumpuhkan atau ubah suai bar status"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Membenarkan apl melumpuhkan bar status atau menambah dan mengalih keluar ikon sistem."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"bar status"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi bagi kaedah input itu. Tidak sekali-kali diperlukan untuk apl biasa."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"terikat kepada perkhidmatan yang boleh diakses"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi bagi perkhidmatan yang boleh diakses. Tidak sekali-kali diperlukan untuk apl biasa."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"minta jelajah melalui sentuhan"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Membenarkan pengguna untuk meminta mod interaksi agar item yang disentuh disebut dengan kuat dan UI boleh dijelajahi melalui gerak isyarat."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"minta kebolehaksesan web dipertingkatkan"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Membenarkan pengguna untuk meminta mendayakan penambahbaikan kebolehaksesan web. Sebagai contoh, memasang skrip untuk menjadikan kandungan apl lebih mudah diakses."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"terikat kepada perkhidmatan teks"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Membenarkan pemegang mengikat kepada antara muka peringkat atasan perkhidmatan teks(mis. PerkhidmatanPenyemakEjaan). Tidak seharusnya diperlukan untuk apl biasa."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"terikat kepada perkhidmatan VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"But semula"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Halaman di \'<xliff:g id="TITLE">%s</xliff:g>\' berkata:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Sahkan Navigasi"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Tinggalkan Halaman ini"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Kekal di Halaman ini"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Adakah anda pasti anda mahu menavigasi keluar dari halaman ini?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Sahkan"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Petua: Ketik dua kali untuk mengezum masuk dan keluar."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Auto isi"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index a81f01754528..ad00570ae7c5 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Tilgang til minnekortet."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Tilgjengelighetsfunksjoner"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Funksjoner støttende teknologi kan be om."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Hent innholdet i vinduet"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspiser innholdet i et vindu du samhandler med."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Slå på for Berøringsutforsking"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Berørte elementer leses høyt, og skjermen kan utforskes ved hjelp av bevegelser."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Slå på forbedret nettilgjengelighet"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Skript kan installeres for å gjøre appinnhold mer tilgjengelig."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observer teksten du skriver inn"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Inkluderer personlige data, slik som kredittkortnumre og passord."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"deaktivere eller endre statusfeltet"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Lar appen deaktivere statusfeltet eller legge til og fjerne systemikoner."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"statusrad"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Lar innehaveren binde det øverste nivået av grensesnittet til en inndatametode. Skal aldri være nødvendig for normale apper."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"binde seg til en tilgjengelighetstjeneste"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Gir innehaveren tillatelse til å bindes til det øverste nivået av grensesnittet for en tilgjengelighetstjeneste. Skal aldri være nødvendig for vanlige apper."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"be om utforsking ved berøring"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Tillater brukeren å be om en interaksjonsmodus der berørte elementer sies høyt, og brukergrensesnittet kan utforskes med bevegelser."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"be om forbedret nettilgjengelighet"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Tillater brukeren å be om aktivering av forbedret nettilgjengelighet. Dette kan for eksempel være installasjon av skript for å gjøre appinnhold mer tilgjengelig."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"binde til en teksttjeneste"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Lar innehaveren binde seg til øverste grensesnittnivå for en teksttjeneste (f.eks. SpellCheckerService). Skal aldri være nødvendig for vanlige apper."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"binde deg til en VPN-tjeneste"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Omstart"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Siden på «<xliff:g id="TITLE">%s</xliff:g>» sier:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Bekreft navigasjon"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Forlat denne siden"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Bli værende på denne siden"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Er du sikker på at du vil navigere bort fra denne siden?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Bekreft"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Tips: Dobbelttrykk for å zoome inn og ut."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autofyll"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 0558096a383a..b676d1d76d84 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Toegang tot de SD-kaart."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Toegankelijkheidsfuncties"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Functies die kunnen worden aangevraagd door ondersteunende technologie."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Inhoud van vensters ophalen"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"De inhoud inspecteren van een venster waarmee u interactie heeft."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Verkennen via aanraking inschakelen"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Aangeraakte items worden hardop benoemd en het scherm kan worden verkend door middel van aanraking."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Verbeterde internettoegankelijkheid inschakelen"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Er kunnen scripts worden geïnstalleerd om app-inhoud toegankelijker te maken."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Tekst observeren die u typt"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Omvat persoonlijke gegevens zoals creditcardnummers en wachtwoorden."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"statusbalk uitschakelen of wijzigen"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Hiermee kan de app de statusbalk uitschakelen of systeempictogrammen toevoegen en verwijderen."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"statusbalk"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Hiermee kan de houder zich verbinden met de hoofdinterface van een invoermethode. Nooit vereist voor normale apps."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"koppelen aan een toegankelijkheidsservice"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Hiermee wordt de houder toegestaan verbinding te maken met de hoofdinterface van een toegankelijkheidsservice. Nooit vereist voor normale apps."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"verkennen via aanraking aanvragen"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Hiermee kan de houder een interactiemodus aanvragen waarin aangeraakte items worden uitgesproken en de gebruikersinterface kan worden bediend met gebaren."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"verbeterde internettoegankelijkheid aanvragen"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Hiermee kan de houder het inschakelen van verbeteringen voor internettoegankelijkheid aanvragen. Bijvoorbeeld scripts installeren om app-inhoud toegankelijker te maken."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"koppelen aan een sms-service"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Hiermee kan de gebruiker koppelen met de hoofdinterface van een tekstservice (zoals SpellCheckerService). Dit is niet nodig voor normale apps."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"koppelen aan een VPN-service"</string>
@@ -778,7 +782,7 @@
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Juist!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Opnieuw proberen"</string>
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Nogmaals proberen"</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Maximaal aantal pogingen voor Face Unlock overschreden"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Maximaal aantal pogingen voor Ontgrendelen via gezichtsherkenning overschreden"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Opladen, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_charged" msgid="321635745684060624">"Opgeladen"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -844,7 +848,7 @@
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Ontgrendelingsgebied uitvouwen."</string>
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Ontgrendeling via schuiven."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ontgrendeling via patroon."</string>
- <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Ontgrendeling via gezichtsherkenning."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Ontgrendelen via gezichtsherkenning"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Ontgrendeling via pincode."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Ontgrendeling via wachtwoord."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Tekengebied voor patroon."</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Opnieuw opstarten"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"De pagina op \'<xliff:g id="TITLE">%s</xliff:g>\' meldt het volgende:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Navigatie bevestigen"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Deze pagina verlaten"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Op deze pagina blijven"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Weet u zeker dat u deze pagina wilt verlaten?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Bevestigen"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Tip: dubbeltik om in en uit te zoomen."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autom. aanvullen"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 2fa77a94f35f..6a27b5c0aa0f 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Dostęp do karty SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Funkcje ułatwień dostępu"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Funkcje, których może zażądać technologia ułatwień dostępu."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pobierz zawartość okna"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Sprawdzanie zawartości okna, z którego korzystasz."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Włącz czytanie dotykiem"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Klikane elementy będą wymawiane na głos, a ekran można przeglądać, używając gestów."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Włącz ułatwienia dostępu w internecie"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Można zainstalować skrypty, by zawartość aplikacji była łatwiej dostępna."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Obserwuj wpisywany tekst"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Obejmuje informacje osobiste, takie jak numery kart kredytowych i hasła."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"wyłączanie lub zmienianie paska stanu"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Pozwala aplikacji na wyłączanie paska stanu oraz dodawanie i usuwanie ikon systemowych."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"pasek stanu"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Pozwala na powiązanie wybranego sposobu wprowadzania tekstu z interfejsem najwyższego poziomu. To uprawnienie nie powinno być nigdy wymagane przez zwykłe aplikacje."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"tworzenie powiązania z usługą ułatwień dostępu"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Zezwala na tworzenie powiązania z interfejsem najwyższego poziomu usługi ułatwień dostępu. Nieprzeznaczone dla zwykłych aplikacji."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"żądanie dotyczące czytania dotykiem"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Pozwala właścicielowi zażądać włączenia trybu interaktywnego, w którym nazwy klikniętych elementów są wypowiadane na głos, a po interfejsie można poruszać się gestami."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"żądanie dotyczące dodatkowych ułatwień dostępu w internecie"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Pozwala właścicielowi zażądać włączenia internetowych funkcji ułatwień dostępu. Może to być np. zainstalowanie skryptów, które sprawią, że treść aplikacji będzie łatwiej dostępna."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"tworzenie powiązania z usługą tekstową"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Pozwala na tworzenie powiązania z interfejsem najwyższego poziomu usługi tekstowej (np. SpellCheckerService). Nie powinno być nigdy potrzebne w przypadku zwykłych aplikacji."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"tworzenie powiązania z usługą VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Uruchom ponownie"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Komunikat ze strony pod adresem „<xliff:g id="TITLE">%s</xliff:g>”:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Potwierdź przejście"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Opuść tę stronę"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Pozostań na tej stronie"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Czy na pewno chcesz opuścić tę stronę?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Potwierdź"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Wskazówka: dotknij dwukrotnie, aby powiększyć lub pomniejszyć."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autouzupełnianie"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index edb34147c8ee..6bff07f97f93 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -36,9 +36,9 @@
<string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
<string name="mmiError" msgid="5154499457739052907">"Problema de ligação ou código MMI inválido."</string>
<string name="mmiFdnError" msgid="5224398216385316471">"A operação está restringida a números fixos autorizados."</string>
- <string name="serviceEnabled" msgid="8147278346414714315">"O serviço foi activado."</string>
- <string name="serviceEnabledFor" msgid="6856228140453471041">"O serviço foi activado para:"</string>
- <string name="serviceDisabled" msgid="1937553226592516411">"O serviço foi desactivado."</string>
+ <string name="serviceEnabled" msgid="8147278346414714315">"O serviço foi ativado."</string>
+ <string name="serviceEnabledFor" msgid="6856228140453471041">"O serviço foi ativado para:"</string>
+ <string name="serviceDisabled" msgid="1937553226592516411">"O serviço foi desativado."</string>
<string name="serviceRegistered" msgid="6275019082598102493">"O registo foi bem sucedido."</string>
<string name="serviceErased" msgid="1288584695297200972">"A eliminação foi bem sucedida."</string>
<string name="passwordIncorrect" msgid="7612208839450128715">"Palavra-passe incorrecta."</string>
@@ -88,8 +88,8 @@
<string name="serviceClassDataSync" msgid="7530000519646054776">"Sincronização"</string>
<string name="serviceClassPacket" msgid="6991006557993423453">"Pacote"</string>
<string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string>
- <string name="roamingText0" msgid="7170335472198694945">"Indicador de Roaming activado"</string>
- <string name="roamingText1" msgid="5314861519752538922">"Indicador de Roaming desactivado"</string>
+ <string name="roamingText0" msgid="7170335472198694945">"Indicador de Roaming ativado"</string>
+ <string name="roamingText1" msgid="5314861519752538922">"Indicador de Roaming desativado"</string>
<string name="roamingText2" msgid="8969929049081268115">"Indicador de Roaming intermitente"</string>
<string name="roamingText3" msgid="5148255027043943317">"Fora da Vizinhança"</string>
<string name="roamingText4" msgid="8808456682550796530">"No Exterior"</string>
@@ -158,11 +158,11 @@
<string name="bugreport_title" msgid="2667494803742548533">"Criar Rel. Erro"</string>
<string name="bugreport_message" msgid="398447048750350456">"Será recolhida informação sobre o estado atual do seu dispositivo a enviar através de uma mensagem de email. Demorará algum tempo até que o relatório de erro esteja pronto para ser enviado. Aguarde um pouco."</string>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Modo silencioso"</string>
- <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Som desactivado"</string>
- <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"O som está activado"</string>
+ <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Som desativado"</string>
+ <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"O som está ativado"</string>
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo de avião"</string>
- <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"O modo de voo está activado"</string>
- <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"O modo de voo está desactivado"</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"O modo de voo está ativado"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"O modo de voo está desativado"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Aceder ao cartão SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Funcionalidades de acessibilidade"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Funcionalidades que a tecnologia de apoio pode solicitar."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Obter conteúdo da janela"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecionar o conteúdo de uma janela com a qual está a interagir."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ativar Explorar Através do Toque"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Os itens em que tocar serão pronunciados em voz alta e o ecrã poderá ser explorado através de toques."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Ativar a acessibilidade Web melhorada"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Poderão ser instalados scripts para tornar o conteúdo da aplicação mais acessível."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observar o texto que escreve"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Inclui dados pessoais, como números de cartões de crédito e palavras-passe."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"desactivar ou modificar barra de estado"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Permite à aplicação desativar a barra de estado ou adicionar e remover ícones do sistema."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"barra de estado"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Permite ao titular vincular-se à interface de nível superior de um método de entrada. Nunca deve ser necessário para aplicações normais."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"vincular a um serviço de acessibilidade"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permite que o titular vincule a interface de nível superior de um serviço de acessibilidade. Nunca deverá ser necessário para aplicações normais."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"solicitar exploração por toque"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Permite ao Hoder solicitar um modo de interação em que os itens tocados são falados em voz alta e a IU pode ser explorada através de gestos."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"solicitar acessibilidade Web melhorada"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Permite ao Hoder solicitar a ativação de melhoramentos de acessibilidade Web. Por exemplo, a instalação de scripts do Google para tornar o conteúdo das aplicações mais acessível."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"vincular a um serviço de texto"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Permite ao titular ligar-se à interface de nível superior de um serviço de texto (por exemplo SpellCheckerService). Nunca deverá ser necessário para aplicações normais."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"vincular a um serviço VPN"</string>
@@ -822,8 +826,8 @@
<string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"Esqueceu-se do nome de utilizador ou da palavra-passe?"\n"Visite "<b>"google.com/accounts/recovery"</b>"."</string>
<string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"A verificar…"</string>
<string name="lockscreen_unlock_label" msgid="737440483220667054">"Desbloquear"</string>
- <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Som activado"</string>
- <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Som desactivado"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Som ativado"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Som desativado"</string>
<string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Sequência iniciada"</string>
<string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Sequência apagada"</string>
<string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Célula adicionada"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Reiniciar"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"A página em \"<xliff:g id="TITLE">%s</xliff:g>\" indica:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Confirmar Navegação"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Sair desta Página"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Permanecer nesta Página"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Tem a certeza de que pretende navegar para outra página?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Confirmar"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Sugestão: toque duas vezes para aumentar ou diminuir o zoom."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Preenchimento Automático"</string>
@@ -1065,7 +1065,7 @@
<string name="no" msgid="5141531044935541497">"Cancelar"</string>
<string name="dialog_alert_title" msgid="2049658708609043103">"Atenção"</string>
<string name="loading" msgid="7933681260296021180">"A carregar…"</string>
- <string name="capital_on" msgid="1544682755514494298">"Activado"</string>
+ <string name="capital_on" msgid="1544682755514494298">"Ativado"</string>
<string name="capital_off" msgid="6815870386972805832">"Desactivar"</string>
<string name="whichApplication" msgid="4533185947064773386">"Concluir ação utilizando"</string>
<string name="alwaysUse" msgid="4583018368000610438">"Utilizar por predefinição para esta acção."</string>
@@ -1289,7 +1289,7 @@
<string name="no_file_chosen" msgid="6363648562170759465">"Não foi selecionado nenhum ficheiro"</string>
<string name="reset" msgid="2448168080964209908">"Repor"</string>
<string name="submit" msgid="1602335572089911941">"Enviar"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Modo automóvel activado"</string>
+ <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Modo automóvel ativado"</string>
<string name="car_mode_disable_notification_message" msgid="8035230537563503262">"Toque para sair do modo automóvel."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Ligação ponto a ponto ou hotspot activos"</string>
<string name="tethered_notification_message" msgid="6857031760103062982">"Toque para configurar."</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 184f704bc937..86ddcacf0f1e 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Acessar o cartão SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Recursos de acessibilidade"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Recursos que a tecnologia assistencial pode solicitar."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar conteúdo da janela"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecionar o conteúdo da janela com a qual você está interagindo."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ativar Explorar por toque"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Itens tocados serão falados em voz alta e a tela poderá ser explorada por meio de gestos."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Ativar acessibilidade na Web aprimorada"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Scripts podem ser instalados para tornar o conteúdo do aplicativo mais acessível."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observar o texto digitado"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Inclui dados pessoais, como números de cartão de crédito e senhas."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"desativar ou modificar a barra de status"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Permite que o aplicativo desative a barra de status ou adicione e remova ícones do sistema."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"barra de status"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Permite que o proprietário utilize a interface de nível superior de um método de entrada. Nunca deve ser necessário para aplicativos normais."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"usar um serviço de acessibilidade"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permite que o proprietário use a interface de nível superior de um serviço de acessibilidade. Nunca deve ser necessário para aplicativos comuns."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"solicitar explorar por toque"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Permite ao proprietário solicitar um modo de interação em que os itens tocados são falados em voz alta e a interface do usuário pode ser explorada com gestos."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"solicitar acessibilidade melhorada da Web"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Permite ao proprietário solicitar melhorias na acessibilidade da Web. Por exemplo, a instalação de scripts para tornar o conteúdo de aplicativos mais acessível."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"sujeitar-se a um serviço de texto"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Permite que o proprietário utilize interface de nível superior de um serviço de texto (por exemplo, SpellCheckerService). Nunca deve ser necessário para aplicativos normais."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"se ligam a um serviço de VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Reiniciar"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"A página em \"<xliff:g id="TITLE">%s</xliff:g>\" diz:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Confirmar navegação"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Sair desta página"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Permanecer nesta página"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Tem certeza de que deseja sair desta página?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Confirmar"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Dica: toque duas vezes para aumentar e diminuir o zoom."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Preench. aut."</string>
diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml
index 7d1037791d48..ff24697b2106 100644
--- a/core/res/res/values-rm/strings.xml
+++ b/core/res/res/values-rm/strings.xml
@@ -318,6 +318,22 @@
<skip />
<!-- no translation found for permgroupdesc_accessibilityFeatures (4205196881678144335) -->
<skip />
+ <!-- no translation found for capability_title_canRetrieveWindowContent (3901717936930170320) -->
+ <skip />
+ <!-- no translation found for capability_desc_canRetrieveWindowContent (3772225008605310672) -->
+ <skip />
+ <!-- no translation found for capability_title_canRequestTouchExploration (3108723364676667320) -->
+ <skip />
+ <!-- no translation found for capability_desc_canRequestTouchExploration (5800552516779249356) -->
+ <skip />
+ <!-- no translation found for capability_title_canRequestEnhancedWebAccessibility (1739881766522594073) -->
+ <skip />
+ <!-- no translation found for capability_desc_canRequestEnhancedWebAccessibility (7881063961507511765) -->
+ <skip />
+ <!-- no translation found for capability_title_canRequestFilterKeyEvents (2103440391902412174) -->
+ <skip />
+ <!-- no translation found for capability_desc_canRequestFilterKeyEvents (7463135292204152818) -->
+ <skip />
<string name="permlab_statusBar" msgid="7417192629601890791">"deactivar u modifitgar la trav da status"</string>
<!-- no translation found for permdesc_statusBar (8434669549504290975) -->
<skip />
@@ -537,14 +553,6 @@
<skip />
<!-- no translation found for permdesc_bindAccessibilityService (7034615928609331368) -->
<skip />
- <!-- no translation found for permlab_canRequestTouchExplorationMode (6094034289937541846) -->
- <skip />
- <!-- no translation found for permdesc_canRequestTouchExplorationMode (940314268922270663) -->
- <skip />
- <!-- no translation found for permlab_canRequestEnahncedWebAccessibility (1905232971331801453) -->
- <skip />
- <!-- no translation found for permdesc_canRequestEnahncedWebAccessibility (4500520989321729676) -->
- <skip />
<!-- no translation found for permlab_bindTextService (7358378401915287938) -->
<skip />
<!-- no translation found for permdesc_bindTextService (8151968910973998670) -->
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index bad144052024..0ac05debaa65 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Accesează cardul SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Funcții de accesibilitate"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Funcții pe care tehnologia de asistare le poate solicita."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperați conținutul ferestrei"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspectează conținutul unei ferestre cu care interacționați."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activați funcția Explorați prin atingere"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Elementele atinse vor fi rostite cu voce tare, iar ecranul poate fi explorat utilizând gesturi."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Activați accesibilitatea web îmbunătățită"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Pot fi instalate scripturi pentru a face conținutul aplicațiilor mai accesibil."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Remarcă textul pe care îl introduceți"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Include date personale, cum ar fi numere ale cardurilor de credit sau parole."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"dezactivare sau modificare bare de stare"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Permite aplicaţiei să dezactiveze bara de stare sau să adauge şi să elimine pictograme de sistem."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"bară de stare"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Permite proprietarului să se conecteze la interfaţa de nivel superior a unei metode de introducere. Nu ar trebui să fie niciodată necesară pentru aplicaţiile obişnuite."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"conectare la un serviciu de accesibilitate"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permite proprietarului să se conecteze la interfaţa de nivel superior a unui serviciu de accesibilitate. Nu ar trebui să fie niciodată necesară pentru aplicaţiile obişnuite."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"solicitare de explorare prin atingere"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Permite proprietarului să solicite un mod de interacțiune în care elementele atinse sunt rostite cu voce tare, iar interfața de utilizare poate fi explorată prin gesturi."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"solicitare de accesibilitate mai bună la internet"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Permite proprietarului să solicite activarea îmbunătățirilor accesibilității web. De exemplu, instalarea unor scripturi pentru a mări accesibilitatea conținutului aplicațiilor."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"conectare la un serviciu text"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Permite proprietarului să se conecteze la o interfaţă de nivel superior a unui serviciu text (de ex., SpellCheckerService). Nu ar trebui să fie niciodată necesară pentru aplicaţiile obişnuite."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"conectare la un serviciu VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Reporniţi"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"La pagina de la „<xliff:g id="TITLE">%s</xliff:g>” apare:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Confirmați părăsirea paginii"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Părăsiți această pagină"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Rămâneți în această pagină"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Sigur doriți să părăsiți această pagină?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Confirmaţi"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Sfat: măriţi şi micşoraţi prin dublă atingere."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Automat"</string>
@@ -1065,8 +1065,8 @@
<string name="no" msgid="5141531044935541497">"Anulaţi"</string>
<string name="dialog_alert_title" msgid="2049658708609043103">"Atenţie"</string>
<string name="loading" msgid="7933681260296021180">"Se încarcă…"</string>
- <string name="capital_on" msgid="1544682755514494298">"ACTIVAT"</string>
- <string name="capital_off" msgid="6815870386972805832">"DEZACTIVAT"</string>
+ <string name="capital_on" msgid="1544682755514494298">"DA"</string>
+ <string name="capital_off" msgid="6815870386972805832">"NU"</string>
<string name="whichApplication" msgid="4533185947064773386">"Finalizare acţiune utilizând"</string>
<string name="alwaysUse" msgid="4583018368000610438">"Se utilizează în mod prestabilit pentru această acţiune."</string>
<string name="clearDefaultHintMsg" msgid="3252584689512077257">"Ștergeţi setările prestabilite din Setări de sistem &gt; Aplicaţii &gt; Descărcate."</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index d9bf3e2cfb14..82369fd5d0e7 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Доступ к SD-карте."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Специальные возможности"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Специальные возможности, которые можно запрашивать"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Читать содержимое окна."</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Распознавать содержимое окна, в котором вы находитесь."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Включать изучение касанием."</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Озвучивать нажимаемые элементы и разрешать управление устройством с помощью жестов."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Включать дополнительные возможности для работы в Интернете."</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"При необходимости устанавливать скрипты, чтобы получить больше специальных возможностей."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Следить за тем, что вы печатаете."</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Фильтровать личные данные, например номера кредитных карт и пароли."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"отключать или изменять строку состояния"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Приложение сможет отключать строку состояния, а также добавлять и удалять системные значки."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"строка состояния"</string>
@@ -329,29 +337,25 @@
<string name="permdesc_backup" msgid="6912230525140589891">"Приложение сможет управлять механизмами резервного копирования и восстановления системы. Это разрешение не используется обычными приложениями."</string>
<string name="permlab_confirm_full_backup" msgid="5557071325804469102">"подтверждать полное резервное копирование или восстановление"</string>
<string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"Приложение сможет отображать окно подтверждения полного резервного копирования. Это разрешение не предназначено для всех приложений."</string>
- <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"показывать неавторизованные окна"</string>
+ <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"Неавторизованное открытие окон"</string>
<string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"Приложение сможет создавать окна для интерфейса внутренней системы. Это разрешение не используется обычными приложениями."</string>
<string name="permlab_systemAlertWindow" msgid="3543347980839518613">"Показ элементов интерфейса поверх других окон"</string>
<string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Разрешает приложению отображать элементы своего интерфейса поверх окон других программ. Это может мешать вашему взаимодействию с другими приложениями и вести к недоразумениям."</string>
- <string name="permlab_setAnimationScale" msgid="2805103241153907174">"изменять глобальную скорость анимации"</string>
+ <string name="permlab_setAnimationScale" msgid="2805103241153907174">"Изменение глобальной скорости анимации"</string>
<string name="permdesc_setAnimationScale" msgid="7690063428924343571">"Приложение сможет в любой момент изменить общую скорость анимации."</string>
<string name="permlab_manageAppTokens" msgid="1286505717050121370">"управление токенами приложений"</string>
<string name="permdesc_manageAppTokens" msgid="8043431713014395671">"Приложение сможет создавать собственные токены и управлять ими в обход обычной Z-последовательности. Это разрешение не используется обычными приложениями."</string>
<string name="permlab_freezeScreen" msgid="4708181184441880175">"замораживать изображение"</string>
<string name="permdesc_freezeScreen" msgid="8558923789222670064">"Приложение сможет приостанавливать изображение на время перехода в полноэкранный режим."</string>
- <string name="permlab_injectEvents" msgid="1378746584023586600">"отрабатывать нажатия клавиш и кнопок управления"</string>
+ <string name="permlab_injectEvents" msgid="1378746584023586600">"Использование клавиш и кнопок управления"</string>
<string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"Приложение сможет передавать собственные входные события (нажатия клавиш и пр.) другим программам. Вредоносные программы смогут таким образом перехватить управление планшетным ПК."</string>
<string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"Приложение сможет передавать собственные входные события (нажатия клавиш и пр.) другим программам. Вредоносные программы смогут таким образом перехватить управление телефоном."</string>
- <string name="permlab_readInputState" msgid="469428900041249234">"записывать вводимый текст и совершаемые действия"</string>
+ <string name="permlab_readInputState" msgid="469428900041249234">"Запись вводимого текста и совершаемых действий"</string>
<string name="permdesc_readInputState" msgid="8387754901688728043">"Приложение сможет отслеживать нажатие пользователем клавиш даже при работе с другими программами (например, при вводе пароля). Это разрешение не используется обычными приложениями."</string>
<string name="permlab_bindInputMethod" msgid="3360064620230515776">"связывать с методом ввода"</string>
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Приложение сможет подключаться к базовому интерфейсу системы ввода. Это разрешение не используется обычными приложениями."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"подключаться к службе спецвозможностей"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Приложение сможет подключаться к базовому интерфейсу службы специальных возможностей. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"запрашивать функцию \"Изучение касанием\""</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Владелец устройства сможет запрашивать включение режима \"Изучение касанием\", чтобы названия элементов управления озвучивались."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"запрашивать установку веб-скриптов"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Владелец устройства сможет запрашивать установку скриптов для повышения доступности веб-контента."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"привязка к службе текстовых сообщений"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Позволяет подключаться к базовому интерфейсу службы текстовых сообщений (например, SpellCheckerService). Это разрешение не используется обычными приложениями."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"подключаться к VPN-службе"</string>
@@ -442,7 +446,7 @@
<string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"Приложение сможет добавлять, удалять и изменять мероприятия, доступные для редактирования на вашем телефоне, включая мероприятия, добавленные другими людьми. Так приложение сможет рассылать сообщения от имени владельца календаря и изменять мероприятия без его ведома."</string>
<string name="permlab_accessMockLocation" msgid="8688334974036823330">"Установка фиктивного местоположения для отладки"</string>
<string name="permdesc_accessMockLocation" msgid="5808711039482051824">"Приложение сможет создавать фиктивные местоположения для тестирования или установки нового источника геоданных и переопределять местоположение и/или статус, возвращаемые другими источниками, такими как система GPS."</string>
- <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"получать доступ к дополнительным командам источника данных о местоположении"</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"Доступ к дополнительным командам управления источниками геоданных"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"Приложение получит доступ к дополнительным командам управления источниками геоданных и сможет вмешиваться в работу системы GPS или других источников геоданных."</string>
<string name="permlab_installLocationProvider" msgid="6578101199825193873">"разрешение на установку поставщика местоположения"</string>
<string name="permdesc_installLocationProvider" msgid="9066146120470591509">"Приложение сможет создавать фиктивные местоположения для тестирования или установки нового источника геоданных и переопределять местоположение и/или статус, возвращаемые другими источниками, такими как система GPS или службы геопозиционирования."</string>
@@ -450,9 +454,9 @@
<string name="permdesc_accessFineLocation" msgid="5295047563564981250">"Разрешает приложению получать данные о вашем точном местоположении с помощью глобального позиционирования (GPS), вышек сотовой связи и точек доступа Wi-Fi. Эти службы должны быть включены на устройстве, а приложению должно быть разрешено их использовать. Это может вести к дополнительному расходу заряда батареи."</string>
<string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"примерное местоположение (на основе сети)"</string>
<string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"Разрешает приложению получать данные о вашем примерном местоположении с помощью служб определения местоположения, вышек сотовой связи и точек доступа Wi-Fi. Эти службы должны быть включены на устройстве, а приложению должно быть разрешено их использовать."</string>
- <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"получать доступ к SurfaceFlinger"</string>
+ <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"Доступ к SurfaceFlinger"</string>
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Приложение сможет использовать низкоуровневые функции SurfaceFlinger."</string>
- <string name="permlab_readFrameBuffer" msgid="6690504248178498136">"считывать буфер фреймов"</string>
+ <string name="permlab_readFrameBuffer" msgid="6690504248178498136">"Чтение данных в буфере кадров"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Приложение сможет считывать содержание буфера фреймов."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"настраивать экраны, подключенные через Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Приложение сможет подключаться к экранам с помощью Wi-Fi и настраивать их."</string>
@@ -465,7 +469,7 @@
<string name="permlab_camera" msgid="3616391919559751192">"Фото- и видеосъемка"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Приложение сможет снимать фотографии и видеоролики с помощью камеры в любое время без вашего разрешения."</string>
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"отключить планшетный ПК навсегда"</string>
- <string name="permlab_brick" product="default" msgid="8337817093326370537">"отключать телефон"</string>
+ <string name="permlab_brick" product="default" msgid="8337817093326370537">"Отключение телефона"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Приложение сможет отключить все функции планшетного ПК. Это очень опасно."</string>
<string name="permdesc_brick" product="default" msgid="5788903297627283099">"Приложение сможет отключить все функции телефона. Это очень опасно."</string>
<string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"принудительно перезагружать планшетный ПК"</string>
@@ -496,7 +500,7 @@
<string name="permdesc_manageUsb" msgid="7776155430218239833">"Приложение сможет управлять настройками и разрешениями для USB-устройств."</string>
<string name="permlab_accessMtp" msgid="4953468676795917042">"Реализовать протокол MTP"</string>
<string name="permdesc_accessMtp" msgid="6532961200486791570">"Разрешает доступ к драйверу основного устройства MTP для реализации протокола MTP USB"</string>
- <string name="permlab_hardware_test" msgid="4148290860400659146">"проверять аппаратное обеспечение"</string>
+ <string name="permlab_hardware_test" msgid="4148290860400659146">"Проверка аппаратного обеспечения"</string>
<string name="permdesc_hardware_test" msgid="6597964191208016605">"Приложение сможет управлять различными периферийными устройствами для проверки аппаратного обеспечения."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"Осуществление телефонных вызовов"</string>
<string name="permdesc_callPhone" msgid="3740797576113760827">"Приложение сможет без вашего участия звонить на любой номер телефона. Это не относится к номерам экстренных служб. Вредоносные программы смогут совершать вызовы без вашего разрешения, что может привести к непредвиденным расходам."</string>
@@ -523,7 +527,7 @@
<string name="permlab_devicePower" product="default" msgid="4928622470980943206">"включать и выключать питание телефона"</string>
<string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"Приложение сможет включать и выключать планшетный ПК."</string>
<string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"Приложение сможет включать и выключать телефон."</string>
- <string name="permlab_factoryTest" msgid="3715225492696416187">"запустить в тестовом режиме"</string>
+ <string name="permlab_factoryTest" msgid="3715225492696416187">"Включение тестового режима"</string>
<string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Выполнять стандартную проверку нижнего уровня, обеспечивающую полный доступ к аппаратному обеспечению планшетного ПК. Доступно только в режиме стандартной проверки."</string>
<string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Выполнить стандартную проверку нижнего уровня, обеспечивающую полный доступ к аппаратному обеспечению телефона. Доступно, только в режиме стандартной проверки."</string>
<string name="permlab_setWallpaper" msgid="6627192333373465143">"Установка обоев"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Перезагрузка"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Подтвердите действие на <xliff:g id="TITLE">%s</xliff:g>"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Подтверждение действия"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Покинуть"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Остаться"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Покинуть эту страницу?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Подтвердите"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Совет: нажмите дважды, чтобы увеличить и уменьшить масштаб."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Автозаполнение"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index caedb22bb371..c270eb384136 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Prístup na kartu SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Funkcie zjednodušenia ovládania"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Funkcie, ktoré môže vyžadovať nápomocná technológia."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Načítať obsah okna"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Preskúmať obsah okna s ktorým interagujete."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Zapnúť funkciu Preskúmanie dotykom"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Po dotyku na položku sa vysloví jej názov a obrazovku je možné preskúmať pomocou gest."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Zapnúť vylepšenú dostupnosť na webe"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Môže nainštalovať skripty na sprístupnenie obsahu aplikácie."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Sledovať vami zadávaný text"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Obsahuje osobné údaje ako sú čísla kreditných kariet a heslá."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"zakázanie alebo zmeny stavového riadka"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Umožňuje aplikácii vypnúť stavový riadok alebo pridať a odstrániť systémové ikony."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"stavový riadok"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania metódy vstupu. Bežné aplikácie by toto nastavenie nemali nikdy potrebovať."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"viazať na službu zjednodušeného ovládania"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania služby zjednodušeného ovládania. Bežné aplikácie by toto nastavenie nemali nikdy potrebovať."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"vyžiadať preskúmanie dotykom"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Držiteľovi umožňuje požiadať o interaktívny režim, v ktorom aplikácia reaguje na dotyky položiek vyslovením ich názvu a v ktorom môže používateľ preskúmať používateľské rozhranie pomocou gest."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"vyžiadať zlepšenie dostupnosti webu"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Držiteľovi umožňuje, aby vyžiadal povolenie vylepšení prístupu k webu, napríklad inštaláciu skriptov, ktoré uľahčujú prístup k obsahu aplikácie."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"väzba na textovú službu"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania textovej služby (napr. SpellCheckerService). Bežné aplikácie by toto nastavenie nemali nikdy potrebovať."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"Zaviazať k službe VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Reštartovať"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Stránka „<xliff:g id="TITLE">%s</xliff:g>“ uvádza:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Potvrďte prechod"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Opustiť stránku"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Zostať na tejto strane"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Naozaj chcete túto stránku opustiť?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Potvrdiť"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Tip: Dvojitým klepnutím môžete zobrazenie priblížiť alebo oddialiť."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Aut.dop."</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 64df43371dbf..eb97c9f10307 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -145,7 +145,7 @@
<string name="shutdown_progress" msgid="2281079257329981203">"Se zaustavlja ..."</string>
<string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tablični računalnik se bo zaustavil."</string>
<string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefon bo zaustavljen."</string>
- <string name="shutdown_confirm_question" msgid="2906544768881136183">"Ali želite izklopiti telefon?"</string>
+ <string name="shutdown_confirm_question" msgid="2906544768881136183">"Ali želite izklopiti napravo?"</string>
<string name="reboot_safemode_title" msgid="7054509914500140361">"Vnovičen zagon v varnem načinu"</string>
<string name="reboot_safemode_confirm" msgid="55293944502784668">"Ali želite znova zagnati v varnem načinu? S tem onemogočite vse nameščene aplikacije drugih ponudnikov. Obnovljene bodo pri naslednjem vnovičnem zagonu."</string>
<string name="recent_tasks_title" msgid="3691764623638127888">"Nedavno"</string>
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Dostop do kartice SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Funkcije za ljudi s posebnimi potrebami"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Funkcije, ki jih lahko zahteva tehnologija za ljudi s posebnimi potrebami."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pridobivanje vsebine okna"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Preverite vsebino okna, ki ga uporabljate."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Vklop raziskovanja z dotikom"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Elementi, ki se jih dotaknete, bodo izrečeni naglas, zaslon pa lahko raziskujete s potezami."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Vklop izboljšanja dostopnosti spleta za ljudi s posebnimi potrebami"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Za boljšo dostopnost vsebine aplikacije je mogoče namestiti skripte."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Opazovanje besedila, ki ga natipkate"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Vključuje osebne podatke, kot so številke kreditnih kartic in gesla."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"onemogočanje ali spreminjanje vrstice stanja"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Programom omogoča onemogočenje vrstice stanja ali dodajanje in odstranjevanje ikon sistema."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"vrstica stanja"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Lastniku omogoča, da se poveže z vmesnikom načina vnosa najvišje ravni. Tega nikoli ni treba uporabiti za navadne programe."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"povezovanje s storitvijo za ljudi s posebnimi potrebami"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Lastniku omogoča povezovanje z vmesnikom najvišje ravni storitve za ljudi s posebnimi potrebami. Tega nikoli ni treba uporabiti za navadne aplikacije."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"zahteva za raziskovanje z dotikom"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Imetniku dovoli, da zahteva interaktivni način delovanja, v katerem se dotaknjene možnosti izgovorijo na glas in je mogoče uporabniški vmesnik raziskati s potezami."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"zahteva za izboljšano spletno dostopnost"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Imetniku dovoli, da zahteva omogočanje izboljšav spletne dostopnosti, na primer namestitev skriptov, ki naredijo vsebino aplikacije dostopnejšo."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"poveži z besedilno storitvijo"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Dovoljuje, da se lastnik poveže z vmesnikom besedilne storitve najvišje ravni (npr. SpellCheckerService). Tega nikoli ni treba uporabiti za navadne programe."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"povezava s storitvijo navideznega zasebnega omrežja"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Znova zaženi"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Na strani na »<xliff:g id="TITLE">%s</xliff:g>« piše:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Potrditev krmarjenja"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Zapusti to stran"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Ostani na tej strani"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Ali res želite zapustiti to stran?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Potrdi"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Nasvet: Tapnite dvakrat, če želite povečati ali pomanjšati."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Samoizp."</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index ec0384cc7316..6a244a84fdfd 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Приступ SD картици."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Функције приступачности"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Функције које технологија за помоћ може да захтева."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Преузимање садржаја прозора"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Проверава садржај прозора са којим остварујете интеракцију."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Укључивање Истраживања додиром"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Ставке које додирнете ће бити изговорене, а можете да се крећете по екрану покретима."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Укључивање побољшане приступачности веба"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Могу да се инсталирају скрипте да би садржај апликација био приступачнији."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Праћење текста који уносите"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Обухвата личне податке као што су бројеви кредитних картица и лозинке."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"онемогућавање или измена статусне траке"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Дозвољава апликацији да онемогући статусну траку или да додаје и уклања системске иконе."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"статусна трака"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Омогућава да се власник обавеже на интерфејс методе уноса највишег нивоа. Уобичајене апликације никада не би требало да је користе."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"повезивање са услугом приступачности"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Дозвољава власнику да се повеже са интерфејсом услуге приступачности највишег нивоа. Уобичајене апликације никада не би требало да је користе."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"захтевање истраживања додиром"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Омогућава носиоцу да захтева режим интеракције у коме се називи додирнутих ставки изговарају наглас, а кориснички интерфејс може да се истражује покретима."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"захтевање побољшане приступачности вебу"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Омогућава носиоцу да захтева омогућавање побољшања приступачности веба. На пример, инсталирање скрипти да би садржај апликације постао приступачнији."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"обавезивање на текстуалну услугу"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Омогућава власнику да се обавеже на интерфејс текстуалне услуге највишег нивоа (нпр. SpellCheckerService). Обичне апликације никада не би требало да је користе."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"везивање за VPN услугу"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Поново покрени"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"На страници на адреси „<xliff:g id="TITLE">%s</xliff:g>“ пише следеће:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Потврда навигације"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Напусти ову страницу"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Остани на овој страници"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Да ли стварно желите да напустите ову страницу?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Потврда"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Савет: Додирните двапут да бисте увећали и умањили приказ."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Аутом. поп."</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 7993bf85f6e8..074427d2b2c0 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Få åtkomst till SD-kortet."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Tillgänglighetsfunktioner"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Funktioner som kan behövas med hjälpmedel."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Hämta fönsterinnehåll"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Granska innehållet i ett fönster som du interagerar med."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktivera Explore by Touch"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Objekt som användaren rör vid läses upp högt och skärmen kan utforskas med hjälp av rörelser."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Aktivera förbättrad webbtillgänglighet"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Skript kan installeras för att göra appens innehåll tillgängligare."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observera text som du skriver"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Omfattar personuppgifter som kreditkortsnummer och lösenord."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"inaktivera eller ändra statusfält"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Tillåter att appen inaktiverar statusfältet eller lägger till och tar bort systemikoner."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"statusfält"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Innehavaren tillåts att binda till den översta nivåns gränssnitt för en inmatningsmetod. Ska inte behövas för vanliga appar."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"bind till en tillgänglighetstjänst"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Innehavaren tillåts att binda till den översta nivåns gränssnitt för en tillgänglighetstjänst. Ska inte behövas för vanliga appar."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"begära beröringsstyrda gränssnittsfunktioner"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Innehavaren tillåts begära ett interaktionsläge där objekt som användaren trycker på läses upp och där gränssnittet kan användas med gester."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"begära tillgänglighetsfunktioner"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Innehavaren tillåts begära aktivering av tillgänglighetsfunktioner. Det kan t.ex. vara att installera skript från Google som gör appens innehåll mer tillgängligt."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"bind till en texttjänst"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Tillåter innehavaren att binda mot den högsta gränssnittsnivån i en texttjänst (t.ex. SpellCheckerService). Bör aldrig behövas för normala appar."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"bind till en VPN-tjänst"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Starta om"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"På sidan på <xliff:g id="TITLE">%s</xliff:g> står det:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Bekräfta navigering"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Lämna den här sidan"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Stanna på den här sidan"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Vill du verkligen navigera bort från den här sidan?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Bekräfta"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Tips! Dubbelknacka om du vill zooma in eller ut."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autofyll"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 535b805ff95b..847dcc77280f 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Fikia kadi ya SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Vipengele vya ufikiaji"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Vipengee ambavyo teknolojia saidizi inaweza kuomba."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Rejesha maudhui ya dirisha"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Chunguza maudhui ya dirisha unaloingiliana nalo."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Washa Chunguza kwa Mguso"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Vipengee vilivyoguswa vitatamkwa kwa sauti na skrini inaweza kuchunguzwa kwa kutumia ishara."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Washa ufikiaji wa wavuti ulioboreshwa"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Hati zinaweza kusakinishwa ili kuyafanya maudhui ya programu kufikiwa zaidi."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Angalia maandishi unayoyacharaza"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Inajumuisha data binafsi kama vile nambari za kadi ya mkopo na manenosiri."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"zima au rekebisha mwambaa hali"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Inaruhusu programu kulemaza upau wa hali au kuongeza na kutoa ikoni za mfumo."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"mwamba hali"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Inaruhusu mmiliki kushurutisha kwenye kusano ya kiwango cha juu ya mbinu ya ingizo. Haipaswi kuhitajika kwa programu za kawaida."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"funga kwa huduma ya ufikiaji"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Inamuruhusu mmiliki kufunga kipengee kinachojitokeza katika nyanja mbalimbali za kiwango cha juu cha huduma ya afikiaji. Hapaswi kuhitajika kwa programu za kawaida."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"omba uchunguzi kwa kugusa"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Huruhusu programu kuomba hali ya mwingiliano ambapo vipengee vilivyoguswa hutamkwa kwa sauti na Kiolesura kinaweza kuchunguzwa kupitia ishara."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"omba ufikiaji wa wavuti ulioimarishwa"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Huruhusu programu kuomba uwezeshaji wa uimarishaji wa ufikiaji wa wavuti. Kwa mfano, kusakinisha hati ili kufanya maudhui ya programu kufikiwa zaidi."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"Imefungwa kwa huduma ya maandishi"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Inaruhusu kishikiliaji kushurutisha kusano ya kiwango cha juu ya huduma ya matini(k.m.SpellCheckerService). Haipaswi kuhitajika kwa programu za kawaida."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"funga kwa huduma ya VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Washa tena"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Ukurasa ulio \"<xliff:g id="TITLE">%s</xliff:g>\" unasema:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"HatiJava"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Thibitisha jinsi ya kuelekea"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Toka kwenye Ukurasa huu"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Bakia kwenye Ukurasa huu"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Je, una uhakika unataka kutoka kwenye ukurasa huu?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Thibitisha"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Kidokezo: Gonga mara mbili ili kukuza ndani na nje."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Kujaza kiotomatiki"</string>
@@ -1057,7 +1057,7 @@
<string name="editTextMenuTitle" msgid="4909135564941815494">"Vitendo vya maandishi"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Nafasi ya kuhafadhi inakwisha"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Baadhi ya vipengee vya mfumo huenda visifanye kazi"</string>
- <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> inaendesha"</string>
+ <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> inatumiwa"</string>
<string name="app_running_notification_text" msgid="4653586947747330058">"Gusa ili upate maelezo zaidi au usitishe programu."</string>
<string name="ok" msgid="5970060430562524910">"Sawa"</string>
<string name="cancel" msgid="6442560571259935130">"Ghairi"</string>
@@ -1120,8 +1120,8 @@
<string name="volume_icon_description_incall" msgid="8890073218154543397">"Sauti ya simu"</string>
<string name="volume_icon_description_media" msgid="4217311719665194215">"Sauti ya midia"</string>
<string name="volume_icon_description_notification" msgid="7044986546477282274">"Sauti ya arifa"</string>
- <string name="ringtone_default" msgid="3789758980357696936">"Toni mlio chaguo-msingi"</string>
- <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Toni mlio chaguo-msingi (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_default" msgid="3789758980357696936">"Mlio chaguo-msingi"</string>
+ <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Mlio chaguo-msingi (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
<string name="ringtone_silent" msgid="7937634392408977062">"Hamna"</string>
<string name="ringtone_picker_title" msgid="3515143939175119094">"Toni za mlio"</string>
<string name="ringtone_unknown" msgid="5477919988701784788">"Mlio amabo haujulikani"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 1c97cb0db113..bbf8a1b95c72 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"เข้าถึงการ์ด SD"</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"คุณลักษณะการเข้าถึง"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"คุณลักษณะที่เทคโนโลยีความช่วยเหลือสามารถร้องขอได้"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"เรียกเนื้อหาหน้าต่าง"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ตรวจสอบเนื้อหาของหน้าต่างที่คุณกำลังโต้ตอบอยู่"</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"เปิด \"แตะเพื่อสำรวจ\""</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"รายการที่แตะจะถูกพูดออกเสียง และการสำรวจหน้าจอสามารถทำได้ด้วยท่าทางสัมผัส"</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"เปิดการเข้าถึงเว็บที่มีประสิทธิภาพมากขึ้น"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"อาจติดตั้งสคริปต์เพื่อทำให้สามารถเข้าถึงเนื้อหาแอปได้ง่ายขึ้น"</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"สังเกตข้อความที่คุณพิมพ์"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"รวมถึงข้อมูลส่วนบุคคล เช่น หมายเลขบัตรเครดิตและรหัสผ่าน"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"ปิดการใช้งานหรือแก้ไขแถบสถานะ"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"อนุญาตให้แอปพลิเคชันปิดใช้งานแถบสถานะหรือเพิ่มและนำไอคอนระบบออก"</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"แถบสถานะ"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"อนุญาตให้ผู้ใช้เชื่อมโยงกับส่วนติดต่อผู้ใช้ระดับสูงสุดของวิธีการป้อนข้อมูล ไม่ควรต้องใช้สำหรับแอปพลิเคชันทั่วไป"</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"เชื่อมโยงกับบริการการเข้าถึง"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"อนุญาตให้เจ้าของเชื่อมโยงกับส่วนติดต่อระดับบนสุดของบริการการเข้าถึง ซึ่งแอปพลิเคชันทั่วไปไม่จำเป็นต้องใช้"</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"ขอการแตะเพื่อสำรวจ"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"อนุญาตให้ผู้ถือสิทธิ์ขอโหมดโต้ตอบซึ่งจะมีเสียงพูดออกมาเมื่อรายการถูกแตะ และสามารถสำรวจ UI ได้โดยการใช้ท่าทางสัมผัส"</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"ขอการเข้าถึงเว็บที่มีประสิทธิภาพมากขึ้น"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"อนุญาตให้ผู้ถือสิทธิ์ขอเปิดใช้การเพิ่มประสิทธิภาพการเข้าถึงเว็บ ตัวอย่างเช่น การติดตั้งสคริปต์เพื่อให้เข้าถึงเนื้อหาแอปพลิเคชันได้ดีขึ้น"</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"เชื่อมโยงกับบริการข้อความ"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"อนุญาตให้ผู้ใช้เชื่อมโยงกับส่วนติดต่อผู้ใช้ระดับสูงสุดของบริการข้อความ (เช่น บริการเครื่องตรวจตัวสะกด) ไม่ควรต้องใช้สำหรับแอปพลิเคชันทั่วไป"</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"เชื่อมโยงกับบริการ VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"รีบูต"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"หน้าเว็บที่ \"<xliff:g id="TITLE">%s</xliff:g>\" ระบุว่า:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"ยืนยันการนำทาง"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"ออกจากหน้านี้"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"อยู่ในหน้านี้"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"คุณแน่ใจไหมว่าต้องการออกจากหน้านี้"</string>
<string name="save_password_label" msgid="6860261758665825069">"ยืนยัน"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"เคล็ดลับ: แตะสองครั้งเพื่อขยายและย่อ"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"ป้อนอัตโนมัติ"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 45a541058e67..6d66f345a16b 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"I-access ang SD card."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Mga tampok ng accessibility"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Mga tampok na maaaring hilingin ng tumutulong na teknolohiya."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Kunin ang nilalaman ng window"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Siyasatin ang nilalaman ng isang window kung saan ka nakikipag-ugnayan."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"I-on ang Explore by Touch"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Bibigkasin ang mga pinindot na item at maaaring galugarin ang screen gamit ang mga galaw."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"I-on ang pinahusay na accessibility sa web"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Maaaring mag-install ng mga script upang gawing mas naa-access ang nilalaman ng app."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Obserbahan ang tekstong tina-type mo"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"May kasamang personal na data tulad ng mga numero ng credit card at password."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"huwag paganahin o baguhin ang status bar"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Pinapayagan ang app na huwag paganahin ang status bar o magdagdag at mag-alis ng mga icon ng system."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"status bar"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Pinapayagan ang may-hawak na sumailalim sa nangungunang interface ng pamamaraan ng pag-input. Hindi kailanman dapat na kailanganin para sa normal na apps."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"sumailalim sa isang serbisyo sa accessibility"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Binibigyang-daan ang may-ari na sumailalim sa nasa nangungunang antas na interface ng isang serbisyo sa accessibility. Hindi dapat kailanman kailanganin para sa normal na apps."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"humiling ng explore by touch"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Binibigyang-daan ang may-ari na humiling ng mode ng pakikipag-ugnayan kung saan sinasabi nang malakas ang mga napindot na item at nagagalugad ang UI sa pamamagitan ng mga galaw."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"humiling ng pinahusay na accessibility sa web"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Binibigyang-daan ang may-ari na hilingin ang pagpapagana ng mga pagpapahusay sa accessibility sa web. Halimbawa, ang pag-install ng mga script mula sa Google upang gawing mas naa-access ang nilalaman ng app."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"sumailalim sa serbisyo ng teksto"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Pinapayagan ang may-hawak na sumailalim sa nangungunang antas na interface (hal. SpellCheckerService). Hindi kailanman dapat na kailanganin para sa normal na apps."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"sumailalim sa isang serbisyo ng VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"I-reboot"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Isinasaad ng pahina sa \"<xliff:g id="TITLE">%s</xliff:g>\" na:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Kumpirmahin ang Pag-navigate"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Umalis sa Pahinang ito"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Manatili sa Pahinang ito"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Sigurado ka bang gusto mong mag-navigate paalis sa pahinang ito?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Kumpirmahin"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Tip: Mag-double tap upang mag-zoom in at out."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autofill"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 77b1cc68e5be..919029a4ce0d 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"SD karta erişin."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Erişilebilirlik özellikleri"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Engelli kullanıcılara yardımcı olan teknolojinin istekte bulunabileceği özellikler."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pencere içeriğini alın"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Etkileşim kurduğunuz pencerenin içeriğini inceleyin."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Dokunarak Keşfet\'i açın"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Dokunulan öğeler sesli olarak okunur ve ekranı keşfetmek için hareketler kullanılabilir."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Gelişmiş web erişilebilirliğini açın"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Uygulamanın erişilebilirliğini artırmak için komut dosyaları yüklenebilir."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Yazdığınız metni izleyin"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Kredi kartı ve şifre gibi kişisel bilgiler içerir."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"durum çubuğunu devre dışı bırak veya değiştir"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Uygulamaya, durum çubuğunu devre dışı bırakma ve sistem simgelerini ekleyip kaldırma izni verir."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"durum çubuğu"</string>
@@ -259,7 +267,7 @@
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Uygulamaya WAP mesajlarını alma ve işleme izni verir. Buna, size gönderilen mesajları takip edip size göstermeden silebilme izni de dahildir."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"çalışan uygulamaları al"</string>
<string name="permdesc_getTasks" msgid="7454215995847658102">"Uygulamaya o anda ve son çalışan görevler hakkında bilgi alma izni verir. Bu izin, uygulamanın cihaz tarafından kullanılan uygulamalar hakkında bilgi elde etmesine olanak sağlayabilir."</string>
- <string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"kullanıcılar arasında etkileşim kur"</string>
+ <string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"kullanıcılar arasında etkileşim kurma"</string>
<string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"Uygulamaya cihazdaki farklı kullanıcılar arasında işlem gerçekleştirme izni verir. Kötü amaçlı uygulamalar bu izinle kullanıcılar arasındaki korumayı ihlal edebilir."</string>
<string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"kullanıcılar arasında etkileşim kurmak için tam izin"</string>
<string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"Kullanıcılar arasında tüm etkileşime izin verir."</string>
@@ -277,7 +285,7 @@
<string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Uygulamaya diğer uygulamaların ekran uyumluluk modunu denetleme izni verir. Kötü amaçlı uygulamalar diğer uygulamaların çalışma şeklini bozabilir."</string>
<string name="permlab_setDebugApp" msgid="3022107198686584052">"uygulama hata ayıklamayı etkinleştir"</string>
<string name="permdesc_setDebugApp" msgid="4474512416299013256">"Uygulamaya, başka bir uygulama için hata ayıklamayı açma izni verir. Kötü amaçlı uygulamalar diğer uygulamaları kaldırmak için bunu kullanabilir."</string>
- <string name="permlab_changeConfiguration" msgid="4162092185124234480">"sistem görüntüleme ayarlarını değiştir"</string>
+ <string name="permlab_changeConfiguration" msgid="4162092185124234480">"sistem görüntüleme ayarlarını değiştirme"</string>
<string name="permdesc_changeConfiguration" msgid="4372223873154296076">"Uygulamaya, yerel ayar veya genel yazı tipi boyutu gibi mevcut yapılandırmayı değiştirme izni verir."</string>
<string name="permlab_enableCarMode" msgid="5684504058192921098">"araç modunu etkinleştir"</string>
<string name="permdesc_enableCarMode" msgid="4853187425751419467">"Uygulamaya, araç modunu etkinleştirme izni verir."</string>
@@ -287,7 +295,7 @@
<string name="permdesc_forceStopPackages" msgid="5253157296183940812">"Uygulamaya, diğer uygulamaları zorla durdurma izni verir."</string>
<string name="permlab_forceBack" msgid="652935204072584616">"uygulamayı kapanmaya zorla"</string>
<string name="permdesc_forceBack" msgid="3892295830419513623">"Uygulamaya, ön plandaki herhangi bir etkinliği kapatma ve geri gitme izni verir. Normal uygulamalar için gerekli olmaz."</string>
- <string name="permlab_dump" msgid="1681799862438954752">"sistemin dahili durumunu al"</string>
+ <string name="permlab_dump" msgid="1681799862438954752">"sistemin dahili durumunu alma"</string>
<string name="permdesc_dump" msgid="1778299088692290329">"Uygulamaya, sistemin iç durumunu alma izni verir. Kötü amaçlı uygulamalar normalde gerek duymadıkları çok çeşitli özel ve güvenli bilgilerini alabilir."</string>
<string name="permlab_retrieve_window_content" msgid="8022588608994589938">"ekran içeriğini al"</string>
<string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"Uygulamaya, etkin pencerenin içeriğini alma izni verir. Kötü amaçlı uygulamalar tüm pencere içeriğini alabilir ve şifreleri hariç tüm metni inceleyebilir."</string>
@@ -331,7 +339,7 @@
<string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"Uygulamaya, tam yedekleme onay arabirimini başlatma izni verir. Herhangi bir uygulamanın kullanımına yönelik değildir."</string>
<string name="permlab_internalSystemWindow" msgid="2148563628140193231">"yetkisiz pencereleri görüntüle"</string>
<string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"Uygulamaya, dahili sistem kullanıcı arayüzü tarafından kullanılacak pencereler oluşturma izni verir. Normal uygulamaların kullanımına yönelik değildir."</string>
- <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"diğer uygulamaları sürükle"</string>
+ <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"diğer uygulamaların üzerinde görüntüleme"</string>
<string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Uygulamaya, diğer uygulamaların veya kullanıcı arayüzüne ait bölümlerin üstüne çizim yapma izni verir. Bu izne sahip uygulamalar herhangi bir uygulamada kullanıcı arayüzünü kullanımınızı etkileyebilir veya diğer uygulamalarda gördüğünüzü düşündüğünüz arayüz öğelerini değiştirmiş olabilir."</string>
<string name="permlab_setAnimationScale" msgid="2805103241153907174">"genel animasyon hızını değiştir"</string>
<string name="permdesc_setAnimationScale" msgid="7690063428924343571">"Uygulamaya, istediği zaman genel animasyon hızını değiştirme (animasyonları hızlandırma veya yavaşlatma) izni verir."</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Cihazın sahibine, bir giriş yönteminin en üst düzey arayüzüne bağlanma izni verir. Normal uygulamalarda hiçbir zaman gerek duyulmaz."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"erişilebilirlik hizmetine bağlan"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"İzin sahibine bir erişilebilirlik hizmetinin en üst düzey arayüzüne bağlanma izni verir. Normal uygulamalarda hiçbir zaman gerek duyulmaz."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"dokunarak keşfetme isteğinde bulunur"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"İzin sahibine, dokunulan öğelerin sesli okunduğu ve kullanıcı arayüzünün hareketlerle keşfedilebildiği etkileşimli bir mod isteğinde bulunma olanağı sağlar."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"genişletilmiş Web erişilebilirliği isteğinde bulunur"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"İzin sahibine Web erişim geliştirmelerini etkinleştirme isteğinde bulunma olanağı sağlar. Örneğin, uygulama içeriğinin daha fazla erişilebilir olması için Google\'dan komut dosyası yüklemek gibi."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"kısa mesaj hizmetine bağla"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Cihazın sahibine, bir metin hizmetinin (ör. SpellCheckerService) en üst düzey arayüzüne bağlanma izni verir. Normal uygulamalarda hiçbir zaman gerekmez."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"VPN hizmetine bağlan"</string>
@@ -370,7 +374,7 @@
<string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"Uygulamaya klavye düzenini değiştirme izni verir. Normal uygulamalar için hiçbir zaman gerekmez."</string>
<string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"uygulamalara Linux sinyalleri gönder"</string>
<string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"Uygulamaya, sağlanan sinyalin tüm kalıcı işlemlere gönderilmesini isteme izni verir."</string>
- <string name="permlab_persistentActivity" msgid="8841113627955563938">"uygulamayı her zaman çalıştır"</string>
+ <string name="permlab_persistentActivity" msgid="8841113627955563938">"uygulamayı her zaman çalıştırma"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Uygulamaya kendisinin bir bölümünü bellekte kalıcı yapma izni verir. Bu izin, diğer uygulamaların kullanabileceği belleği sınırlandırarak tabletin yavaş çalışmasına neden olabilir."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Uygulamaya kendisinin bir bölümünü bellekte kalıcı yapma izni verir. Bu izin, diğer uygulamaların kullanabileceği belleği sınırlandırarak telefonun yavaş çalışmasına neden olabilir."</string>
<string name="permlab_deletePackages" msgid="184385129537705938">"uygulamaları sil"</string>
@@ -402,22 +406,22 @@
<string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Uygulamaya, kendisi veya başka uygulamalar için belirli izinleri verme ya da kaldırma izni verir. Zararlı uygulamalar bunu, kendilerine izin vermediğiniz özelliklere erişmek için kullanabilir."</string>
<string name="permlab_setPreferredApplications" msgid="8463181628695396391">"tercih edilen uygulamaları ayarla"</string>
<string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"Uygulamaya, tercih edilen uygulamalarınızı değiştirme izni verir. Kötü amaçlı uygulamalar çalışmakta olan uygulamaları sessizce değiştirip gizli verilerinizi toplamak için mevcut uygulamalarınızı yanlış yönlendirebilir."</string>
- <string name="permlab_writeSettings" msgid="2226195290955224730">"sistem ayarlarını değiştir"</string>
+ <string name="permlab_writeSettings" msgid="2226195290955224730">"sistem ayarlarını değiştirme"</string>
<string name="permdesc_writeSettings" msgid="7775723441558907181">"Uygulamaya, sistem ayarı verilerini değiştirme izni verir. Kötü amaçlı uygulamalar sistem yapılandırmanızı bozabilir."</string>
- <string name="permlab_writeSecureSettings" msgid="204676251876718288">"güvenli sistem ayarlarını değiştir"</string>
+ <string name="permlab_writeSecureSettings" msgid="204676251876718288">"güvenli sistem ayarlarını değiştirme"</string>
<string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"Uygulamaya, sisteme ait güvenlik ayarı verilerini değiştirme izni verir. Normal uygulamaların kullanımına yönelik değildir."</string>
<string name="permlab_writeGservices" msgid="2149426664226152185">"Google hizmetler haritasını değiştir"</string>
<string name="permdesc_writeGservices" msgid="1287309437638380229">"Uygulamaya, Google hizmetleri haritasını değiştirme izni verir. Normal uygulamaların kullanımına yönelik değildir."</string>
- <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"başlangıçta çalıştır"</string>
+ <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"başlangıçta çalıştırma"</string>
<string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Uygulamaya, kendisini sistem açılışı bittikten hemen sonra başlatma izni verir. Bu izin, tabletin başlaması için daha uzun süre geçmesine ve uygulamanın her zaman çalışarak tableti yavaşlatmasına neden olabilir."</string>
<string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"Uygulamaya, kendisini sistem açılışı bittikten hemen sonra başlatma izni verir. Bu izin, telefonun başlatılması için daha uzun bir süre geçmesine ve uygulamanın her zaman çalışarak telefonu yavaşlatmasına neden olur."</string>
- <string name="permlab_broadcastSticky" msgid="7919126372606881614">"sabit yayın gönder"</string>
+ <string name="permlab_broadcastSticky" msgid="7919126372606881614">"sabit yayın gönderme"</string>
<string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"Uygulamaya, yayın bittikten sonra da kalan sabit yayınlar gönderme izni verir. Aşırı kullanılması çok fazla bellek harcanmasına neden olarak tableti yavaşlatabilir veya dengesiz hale getirebilir."</string>
<string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Uygulamaya, yayın bittikten sonra da kalan sabit yayınlar gönderme izni verir. Aşırı kullanılması çok fazla bellek harcanmasına neden olarak telefonunu yavaşlatabilir veya dengesiz hale getirebilir."</string>
- <string name="permlab_readContacts" msgid="8348481131899886131">"kişilerimi oku"</string>
+ <string name="permlab_readContacts" msgid="8348481131899886131">"kişilerinizi okuma"</string>
<string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Uygulamaya tabletinizde depolanan kişilerinizle ilgili verileri okuma izni verir. Bu verilere belirli kişilerle ne sıklıkta çağrı, e-posta veya diğer yöntemlerle iletişim kurduğunuz bilgisi dahildir. Bu izin, uygulamanın kişi verilerinizi kaydetmesine olanak sağlar ve kötü amaçlı uygulamalar kişi verilerini haberiniz olmadan paylaşabilir."</string>
<string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Uygulamaya telefonunuzda depolanan kişilerinizle ilgili verileri okuma izni verir. Bu verilere belirli kişilerle ne sıklıkta çağrı, e-posta veya diğer yöntemlerle iletişim kurduğunuz bilgisi dahildir. Bu izin, uygulamanın kişi verilerinizi kaydetmesine olanak sağlar ve kötü amaçlı uygulamalar kişi verilerini sizden habersiz paylaşabilir."</string>
- <string name="permlab_writeContacts" msgid="5107492086416793544">"kişilerimi değiştir"</string>
+ <string name="permlab_writeContacts" msgid="5107492086416793544">"kişilerinizi değiştirme"</string>
<string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Uygulamaya tabletinizde depolanan kişilerinizle ilgili verileri değiştirme izni verir. Bu verilere belirli kişilerle ne sıklıkta çağrı, e-posta veya diğer yöntemlerle iletişim kurduğunuz bilgisi dahildir. Bu izin, uygulamanın kişi verilerinizi silmesine olanak sağlar."</string>
<string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Uygulamaya telefonunuzda depolanan kişilerinizle ilgili verileri değiştirme izni verir. Bu verilere belirli kişilerle ne sıklıkta çağrı, e-posta veya diğer yöntemlerle iletişim kurduğunuz bilgisi dahildir. Bu izin, uygulamanın kişi verilerinizi silmesine olanak sağlar."</string>
<string name="permlab_readCallLog" msgid="3478133184624102739">"çağrı günlüğünü oku"</string>
@@ -428,11 +432,11 @@
<string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Uygulamaya telefonunuzun çağrı günlüğünde (gelen ve giden çağrılarla ilgili veriler dahil olmak üzere) değişiklik yapma izni verir. Kötü amaçlı uygulamalar bu izni kullanarak çağrı günlüğünüzü silebilir veya değiştirebilir."</string>
<string name="permlab_readProfile" msgid="4701889852612716678">"kendi kişi kartımı oku"</string>
<string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"Uygulamaya adınız ve iletişim bilgileriniz gibi cihazınızda saklanan kişisel profil bilgilerini okuma izni verir. Bu izin, uygulamanın sizi tanımlayabileceği ve profil bilgilerinizi başkalarına gönderebileceği anlamına gelir."</string>
- <string name="permlab_writeProfile" msgid="907793628777397643">"kendi kişi kartımı değiştir"</string>
+ <string name="permlab_writeProfile" msgid="907793628777397643">"kendi kişi kartınızı değiştirme"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Uygulamaya adınız ve iletişim bilgileriniz gibi cihazınızda saklanan kişisel profil bilgilerini değiştirme veya bunlara ekleme yapma izni verir. Bu izin, uygulamanın sizi tanımlayabileceği ve profil bilgilerinizi başkalarına gönderebileceği anlamına gelir."</string>
- <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"sosyal akışımı oku"</string>
+ <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"sosyal akışınızı okuma"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Uygulamaya size veya arkadaşlarınıza ait sosyal güncellemelere erişme ve bunları senkronize etme izni verir. Bilgi paylaşırken dikkatli olun. Bu izin, uygulamanın sosyal ağlarda sizinle arkadaşlarınız arasındaki iletişimi, gizliliğine bakılmaksızın okumasına olanak sağlar. Not: Bu izin tüm sosyal ağlar için geçerli olmayabilir."</string>
- <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"sosyal akışıma yaz"</string>
+ <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"sosyal akışınıza yazma"</string>
<string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Uygulamaya arkadaşlarınızın sosyal güncellemelerini gösterme izni verir. Bilgi paylaşırken dikkatli olun -- Bu uygulama bir arkadaşınızdan geliyormuş gibi görünen mesajlar oluşturabilir. Not: Bu izin, tüm sosyal ağlarda geçerli olmayabilir."</string>
<string name="permlab_readCalendar" msgid="5972727560257612398">"takvim etkinliklerini ve gizli bilgileri oku"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Uygulamaya, arkadaşlarınızın ve iş arkadaşlarınızın etkinlikleri de olmak üzere tabletinizde depolanan tüm takvim etkinliklerini okuma izni verir. Bu izin, uygulamanın takvim verilerinizi gizliliğine ve hassaslığına bakmaksızın paylaşmasına ve kaydetmesine olanak sağlayabilir."</string>
@@ -488,7 +492,7 @@
<string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"Uygulamaya, dahili depolama birimini ekleme/bağlantısını kesme izni verir."</string>
<string name="permlab_asec_rename" msgid="7496633954080472417">"dahili dep br adını dğş"</string>
<string name="permdesc_asec_rename" msgid="1794757588472127675">"Uygulamaya, dahili depolama biriminin adını değiştirme izni verir."</string>
- <string name="permlab_vibrate" msgid="7696427026057705834">"titreşimi denetle"</string>
+ <string name="permlab_vibrate" msgid="7696427026057705834">"titreşimi denetleme"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"Uygulamaya, titreşimi denetleme izni verir."</string>
<string name="permlab_flashlight" msgid="2155920810121984215">"flaşı denetle"</string>
<string name="permdesc_flashlight" msgid="6522284794568368310">"Uygulamaya, flaş ışığını denetleme izni verir."</string>
@@ -513,10 +517,10 @@
<string name="permdesc_bindGadget" msgid="8261326938599049290">"Uygulamaya, hangi uygulamaların hangi widget\'ları kullanacağını sisteme bildirme izni verir. Bu izne sahip bir uygulama, başka uygulamalara kişisel veriler için erişim hakkı verebilir. Normal uygulamaların kullanımına yönelik değildir."</string>
<string name="permlab_modifyPhoneState" msgid="8423923777659292228">"telefon durumunu değiştir"</string>
<string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Uygulamaya, cihazın telefon özelliklerini kontrol etme izni verir. Bu izne sahip bir uygulama sizi hiç uyarmadan ağlar arasında geçiş, telefonun radyosunu açıp kapatma ve benzeri işlemler yapabilir."</string>
- <string name="permlab_readPhoneState" msgid="9178228524507610486">"telefonun durumunu ve kimliğini oku"</string>
+ <string name="permlab_readPhoneState" msgid="9178228524507610486">"telefonun durumunu ve kimliğini okuma"</string>
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Uygulamaya cihazdaki telefon özelliklerine erişme izni verir. Bu izin, uygulamanın telefon numarasını ve cihaz kimliğini, etkin bir çağrı olup olmadığını ve çağrıda bağlanılan karşı tarafın numarasını öğrenmesine olanak sağlar."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"tabletin uykuya geçmesini önle"</string>
- <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"telefonunun uykuya geçmesini önle"</string>
+ <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"telefonun uykuya geçmesini önleme"</string>
<string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Uygulamaya, tabletin uykuya geçmesini önleme izni verir."</string>
<string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Uygulamaya, telefonun uykuya geçmesini önleme izni verir."</string>
<string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"tableti aç veya kapat"</string>
@@ -540,30 +544,30 @@
<string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Uygulamaya, telefonun saat dilimini değiştirme izni verir."</string>
<string name="permlab_accountManagerService" msgid="4829262349691386986">"Hesap Yönetici Hizmeti gibi davran"</string>
<string name="permdesc_accountManagerService" msgid="1948455552333615954">"Uygulamaya, Hesap Kimlik Doğrulayıcılarına çağrı yapma izni verir."</string>
- <string name="permlab_getAccounts" msgid="1086795467760122114">"cihazdaki hesapları bul"</string>
+ <string name="permlab_getAccounts" msgid="1086795467760122114">"cihazdaki hesapları bulma"</string>
<string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Uygulamaya tablet tarafından bilinen hesapların listesini alma izni verir. Bu liste, yüklediğiniz uygulamalar tarafından oluşturulan tüm hesapları içerebilir."</string>
<string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Uygulamaya telefon tarafından bilinen hesapların listesini alma izni verir. Bu liste, yüklediğiniz uygulamalar tarafından oluşturulan tüm hesapları içerebilir."</string>
- <string name="permlab_authenticateAccounts" msgid="5265908481172736933">"hesap oluştur ve şifre ayarla"</string>
+ <string name="permlab_authenticateAccounts" msgid="5265908481172736933">"hesap oluşturma ve şifre ayarlama"</string>
<string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"Uygulamaya, hesaplar oluşturma ve bunların şifrelerini alma ve ayarlama da dahil olmak üzere Hesap Yöneticisi\'nin hesap doğrulama yetkilerini kullanma izni verir."</string>
- <string name="permlab_manageAccounts" msgid="4983126304757177305">"hesap ekle veya kaldır"</string>
+ <string name="permlab_manageAccounts" msgid="4983126304757177305">"hesap ekleme veya kaldırma"</string>
<string name="permdesc_manageAccounts" msgid="8698295625488292506">"Uygulamaya, hesap ekleme, kaldırma ve hesapların şifrelerini silme gibi işlemleri yapma izni verir."</string>
- <string name="permlab_useCredentials" msgid="235481396163877642">"bu cihazdaki hesapları kullan"</string>
+ <string name="permlab_useCredentials" msgid="235481396163877642">"bu cihazdaki hesapları kullanma"</string>
<string name="permdesc_useCredentials" msgid="7984227147403346422">"Uygulamaya kimlik doğrulama jetonları isteme izni verir."</string>
- <string name="permlab_accessNetworkState" msgid="4951027964348974773">"ağ bağlantılarını görüntüle"</string>
+ <string name="permlab_accessNetworkState" msgid="4951027964348974773">"ağ bağlantılarını görüntüleme"</string>
<string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Uygulamaya, hangi ağların bulunduğu ve hangilerinin bağlı olduğu gibi ağ bağlantılarıyla ilgili bilgileri görüntüleme izni verir."</string>
<string name="permlab_createNetworkSockets" msgid="8018758136404323658">"tam ağ erişimi"</string>
<string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Uygulamaya ağ yuvaları oluşturma ve özel ağ protokolleri kullanma izni verir. Tarayıcı ve diğer uygulamalar İnternet\'e veri gönderilmesi için araç sağlarlar, bu nedenle bu izin, İnternet\'e veri göndermek için gerekli değildir."</string>
<string name="permlab_writeApnSettings" msgid="505660159675751896">"ağ ayarlarını ve trafiği değiştir/müdahale et"</string>
<string name="permdesc_writeApnSettings" msgid="5333798886412714193">"Uygulamaya, ağ ayarlarını değiştirme, tüm ağ trafiğine engel olma ve izleme (örneğin, proxy\'yi ve APN bağlantı noktalarını değiştirmek için) izni verir. Kötü amaçlı uygulamalar sizin bilginiz olmadan ağ paketlerini izleyebilir, yönlendirebilir ya da değiştirebilir."</string>
- <string name="permlab_changeNetworkState" msgid="958884291454327309">"ağ bağlantısını değiştir"</string>
+ <string name="permlab_changeNetworkState" msgid="958884291454327309">"ağ bağlantısını değiştirme"</string>
<string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Uygulamaya, ağ bağlantısının durumunu değiştirme izni verir."</string>
<string name="permlab_changeTetherState" msgid="5952584964373017960">"kullanılan bağlantıyı değiştir"</string>
<string name="permdesc_changeTetherState" msgid="1524441344412319780">"Uygulamaya, tethering kullanan ağ bağlantısının durumunu değiştirme izni verir."</string>
<string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"arka plan veri kullanımı ayarını değiştir"</string>
<string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"Uygulamaya, arka plan veri kullanımı ayarını değiştirme izni verir."</string>
- <string name="permlab_accessWifiState" msgid="5202012949247040011">"Kablosuz bağlantıları görüntüle"</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"Kablosuz bağlantıları görüntüleme"</string>
<string name="permdesc_accessWifiState" msgid="5002798077387803726">"Uygulamaya, Kablosuz bağlantının etkin olup olmadığı ve bağlanan Kablosuz cihazların adları gibi Kablosuz ağ kullanımıyla ilgili bilgileri görüntüleme izni verir."</string>
- <string name="permlab_changeWifiState" msgid="6550641188749128035">"Kablosuza bağlan veya Kablosuz bağlantısını kes"</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"Kablosuza bağlanma veya Kablosuz bağlantısını kesme"</string>
<string name="permdesc_changeWifiState" msgid="7137950297386127533">"Uygulamaya, kablosuz erişim noktalarına bağlanıp bunlarla bağlantısını kesme ve Kablosuz ağlar için cihaz yapılandırmasında değişiklikler yapma izni verir."</string>
<string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Kablosuz Çoklu Yayın alımına izin ver"</string>
<string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Uygulamaya, çoklu yayın adreslerini kullanarak yalnızca tablete değil Kablosuz ağ üzerindeki tüm cihazlara gönderilen paketleri alma izni verir. Çoklu olmayan yayın moduna göre daha fazla güç tüketir."</string>
@@ -583,25 +587,25 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Uygulamaya, Near Field Communication (NFC) etiketleri, kartlar ve okuyucular ile iletişim kurma izni verir."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ekran kilidimi devre dışı bırak"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Uygulamaya, tuş kilidini ve ilişkili tüm şifreli güvenlik önlemlerini devre dışı bırakma izni verir. Örneğin, telefon, çağrı alındığında tuş kilidinin devre dışı bırakır ve sonra, görüşme bittiğinde kilidi yeniden etkinleştirir."</string>
- <string name="permlab_readSyncSettings" msgid="6201810008230503052">"senk. ayarlarını oku"</string>
+ <string name="permlab_readSyncSettings" msgid="6201810008230503052">"senk. ayarlarını okuma"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Uygulamaya bir hesaba ait senkronizasyon ayarlarını okuma izni verir. Örneğin, bu izne sahip bir uygulama Kişiler uygulamasının bir hesapla senkronize olup olmadığını belirleyebilir."</string>
- <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"senkronizasyonu aç/kapat"</string>
+ <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"senkronizasyonu açma/kapatma"</string>
<string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Uygulamaya bir hesaba ait senkronizasyon ayarlarını değiştirme izni verir. Örneğin, bu izne sahip bir uygulama Kişiler uygulamasının bir hesapla senkronize edilmesini etkinleştirebilir."</string>
- <string name="permlab_readSyncStats" msgid="7396577451360202448">"senk. istatistiklerini oku"</string>
+ <string name="permlab_readSyncStats" msgid="7396577451360202448">"senk. istatistiklerini okuma"</string>
<string name="permdesc_readSyncStats" msgid="1510143761757606156">"Uygulamaya bir hesaba ait senkronizasyon istatistiklerini okuma izni verir. Buna senkronizasyon etkinlikleri geçmişi ve senkronize edilen veri miktarı bilgileri de dahildir."</string>
- <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"abone olunan yayınları oku"</string>
+ <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"abone olunan yayınları okuma"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Uygulamaya, o anda senkronize olan özet akışları ile ilgili bilgi alma izni verir."</string>
- <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"abone olunan yayınları yaz"</string>
+ <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"abone olunan yayınları yazma"</string>
<string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"Uygulamaya, o anda senkronize edilmiş özet akışlarını değiştirme izni verir. Kötü amaçlı uygulamalar senkronize edilmiş özet akışlarını değiştirebilir."</string>
<string name="permlab_readDictionary" msgid="4107101525746035718">"sözlüğe eklediğim terimleri oku"</string>
<string name="permdesc_readDictionary" msgid="659614600338904243">"Uygulamaya, kullanıcının kullanıcı sözlüğünde depolamış olabileceği kelimeleri, adları ve kelime öbeklerini okuma izni verir."</string>
<string name="permlab_writeDictionary" msgid="2183110402314441106">"kullanıcı tanımlı sözlüğe kelime ekle"</string>
<string name="permdesc_writeDictionary" msgid="8185385716255065291">"Uygulamaya, kullanıcı sözlüğüne yeni kelimeler yazma izni verir."</string>
- <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"korumalı depolama birimine erişimi test et"</string>
- <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"korumalı depolama birimine erişimi test et"</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"korumalı depolama birimine erişimi test etme"</string>
+ <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"korumalı depolama birimine erişimi test etme"</string>
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Uygulamaya, gelecekteki cihazlarda kullanılabilecek USB depolama birimi için bir izni test etme olanağı verir."</string>
<string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Uygulamaya gelecekteki cihazlarda kullanılabilecek SD karta ilişkin bir izni test etme olanağı verir."</string>
- <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"USB belleğimin içeriğini değiştir veya sil"</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"USB belleğinizin içeriğini değiştirme veya silme"</string>
<string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD kartın içeriğini değiştir veya sil"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Uygulamaya USB belleğe yazma izni verir."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Uygulamaya, SD karta yazma izni verir."</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Yeniden başlat"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"\"<xliff:g id="TITLE">%s</xliff:g>\" adresindeki sayfada şunlar belirtiliyor:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Gezinmeyi Onayla"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Bu Sayfadan Ayrıl"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Bu sayfada kal"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Bu sayfadan ayrılmak istediğinizden emin misiniz?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Onayla"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"İpucu: Yakınlaştırmak ve uzaklaştırmak için iki kez hafifçe vurun."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Otomatik Doldur"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 0cdedc1ebc3c..9a3bd92aa4af 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Доступ до карти SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Функції доступності"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Функції, на які може подавати запит допоміжна технологія."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Отримувати вміст вікна"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Перевіряти вміст вікна, з яким ви взаємодієте."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Увімкнути функцію дослідження дотиком"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Для елементів, яких ви торкаєтеся, надаватимуться голосові підказки, а інтерфейсом можна користуватися за допомогою жестів."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Увімкнути покращення веб-доступності"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Можуть установлюватися сценарії, щоб зробити вміст програми доступнішим."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Спостерігати за текстом, який ви вводите"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Включає особисті дані, як-от номери кредитних карток і паролі."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"вимикати чи змін. рядок стану"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Дозволяє програмі вимикати рядок стану чи додавати та видаляти піктограми системи."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"рядок стану"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Дозволяє власнику прив’язуватися до інтерфейсу верхнього рівня методу введення. Ніколи не застосовується для звичайних програм."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"прив’язуватися до служби доступності"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Дозволяє власникові прив’язуватися до інтерфейсу верхнього рівня служби доступності. Ніколи не застосовується для звичайних програм."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"подавати запит на дослідження дотиком"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Дозволяє подавати запит на інтерактивний режим, у якому надаються голосові підказки для елементів, яких торкається користувач, а інтерфейсом можна користуватися за допомогою жестів."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"подавати запит на покращення веб-доступності"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Дозволяє подавати запит на ввімкнення покращень веб-доступності. Наприклад, установлювати сценарії, які робитимуть вміст програм доступнішим."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"прив’язати до текстової служби"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Дозволяє власникові прив’язуватися до інтерфейсу верхнього рівня текстової служби (напр. SpellCheckerService). Ніколи не застосовується для звичайних програм."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"прив’язуватися до служби VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Перезав."</string>
<string name="js_dialog_title" msgid="1987483977834603872">"На сторінці за адресою \"<xliff:g id="TITLE">%s</xliff:g>\" написано:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"Javascript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Підтвердити перехід"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Полишити цю сторінку"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Залишитися на цій сторінці"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Справді полишити цю сторінку?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Підтверд."</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Порада: двічі торкніться для збільшення чи зменшення."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Автозап."</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 7732f4aecff1..f80d0a6299aa 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Truy cập thẻ SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Tính năng hỗ trợ truy cập"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Tính năng mà công nghệ hỗ trợ có thể yêu cầu."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Truy xuất nội dung cửa sổ"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kiểm tra nội dung của cửa sổ bạn đang tương tác."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Bật Khám phá bằng cách chạm"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Mục đã chạm sẽ được nói to và bạn có thể khám phá màn hình bằng cử chỉ."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Bật khả năng truy cập web nâng cao"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Tập lệnh có thể được cài đặt để làm cho nội dung ứng dụng dễ truy cập hơn."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Xem nội dung bạn nhập"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Bao gồm dữ liệu cá nhân chẳng hạn như số thẻ tín dụng và mật khẩu."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"vô hiệu hóa hoặc sửa đổi thanh trạng thái"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Cho phép ứng dụng vô hiệu hóa thanh trạng thái hoặc thêm và xóa biểu tượng hệ thống."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"thanh trạng thái"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Cho phép chủ sở hữu liên kết với giao diện cấp cao nhất của phương thức nhập. Không cần thiết cho các ứng dụng thông thường."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"liên kết với dịch vụ truy cập"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Cho phép chủ sở hữu liên kết với giao diện cấp cao nhất của dịch vụ truy cập. Không cần thiết cho các ứng dụng thông thường."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"yêu cầu khám phá bằng cách chạm"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Cho phép chủ sở hữu yêu cầu chế độ tương tác mà các mục đã chạm được đọc to và có thể khám phá giao diện người dùng qua các thao tác."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"yêu cầu khả năng hỗ trợ truy cập web nâng cao"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Cho phép chủ sở hữu yêu cầu bật tính năng cải thiện hỗ trợ truy cập web. Ví dụ: cài đặt tập lệnh để nội dung ứng dụng dễ truy cập hơn."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"liên kết với dịch vụ văn bản"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Cho phép chủ sở hữu liên kết với giao diện cấp cao nhất của dịch vụ văn bản (ví dụ: SpellCheckerService). Không cần thiết cho các ứng dụng thông thường."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"liên kết với dịch vụ VPN"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Khởi động lại"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Trang tại \"<xliff:g id="TITLE">%s</xliff:g>\" cho biết:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Xác nhận điều hướng"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Rời khỏi trang này"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Ở lại trang này"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Bạn có chắc chắn muốn điều hướng khỏi trang này không?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Xác nhận"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Mẹo: Nhấn đúp để phóng to và thu nhỏ."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Tự động điền"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 9d1c48cdd39c..184c1c82a705 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"访问 SD 卡。"</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"辅助功能"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"辅助技术可请求启用的功能。"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"检索窗口内容"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"检查您正与其进行互动的窗口的内容。"</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"启用触摸浏览"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"设备可大声读出用户触摸的内容,而用户可以通过手势浏览屏幕。"</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"启用网页辅助增强功能"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"安装脚本以方便访问应用的内容。"</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"监测您输入的文字"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"包含个人数据,例如信用卡号和密码。"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"停用或修改状态栏"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"允许应用停用状态栏或者增删系统图标。"</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"状态栏"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"允许用户绑定至输入法的顶级接口。普通应用绝不需要此权限。"</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"绑定至辅助服务"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"允许应用绑定至辅助服务的顶级接口。普通应用绝不需要此权限。"</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"请求启用触摸浏览"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"允许应用请求启用互动模式,在该模式下,设备可大声读出用户触摸的内容,而且用户可以通过手势浏览用户界面。"</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"请求启用网页辅助增强功能"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"允许应用请求打开网页辅助增强功能。例如,安装脚本,以方便用户更轻松地访问应用内容。"</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"绑定至文字服务"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"允许用户绑定至文字服务(如 SpellCheckerService)的顶级接口。普通应用绝不需要此权限。"</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"绑定到 VPN 服务"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"重新启动"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"网址为“<xliff:g id="TITLE">%s</xliff:g>”的网页显示:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"确认离开"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"离开此页"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"留在此页"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"您确定要离开此页面吗?"</string>
<string name="save_password_label" msgid="6860261758665825069">"确认"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"提示:点按两次可放大或缩小。"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"自动填充"</string>
@@ -1489,7 +1489,7 @@
<string name="user_switched" msgid="3768006783166984410">"当前用户是<xliff:g id="NAME">%1$s</xliff:g>。"</string>
<string name="owner_name" msgid="2716755460376028154">"机主"</string>
<string name="error_message_title" msgid="4510373083082500195">"错误"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"此应用不支持受限用户的帐户"</string>
+ <string name="app_no_restricted_accounts" msgid="5322164210667258876">"受限用户无法使用此应用"</string>
<string name="app_not_found" msgid="3429141853498927379">"找不到可处理此操作的应用"</string>
<string name="revoke" msgid="5404479185228271586">"撤消"</string>
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index b4c41b434e0f..feee2d5210b9 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"存取 SD 卡。"</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"協助工具功能"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"輔助技術可要求的功能。"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"擷取視窗內容"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"檢查您存取的視窗內容。"</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"啟用輕觸探索功能"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"朗讀您輕觸的項目,並可讓您使用手勢探索螢幕。"</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"啟用強化網頁協助工具"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"可能會安裝程式碼,使應用程式內容更易於存取。"</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"記錄您輸入的文字"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"包括個人資料,如信用卡號碼和密碼。"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"停用或變更狀態列"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"允許應用程式停用狀態列,並可新增或移除系統圖示。"</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"狀態列"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"允許應用程式繫結至輸入法的頂層介面 (一般應用程式不需使用)。"</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"繫結至協助工具服務"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"允許應用程式繫結至協助工具服務的頂層介面 (一般應用程式不需使用)。"</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"要求輕觸探索"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"允許應用程式要求啟用互動模式,讓裝置讀出使用者輕觸的項目,並且讓使用者透過手勢探索使用者介面。"</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"要求增強式網頁協助工具"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"允許應用程式要求啟用網頁協助工具增強功能。例如安裝指令碼,讓使用者更容易存取應用程式的內容。"</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"繫結至文字服務"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"允許應用程式繫結至文字服務 (例如 SpellCheckerService) 的頂層介面 (一般應用程式不需使用)。"</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"繫結至 VPN 服務"</string>
@@ -462,7 +466,7 @@
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"允許應用程式修改全域音訊設定,例如音量和用來輸出的喇叭。"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"錄製音訊"</string>
<string name="permdesc_recordAudio" msgid="4906839301087980680">"允許應用程式使用麥克風錄音。這項權限可讓應用程式隨時錄音,不需經過您的確認。"</string>
- <string name="permlab_camera" msgid="3616391919559751192">"拍照和拍攝影片"</string>
+ <string name="permlab_camera" msgid="3616391919559751192">"拍攝相片和影片"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"允許應用程式使用相機拍照和錄影。這項權限可讓應用程式隨時使用相機,而不需請求您進行確認。"</string>
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"永久停用平板電腦"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"永久停用電話"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"重新開機"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"「<xliff:g id="TITLE">%s</xliff:g>」網頁指出:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"確認瀏覽"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"離開這一頁"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"停留在這一頁"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"您確定要前往其他網頁瀏覽嗎?"</string>
<string name="save_password_label" msgid="6860261758665825069">"確認"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"提示:輕按兩下即可縮放。"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"自動填入功能"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index e2f14784d52a..f3f58860211d 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -30,7 +30,7 @@
<string name="untitled" msgid="4638956954852782576">"&lt;Akunasihloko&gt;"</string>
<string name="ellipsis" msgid="7899829516048813237">"..."</string>
<string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
- <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Ayikho inombolo yocingo)"</string>
+ <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Ayikho inombolo yefoni)"</string>
<string name="unknownName" msgid="2277556546742746522">"(Akwaziwa)"</string>
<string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Ivoyisimeyili"</string>
<string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
@@ -229,6 +229,14 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Finyelela ikhadi le-SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Izici zokufinyelela"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Izici ezingacelwa ubuchwepheshe bokusiza."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Thola okuqukethwe kwewindi"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Hlola okuqukethwe kwewindi ohlanganyela nalo."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Vula ukuhlola ngokuthinta"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Izinto ezithintiwe zizokhulunywa ngokuzwakalayo futhi isikrini singahlolwa kusetshenziswa ukuthintwa."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Vula ukufinyeleleka kwewebhu okuthuthukisiwe"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Amaskripthi angase afakwe ukwenza okuqukethwe kohlelo lokusebenza kufinyeleleke kakhulu."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Qapha umbhalo owuthayiphayo"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Kufaka phakathi idatha yomuntu siqu efana nezinombolo zekhadi lesikweletu namaphasiwedi."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"khubaza noma guqula ibha yomumo"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Ivumela insiza ukuthi yenze umudwa ochaza ngesimo ukuthi ungasebenzi noma ukufaka noma ukukhipha izithonjana zohlelo."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"umudwa ochaza ngesimo"</string>
@@ -306,7 +314,7 @@
<string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"thola ulwazi lohlelo lokusebenza lwamanje"</string>
<string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"Ivumela umphathi ukuthi athole ulwazi oluyimfihlo mayelana nohlelo lokusebenza lwamanje ngaphambili kwesikrini."</string>
<string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"qapha futhi ulawule ukuqaliswa kwazo zonke izinsiza"</string>
- <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Ivumela insiza ukuthi ihlole futhi ilawule ukuthi isistimu iziqalisa kanjani izehlakalo. Izinzisa ezinobungozi zingensa isistimu ibe sebungozini. Lemvume idingakalela intuthuku kuphela hhay ukusetshenziswa okwejwayelekile."</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Ivumela uhlelo lokusebebenza ukuthi luhlole futhi lulawule ukuthi isistimu iziqalisa kanjani imisebenzi. Izinhlelo zokusebenza ezinobungozi zingensa isistimu ibe sebungozini. Le mvume idingakalela intuthuku kuphela hhayi ukusetshenziswa okwejwayelekile."</string>
<string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"thumela iphakheji yomsakazo okhishiwe"</string>
<string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"Ivumela insiza ukuthi isakaze isaziso sokuthi insiza ethize isusiwe. Izinsiza ezinobungozi zingasebenzisa lokhu ukubulala nanoma iyiphi enye insiza esebenzayo."</string>
<string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"thumela umsakazo otholwe nge-SMS"</string>
@@ -348,10 +356,6 @@
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Ivumela isimeli ukuhlanganisa uxhumano nomsebenzisi wezinga eliphezulu lendlela yokufaka. Ayisoze yadingeka kwizinhlelo ezivamile."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"hlanganisa kusevisi yokufinyeleleka"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Ivumela isibambi ukuhlanganisa uxhumo nomsebenzisi kwezinga eliphezulu lesevisi yesinqunjwana. Akusoze kwadingekela izinhlelo zokusebenza ezivamile."</string>
- <string name="permlab_canRequestTouchExplorationMode" msgid="6094034289937541846">"cela ukuhlola ngokuthinta"</string>
- <string name="permdesc_canRequestTouchExplorationMode" msgid="940314268922270663">"Ivumela i-hoder ukuthi icele imodi yokusebenzisana lapho izinto ezithintiwe zikhulunywa ngokumemezwa ne-UI ingahlolwa ngezimpawu."</string>
- <string name="permlab_canRequestEnahncedWebAccessibility" msgid="1905232971331801453">"cela ukufinyelela kuwebhu okuthuthukisiwe"</string>
- <string name="permdesc_canRequestEnahncedWebAccessibility" msgid="4500520989321729676">"Ivumela i-hoder ukucela ukunika amandla ukuthuthukiswa kokufinyelela iwebhu. isibonelo, ukufaka izikripthi kusuka ku-Google ukwenza okuqukethwe kohlelo lokusebenza ukuthi kufinyeleleke."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"bophezela kunsizakalo yombhalo"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Ivumela umbambi ukuhlanganisa uxhumano nomsebenzisi kwezinga eliphezulu lwesixhumi esibonakalayo sensizakalo yombhalo(isb. InsizakaloYokuhlolaUkubhala). Akusoze kwadingeka kwezinhlelo zokusebenza ezivamile."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"hlanganisa kwinsizakalo ye-VPN"</string>
@@ -568,7 +572,7 @@
<string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"ivumela isamukeli se-Wi-Fi Multicast"</string>
<string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Ivumela uhlelo lokusebenza ukuthola amaphakethe athunyelwe kuwo onke amadivayisi kunethiwekhi ye-Wi-Fi asebenzisa amakheli amaningi okusakaza, hhayi nje ithebhulethi yakho. Isebenzisa amandla aminingi ukudlula imodi okungeyona yokusakaza okuningi."</string>
<string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Ivumela uhlelo lokusebenza ukuthola amaphakethe athunyelwe kuwo onke amadivayisi kunethiwekhi ye-Wi-Fi asebenzisa amakheli amaningi okusakaza, hhayi nje ifoni yakho. Isebenzisa amandla aminingi ukudlula imodi okungeyona yokusakaza okuningi."</string>
- <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"finyelela ezilungiselelweni ze-Bluetooth"</string>
+ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"finyelela kuzilungiselelo ze-Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Ivumela uhlelo lokusebenza ukumisa ithebhulethi ye-Bluetooth yasendawni, nokuthola nokubhanqanisa namadivaysi okulawula okukude."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Ivumela uhlelo lokusebenza ukumisa ifoni ye-Bluetooth yasendawni, nokuthola nokubhanqanisa namadivaysi okulawula okukude."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"xhuma futhi unqamule kusuka ku-WiMAX"</string>
@@ -801,16 +805,16 @@
<string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"Sicela ubone Isiqondisi Somsebenzisi noma xhumana Nokunakekela Ikhasimende"</string>
<string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"Ikhadi le-SIM livaliwe."</string>
<string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Ivula ikhadi le-SIM..."</string>
- <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"Udwebe iphathini yakho yokuvula ngendlela engafanele-<xliff:g id="NUMBER_0">%d</xliff:g>. "\n\n" Zama futhi kwengu <xliff:g id="NUMBER_1">%d</xliff:g> imizuzwana."</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"Udwebe iphathini yakho yokuvula ngendlela engafanele izinkathi ezingu-<xliff:g id="NUMBER_0">%d</xliff:g>. "\n\n" Zama futhi emuva kwamasekhondi angu-<xliff:g id="NUMBER_1">%d</xliff:g>"</string>
<string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"Ubhale iphasiwedi yakho ngendlela engafanele <xliff:g id="NUMBER_0">%d</xliff:g> izikhathi. "\n\n"Zama futhi <xliff:g id="NUMBER_1">%d</xliff:g> imizuzwna."</string>
- <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"Ubhale i-PIN ykho ngendlela engafanele <xliff:g id="NUMBER_0">%d</xliff:g> izikhathi. "\n\n"Zama futhi <xliff:g id="NUMBER_1">%d</xliff:g> imizuzwana."</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"Udwebe ngokungalungile iphathini yakho yokuvula izikhathi ezingu-<xliff:g id="NUMBER_0">%d</xliff:g>. Emva <xliff:g id="NUMBER_1">%d</xliff:g> kweminye imizamo engaphumelelanga, uzocelwa ukuvula ithebhulethi yakho usebenzisa ukungena ngemvume kwi-Google."\n\n" Sicela uzame futhi kwengu-<xliff:g id="NUMBER_2">%d</xliff:g> imizuzwana."</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"Ukulayisha ungenisa iphathini yakho yokuvula ngendlela engalungile izikhathi ezi-<xliff:g id="NUMBER_0">%d</xliff:g> Emumva kweminye imizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g>, uzocelwa ukuvula ifoni yakho usebenzisa ukungena ngemvume ku-Google"\n\n" Zame futhi emumva kwengu- <xliff:g id="NUMBER_2">%d</xliff:g> imizuzwana."</string>
+ <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"Ubhale i-PIN ykho ngendlela engafanele <xliff:g id="NUMBER_0">%d</xliff:g> izikhathi. "\n\n"Zama futhi emuva kwamasekhondi angu-<xliff:g id="NUMBER_1">%d</xliff:g>."</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"Udwebe ngokungalungile iphathini yakho yokuvula izikhathi ezingu-<xliff:g id="NUMBER_0">%d</xliff:g>. Emva <xliff:g id="NUMBER_1">%d</xliff:g> kweminye imizamo engaphumelelanga, uzocelwa ukuvula ithebhulethi yakho usebenzisa ukungena ngemvume kwi-Google."\n\n" Sicela uzame futhi emuva kwamasekhondi angu-<xliff:g id="NUMBER_2">%d</xliff:g>"</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"Ukulayisha ungenisa iphathini yakho yokuvula ngendlela engalungile izikhathi ezingu-<xliff:g id="NUMBER_0">%d</xliff:g> Emumva kweminye imizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g>, uzocelwa ukuvula ifoni yakho usebenzisa ukungena ngemvume ku-Google"\n\n" Zame futhi emuva kwamasekhondi angu- <xliff:g id="NUMBER_2">%d</xliff:g>"</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"Uzame ngokusebenzisa indlela engafanele ukuvula izikhathi <xliff:g id="NUMBER_0">%d</xliff:g> ze-tablet. Ngemuva <xliff:g id="NUMBER_1">%d</xliff:g> kokuzama kaningana okuyimpumelelo i-tablet izobuyela kwizimo zasembonini futhi yonke imininingo yomsebenzisi izolahleka."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"Uzame ngokusebenzisa indlela engafanele ukuvula izikhathi <xliff:g id="NUMBER_0">%d</xliff:g> zocingo. Ngemuva <xliff:g id="NUMBER_1">%d</xliff:g> kokuzama kaningana ngaphandle kwempumelelo, ucingo luzobiyiselwa kwizimiso zasembonini futhi yonke imininingo yomsebenzisi izolahleka."</string>
<string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Uzame ukuvula ngendlela engafanele izikhathi <xliff:g id="NUMBER">%d</xliff:g> ze-tablet. I-tablet manje seyizosethwa kabusha ibe yizimiso zasembonini."</string>
<string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Uzame ukuvula ngendlela engafanele izikhathi <xliff:g id="NUMBER">%d</xliff:g> zocingo. Ucingo manje seyizosethwa kabusha ibe yizimiso zasembonini."</string>
- <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Zama futhi emaminithini angu <xliff:g id="NUMBER">%d</xliff:g>."</string>
+ <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Zama futhi emasekhondini angu-<xliff:g id="NUMBER">%d</xliff:g>."</string>
<string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Ukhohlwe iphethini?"</string>
<string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Ukuvulwa kwe-akhawunti"</string>
<string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"Kunemizamo eminingi kakhulu yephathini!"</string>
@@ -864,14 +868,10 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"Qalisa kabusha"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"Ikhasi eliku <xliff:g id="TITLE">%s</xliff:g> lithi:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"i-JavaScript"</string>
- <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
- <skip />
- <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
- <skip />
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Qinisekisa ukuzulazula"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Phuma kuleli khasi"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Hlala kuleli khasi"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Ingabe uqinisekile ukuthi ufuna ukuzulazulela ngokuphuma kuleli khasi?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Qinisekisa"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"Ithiphu: thepha kabili ukusondeza ngaphandle nangaphakathi."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Ukugcwalisa Ngokuzenzakalelayo"</string>
@@ -919,7 +919,7 @@
<string name="save_password_never" msgid="8274330296785855105">"Akusoze"</string>
<string name="open_permission_deny" msgid="7374036708316629800">"Awunayo imvume yokuvula leli khasi."</string>
<string name="text_copied" msgid="4985729524670131385">"Umbhalo ukopishwe ebhodini lokunamathisela."</string>
- <string name="more_item_label" msgid="4650918923083320495">"Okungaphezulu"</string>
+ <string name="more_item_label" msgid="4650918923083320495">"Okuningi"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Imenyu+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"isikhala"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"faka"</string>
@@ -936,15 +936,15 @@
<string name="oneMonthDurationPast" msgid="7396384508953779925">"inyanga engu-1 edlule"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Ngaphambi kwenyanga engu-1 edlule"</string>
<plurals name="num_seconds_ago">
- <item quantity="one" msgid="4869870056547896011">"isekhondi elingu-1 eledlule"</item>
- <item quantity="other" msgid="3903706804349556379">"amasekhondi angu-<xliff:g id="COUNT">%d</xliff:g> edlule."</item>
+ <item quantity="one" msgid="4869870056547896011">"1 isekhondi eledlule"</item>
+ <item quantity="other" msgid="3903706804349556379">"<xliff:g id="COUNT">%d</xliff:g> amasekhondi adlule"</item>
</plurals>
<plurals name="num_minutes_ago">
- <item quantity="one" msgid="3306787433088810191">"iminithi elingu-1 edlule"</item>
+ <item quantity="one" msgid="3306787433088810191">"1 iminithi elidlule"</item>
<item quantity="other" msgid="2176942008915455116">"<xliff:g id="COUNT">%d</xliff:g> amaminithi adlule.."</item>
</plurals>
<plurals name="num_hours_ago">
- <item quantity="one" msgid="9150797944610821849">"ihora elingu-1 elidlule"</item>
+ <item quantity="one" msgid="9150797944610821849">"1 ihora eledlule"</item>
<item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> amahora adlule"</item>
</plurals>
<plurals name="last_num_days">
@@ -973,15 +973,15 @@
<item quantity="other" msgid="5109449375100953247">"ezinsukwini ezingu-<xliff:g id="COUNT">%d</xliff:g>"</item>
</plurals>
<plurals name="abbrev_num_seconds_ago">
- <item quantity="one" msgid="1849036840200069118">"isekhondi elingu-1 edlule"</item>
+ <item quantity="one" msgid="1849036840200069118">"1 isekhondi edlule"</item>
<item quantity="other" msgid="3699169366650930415">"amasekhondi angu-<xliff:g id="COUNT">%d</xliff:g> edlule"</item>
</plurals>
<plurals name="abbrev_num_minutes_ago">
- <item quantity="one" msgid="6361490147113871545">"iminithi elingu-1 edlule"</item>
+ <item quantity="one" msgid="6361490147113871545">"1 iminithi eledlule"</item>
<item quantity="other" msgid="851164968597150710">"<xliff:g id="COUNT">%d</xliff:g> amaminithi adlule"</item>
</plurals>
<plurals name="abbrev_num_hours_ago">
- <item quantity="one" msgid="4796212039724722116">"ihora elingu-1 elidlule"</item>
+ <item quantity="one" msgid="4796212039724722116">"1 ihora eledlule"</item>
<item quantity="other" msgid="6889970745748538901">"<xliff:g id="COUNT">%d</xliff:g> amahora adlule"</item>
</plurals>
<plurals name="abbrev_num_days_ago">
@@ -1069,7 +1069,7 @@
<string name="capital_off" msgid="6815870386972805832">"VALIWE"</string>
<string name="whichApplication" msgid="4533185947064773386">"Qedela isenzo usebenzisa"</string>
<string name="alwaysUse" msgid="4583018368000610438">"Sebenzisa ngokuzenzakalelayo kulesenzo."</string>
- <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Susa izilungiselelo ozithola zikhona zeSistimu; Izinhlelo zokusebenzaApps &amp; Okulayishiwe"</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Susa izilungiselelo zesistimu; Izinhlelo zokusebenza &amp; Okulandiwe"</string>
<string name="chooseActivity" msgid="7486876147751803333">"Khetha okufanele kwenziwe"</string>
<string name="chooseUsbActivity" msgid="6894748416073583509">"Kheth insiza yedivayisi ye-USB"</string>
<string name="noApplications" msgid="2991814273936504689">"Azikho izinsiza ezingenza lokhu"</string>
@@ -1260,7 +1260,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"Thumela"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Okulandelayo"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Kwenziwe"</string>
- <string name="ime_action_previous" msgid="1443550039250105948">"Okwangaphambilini"</string>
+ <string name="ime_action_previous" msgid="1443550039250105948">"Okwandulele"</string>
<string name="ime_action_default" msgid="2840921885558045721">"Ukwenza"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Dayela inombolo"\n"usebenzisa <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Yenza othintana naye"\n" usebenzisa <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1291,7 +1291,7 @@
<string name="submit" msgid="1602335572089911941">"Hambisa"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Imodi yemoto ivunyelwe"</string>
<string name="car_mode_disable_notification_message" msgid="8035230537563503262">"Thinta ukuze uphume esimweni semoto."</string>
- <string name="tethered_notification_title" msgid="3146694234398202601">"Ukusebenzisa ifoni njengemodemu noma indawo ethakazelisayo kuvuliwe"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Ukusebenzisa njengemodemu noma i-hotspot ephathekayo kuvuliwe"</string>
<string name="tethered_notification_message" msgid="6857031760103062982">"Cindezela ukuze ulungisele ukusebenza."</string>
<string name="back_button_label" msgid="2300470004503343439">"Emuva"</string>
<string name="next_button_label" msgid="1080555104677992408">"Okulandelayo"</string>
@@ -1478,8 +1478,8 @@
<string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Uzame ngokusebenzisa indlela engafanele ukuvula ifoni izikhathi ezingu-<xliff:g id="NUMBER_0">%d</xliff:g>. Ngemuva kokuzama ngaphandle kwempumelelo okungu-<xliff:g id="NUMBER_1">%d</xliff:g>, ifoni izobuyiselwa kwizimiso zasembonini futhi yonke imininingwane yomsebenzisi izolahleka."</string>
<string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Uzame ukuvula ngendlela engafanele ifoni izikhathi ezingu-<xliff:g id="NUMBER">%d</xliff:g>. Ithebhulethi manje isizosethwa kabusha ibe yizimiso ezizenzakalelayo."</string>
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Uzame ukuvula ngendlela engafanele ifoni izikhathi ezingu-<xliff:g id="NUMBER">%d</xliff:g>. Ifoni manje isizosethwa kabusha ibe yizimiso ezizenzakalelayo."</string>
- <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Udwebe ngokungalungile iphathini yakho yokuvula izikhathi ezingu-<xliff:g id="NUMBER_0">%d</xliff:g>. Emva <xliff:g id="NUMBER_1">%d</xliff:g> kweminye imizamo engaphumelelanga, uzocelwa ukuvula ithebhulethi yakho usebenzisa ukungena ngemvume kwi-Google."\n\n" Sicela uzame futhi kwengu-<xliff:g id="NUMBER_2">%d</xliff:g> imizuzwana."</string>
- <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Ukulayisha ungenisa iphathini yakho yokuvula ngendlela engalungile izikhathi ezi-<xliff:g id="NUMBER_0">%d</xliff:g> Emva kweminye imizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g>, uzocelwa ukuvula ifoni yakho usebenzisa ukungena ngemvume ku-Google"\n\n" Zame futhi emumva kwengu- <xliff:g id="NUMBER_2">%d</xliff:g> imizuzwana."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Udwebe ngokungalungile iphathini yakho yokuvula izikhathi ezingu-<xliff:g id="NUMBER_0">%d</xliff:g>. Emva <xliff:g id="NUMBER_1">%d</xliff:g> kweminye imizamo engaphumelelanga, uzocelwa ukuvula ithebhulethi yakho usebenzisa ukungena ngemvume kwi-Google."\n\n" Sicela uzame futhi emuva kwamasekhondi angu-<xliff:g id="NUMBER_2">%d</xliff:g>"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Ukulayisha ungenisa iphathini yakho yokuvula ngendlela engalungile izikhathi ezi-<xliff:g id="NUMBER_0">%d</xliff:g> Emva kweminye imizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g>, uzocelwa ukuvula ifoni yakho usebenzisa ukungena ngemvume ku-Google"\n\n" Zame futhi emumva kwengu- <xliff:g id="NUMBER_2">%d</xliff:g> amasekhondi."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Susa"</string>
<string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"Khulisa ivolomu ngaphezu kwezinga elinconyiwe?"\n"Ukulalela ngevolomu ephezulu izikhathi ezinde kungalimaza ukuzwa kwakho."</string>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 84e300a112c6..5c772b2e99fa 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -633,6 +633,60 @@
<!-- True if WallpaperService is enabled -->
<bool name="config_enableWallpaperService">true</bool>
+ <!-- Whether to enable network location overlay which allows network
+ location provider to be replaced by an app at run-time. When disabled,
+ only the config_networkLocationProviderPackageName package will be
+ searched for network location provider, otherwise packages whose
+ signature matches the signatures of config_locationProviderPackageNames
+ will be searched, and the service with the highest version number will
+ be picked. Anyone who wants to disable the overlay mechanism can set it
+ to false.
+ -->
+ <bool name="config_enableNetworkLocationOverlay" translatable="false">true</bool>
+ <!-- Package name providing network location support. Used only when
+ config_enableNetworkLocationOverlay is false. -->
+ <string name="config_networkLocationProviderPackageName" translatable="false">@null</string>
+
+ <!-- Whether to enable fused location provider overlay which allows fused
+ location provider to be replaced by an app at run-time. When disabled,
+ only the config_fusedLocationProviderPackageName package will be
+ searched for fused location provider, otherwise packages whose
+ signature matches the signatures of config_locationProviderPackageNames
+ will be searched, and the service with the highest version number will
+ be picked. Anyone who wants to disable the overlay mechanism can set it
+ to false.
+ -->
+ <bool name="config_enableFusedLocationOverlay" translatable="false">true</bool>
+ <!-- Package name providing fused location support. Used only when
+ config_enableFusedLocationOverlay is false. -->
+ <string name="config_fusedLocationProviderPackageName" translatable="false">com.android.location.fused</string>
+
+ <!-- Whether to enable geocoder overlay which allows geocoder to be replaced
+ by an app at run-time. When disabled, only the
+ config_geocoderProviderPackageName package will be searched for
+ geocoder, otherwise packages whose signature matches the signatures of
+ config_locationProviderPackageNames will be searched, and the service
+ with the highest version number will be picked. Anyone who wants to
+ disable the overlay mechanism can set it to false.
+ -->
+ <bool name="config_enableGeocoderOverlay" translatable="false">true</bool>
+ <!-- Package name providing geocoder API support. Used only when
+ config_enableGeocoderOverlay is false. -->
+ <string name="config_geocoderProviderPackageName" translatable="false">@null</string>
+
+ <!-- Whether to enable geofence overlay which allows geofence to be replaced
+ by an app at run-time. When disabled, only the
+ config_geofenceProviderPackageName package will be searched for
+ geofence implementation, otherwise packages whose signature matches the
+ signatures of config_locationProviderPackageNames will be searched, and
+ the service with the highest version number will be picked. Anyone who
+ wants to disable the overlay mechanism can set it to false.
+ -->
+ <bool name="config_enableGeofenceOverlay" translatable="false">true</bool>
+ <!-- Package name providing geofence API support. Used only when
+ config_enableGeofenceOverlay is false. -->
+ <string name="config_geofenceProviderPackageName" translatable="false">@null</string>
+
<!-- Package name(s) containing location provider support.
These packages can contain services implementing location providers,
such as the Geocode Provider, Network Location Provider, and
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index c150fe01c255..2d9713813d78 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2029,27 +2029,27 @@
<public type="style" name="Widget.DeviceDefault.Light.CheckedTextView" id="0x010301dc" />
<!-- ===============================================================
- Resources added in version 18 of the platform
+ Resources added in version 18 of the platform (Jelly Bean MR2)
=============================================================== -->
<eat-comment />
- <public type="attr" name="mipMap" />
- <public type="attr" name="mirrorForRtl" />
- <public type="attr" name="windowOverscan" />
- <public type="attr" name="requiredForAllUsers" />
- <public type="attr" name="indicatorStart" />
- <public type="attr" name="indicatorEnd" />
- <public type="attr" name="childIndicatorStart" />
- <public type="attr" name="childIndicatorEnd" />
- <public type="attr" name="restrictedAccountType" />
- <public type="attr" name="requiredAccountType" />
- <public type="attr" name="canRequestTouchExplorationMode" />
- <public type="attr" name="canRequestEnhancedWebAccessibility" />
- <public type="attr" name="canRequestFilterKeyEvents" />
-
- <public type="style" name="Theme.Holo.NoActionBar.Overscan" />
- <public type="style" name="Theme.Holo.Light.NoActionBar.Overscan" />
- <public type="style" name="Theme.DeviceDefault.NoActionBar.Overscan" />
- <public type="style" name="Theme.DeviceDefault.Light.NoActionBar.Overscan" />
+ <public type="attr" name="mipMap" id="0x010103cd" />
+ <public type="attr" name="mirrorForRtl" id="0x010103ce" />
+ <public type="attr" name="windowOverscan" id="0x010103cf" />
+ <public type="attr" name="requiredForAllUsers" id="0x010103d0" />
+ <public type="attr" name="indicatorStart" id="0x010103d1" />
+ <public type="attr" name="indicatorEnd" id="0x010103d2" />
+ <public type="attr" name="childIndicatorStart" id="0x010103d3" />
+ <public type="attr" name="childIndicatorEnd" id="0x010103d4" />
+ <public type="attr" name="restrictedAccountType" id="0x010103d5" />
+ <public type="attr" name="requiredAccountType" id="0x010103d6" />
+ <public type="attr" name="canRequestTouchExplorationMode" id="0x010103d7" />
+ <public type="attr" name="canRequestEnhancedWebAccessibility" id="0x010103d8" />
+ <public type="attr" name="canRequestFilterKeyEvents" id="0x010103d9" />
+
+ <public type="style" name="Theme.Holo.NoActionBar.Overscan" id="0x010301dd" />
+ <public type="style" name="Theme.Holo.Light.NoActionBar.Overscan" id="0x010301de" />
+ <public type="style" name="Theme.DeviceDefault.NoActionBar.Overscan" id="0x010301df" />
+ <public type="style" name="Theme.DeviceDefault.Light.NoActionBar.Overscan" id="0x010301e0" />
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index db9602a1f10d..a1479af9f0ca 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1377,6 +1377,10 @@
<string name="permdesc_camera">Allows the app to take pictures and videos
with the camera. This permission allows the app to use the camera at any
time without your confirmation.</string>
+ <!-- Title of a camera app permission, listed so the user can choose whether or not they want to allow it to disable the may-transmit light indicator. -->
+ <string name="permlab_cameraDisableTransmitLed">disable transmit indicator LED when camera is in use</string>
+ <!-- Description of a camera app permission, listed so the user can choose whether or not they want to allow it to disable the may-transmit light indicator. -->
+ <string name="permdesc_cameraDisableTransmitLed">Allows a pre-installed system application to disable the camera use indicator LED.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_brick" product="tablet">permanently disable tablet</string>
@@ -4101,7 +4105,7 @@
<!-- Error message title [CHAR LIMIT=35] -->
<string name="error_message_title">Error</string>
<!-- Message informing user that app is not permitted to access accounts. [CHAR LIMIT=none] -->
- <string name="app_no_restricted_accounts">This application does not support accounts for limited users</string>
+ <string name="app_no_restricted_accounts">This application does not support accounts for restricted profiles</string>
<!-- Message informing user that the requested activity could not be found [CHAR LIMIT=none] -->
<string name="app_not_found">No application found to handle this action</string>
<string name="revoke">Revoke</string>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index fdf7c8f65606..2158e90779f7 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1534,6 +1534,10 @@
<java-symbol type="array" name="config_notificationFallbackVibePattern" />
<java-symbol type="bool" name="config_animateScreenLights" />
<java-symbol type="bool" name="config_automatic_brightness_available" />
+ <java-symbol type="bool" name="config_enableFusedLocationOverlay" />
+ <java-symbol type="bool" name="config_enableGeocoderOverlay" />
+ <java-symbol type="bool" name="config_enableGeofenceOverlay" />
+ <java-symbol type="bool" name="config_enableNetworkLocationOverlay" />
<java-symbol type="bool" name="config_sf_limitedAlpha" />
<java-symbol type="bool" name="config_unplugTurnsOnScreen" />
<java-symbol type="bool" name="config_wifi_background_scan_support" />
@@ -1618,6 +1622,10 @@
<java-symbol type="string" name="car_mode_disable_notification_title" />
<java-symbol type="string" name="chooser_wallpaper" />
<java-symbol type="string" name="config_datause_iface" />
+ <java-symbol type="string" name="config_fusedLocationProviderPackageName" />
+ <java-symbol type="string" name="config_geocoderProviderPackageName" />
+ <java-symbol type="string" name="config_geofenceProviderPackageName" />
+ <java-symbol type="string" name="config_networkLocationProviderPackageName" />
<java-symbol type="string" name="config_wimaxManagerClassname" />
<java-symbol type="string" name="config_wimaxNativeLibLocation" />
<java-symbol type="string" name="config_wimaxServiceClassname" />
diff --git a/data/keyboards/Vendor_045e_Product_028e.kl b/data/keyboards/Vendor_045e_Product_028e.kl
index ca6fa5941c26..301601a1ffdd 100644
--- a/data/keyboards/Vendor_045e_Product_028e.kl
+++ b/data/keyboards/Vendor_045e_Product_028e.kl
@@ -22,9 +22,9 @@ key 307 BUTTON_X
key 308 BUTTON_Y
key 310 BUTTON_L1
key 311 BUTTON_R1
-key 314 BUTTON_BACK
+key 314 BACK
key 315 BUTTON_START
-key 316 BUTTON_HOME
+key 316 HOME
key 317 BUTTON_THUMBL
key 318 BUTTON_THUMBR
diff --git a/data/keyboards/Vendor_046d_Product_c219.kl b/data/keyboards/Vendor_046d_Product_c219.kl
index 431dd03e886c..2fa964ce532e 100644
--- a/data/keyboards/Vendor_046d_Product_c219.kl
+++ b/data/keyboards/Vendor_046d_Product_c219.kl
@@ -23,7 +23,7 @@ key 309 BUTTON_R1
key 310 BUTTON_L2
key 311 BUTTON_R2
key 313 BUTTON_START
-key 312 BUTTON_BACK
+key 312 BACK
key 314 BUTTON_THUMBL
key 315 BUTTON_THUMBR
diff --git a/data/keyboards/Vendor_046d_Product_c21f.kl b/data/keyboards/Vendor_046d_Product_c21f.kl
index 981d864ecbb1..a9ba3781ec1b 100644
--- a/data/keyboards/Vendor_046d_Product_c21f.kl
+++ b/data/keyboards/Vendor_046d_Product_c21f.kl
@@ -21,8 +21,8 @@ key 308 BUTTON_Y
key 310 BUTTON_L1
key 311 BUTTON_R1
key 315 BUTTON_START
-key 314 BUTTON_BACK
-key 316 BUTTON_HOME
+key 314 BACK
+key 316 HOME
key 317 BUTTON_THUMBL
key 318 BUTTON_THUMBR
diff --git a/data/keyboards/Vendor_054c_Product_0268.kl b/data/keyboards/Vendor_054c_Product_0268.kl
index 62c5f4d5800e..7c601373c2d0 100644
--- a/data/keyboards/Vendor_054c_Product_0268.kl
+++ b/data/keyboards/Vendor_054c_Product_0268.kl
@@ -35,7 +35,7 @@ key 0x121 BUTTON_THUMBL
key 0x122 BUTTON_THUMBR
# PS key
-key 0x2d0 BUTTON_HOME
+key 0x2d0 HOME
# Left Analog Stick
axis 0x00 X
diff --git a/data/keyboards/Vendor_1689_Product_fd00.kl b/data/keyboards/Vendor_1689_Product_fd00.kl
index 6ce14ed03817..8407b1306472 100644
--- a/data/keyboards/Vendor_1689_Product_fd00.kl
+++ b/data/keyboards/Vendor_1689_Product_fd00.kl
@@ -18,11 +18,11 @@ key 304 BUTTON_A
key 305 BUTTON_B
key 307 BUTTON_X
key 308 BUTTON_Y
-key 307 BUTTON_L1
-key 308 BUTTON_R1
+key 310 BUTTON_L1
+key 311 BUTTON_R1
key 315 BUTTON_START
-key 314 BUTTON_BACK
-key 316 BUTTON_HOME
+key 314 BACK
+key 316 HOME
key 317 BUTTON_THUMBL
key 318 BUTTON_THUMBR
key 706 DPAD_UP
diff --git a/data/keyboards/Vendor_1689_Product_fd01.kl b/data/keyboards/Vendor_1689_Product_fd01.kl
index 81445159c8e2..cacc07526b15 100644
--- a/data/keyboards/Vendor_1689_Product_fd01.kl
+++ b/data/keyboards/Vendor_1689_Product_fd01.kl
@@ -19,10 +19,10 @@ key 305 BUTTON_B
key 307 BUTTON_X
key 308 BUTTON_Y
key 310 BUTTON_L1
-key 308 BUTTON_R1
+key 311 BUTTON_R1
key 315 BUTTON_START
-key 314 BUTTON_BACK
-key 316 BUTTON_HOME
+key 314 BACK
+key 316 HOME
key 317 BUTTON_THUMBL
key 318 BUTTON_THUMBR
diff --git a/data/keyboards/Vendor_1689_Product_fe00.kl b/data/keyboards/Vendor_1689_Product_fe00.kl
index 90fe4afa79fb..467173f00158 100644
--- a/data/keyboards/Vendor_1689_Product_fe00.kl
+++ b/data/keyboards/Vendor_1689_Product_fe00.kl
@@ -21,8 +21,8 @@ key 308 BUTTON_Y
key 310 BUTTON_L1
key 311 BUTTON_R1
key 315 BUTTON_START
-key 314 BUTTON_BACK
-key 316 BUTTON_HOME
+key 314 BACK
+key 316 HOME
key 317 BUTTON_THUMBL
key 318 BUTTON_THUMBR
diff --git a/data/keyboards/Vendor_1bad_Product_f016.kl b/data/keyboards/Vendor_1bad_Product_f016.kl
index b72fd5ce5f24..00f855915015 100644
--- a/data/keyboards/Vendor_1bad_Product_f016.kl
+++ b/data/keyboards/Vendor_1bad_Product_f016.kl
@@ -21,8 +21,8 @@ key 308 BUTTON_Y
key 310 BUTTON_L1
key 311 BUTTON_R1
key 315 BUTTON_START
-key 314 BUTTON_BACK
-key 316 BUTTON_HOME
+key 314 BACK
+key 316 HOME
key 317 BUTTON_THUMBL
key 318 BUTTON_THUMBR
diff --git a/data/keyboards/Vendor_1bad_Product_f023.kl b/data/keyboards/Vendor_1bad_Product_f023.kl
index c1588b2a2e6d..175a523b5b3e 100644
--- a/data/keyboards/Vendor_1bad_Product_f023.kl
+++ b/data/keyboards/Vendor_1bad_Product_f023.kl
@@ -21,7 +21,7 @@ key 308 BUTTON_Y
key 310 BUTTON_L1
key 311 BUTTON_R1
key 315 BUTTON_START
-key 314 BUTTON_BACK
+key 314 BACK
key 317 BUTTON_THUMBL
key 318 BUTTON_THUMBR
diff --git a/data/keyboards/Vendor_1bad_Product_f027.kl b/data/keyboards/Vendor_1bad_Product_f027.kl
index ea0aa7a5218b..216e3daebb9c 100644
--- a/data/keyboards/Vendor_1bad_Product_f027.kl
+++ b/data/keyboards/Vendor_1bad_Product_f027.kl
@@ -21,8 +21,8 @@ key 308 BUTTON_Y
key 310 BUTTON_L1
key 311 BUTTON_R1
key 315 BUTTON_START
-key 314 BUTTON_BACK
-key 316 BUTTON_HOME
+key 314 BACK
+key 316 HOME
key 317 BUTTON_THUMBL
key 318 BUTTON_THUMBR
diff --git a/data/keyboards/Vendor_1bad_Product_f036.kl b/data/keyboards/Vendor_1bad_Product_f036.kl
index 8cd906a3dfe4..f27de1c0e4f2 100644
--- a/data/keyboards/Vendor_1bad_Product_f036.kl
+++ b/data/keyboards/Vendor_1bad_Product_f036.kl
@@ -21,8 +21,8 @@ key 308 BUTTON_Y
key 310 BUTTON_L1
key 311 BUTTON_R1
key 315 BUTTON_START
-key 314 BUTTON_BACK
-key 316 BUTTON_HOME
+key 314 BACK
+key 316 HOME
key 317 BUTTON_THUMBL
key 318 BUTTON_THUMBR
diff --git a/data/keyboards/Vendor_1d79_Product_0009.kl b/data/keyboards/Vendor_1d79_Product_0009.kl
index 78fe2cd795ca..bbfbc37a9ba4 100644
--- a/data/keyboards/Vendor_1d79_Product_0009.kl
+++ b/data/keyboards/Vendor_1d79_Product_0009.kl
@@ -21,8 +21,8 @@ key 308 BUTTON_Y
key 310 BUTTON_L1
key 311 BUTTON_R1
key 315 BUTTON_START
-key 158 BUTTON_BACK
-key 172 BUTTON_HOME
+key 158 BACK
+key 172 HOME
key 317 BUTTON_THUMBL
key 318 BUTTON_THUMBR
diff --git a/data/keyboards/common.mk b/data/keyboards/common.mk
index 335298c9df81..7b3616733379 100644
--- a/data/keyboards/common.mk
+++ b/data/keyboards/common.mk
@@ -26,7 +26,23 @@ keylayouts := \
Vendor_046d_Product_c532.kl \
Vendor_054c_Product_0268.kl \
Vendor_05ac_Product_0239.kl \
- Vendor_22b8_Product_093d.kl
+ Vendor_22b8_Product_093d.kl \
+ Vendor_0079_Product_0011.kl \
+ Vendor_046d_Product_c219.kl \
+ Vendor_046d_Product_c21f.kl \
+ Vendor_0583_Product_2060.kl \
+ Vendor_0a5c_Product_8502.kl \
+ Vendor_1038_Product_1412.kl \
+ Vendor_12bd_Product_d015.kl \
+ Vendor_1689_Product_fd00.kl \
+ Vendor_1689_Product_fd01.kl \
+ Vendor_1689_Product_fe00.kl \
+ Vendor_1bad_Product_f016.kl \
+ Vendor_1bad_Product_f023.kl \
+ Vendor_1bad_Product_f027.kl \
+ Vendor_1bad_Product_f036.kl \
+ Vendor_1d79_Product_0009.kl \
+ Vendor_2378_Product_100a.kl
keycharmaps := \
Generic.kcm \
diff --git a/docs/html/about/versions/android-1.1.jd b/docs/html/about/versions/android-1.1.jd
index b61f18615c75..b2a16153e294 100644
--- a/docs/html/about/versions/android-1.1.jd
+++ b/docs/html/about/versions/android-1.1.jd
@@ -1,4 +1,5 @@
page.title=Android 1.1 Version Notes
+excludeFromSuggestions=true
sdk.version=1.1_r1
sys.date=February 2009
@jd:body
diff --git a/docs/html/about/versions/android-1.5-highlights.jd b/docs/html/about/versions/android-1.5-highlights.jd
index ff64e8c28cf9..dd4d218365b7 100644
--- a/docs/html/about/versions/android-1.5-highlights.jd
+++ b/docs/html/about/versions/android-1.5-highlights.jd
@@ -1,4 +1,5 @@
page.title=Android 1.5 Platform Highlights
+excludeFromSuggestions=true
@jd:body
<p>
diff --git a/docs/html/about/versions/android-1.5.jd b/docs/html/about/versions/android-1.5.jd
index 78dcbd761040..ca8771ba2ac3 100644
--- a/docs/html/about/versions/android-1.5.jd
+++ b/docs/html/about/versions/android-1.5.jd
@@ -1,4 +1,5 @@
page.title=Android 1.5 Platform
+excludeFromSuggestions=true
sdk.platform.version=1.5
sdk.platform.apiLevel=3
sdk.platform.majorMinor=major
diff --git a/docs/html/about/versions/android-1.6-highlights.jd b/docs/html/about/versions/android-1.6-highlights.jd
index 0c56e8ea3a97..88c0f55c8fc1 100644
--- a/docs/html/about/versions/android-1.6-highlights.jd
+++ b/docs/html/about/versions/android-1.6-highlights.jd
@@ -1,4 +1,5 @@
page.title=Android 1.6 Platform Highlights
+excludeFromSuggestions=true
sdk.date=September 2009
@jd:body
diff --git a/docs/html/about/versions/android-1.6.jd b/docs/html/about/versions/android-1.6.jd
index 2a66cd3e7e5a..313b77a7b6b4 100644
--- a/docs/html/about/versions/android-1.6.jd
+++ b/docs/html/about/versions/android-1.6.jd
@@ -1,4 +1,5 @@
page.title=Android 1.6 Platform
+excludeFromSuggestions=true
sdk.platform.version=1.6
sdk.platform.apiLevel=4
sdk.platform.majorMinor=minor
diff --git a/docs/html/about/versions/android-2.0-highlights.jd b/docs/html/about/versions/android-2.0-highlights.jd
index bec49a366fe7..3b23e4d6b0e0 100644
--- a/docs/html/about/versions/android-2.0-highlights.jd
+++ b/docs/html/about/versions/android-2.0-highlights.jd
@@ -1,4 +1,5 @@
page.title=Android 2.0 Platform Highlights
+excludeFromSuggestions=true
sdk.date=October 2009
@jd:body
diff --git a/docs/html/about/versions/android-2.0.1.jd b/docs/html/about/versions/android-2.0.1.jd
index bcba7177b684..ba0023109028 100644
--- a/docs/html/about/versions/android-2.0.1.jd
+++ b/docs/html/about/versions/android-2.0.1.jd
@@ -1,4 +1,5 @@
page.title=Android 2.0.1, Release 1
+excludeFromSuggestions=true
sdk.platform.version=2.0.1
sdk.platform.apiLevel=6
sdk.platform.majorMinor=minor
diff --git a/docs/html/about/versions/android-2.0.jd b/docs/html/about/versions/android-2.0.jd
index 7a12e48672e3..82bb78fa14f9 100644
--- a/docs/html/about/versions/android-2.0.jd
+++ b/docs/html/about/versions/android-2.0.jd
@@ -1,4 +1,5 @@
page.title=Android 2.0, Release 1
+excludeFromSuggestions=true
sdk.platform.version=2.0
sdk.platform.apiLevel=5
sdk.platform.majorMinor=major
diff --git a/docs/html/about/versions/android-2.1.jd b/docs/html/about/versions/android-2.1.jd
index 3cb0708ec42a..2d5988a20fdb 100644
--- a/docs/html/about/versions/android-2.1.jd
+++ b/docs/html/about/versions/android-2.1.jd
@@ -1,4 +1,5 @@
page.title=Android 2.1 Platform
+excludeFromSuggestions=true
sdk.platform.version=2.1
sdk.platform.apiLevel=7
sdk.platform.majorMinor=minor
diff --git a/docs/html/about/versions/android-2.2-highlights.jd b/docs/html/about/versions/android-2.2-highlights.jd
index 334d036a4290..afbf26bb654c 100644
--- a/docs/html/about/versions/android-2.2-highlights.jd
+++ b/docs/html/about/versions/android-2.2-highlights.jd
@@ -1,4 +1,5 @@
page.title=Android 2.2 Platform Highlights
+excludeFromSuggestions=true
@jd:body
diff --git a/docs/html/about/versions/android-2.2.jd b/docs/html/about/versions/android-2.2.jd
index 64ddca46b915..bd0f071e55f9 100644
--- a/docs/html/about/versions/android-2.2.jd
+++ b/docs/html/about/versions/android-2.2.jd
@@ -1,4 +1,5 @@
page.title=Android 2.2 APIs
+excludeFromSuggestions=true
sdk.platform.version=2.2
sdk.platform.apiLevel=8
sdk.platform.majorMinor=minor
diff --git a/docs/html/about/versions/android-2.3.3.jd b/docs/html/about/versions/android-2.3.3.jd
index 3b40831f97a7..eec0735b0842 100644
--- a/docs/html/about/versions/android-2.3.3.jd
+++ b/docs/html/about/versions/android-2.3.3.jd
@@ -1,4 +1,5 @@
page.title=Android 2.3.3 APIs
+excludeFromSuggestions=true
sdk.platform.version=2.3.3
sdk.platform.apiLevel=10
diff --git a/docs/html/about/versions/android-2.3.4.jd b/docs/html/about/versions/android-2.3.4.jd
index b80b4b2aeed2..963df9a7f51c 100644
--- a/docs/html/about/versions/android-2.3.4.jd
+++ b/docs/html/about/versions/android-2.3.4.jd
@@ -1,4 +1,5 @@
page.title=Android 2.3.4 APIs
+excludeFromSuggestions=true
sdk.platform.version=2.3.4
sdk.platform.apiLevel=10
diff --git a/docs/html/about/versions/android-2.3.jd b/docs/html/about/versions/android-2.3.jd
index 4feff51b5b3f..4b8ef914dadb 100644
--- a/docs/html/about/versions/android-2.3.jd
+++ b/docs/html/about/versions/android-2.3.jd
@@ -1,4 +1,5 @@
page.title=Android 2.3 APIs
+excludeFromSuggestions=true
sdk.platform.version=2.3
sdk.platform.apiLevel=9
diff --git a/docs/html/about/versions/android-3.0.jd b/docs/html/about/versions/android-3.0.jd
index d0b41d3387b1..f319feddba3d 100644
--- a/docs/html/about/versions/android-3.0.jd
+++ b/docs/html/about/versions/android-3.0.jd
@@ -1,4 +1,5 @@
page.title=Android 3.0 APIs
+excludeFromSuggestions=true
sdk.platform.version=3.0
sdk.platform.apiLevel=11
@jd:body
diff --git a/docs/html/about/versions/android-3.1.jd b/docs/html/about/versions/android-3.1.jd
index 8681327fd8b3..c22dfaa93caa 100644
--- a/docs/html/about/versions/android-3.1.jd
+++ b/docs/html/about/versions/android-3.1.jd
@@ -1,4 +1,5 @@
page.title=Android 3.1 APIs
+excludeFromSuggestions=true
sdk.platform.version=3.1
sdk.platform.apiLevel=12
@jd:body
diff --git a/docs/html/about/versions/android-3.2.jd b/docs/html/about/versions/android-3.2.jd
index 17f4d85d9a0b..ef95337db9b0 100644
--- a/docs/html/about/versions/android-3.2.jd
+++ b/docs/html/about/versions/android-3.2.jd
@@ -1,4 +1,5 @@
page.title=Android 3.2 APIs
+excludeFromSuggestions=true
sdk.platform.version=3.2
sdk.platform.apiLevel=13
@jd:body
diff --git a/docs/html/about/versions/android-4.0.3.jd b/docs/html/about/versions/android-4.0.3.jd
index dc69c993ece0..5fa8547eed5b 100644
--- a/docs/html/about/versions/android-4.0.3.jd
+++ b/docs/html/about/versions/android-4.0.3.jd
@@ -1,4 +1,5 @@
page.title=Android 4.0.3 APIs
+excludeFromSuggestions=true
sdk.platform.version=4.0.3
sdk.platform.apiLevel=15
@jd:body
diff --git a/docs/html/about/versions/android-4.0.jd b/docs/html/about/versions/android-4.0.jd
index 868227ad27ef..1d81bc2d93cf 100644
--- a/docs/html/about/versions/android-4.0.jd
+++ b/docs/html/about/versions/android-4.0.jd
@@ -1,4 +1,5 @@
page.title=Android 4.0 APIs
+excludeFromSuggestions=true
sdk.platform.version=4.0
sdk.platform.apiLevel=14
@jd:body
diff --git a/docs/html/about/versions/android-4.1.jd b/docs/html/about/versions/android-4.1.jd
index 60ed7f0b6e3e..060f0f40cf2b 100644
--- a/docs/html/about/versions/android-4.1.jd
+++ b/docs/html/about/versions/android-4.1.jd
@@ -1,4 +1,5 @@
page.title=Android 4.1 APIs
+excludeFromSuggestions=true
sdk.platform.version=4.1
sdk.platform.apiLevel=16
@jd:body
diff --git a/docs/html/about/versions/android-4.2.jd b/docs/html/about/versions/android-4.2.jd
index b02c1d10f4d9..73d51c557784 100644
--- a/docs/html/about/versions/android-4.2.jd
+++ b/docs/html/about/versions/android-4.2.jd
@@ -1,4 +1,5 @@
page.title=Android 4.2 APIs
+excludeFromSuggestions=true
sdk.platform.version=4.2
sdk.platform.apiLevel=17
@jd:body
diff --git a/docs/html/distribute/googleplay/about/monetizing.jd b/docs/html/distribute/googleplay/about/monetizing.jd
index 8233a31c04c4..9a5c6d7a6956 100644
--- a/docs/html/distribute/googleplay/about/monetizing.jd
+++ b/docs/html/distribute/googleplay/about/monetizing.jd
@@ -138,7 +138,7 @@ Google Play Developer Console.</p>
<h2 id="payouts">Monthly payouts in your local currency</h2>
<p>To sell products in Google Play, all you have to do is register for a Google
-Checkout merchant account and link it to your Google Play Android Developer
+Wallet merchant account and link it to your Google Play Android Developer
Console account (see <a
href="{@docRoot}distribute/googleplay/publish/register.html">Get Started with
Publishing</a> for details). Once you’ve set up your account and published your
@@ -159,4 +159,4 @@ transaction.</p>
<p>At the close of the month, you can download a complete sales report that
gives you the final details of all transactions that closed in the month,
including the payout amounts and other data. Additional financial reports are
-available in your Google Checkout merchant account.</p>
+available in your Google Wallet merchant account.</p>
diff --git a/docs/html/distribute/googleplay/promote/brand.jd b/docs/html/distribute/googleplay/promote/brand.jd
index cea6d2ca3d69..265584f6fa83 100644
--- a/docs/html/distribute/googleplay/promote/brand.jd
+++ b/docs/html/distribute/googleplay/promote/brand.jd
@@ -172,5 +172,22 @@ Play&trade; Store app."
see <a href="{@docRoot}distribute/googleplay/promote/linking.html">Linking to your products</a></p>
-<p>If you are not sure you meet these brand guidelines, <a href=
- "http://services.google.com/permissions/application">please contact us</a>. </p>
+
+<h2 id="Questions">Questions</h2>
+
+<p>To view our full guidelines or for any further brand usage questions, please contact our
+Android Partner Marketing team:</p>
+<ul>
+ <li>For North and South America, please contact <a
+ href="mailto:android-brand-approvals@google.com?Subject=Brand%20Approval%20Questions"
+ >android-brand-approvals@google.com</a></li>
+
+ <li>For Europe and Emerging Markets, please contact <a
+ href="mailto:emea-android-brand@google.com?Subject=Brand%20Approval%20Questions"
+ >emea-android-brand@google.com</a></li>
+
+ <li>For Asia and Pacific-America, please contact <a
+ href="mailto:apac-android-brand-approvals@google.com?Subject=Brand%20Approval%20Questions"
+ >apac-android-brand-approvals@google.com</a></li>
+</ul>
+
diff --git a/docs/html/distribute/googleplay/publish/console.jd b/docs/html/distribute/googleplay/publish/console.jd
index 0bf5e78c95c2..3831e51353f8 100644
--- a/docs/html/distribute/googleplay/publish/console.jd
+++ b/docs/html/distribute/googleplay/publish/console.jd
@@ -64,8 +64,8 @@ create the store listing page for a specific app.</p>
<h3 id="merchant">Linking your Merchant Account</h3>
<p>If you want to sell apps or in-app products, you can link your Google
-Checkout Merchant account to your developer profile. Google Play uses the linked
-Checkout account for financial and tax identification and monthly payouts of
+Wallet merchant account to your developer profile. Google Play uses the linked
+merchant account for financial and tax identification and monthly payouts of
sales. </p>
<h3 id="details">Your store listing details</h3>
diff --git a/docs/html/distribute/googleplay/publish/preparing.jd b/docs/html/distribute/googleplay/publish/preparing.jd
index 416f02e0fc24..b4b8c2267b2e 100644
--- a/docs/html/distribute/googleplay/publish/preparing.jd
+++ b/docs/html/distribute/googleplay/publish/preparing.jd
@@ -278,7 +278,7 @@ priced). You can also sell in-app products and subscriptions. </li>
</ul>
<p> If your app is be priced, or if you'll be selling in-app products,
-you need set up a Checkout Merchant Account before you can publish.</p>
+you need set up a Google Wallet merchant account before you can publish.</p>
<table>
<tr>
@@ -560,7 +560,7 @@ final checks.</p>
<p>Make sure that: </p>
<ul>
-<li>Your developer profile has the correct information and is linked to the proper Google Checkout Merchant account (if you are selling products).</li>
+<li>Your developer profile has the correct information and is linked to the proper Google Wallet merchant account (if you are selling products).</li>
<li>You have the right version of the app uploaded.</li>
<li>All parts of your Product Details are ready, including all graphic assets, screenshots, video, localized descriptions, and so on. </li>
<li>You have set your app's pricing to free or priced.</li>
diff --git a/docs/html/distribute/googleplay/publish/register.jd b/docs/html/distribute/googleplay/publish/register.jd
index 5f1f2eaccd19..faade8155efc 100644
--- a/docs/html/distribute/googleplay/publish/register.jd
+++ b/docs/html/distribute/googleplay/publish/register.jd
@@ -53,8 +53,8 @@ name, email address, and so on. You can modify this information later.</li>
<li>Read and accept the <strong>Developer Distribution Agreement</strong> that applies to your
country or region. Note that apps and store listings that you publish on Google Play must comply
with the Developer Program Policies and US export law,</li>
-<li>Pay a <strong>$25 USD registration fee</strong> using Google Checkout. If you don't have
-a Google Checkout account, you can quickly set one up during the process.</li>
+<li>Pay a <strong>$25 USD registration fee</strong> using Google Wallet. If you don't have
+a Google Wallet account, you can quickly set one up during the process.</li>
</ol>
<p>When your registration is verified, you’ll be notified at the email address you specified during registration.</p>
diff --git a/docs/html/distribute/googleplay/quality/tablet.jd b/docs/html/distribute/googleplay/quality/tablet.jd
index 6d7e3e2cbb05..192aae91350c 100644
--- a/docs/html/distribute/googleplay/quality/tablet.jd
+++ b/docs/html/distribute/googleplay/quality/tablet.jd
@@ -12,15 +12,15 @@ page.title=Tablet App Quality Checklist
<li><a href="#adjust-font-sizes">5. Adjust fonts and touch targets</a></li>
<li><a href="#adjust-widgets">6. Adjust homescreen widgets</a></li>
<li><a href="#offer-full-feature-set">7. Offer the app's full feature set</a></li>
-<li><a href="#hardware-requirements">8. Don’t require hardware features</a></li>
-<li><a href="#support-screens">9. Declare tablet screen support</a></li>
-<li><a href="#google-play">10. Showcase your tablet UI</a></li>
-<li><a href="#google-play-bp">11. Follow publishing best practices</a></li>
+<li><a href="#android-versions">8. Target Android versions properly</a></li>
+<li><a href="#hardware-requirements">9. Declare dependencies properly</a></li>
+<li><a href="#support-screens">10. Declare tablet screens support</a></li>
+<li><a href="#google-play">11. Showcase your tablet UI</a></li>
+<li><a href="#google-play-best-practices">12. Follow publishing best practices</a></li>
</ol>
<h2>Testing</h2>
<ol>
-<li><a href="#basic-technical-checks">Basic Technical Checks for Tablets</a></li>
<li><a href="#test-environment">Setting Up a Test Environment</a></li>
</ol>
</div></div>
@@ -47,12 +47,7 @@ to the greatest extent possible. </p>
that can help you address the topics raised in each task.</p>
-<h2 id="core-app-quality">1. Test for Core Tablet App Quality</h2>
-
-<p>Before publishing, make sure that your app and it's store listing meet the
- core quality guidlines below. </p>
-
-<h5>Core app quality</h5>
+<h2 id="core-app-quality" style="margin-top:1.5em;">1. Test for basic tablet app quality</h2>
<p>The first step in delivering a great tablet app experience is making sure
that it meets the <em>core app quality criteria</em> for all of the devices
@@ -60,69 +55,25 @@ and form factors that the app is targeting. For complete information, see the <a
href="{@docRoot}distribute/googleplay/quality/core.html">Core App Quality Guidelines</a>.
</p>
-<h5>Basic technical checks for tablets</h5>
<p>
- Before publishing, you should also ensure that your app passes several basic
- technical checks, such as:
+ Before publishing, also ensure that your app passes several basic
+ technical checks and launch criteria, such as:
</p>
<ul>
- <li>Targeting appropriate Android versions</li>
- <li>Specifying any feature dependencies properly</li>
- <li>Declaring support for appropriate screens</li>
+ <li><a href="#android-versions">Targets appropriate Android versions</a></li>
+ <li><a href="#hardware-requirements">Specifies any hardware dependencies properly</a></li>
+ <li><a href="#support-screens">Declares support for appropriate screens</a></li>
+ <li><a href="#use-extra-space">Uses all of the available screen space</a></li>
+ <li><a href="#google-play">Screenshots are uploaded to Google Play</a></li>
</ul>
-<p>
- For details, see <a href="#basic-technical-checks">Basic Technical
- Checks</a>.
-</p>
-
-<h5>Tablet screenshots and other promotional tools</h5>
-
-<p>Make sure that you upload screenshots of your tablet UI to the
- Developer Console and highlight your tablet experience in your app description,
- video, and promotional campaigns. For details, see <a href="#google-play">Showcase your
- tablet UI in Google Play.</a></p>
-
-<h5>Test environment</h5>
-
-<p>
- To assess the quality of your app on tablets, you need to set up a suitable
- hardware or emulator environment for testing. For more information, see
- <a href="#test-environment">Setting Up a Test Environment</a>.
-</p>
-<p>
- Note that a successful tablet app will go <em>well beyond the core and tablet
- app quality criteria</em> to offer a custom tablet experience to users. Read
- the sections below for ideas on how to plan and develop a great tablet UI for
- your app.
-</p>
+<p>If your app is already uploaded to the Google Play Developer Console, you
+ can see how it is doing against these checks
+ by visiting the <a href="#google-play-optimization-tips">Optimization
+ Tips page</a>.</p>
-<div class="rel-resources">
- <h3>
- Related resources
- </h3>
-
- <ul>
- <li>
- <a href="{@docRoot}distribute/googleplay/quality/core.html">Core App
- Quality</a>&mdash;A set of core quality criteria that all Android apps
- should meet on all targeted devices.
- </li>
-
- <li>
- <a href="#basic-technical-checks">Basic Technical Checks for
- Tablets</a>&mdash;Additional quality criteria for any app that is
- targeting, designed for, or distributable to Android tablets.
- </li>
- <li>
- <a href="#google-play">Showcase your tablet UI on Google Play</a>&mdash;Information
- on how to upload tablet screenshots and promote your tablet app.
- </li>
- </ul>
-</div>
-
<h2 id="optimize-layouts">2. Optimize your layouts for larger screens</h2>
<p>Android makes it easy to develop an app that runs well on a wide range of
@@ -288,7 +239,7 @@ different layouts in the appropriate screen size buckets (such as
<li>
<a href=
- "/training/design-navigation/multiple-sizes.html">Planning for Multiple
+ "{@docRoot}training/design-navigation/multiple-sizes.html">Planning for Multiple
Touchscreen Sizes</a>&mdash;Android Training class that walks you through
the essentials of planning an intuitive, effective navigation for tablets
and other devices.
@@ -304,7 +255,8 @@ different layouts in the appropriate screen size buckets (such as
</div>
-<h2 id="use-tablet-icons">4. Use Icons and other assets that are designed for tablet screens</h2>
+<h2 id="use-tablet-icons">4. Use Icons and other assets that are designed
+for tablet screens</h2>
<p>So that your app looks its best, make sure to use icons and other bitmap
assets that are created specifically for the densities used by tablet screens.
@@ -362,6 +314,16 @@ resource qualifiers</a> to ensure that the proper set of alternative resources
gets loaded.</li>
</ul>
+<p style="margin-bottom:.5em;">At a minimum, your app should supply sets of
+ custom drawables and assets for common tablet screen densities,
+ tagged with these qualifiers as appropriate:</p>
+
+<ul>
+ <li><code>hdpi</code>, OR</li>
+ <li><code>xhdpi</code>, OR</li>
+ <li><code>xxhdpi</code></li>
+</ul>
+
<div class="rel-resources">
<h3>
Related resources
@@ -375,7 +337,7 @@ gets loaded.</li>
<li>
<a href=
- "/guide/topics/resources/providing-resources.html">Providing
+ "{@docRoot}guide/topics/resources/providing-resources.html">Providing
Resources</a>&mdash;Developer documentation on how to provide
sets of layouts and drawable resources for specific ranges of device
screens.
@@ -390,7 +352,7 @@ gets loaded.</li>
<li>
<a href=
- "/training/basics/supporting-devices/screens.html">Supporting Different
+ "{@docRoot}training/basics/supporting-devices/screens.html">Supporting Different
Screens</a>&mdash;Android Training class that takes you
through the process of optimizing the user experience for different
screen sizes and densities.
@@ -527,49 +489,106 @@ that it is not accessible to users or that it offers “graceful degradation”
to a replacement feature (also see the section below on hardware features).</li>
</ul>
+<h2 id="android-versions">8. Target Android versions properly</h2>
+
+<p>To ensure the broadest possible distribution to tablets, make sure that your
+app properly targets the Android versions that support tablets. Initial support for
+tablets was added in <a href="{@docRoot}about/versions/android-3.0">Android 3.0</a> (API level 11). Unified UI
+framework support for tablets, phones, and other devices was introduced in <a href="{@docRoot}about/versions/android-4.0">Android 4.0</a> (API level 14) and is supported in later versions.
+
+<p>You can set the app's
+range of targeted Android versions in the manifest file, in the
+<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><code>&lt;uses-sdk&gt;</code></a> element. In most cases, you can target Android versions properly by setting the element's <code>targetSdkVersion</code> attribute to the highest API level available.</p>
+
+<p style="margin-bottom:.5em;">At a minimum, check the <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><code>&lt;uses-sdk&gt;</code></a>
+ element to make sure that:</p>
-<h2 id="hardware-requirements">8. Don’t require hardware features that might not be
- available on tablets</h2>
+ <ol style="list-style-type:lower-alpha;margin-top:0em;">
+ <li><code>targetSdkVersion</code> is declared with value 11 or higher (14 or higher is recommended), OR</li>
+ <li><code>minSdkVersion</code> is declared with value 11 or higher.</li>
+ <li>If a <code>maxSdkVersion</code> attribute is declared, it must have a value of 11 or higher. Note that, in general, the use of <code>maxSdkVersion</code> is <em>not recommended</em>.</li>
+</ol>
-<p>Handsets and tablets typically offer slightly different hardware support for
-sensors, camera, telephony, and other features. For example, many tablets are
-available in a "Wi-Fi" configuration that does not include telephony support.</p>
+<div class="rel-resources">
+<h3>
+ Related resources
+</h3>
-<p>To ensure that you can deliver a single APK broadly across the
-your full customer base, make sure that your app does not have built-in
-requirements for hardware features that aren't commonly available on tablets.
+<ul>
+ <li>
+ <a href=
+ "{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">Android API
+ Levels</a>&mdash;Introduces API levels and how they relate to compatibility.
+ A reference of available API levels is included.
+ </li>
+ <li>
+ <a href="{@docRoot}training/basics/supporting-devices/platforms.html">Supporting Different Platform Versions</a>&mdash;Training class showing how to declare support for
+ minimum and target API levels in your app.
+ </li>
+</ul>
+</div>
+
+<h2 id="hardware-requirements">9. Declare hardware feature dependencies properly</h2>
+
+<p>
+ Handsets and tablets typically offer slightly different hardware support for
+ sensors, camera, telephony, and other features. For example, many tablets are
+ available in a "Wi-Fi" configuration that does not include telephony support.
+</p>
+
+<p>
+ So that you can distribute a single APK broadly across your full customer
+ base of phones and tablets, make sure that your app doesn't declare
+ requirements for hardware features that aren't commonly available on tablets.
+ Instead, properly declare the hardware features as <em>not required</em> in the app
+ manifest, as described below.
</p>
<ul>
-<li>Your app's manifest should not include <a
-href="{@docRoot}guide/topics/manifest/uses-feature-element.html"><code>&lt;uses-feature&gt;</code></a>
-elements for hardware features or capabilities that might not be
-available on tablets, except when they are declared with the
-<code>android:required=”false”</code> attribute. For example, your app should
-not <em>require</em> features such as:
+<li>In your app manifest, locate any <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html"><code>&lt;uses-feature&gt;</code></a>
+elements. In particular, look for hardware features that might not be
+available on some tablets, such as:
+
<ul>
<li><code>android.hardware.telephony</code></li>
<li><code>android.hardware.camera</code> (refers to back camera), or</li>
<li><code>android.hardware.camera.front</code></li>
+</ul></li>
+
+<li>Declare the <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html"><code>&lt;uses-feature&gt;</code></a>
+elements as <em>not required</em> by including the <code>android:required=”false”</code>
+attribute.
+
+<p>
+ For example, here's the proper way to declare a dependency on
+ <code>android.hardware.telephony</code>, such that you can still
+ distribute the app broadly, even to devices that don't offer telephony:
+</p>
+
+<pre>&lt;uses-feature android:name="android.hardware.telephony" android:required="false" /&gt;</pre></li>
+
+<li>Similarly, check the manifest for <a href="/guide/topics/manifest/permission-element.html"><code>&lt;permission&gt;</code></a> elements that
+<a href="/guide/topics/manifest/uses-feature-element.html#permissions">imply hardware
+feature requirements</a> that not be appropriate for tablets. If you find such
+permissions, make sure to explicitly declare a corresponding
+<code>&lt;uses-feature&gt;</code> element for the features and includes the
+<code>android:required=”false”</code> attribute.</li>
</ul>
-</li>
-<li>Similarly, your app manifest should not include any <a
-href="{@docRoot}guide/topics/manifest/permission-element.html"><code>&lt;permission&gt;</code></a> elements that <a
-href="{@docRoot}guide/topics/manifest/uses-feature-element.html#permissions">imply
-feature requirements</a> that might not be appropriate for tablets, except when
-accompanied by a corresponding <code>&lt;uses-feature&gt;</code> element
-declared with the <code>android:required=”false”</code> attribute.
-<p>Here's an example of a dependency that's properly declared as "not required", so that
-it does not limit distribution to devices that do not support the dependency:</p>
-<p><code>&lt;uses-feature android:name="android.hardware.telephony"
-android:required="false" /&gt;</code></p></li>
-</ul>
-<p>In all cases, the app must function normally when the hardware features it
-uses are not available and should offer "graceful degradation" and alternative
-functionality where appropriate. For example, if GPS is not supported on the device,
-your app could let the user set their location manually. The app should do
-run-time checking for the hardware capability that it needs and handle as needed.</p>
+
+<p>
+ After declaring hardware features as <em>not required</em>, make sure to test
+ your app on a variety of devices. The app should function normally when the
+ hardware features it uses are not available, and it should offer "graceful
+ degradation" and alternative functionality where appropriate.
+</p>
+
+<p>
+ For example, if an app normally uses GPS to set the location but GPS is not
+ supported on the device, the app could let the user set the location manually
+ instead. The app can check for device hardware capabilities at runtime and handle
+ as needed.
+</p>
<div class="rel-resources">
<h3>
@@ -579,13 +598,13 @@ run-time checking for the hardware capability that it needs and handle as needed
<ul>
<li>
<a href=
- "/guide/topics/manifest/uses-feature-element.html#permissions">Permissions
+ "{@docRoot}guide/topics/manifest/uses-feature-element.html#permissions">Permissions
that Imply Feature Requirements</a>&mdash;A list of permissions that may
cause unwanted filtering if declared in your app's manifest.
</li>
<li>
<a href=
- "/guide/topics/manifest/uses-feature-element.html"><code>&lt;uses-feature&gt;</code></a>&mdash;Description
+ "{@docRoot}guide/topics/manifest/uses-feature-element.html"><code>&lt;uses-feature&gt;</code></a>&mdash;Description
and reference documentation for the <code>&lt;uses-feature&gt;</code>
manifest element.
</li>
@@ -599,23 +618,30 @@ run-time checking for the hardware capability that it needs and handle as needed
</ul>
</div>
-<h2 id="support-screens">9. Declare support for tablet screen configurations</h2>
+<h2 id="support-screens">10. Declare support for tablet screens</h2>
-<p>To ensure that you can distribute your app to a broad range of tablets,
-declare all the screen sizes that your app supports in its manifest:</p>
+<p>To ensure that you can distribute your app to a broad range of tablets, your app should
+declare support for tablet screen sizes in its manifest file, as follows:</p>
<ul>
-<li>Declare a <a
-href="{@docRoot}guide/topics/manifest/supports-screens-element.html"><code>&lt;supports-screens&gt;</code></a> element
-with appropriate attributes, as needed. For details, see <a
-href="#basic-technical-checks">Basic Technical Checks</a>
-later in this document.</li>
-<li>If the app declares a <code>&lt;compatible-screens&gt;</code> element in the
-manifest, the element must include attributes that specify <em>all of the size and
-density combinations for tablet screens</em> that the app supports. Note that, if possible,
-you should avoid using this element in your app.</li>
+ <li>A
+ <a href="{@docRoot}guide/topics/manifest/supports-screens-element.html"><code>&lt;supports-screens&gt;</code></a>
+ element, if declared, must not specify <code>android:largeScreens="false"</code>
+ or <code>android:xlargeScreens="false"</code>.</li>
+ <li>For apps targeting <code>minSdkVersion</code> value less than 13, a
+ <a href="{@docRoot}guide/topics/manifest/supports-screens-element.html"><code>&lt;supports-screens&gt;</code></a>
+ element must be declared with both <code>android:largeScreens="true"</code> and
+ <code>android:xlargeScreens="true"</code>.</li>
</ul>
+<p>If the app declares a
+<a href="{@docRoot}guide/topics/manifest/compatible-screens-element.html"><code>&lt;compatible-screens&gt;</code></a>
+element in the manifest, the element should include attributes that specify
+<em>all of the size and density combinations for tablet screens</em> that the
+app supports. Note that, if possible, you should avoid using the
+<a href="{@docRoot}guide/topics/manifest/compatible-screens-element.html"><code>&lt;compatible-screens&gt;</code></a>
+element in your app.</p>
+
<div class="rel-resources">
<h3>
Related resources
@@ -623,21 +649,8 @@ you should avoid using this element in your app.</li>
<ul>
<li>
- <a href="#basic-technical-checks">Basic Technical
- Checks</a>&mdash;Includes details (see <a href="#TB-R4">TB-R4</a>) on how
- to properly declare screens support for tablet screen sizes.
- </li>
-
- <li>
- <a href=
- "/guide/topics/manifest/supports-screens-element.html"><code>&lt;supports-screens&gt;</code></a>&mdash;Description
- and reference documentation for the <code>&lt;supports-screens&gt;</code>
- manifest element.
- </li>
-
- <li>
<a href=
- "/guide/practices/screens_support.html#DeclaringScreenSizeSupport">Declaring
+ "{@docRoot}guide/practices/screens_support.html#DeclaringScreenSizeSupport">Declaring
Screen Size Support</a>&mdash;Developer documentation that explains the
details of managing UI for best display on multiple screen sizes.
</li>
@@ -645,7 +658,7 @@ you should avoid using this element in your app.</li>
</div>
-<h2 id="google-play">10. Showcase your tablet UI in Google Play</h2>
+<h2 id="google-play">11. Showcase your tablet UI in Google Play</h2>
<p>
After you've done the work to create an rich, optimized UI for your tablet
@@ -653,16 +666,15 @@ you should avoid using this element in your app.</li>
ways to promote your tablet app to users on Google Play.
</p>
-<h5>
+<h4>
Upload screenshots of your tablet UI
-</h5>
+</h4>
<p>
Tablet users want to know what your app is like on a tablet device, not on a
- phone. Capitalize on their interest by showing them screenshots of your
- tablet UI on your app's store listing page. You can upload tablet screenshots
- from the Developer Console. Here are some tips and guidelines:
-</p>
+ phone. If you developed a tablet app, make sure to upload screenshots
+ of your tablet UI to the Google Play Developer Console. Here are some guidelines:
+ </p>
<ul style="margin-top:0;">
<li>Your screenshots should show the core functionality of your app, not a
@@ -670,7 +682,7 @@ you should avoid using this element in your app.</li>
what you should show in your screenshots.
</li>
- <li>Add screenshots taken on both 7-inch and 10-inch tablets, if possible.
+ <li>Add screenshots taken on both 7-inch and 10-inch tablets.
</li>
<li>It's recommended that you add screenshots taken in both landscape and
@@ -689,9 +701,9 @@ you should avoid using this element in your app.</li>
</li>
</ul>
-<h5>
+<h4>
Update your app description and release notes
-</h5>
+</h4>
<ul>
<li>In your app description, make sure to highlight that your app offers
@@ -704,9 +716,9 @@ you should avoid using this element in your app.</li>
</li>
</ul>
-<h5>
+<h4>
Update your promotional video
-</h5>
+</h4>
<p>
Many users view an app's promotional video to get an idea of what the app is
@@ -735,9 +747,9 @@ you should avoid using this element in your app.</li>
</li>
</ul>
-<h5>
+<h4>
Feature your tablet UI in your promotional campaigns
-</h5>
+</h4>
<p>
Make sure to let tablet users know about your tablet UI in your promotional
@@ -796,26 +808,59 @@ you should avoid using this element in your app.</li>
</ul>
</div>
-<h2 id="google-play-bp">11. Follow best practices for publishing in Google Play</h2>
+<h2 id="google-play-best-practices">12. Follow best practices for publishing in Google Play</h2>
-<p>Make sure that your app follows key best practices that ensure broad
- distribution to tablet devices. </p>
+<p>Here are some best practices for delivering a successful tablet app on Google Play.</p>
-<h5>Verify basic technical checks</h5>
+<h4 id="google-play-optimization-tips">Check out your app's Optimization Tips</h4>
- <ul>
- <li>Verify that the app is targeting the proper Android versions and screen sizes
- for Android tablets. Follow the <a href="#basic-technical-checks">Basic Technical
- Checks for Tablets</a> listed in the next section. </li>
- <li>After you've uploaded the app to the
- <a href="https://play.google.com/apps/publish/">Developer Console</a>,
- check the APK's Supported Devices list to make sure that the app is not filtered
- from tablet devices that you want to target.</p></li>
- </ul>
+<p>The Google Play Developer Console now offers an Optimization Tips page that
+lets you quickly check how your app is doing against basic guidelines for tablet app
+distribution and quality. To visit the page, sign into the Developer Console,
+load the app from All Applications, and click Optimization Tips in
+the left navigation.</p>
+
+<div class="sidebox-wrapper">
+<div class="sidebox">
+<h2 style="line-height:1em;">How to Send Feedback</h2>
+
+<p>Please use the link below to send
+feedback or request a manual review of your Optimization Tips.</p>
+
+<p>Make sure to read the relevant sections of the Tablet App Quality
+Guidelines prior to sending feedback.</p>
+
+<p><strong><a href="https://support.google.com/googleplay/android-developer/contact/tabletf"
+target="_googleplay" style="white-space:nowrap">Tablet Optimization
+Tips Feedback Form &raquo;</a></strong></p>
+</div>
+</div>
+
+<p>The Developer Console creates your app's Optimization Tips page
+by running a series of checks to verify basic quality
+criteria. If it finds any issues, it alerts you to them as "To Do"
+items in the Optimization Tips page.</p>
+
+<p>If you've developed a tablet experience for your app, make sure
+to visit the Optimization Tips page to see how your app is doing
+against the basic checks. If there are any issues listed, we
+recommend addressing them in your app and uploading a new binary for
+distribution, if needed.</p>
+
+<p>If the Optimization Tips page lists "To Do" issues that you feel don't
+apply to your app or affect its quality on tablets, please notify us
+using the <a href="https://support.google.com/googleplay/android-developer/contact/tabletf"
+target="_googleplay" style="white-space:nowrap">Tablet Optimization
+Tips Feedback Form</a>. We
+will review your app and update your Optimization Tips page as
+appropriate.</p>
+
+
+<h4>Confirm the app's filtering</h4>
+
+<p>After you've uploaded the app to the <a href="https://play.google.com/apps/publish/">Developer Console</a>, check the APK's Supported Devices list to make sure that the app is not filtered from tablet devices that you want to target.</p>
-<h5>
- Distribute as a single APK
-</h5>
+<h4>Distribute as a single APK</h4>
<p>
It's recommended that you publish your app as a single APK for all screen
@@ -841,7 +886,7 @@ you should avoid using this element in your app.</li>
<p>
If necessary, you can alternatively choose to deliver your app using <a href=
- "/google/play/publishing/multiple-apks.html">Multiple APK Support</a>,
+ "{@docRoot}google/play/publishing/multiple-apks.html">Multiple APK Support</a>,
although in most cases using a single APK to reach all devices is strongly
recommended.
</p>
@@ -858,189 +903,6 @@ you should avoid using this element in your app.</li>
</ul>
</div>
-<h2 id="basic-technical-checks">Basic Technical Checks for Tablets</h2>
-
-<p>
- This section lists specific details on basic technical checks that you should
- perform before publishing. The checks ensure that your app is properly targeted to a
- broad range of tablet devices. Make sure that the app meets all of the checks
- listed below.
-</p>
-
-<p>
- To verify the basic technical checks, follow the <a href="#tests">Test
- Procedures</a> listed below. Before you start, you need to obtain need the
- application source code.
-</p>
-
-<h5 id="criteria">
-Technical checks
-</h5>
-
-<table>
- <tr>
- <th style="width:2px;">
- Area
- </th>
- <th style="width:54px;">
- ID
- </th>
- <th>
- Description
- </th>
- <th style="width:54px;">
- Tests
- </th>
- </tr>
- <tr id="TB-R1">
- <td rowspan="2">Android Versions</td>
- <td>
- TB-R1
- </td>
- <td>
- <p style="margin-bottom:.5em;">App <em>does</em> target minimum Android versions
- that support tablets:</p>
- <ol style="margin-bottom:.5em;list-style-type:lower-alpha">
- <li><code>targetSdkVersion</code> is declared with value 11 or higher, OR</li>
- <li><code>minSdkVersion</code> is declared with value 11 or higher.</li>
- </ol>
- </td>
- <td><a href="#tests">TA-1</a></td>
- </tr>
- <tr id="TB-R2">
- <td>
- TB-R2
- </td>
- <td>
- <p style="margin-bottom:.5em;">App <em>does not</em> limit targeting to
- exclude Android versions that support tablets:</p>
- <ol style="margin-bottom:.5em;list-style-type:lower-alpha">
- <li><code>maxSdkVersion</code>, if declared, must have a value of 12
- or higher. </li>
- </ol>
- <p class="caution" style="margin-bottom:.25em;">Note that, in most cases, the use of <code>
- maxSdkVersion</code> is not recommended.</p>
- </td>
- <td><a href="#tests">TA-1</a></td>
- </tr>
- <tr id="TB-R3">
- <td rowspan="1">Feature Dependencies</td>
- <td>
- TB-R3
- </td>
- <td>
- <p style="margin-bottom:.5em;">App <em>does not</em> limit distribution to
- tablets by requiring hardware features not normally available on tablets,
- whether <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html#declared"
- declared explicitly</a> or <a href=
- "/guide/topics/manifest/uses-feature-element.html#permissions">implied by
- permissions</a>.
- </p>
- <ol style="margin-bottom:.5em;list-style-type:lower-alpha">
- <li>the app must not declare a <code>&lt;uses-feature&gt;</code> element for
- <code>android.hardware.telephony</code> unless the element is specifically
- marked with the <code>android:required="false"</code> attribute.
- </li>
- </ol>
- <p>For details, see <a href="#hardware-requirements">Hardware Requirements</a>
- earlier in this document.</p>
- </td>
- <td><a href="#tests">TA-1</a></td>
- </tr>
- <tr id="TB-R4">
- <td rowspan="2">Screens Support</td>
- <td>
- TB-R4
- </td>
- <td>
- <p style="margin-bottom:.5em;">App <em>does not</em> limit distribution to common
- tablet screen sizes:</p>
- <ol style="margin-bottom:.5em;list-style-type:lower-alpha">
- <li>If declared, <code>&lt;supports-screens&gt;</code> element must not specify
- <code>android:largeScreens="false"</code> or <code>android:xlargeScreens="false"</code>.</li>
- <li>For a <code>minSdkVersion</code> value less than 13, a <code>&lt;supports-screens&gt;</code>
- element must be declared with both <code>android:largeScreens="true"</code>
- and <code>android:xlargeScreens="true"</code>.</li>
- </ol>
- </td>
- <td><a href="#tests">TA-1</a></td>
- </tr>
- <tr id="TB-R5">
- <td>
- TB-R5
- </td>
- <td>
- <p style="margin-bottom:.5em;">App <em>does</em> supply custom drawables and
- assets for common tablet screen densities. Specifically, the APK must include
- corresponding resource directories tagged with these qualifiers:</p>
- <ol style="margin-bottom:.5em;list-style-type:lower-alpha">
- <li>An <code>hdpi</code> qualifier, OR</li>
- <li>An <code>xhdpi</code> qualifier, OR</li>
- <li>An <code>xxhdpi</code> qualifier</li>
- </ol>
-
- <p>For details, see <a href="#use-tablet-icons">Icons and Other Assets</a>
- earlier in this document.</p>
- </td>
- <td><a href="#tests">TA-2</a></td>
- </tr>
-</table>
-
-<p>If you use <a href="{@docRoot}google/play/publishing/multiple-apks.html">multiple APK
- support</a> to deliver size- or version-specific APKs, the APKs and their
- characteristics must meet all of the criteria listed above, either individually
- or as a cumulative set.</p>
-
-<h5 id="tests">
- Test procedures
-</h5>
-
-<table>
- <tr>
- <th style="width:54px;">
- Procedure
- <th>
- Description
- </th>
- </tr>
- <td>
- TA-1
- </td>
- <td>
- <p style="margin-bottom:.5em;">Obtain the APK and inspect the manifest.xml file. Check for the required attribute values.</p>
- </td>
- </tr>
- <tr id="ta2">
- <td>
- TA-2
- </td>
- <td>
- <p style="margin-bottom:.5em;">Obtain the APK and inspect the resources
- directories. Make sure that the app includes custom drawables and assets
- directories tagged with the required qualifiers.</p>
- </td>
- </tr>
-</table>
-
-<div class="rel-resources">
- <h3>
- Related resources
- </h3>
-
- <ul>
- <li>
- <a href="{@docRoot}distribute/googleplay/quality/core.html">Core App
- Quality</a>&mdash;A set of core quality criteria that all Android apps
- should meet on all targeted devices.
- </li>
-
- <li>
- <a href="#test-environment">Setting up a Test
- Environment</a>&mdash;Information on how to set up an environment to test
- your app on tablets.
- </li>
- </ul>
-</div>
<h2 id="test-environment">Setting Up a Test Environment for Tablets</h2>
diff --git a/docs/html/google/backup/signup.jd b/docs/html/google/backup/signup.jd
index d5c26a1dd3e8..70f7de209e7d 100644
--- a/docs/html/google/backup/signup.jd
+++ b/docs/html/google/backup/signup.jd
@@ -225,7 +225,7 @@ onclick="onRegister(); return false;" >Register with Android Backup Service</a><
} else if ($("input#agree").is(':checked')
&& packagename.length
&& packagename != DEFAULT_TEXT) {
- window.location = "http://play.google.com/apps/publish/GetBackupApiKey?p=" +
+ window.location = "https://play.google.com/apps/publish/v2/GetBackupApiKey?p=" +
encodeURIComponent(packagename);
} else {
$("label#agreeLabel,label#pnameLabel").parent().stop().animate({color: "#258AAF"}, 200,
diff --git a/docs/html/google/gcm/gcm.jd b/docs/html/google/gcm/gcm.jd
index 089baf5cc265..6beb486ec520 100644
--- a/docs/html/google/gcm/gcm.jd
+++ b/docs/html/google/gcm/gcm.jd
@@ -779,9 +779,9 @@ sent. Optional. The default value is <code>false</code>, and must be a JSON bool
that restricts the traffic to or
from the Internet, you need to configure it to allow connectivity with GCM in order for
your Android devices to receive messages.
-The ports to open are: 5228, 5229, and 5230. GCM typically only uses 5228, but
-it sometimes uses 5229 and 5230. GCM doesn't provide specific IPs, so you should
-allow your firewall to accept incoming connections from all IP addresses
+The ports to open are: 5228, 5229, and 5230. GCM typically only uses 5228, but
+it sometimes uses 5229 and 5230. GCM doesn't provide specific IPs, so you should allow
+your firewall to accept outgoing connections to all IP addresses
contained in the IP blocks listed in Google's ASN of 15169.</p>
diff --git a/docs/html/google/gcm/gs.jd b/docs/html/google/gcm/gs.jd
index 5d346413dab1..e96b204880dd 100644
--- a/docs/html/google/gcm/gs.jd
+++ b/docs/html/google/gcm/gs.jd
@@ -1,4 +1,5 @@
page.title=GCM: Getting Started
+page.tags="cloud","push","messaging"
@jd:body
<div id="qv-wrapper">
diff --git a/docs/html/google/play-services/auth.jd b/docs/html/google/play-services/auth.jd
index 8e111315a2c4..3ccc81a8240b 100644
--- a/docs/html/google/play-services/auth.jd
+++ b/docs/html/google/play-services/auth.jd
@@ -1,4 +1,5 @@
page.title=Authorization
+page.tags="AccountManager","oauth2"
@jd:body
<div id="qv-wrapper">
diff --git a/docs/html/google/play-services/maps.jd b/docs/html/google/play-services/maps.jd
index 5a4aaf49ce47..965444a1ff28 100644
--- a/docs/html/google/play-services/maps.jd
+++ b/docs/html/google/play-services/maps.jd
@@ -1,4 +1,5 @@
page.title=Google Maps Android API
+page.tags="mapview","location"
header.hide=1
@jd:body
diff --git a/docs/html/google/play-services/plus.jd b/docs/html/google/play-services/plus.jd
index de921be94ec3..e126dad22da0 100644
--- a/docs/html/google/play-services/plus.jd
+++ b/docs/html/google/play-services/plus.jd
@@ -1,4 +1,5 @@
page.title=Google+ Platform for Android
+page.tags="authentication","signin","social"
header.hide=1
@jd:body
diff --git a/docs/html/google/play-services/setup.jd b/docs/html/google/play-services/setup.jd
index 0cf2df303141..a960a181a798 100644
--- a/docs/html/google/play-services/setup.jd
+++ b/docs/html/google/play-services/setup.jd
@@ -1,4 +1,4 @@
-page.title=Setup
+page.title=Setup Google Play Services SDK
@jd:body
diff --git a/docs/html/google/play/billing/billing_admin.jd b/docs/html/google/play/billing/billing_admin.jd
index 91883da15b25..f1e4ec434d4c 100644
--- a/docs/html/google/play/billing/billing_admin.jd
+++ b/docs/html/google/play/billing/billing_admin.jd
@@ -29,15 +29,15 @@ few administrative tasks, including setting up and maintaining your product list
Developer Console, registering test accounts, and handling refunds when necessary.</p>
<p>You must have a Google Play publisher account to register test accounts. And you must have a
-Google Checkout merchant account to create a product list and issue refunds to your users. If you
+Google Wallet merchant account to create a product list and issue refunds to your users. If you
already have a publisher account on Google Play, you can use your existing account. You do not
need to register for a new account to support in-app billing.</p>
<p>If you do not have a publisher account, you can register as a Google Play
developer and set up a publisher account at the <a
href="http://play.google.com/apps/publish">Google Play Developer Console</a>. If you do not
-have a Google Checkout merchant account, you can register for one at the <a
-href="http://checkout.google.com">Google Checkout site</a>.</p>
+have a Google Wallet merchant account, you can register for one through the
+Developer Console.</p>
<h2 id="billing-list-setup">Creating a Product List</h2>
@@ -48,7 +48,7 @@ items that are listed in another application's product list.</p>
<p>You can access an application's product list by clicking the <strong>In-App Products</strong>
link in applications listed in your developer account (see
-figure 1). The <strong>In-App Products</strong> link appears only if you have a Google Checkout
+figure 1). The <strong>In-App Products</strong> link appears only if you have a Google Wallet
merchant account and the application's manifest includes the <code>com.android.vending.BILLING</code>
permission.</p>
@@ -67,7 +67,7 @@ storing and delivering the digital content that you sell in your applications.</
</div>
<p>You can create a product list for any published application or any draft application that's been
-uploaded and saved to the Developer Console. However, you must have a Google Checkout merchant
+uploaded and saved to the Developer Console. However, you must have a Google Wallet merchant
account and the application's manifest must include the <code>com.android.vending.BILLING</code>
permission. If an application's manifest does not include this permission, you will be able to edit
existing items in the product list but you will not be able to add new items to the list. For more
@@ -401,22 +401,22 @@ Billing Version 2</a>.
<p>In-app billing does not allow users to send a refund request to Google Play. Refunds for
in-app purchases must be directed to you (the application developer). You can then process the
-refund through your Google Checkout merchant account. When you do this, Google Play receives a
-refund notification from Google Checkout, and Google Play sends a refund message to your
+refund through your Google Wallet merchant account. When you do this, Google Play receives a
+refund notification from Google Wallet, and Google Play sends a refund message to your
application. For more information, see <a
href="{@docRoot}google/play/billing/v2/api.html#billing-action-notify">Handling
IN_APP_NOTIFY messages</a> and <a
href="http://support.google.com/googleplay/android-developer/bin/answer.py?hl=en&answer=1153485">In-app Billing
Pricing</a>.</p>
-<p class="caution"><strong>Important:</strong> You cannot use the Google Checkout API to issue
+<p class="caution"><strong>Important:</strong> You cannot use the Google Wallet API to issue
refunds or cancel In-app Billing transactions. You must do this manually through your Google
-Checkout merchant account. However, you can use the Google Checkout API to retrieve order
+Wallet merchant account. However, you can use the Google Wallet API to retrieve order
information.</p>
<h2 id="orderId">Working with Order Numbers</h2>
-<p>When a user purchases an in-app item, Google Checkout assigns the transaction
+<p>When a user purchases an in-app item, Google Wallet assigns the transaction
a unique and permanent order number. Google Play provides that order number to
you at the conclusion of the purchase flow, as the value of the
<code>orderId</code> field of the <code>PURCHASE_STATE_CHANGED</code>
@@ -428,9 +428,9 @@ number as a means of tracking the transaction in reconciliation reports and for
customer support.</p>
<p>The order number itself is a string consisting of numbers only, with a format
-assigned and managed by Google Checkout.</p>
+assigned and managed by Google Wallet.</p>
-<p>For transactions dated 5 December 2012 or later, Google Checkout assigns a
+<p>For transactions dated 5 December 2012 or later, Google Wallet assigns a
Merchant Order Number (rather than a Google Order Number) and reports the Merchant
Order Number as the value of <code>orderID</code>. Here's an
example:</p>
diff --git a/docs/html/google/play/billing/billing_overview.jd b/docs/html/google/play/billing/billing_overview.jd
index 14cbfdfb9846..581c648e5e58 100644
--- a/docs/html/google/play/billing/billing_overview.jd
+++ b/docs/html/google/play/billing/billing_overview.jd
@@ -10,7 +10,7 @@ parent.link=index.html
<li>Use In-app Billing to sell digital goods, including one-time items and
recurring subscriptions.</li>
<li>Supported for any app published on Google Play. You only need a Google
-Play Developer Console account and a Google Checkout Merchant account.</li>
+Play Developer Console account and a Google Wallet merchant account.</li>
<li>Checkout processing is automatically handled by Google Play, with the
same look-and-feel as for app purchases.</li>
</ul>
@@ -119,8 +119,8 @@ In-app Billing</a>.</p>
<h2 id="checkout">Google Play Purchase Flow</h2>
<p>Google Play uses the same checkout backend service as is used for application
purchases, so your users experience a consistent and familiar purchase flow.</p>
-<p class="note"><strong>Important:</strong> You must have a Google Checkout
-Merchant account to use the In-app Billing service on Google Play.</p>
+<p class="note"><strong>Important:</strong> You must have a Google Wallet
+merchant account to use the In-app Billing service on Google Play.</p>
<p>To initiate a purchase, your application sends a billing request for a
specific in-app product. Google Play then handles all of the checkout details for
the transaction, including requesting and validating the form of payment and
diff --git a/docs/html/google/play/billing/billing_subscriptions.jd b/docs/html/google/play/billing/billing_subscriptions.jd
index 2840dbc60119..92725cf3c47b 100644
--- a/docs/html/google/play/billing/billing_subscriptions.jd
+++ b/docs/html/google/play/billing/billing_subscriptions.jd
@@ -53,7 +53,7 @@ publish. For more information about using the Developer Console, see
<p>When users purchase subscriptions in your apps, Google Play handles all
checkout details so your apps never have to directly process any financial
transactions. Google Play processes all payments for subscriptions through
-Google Checkout, just as it does for standard in-app products and app purchases.
+Google Wallet, just as it does for standard in-app products and app purchases.
This ensures a consistent and familiar purchase flow for your users.</p>
<img src="{@docRoot}images/in-app-billing/v3/billing_subscription_v3.png" style="float:right; border:4px solid ddd;">
@@ -137,10 +137,10 @@ original price, but new users will be charged at the new price.</p>
automated recurring billing at either of two intervals:</p>
<ul>
- <li>Monthly &mdash; Google Play bills the customer’s Google Checkout account at
+ <li>Monthly &mdash; Google Play bills the customer’s Google Wallet account at
the time of purchase and monthly subsequent to the purchase date (exact billing
intervals can vary slightly over time)</li>
- <li>Annually &mdash; Google Play bills the customer's Google Checkout account at
+ <li>Annually &mdash; Google Play bills the customer's Google Wallet account at
the time of purchase and again on the same date in subsequent years.</li>
</ul>
@@ -154,7 +154,7 @@ cycles will always match subscription cycles, based on the purchase date.</p>
or by Direct Carrier Billing) that was originally used to purchase the
subscription.</p>
-<p>When the subscription payment is approved by Google Checkout, Google Play
+<p>When the subscription payment is approved by Google Wallet, Google Play
provides a purchase token back to the purchasing app through the In-app Billing
API. Your apps can store the token locally or pass it to your backend servers,
which can then use it to validate or cancel the subscription remotely using the <a
@@ -291,7 +291,7 @@ subscriptions are not available at this time.</p>
<h2 id="payment">Payment Processing and Policies</h2>
<p>In general, the terms of Google Play allow you to sell in-app subscriptions
-only through the standard payment processor, Google Checkout. For purchases of
+only through the standard payment processor, Google Wallet. For purchases of
any subscription products, the transaction fee is the same as the transaction
fee for application purchases (30%).</p>
@@ -306,7 +306,7 @@ document</a>.</p>
<h3 id="orderId">Subscription order numbers</h3>
<p>To help you track transactions relating to a given subscription, Google
-Checkout provides a base Merchant Order Number for all recurrences of the
+Wallet provides a base Merchant Order Number for all recurrences of the
subscription and denotes
each recurring transaction by appending an integer as follows: </p>
diff --git a/docs/html/google/play/billing/billing_testing.jd b/docs/html/google/play/billing/billing_testing.jd
index 8dcaa86e8aa7..241d45ed96db 100644
--- a/docs/html/google/play/billing/billing_testing.jd
+++ b/docs/html/google/play/billing/billing_testing.jd
@@ -77,8 +77,8 @@ reserved product IDs.</p>
<p>When you make an In-app Billing request with this product ID, Google Play responds as
though the purchase was refunded. Refunds cannot be initiated through Google Play's in-app
billing service. Refunds must be initiated by you (the merchant). After you process a refund
- request through your Google Checkout account, a refund message is sent to your application by
- Google Play. This occurs only when Google Play gets notification from Google Checkout that
+ request through your Google Wallet merchant account, a refund message is sent to your application by
+ Google Play. This occurs only when Google Play gets notification from Google Wallet that
a refund has been made. For more information about refunds, see <a href="{@docRoot}google/play/billing/v2/api.html#billing-action-notify">Handling
IN_APP_NOTIFY messages</a> and <a href="http://support.google.com/googleplay/android-developer/bin/answer.py?hl=en&answer=1153485">In-app Billing
Pricing</a>.</p>
@@ -200,7 +200,7 @@ testing.</p>
<p>To test your In-app Billing implementation with actual in-app purchases, you will need to
register at least one test account on the Google Play Developer Console. You cannot use your
-developer account to test the complete in-app purchase process because Google Checkout does not let
+developer account to test the complete in-app purchase process because Google Wallet does not let
you buy items from yourself. If you have not set up test accounts before, see <a
href="{@docRoot}google/play/billing/billing_admin.html#billing-testing-setup">Setting up test
accounts</a>.</p>
@@ -208,8 +208,8 @@ accounts</a>.</p>
<p>Also, a test account can purchase an item in your product list only if the item is published. The
application does not need to be published, but the item does need to be published.</p>
-<p>When you use a test account to purchase items, the test account is billed through Google Checkout
-and your Google Checkout Merchant account receives a payout for the purchase. Therefore, you may
+<p>When you use a test account to purchase items, the test account is billed through Google Wallet
+and your Google Wallet merchant account receives a payout for the purchase. Therefore, you may
want to refund purchases that are made with test accounts, otherwise the purchases will show up as
actual payouts to your merchant account.</p>
diff --git a/docs/html/google/play/billing/index.jd b/docs/html/google/play/billing/index.jd
index 44aa00191e26..1969154f5ea3 100644
--- a/docs/html/google/play/billing/index.jd
+++ b/docs/html/google/play/billing/index.jd
@@ -31,7 +31,7 @@ familiar purchase flow.</p>
<p>Any application that you publish through Google Play can implement In-app Billing. No special
account or registration is required other than a Google Play Developer Console account and a Google
-Checkout merchant account.</p>
+Wallet merchant account.</p>
<p>To help you integrate in-app billing into your application, the Android SDK
provides a sample application that demonstrates how to sell standard in-app
diff --git a/docs/html/google/play/billing/v2/billing_integrate.jd b/docs/html/google/play/billing/v2/billing_integrate.jd
index 15813155446d..ca41e0b7f471 100644
--- a/docs/html/google/play/billing/v2/billing_integrate.jd
+++ b/docs/html/google/play/billing/v2/billing_integrate.jd
@@ -226,7 +226,7 @@ how to do this.</p>
List</a>.</p>
<p class="note"><strong>Note:</strong> You must publish the items in your product
list (<code>sword_001</code> and <code>potion_001</code>) even though you are not publishing the
- sample application. Also, you must have a Google Checkout Merchant account to add items to the
+ sample application. Also, you must have a Google Wallet merchant account to add items to the
sample application's product list.</p>
</li>
</ol>
@@ -239,7 +239,7 @@ onto a device to run it. To run the sample application, do the following:</p>
<ol>
<li><strong>Make sure you have at least one test account registered under your Google Play
publisher account.</strong>
- <p>You cannot purchase items from yourself (Google Checkout prohibits this), so you need to
+ <p>You cannot purchase items from yourself (Google Wallet prohibits this), so you need to
create at least one test account that you can use to purchase items in the sample application.
To learn how to set up a test account, see <a
href="{@docRoot}google/play/billing/billing_testing.html#billing-testing-setup">Setting up Test
@@ -278,7 +278,7 @@ onto a device to run it. To run the sample application, do the following:</p>
</li>
<li><strong>Run the application and purchase the sword or the potion.</strong>
<p>When you use a test account to purchase items, the test account is billed through Google
- Wallet and your Google Checkout Merchant account receives a payout for the purchase.
+ Wallet and your Google Wallet merchant account receives a payout for the purchase.
Therefore, you may want to refund purchases that are made with test accounts, otherwise the
purchases will show up as actual payouts to your merchant account.</p>
</ol>
diff --git a/docs/html/google/play/billing/v2/billing_subscriptions.jd b/docs/html/google/play/billing/v2/billing_subscriptions.jd
index 3bcf212d8a4b..db18a53f8863 100644
--- a/docs/html/google/play/billing/v2/billing_subscriptions.jd
+++ b/docs/html/google/play/billing/v2/billing_subscriptions.jd
@@ -65,7 +65,7 @@ responses. Inside the requests and responses are two new fields described below.
token, a string value that uniquely identifies (and associates) a user ID and a
subscription ID. Google Play generates the purchase token when the user
completes the purchase of a subscription product (and payment is approved by
-Google Checkout) and then sends it to the purchasing app on the device through the
+Google Wallet) and then sends it to the purchasing app on the device through the
In-app Billing API. </p>
<p>At the conclusion of a <code>PURCHASE_REQUEST</code> message flow, your app
diff --git a/docs/html/guide/appendix/app-intents.jd b/docs/html/guide/appendix/app-intents.jd
index 110196c33ab0..8898927f240f 100644
--- a/docs/html/guide/appendix/app-intents.jd
+++ b/docs/html/guide/appendix/app-intents.jd
@@ -1,4 +1,5 @@
page.title=Reference of Available Intents
+excludeFromSuggestions=true
@jd:body
<p>This document describes the default applications and settings that Google provides
diff --git a/docs/html/guide/appendix/g-app-intents.jd b/docs/html/guide/appendix/g-app-intents.jd
index 10ec01e038f9..9ec72db2411f 100644
--- a/docs/html/guide/appendix/g-app-intents.jd
+++ b/docs/html/guide/appendix/g-app-intents.jd
@@ -1,4 +1,5 @@
page.title=Intents List: Invoking Google Applications on Android Devices
+excludeFromSuggestions=true
@jd:body
<div class="sidebox-wrapper">
diff --git a/docs/html/guide/appendix/glossary.jd b/docs/html/guide/appendix/glossary.jd
index 94cb0f08433b..af60eb728eb2 100644
--- a/docs/html/guide/appendix/glossary.jd
+++ b/docs/html/guide/appendix/glossary.jd
@@ -1,4 +1,5 @@
page.title=Glossary
+excludeFromSuggestions=true
@jd:body
<p>The list below defines some of the basic terminology of the Android platform. </p>
diff --git a/docs/html/guide/practices/compatibility.jd b/docs/html/guide/practices/compatibility.jd
index bc584035f624..9e3d4613cdba 100644
--- a/docs/html/guide/practices/compatibility.jd
+++ b/docs/html/guide/practices/compatibility.jd
@@ -1,4 +1,5 @@
page.title=Android Compatibility
+excludeFromSuggestions=true
@jd:body
<div id="qv-wrapper">
diff --git a/docs/html/guide/practices/index.jd b/docs/html/guide/practices/index.jd
index 48a849a0a6c0..b61272b91ad7 100644
--- a/docs/html/guide/practices/index.jd
+++ b/docs/html/guide/practices/index.jd
@@ -1,4 +1,5 @@
page.title=Best Practices
+excludeFromSuggestions=true
page.landing=true
page.landing.intro=Design and build apps the right way. Learn how to create apps that look great and perform well on as many devices as possible, from phones to tablets and more.
page.landing.image=
diff --git a/docs/html/guide/practices/optimizing-for-3.0.jd b/docs/html/guide/practices/optimizing-for-3.0.jd
index 0dd92d96fe07..465a847f68e6 100644
--- a/docs/html/guide/practices/optimizing-for-3.0.jd
+++ b/docs/html/guide/practices/optimizing-for-3.0.jd
@@ -1,4 +1,5 @@
page.title=Optimizing Apps for Android 3.0
+excludeFromSuggestions=true
@jd:body
diff --git a/docs/html/guide/practices/screen-compat-mode.jd b/docs/html/guide/practices/screen-compat-mode.jd
index 7f10914d7d95..e3160c395fcf 100644
--- a/docs/html/guide/practices/screen-compat-mode.jd
+++ b/docs/html/guide/practices/screen-compat-mode.jd
@@ -1,4 +1,5 @@
page.title=Screen Compatibility Mode
+excludeFromSuggestions=true
parent.title=Supporting Multiple Screens
parent.link=screens_support.html
diff --git a/docs/html/guide/practices/screens-distribution.jd b/docs/html/guide/practices/screens-distribution.jd
index 29d2a8c8e7dd..99eb04e6955e 100644
--- a/docs/html/guide/practices/screens-distribution.jd
+++ b/docs/html/guide/practices/screens-distribution.jd
@@ -1,4 +1,5 @@
page.title=Distributing to Specific Screens
+excludeFromSuggestions=true
parent.title=Supporting Multiple Screens
parent.link=screens_support.html
diff --git a/docs/html/guide/practices/screens-support-1.5.jd b/docs/html/guide/practices/screens-support-1.5.jd
index 15f069535df2..ad680d945222 100644
--- a/docs/html/guide/practices/screens-support-1.5.jd
+++ b/docs/html/guide/practices/screens-support-1.5.jd
@@ -1,4 +1,5 @@
page.title=Strategies for Android 1.5
+excludeFromSuggestions=true
parent.title=Supporting Multiple Screens
parent.link=screens_support.html
diff --git a/docs/html/guide/practices/seamlessness.jd b/docs/html/guide/practices/seamlessness.jd
index ec6b7fdff73c..9679e2a8a2ce 100644
--- a/docs/html/guide/practices/seamlessness.jd
+++ b/docs/html/guide/practices/seamlessness.jd
@@ -1,4 +1,5 @@
page.title=Designing for Seamlessness
+excludeFromSuggestions=true
@jd:body
<div id="qv-wrapper">
diff --git a/docs/html/guide/practices/ui_guidelines/activity_task_design.jd b/docs/html/guide/practices/ui_guidelines/activity_task_design.jd
index cb2bc373bbf1..f6669e4f36b4 100644
--- a/docs/html/guide/practices/ui_guidelines/activity_task_design.jd
+++ b/docs/html/guide/practices/ui_guidelines/activity_task_design.jd
@@ -1,4 +1,5 @@
page.title=Activity and Task Design Guidelines
+excludeFromSuggestions=true
parent.title=UI Guidelines
parent.link=index.html
@jd:body
diff --git a/docs/html/guide/practices/ui_guidelines/icon_design.jd b/docs/html/guide/practices/ui_guidelines/icon_design.jd
index 70ae862c8c77..07266607ed4c 100644
--- a/docs/html/guide/practices/ui_guidelines/icon_design.jd
+++ b/docs/html/guide/practices/ui_guidelines/icon_design.jd
@@ -1,4 +1,5 @@
page.title=Icon Design Guidelines
+excludeFromSuggestions=true
parent.title=UI Guidelines
parent.link=index.html
@jd:body
diff --git a/docs/html/guide/practices/ui_guidelines/icon_design_action_bar.jd b/docs/html/guide/practices/ui_guidelines/icon_design_action_bar.jd
index 9f835a719dec..831de4569edd 100644
--- a/docs/html/guide/practices/ui_guidelines/icon_design_action_bar.jd
+++ b/docs/html/guide/practices/ui_guidelines/icon_design_action_bar.jd
@@ -1,4 +1,5 @@
page.title=Action Bar Icons
+excludeFromSuggestions=true
parent.title=Icon Design Guidelines
parent.link=icon_design.html
@jd:body
diff --git a/docs/html/guide/practices/ui_guidelines/icon_design_dialog.jd b/docs/html/guide/practices/ui_guidelines/icon_design_dialog.jd
index a2c1459633b6..c958ed9a655e 100644
--- a/docs/html/guide/practices/ui_guidelines/icon_design_dialog.jd
+++ b/docs/html/guide/practices/ui_guidelines/icon_design_dialog.jd
@@ -1,4 +1,5 @@
page.title=Dialog Icons
+excludeFromSuggestions=true
parent.title=Icon Design Guidelines
parent.link=icon_design.html
@jd:body
diff --git a/docs/html/guide/practices/ui_guidelines/icon_design_launcher.jd b/docs/html/guide/practices/ui_guidelines/icon_design_launcher.jd
index 4ec56b1f0703..f47e186790a9 100644
--- a/docs/html/guide/practices/ui_guidelines/icon_design_launcher.jd
+++ b/docs/html/guide/practices/ui_guidelines/icon_design_launcher.jd
@@ -1,4 +1,5 @@
page.title=Launcher Icons
+excludeFromSuggestions=true
parent.title=Icon Design Guidelines
parent.link=icon_design.html
@jd:body
diff --git a/docs/html/guide/practices/ui_guidelines/icon_design_launcher_archive.jd b/docs/html/guide/practices/ui_guidelines/icon_design_launcher_archive.jd
index 452979703a10..2df3a2250ef5 100644
--- a/docs/html/guide/practices/ui_guidelines/icon_design_launcher_archive.jd
+++ b/docs/html/guide/practices/ui_guidelines/icon_design_launcher_archive.jd
@@ -1,4 +1,5 @@
page.title=Launcher Icons (Archive)
+excludeFromSuggestions=true
parent.title=Icon Design Guidelines
parent.link=icon_design.html
@jd:body
diff --git a/docs/html/guide/practices/ui_guidelines/icon_design_list.jd b/docs/html/guide/practices/ui_guidelines/icon_design_list.jd
index 38ceb85c5896..29e1a9380de7 100644
--- a/docs/html/guide/practices/ui_guidelines/icon_design_list.jd
+++ b/docs/html/guide/practices/ui_guidelines/icon_design_list.jd
@@ -1,4 +1,5 @@
page.title=List View Icons
+excludeFromSuggestions=true
parent.title=Icon Design Guidelines
parent.link=icon_design.html
@jd:body
diff --git a/docs/html/guide/practices/ui_guidelines/icon_design_menu.jd b/docs/html/guide/practices/ui_guidelines/icon_design_menu.jd
index 24bce51b714a..a5b35977fc0e 100644
--- a/docs/html/guide/practices/ui_guidelines/icon_design_menu.jd
+++ b/docs/html/guide/practices/ui_guidelines/icon_design_menu.jd
@@ -1,4 +1,5 @@
page.title=Menu Icons
+excludeFromSuggestions=true
parent.title=Icon Design Guidelines
parent.link=icon_design.html
@jd:body
diff --git a/docs/html/guide/practices/ui_guidelines/icon_design_status_bar.jd b/docs/html/guide/practices/ui_guidelines/icon_design_status_bar.jd
index 4cd4db37d83f..4993adb0328b 100644
--- a/docs/html/guide/practices/ui_guidelines/icon_design_status_bar.jd
+++ b/docs/html/guide/practices/ui_guidelines/icon_design_status_bar.jd
@@ -1,4 +1,5 @@
page.title=Status Bar Icons
+excludeFromSuggestions=true
parent.title=Icon Design Guidelines
parent.link=icon_design.html
@jd:body
diff --git a/docs/html/guide/practices/ui_guidelines/icon_design_tab.jd b/docs/html/guide/practices/ui_guidelines/icon_design_tab.jd
index 5338a4d6462d..cbe6706fb067 100644
--- a/docs/html/guide/practices/ui_guidelines/icon_design_tab.jd
+++ b/docs/html/guide/practices/ui_guidelines/icon_design_tab.jd
@@ -1,4 +1,5 @@
page.title=Tab Icons
+excludeFromSuggestions=true
parent.title=Icon Design Guidelines
parent.link=icon_design.html
@jd:body
diff --git a/docs/html/guide/practices/ui_guidelines/index.jd b/docs/html/guide/practices/ui_guidelines/index.jd
index 7603f6bc0242..91a0725b82e3 100644
--- a/docs/html/guide/practices/ui_guidelines/index.jd
+++ b/docs/html/guide/practices/ui_guidelines/index.jd
@@ -1,4 +1,5 @@
page.title=User Interface Guidelines
+excludeFromSuggestions=true
@jd:body
diff --git a/docs/html/guide/practices/ui_guidelines/menu_design.jd b/docs/html/guide/practices/ui_guidelines/menu_design.jd
index b4e2ea7492ec..bf87bdd124e7 100644
--- a/docs/html/guide/practices/ui_guidelines/menu_design.jd
+++ b/docs/html/guide/practices/ui_guidelines/menu_design.jd
@@ -1,4 +1,5 @@
page.title=Menu Design Guidelines
+excludeFromSuggestions=true
parent.title=UI Guidelines
parent.link=index.html
@jd:body
diff --git a/docs/html/guide/practices/ui_guidelines/widget_design.jd b/docs/html/guide/practices/ui_guidelines/widget_design.jd
index a48d17df1dc0..cf2cd64d483a 100644
--- a/docs/html/guide/practices/ui_guidelines/widget_design.jd
+++ b/docs/html/guide/practices/ui_guidelines/widget_design.jd
@@ -1,4 +1,5 @@
page.title=App Widget Design Guidelines
+excludeFromSuggestions=true
parent.title=UI Guidelines
parent.link=index.html
@jd:body
diff --git a/docs/html/guide/topics/graphics/hardware-accel.jd b/docs/html/guide/topics/graphics/hardware-accel.jd
index 9859c2840136..8ba6676bf11c 100644
--- a/docs/html/guide/topics/graphics/hardware-accel.jd
+++ b/docs/html/guide/topics/graphics/hardware-accel.jd
@@ -47,35 +47,24 @@ parent.link=index.html
</div>
</div>
- <p>Beginning in Android 3.0 (API level 11), the Android 2D rendering pipeline is designed to
- better support hardware acceleration. Hardware acceleration carries out all drawing operations
- that are performed on a {@link android.view.View}'s canvas using the GPU. Because of the
- increased resources required to enable hardware acceleration, your app will consume more RAM.</p>
-
- <p>The easiest way to enable hardware acceleration is to turn it on
- globally for your entire application. If your application uses only standard views and {@link
- android.graphics.drawable.Drawable}s, turning it on globally should not cause any adverse
- drawing effects. However, because hardware acceleration is not supported for all of the 2D drawing
- operations, turning it on might affect some of your applications that use custom views or drawing
- calls. Problems usually manifest themselves as invisible elements, exceptions, or wrongly
- rendered pixels. To remedy this, Android gives you the option to enable or disable hardware
- acceleration at the following levels:</p>
-
- <ul>
- <li>Application</li>
-
- <li>Activity</li>
-
- <li>Window</li>
-
- <li>View</li>
- </ul>
-
- <p>If your application performs custom drawing, test your application on actual hardware
-devices with hardware acceleration turned on to find any problems. The <a
-href="#drawing-support">Unsupported drawing operations</a> section describes known issues with
-drawing operations that cannot be hardware accelerated and how to work around them.</p>
-
+ <p>Beginning in Android 3.0 (API level 11), the Android 2D rendering pipeline supports hardware
+ acceleration, meaning that all drawing operations that are performed on a {@link
+ android.view.View}'s canvas use the GPU. Because of the increased resources required to enable
+ hardware acceleration, your app will consume more RAM.</p>
+
+ <p>Hardware acceleration is enabled by default if your Target API level is &gt;=14, but can also
+ be explicitly enabled. If your application uses only standard views and {@link
+ android.graphics.drawable.Drawable}s, turning it on globally should not cause any adverse drawing
+ effects. However, because hardware acceleration is not supported for all of the 2D drawing
+ operations, turning it on might affect some of your custom views or drawing calls. Problems
+ usually manifest themselves as invisible elements, exceptions, or wrongly rendered pixels. To
+ remedy this, Android gives you the option to enable or disable hardware acceleration at multiple
+ levels. See <a href="#controlling">Controlling Hardware Acceleration</a>.</p>
+
+ <p>If your application performs custom drawing, test your application on actual hardware devices
+ with hardware acceleration turned on to find any problems. The <a
+ href="#drawing-support">Unsupported drawing operations</a> section describes known issues with
+ hardware acceleration and how to work around them.</p>
<h2 id="controlling">Controlling Hardware Acceleration</h2>
<p>You can control hardware acceleration at the following levels:</p>
@@ -100,12 +89,12 @@ drawing operations that cannot be hardware accelerated and how to work around th
</pre>
<h4>Activity level</h4>
- <p>If your application does not behave properly with hardware acceleration turned on globally,
- you can control it for individual activities as well. To enable or disable hardware acceleration
- at the activity level, you can use the <code>android:hardwareAccelerated</code>
- attribute for the <a href="{@docRoot}guide/topics/manifest/activity-element.html">
- <code>&lt;activity&gt;</code></a> element. The following example enables hardware acceleration
-for the entire application but disables it for one activity:</p>
+ <p>If your application does not behave properly with hardware acceleration turned on globally, you
+ can control it for individual activities as well. To enable or disable hardware acceleration at
+ the activity level, you can use the <code>android:hardwareAccelerated</code> attribute for
+ the <a href="{@docRoot}guide/topics/manifest/activity-element.html">
+ <code>&lt;activity&gt;</code></a> element. The following example enables hardware acceleration for
+ the entire application but disables it for one activity:</p>
<pre>
&lt;application android:hardwareAccelerated="true"&gt;
@@ -228,8 +217,7 @@ changed.</li>
<p>With this model, you cannot rely on a view intersecting the dirty region to have its {@link
android.view.View#draw draw()} method executed. To ensure that the Android system records a
view’s display list, you must call {@link android.view.View#invalidate invalidate()}. Forgetting
- to do so causes a view to look the same even after changing it, which is an easier bug to find if
- it happens.</p>
+ to do so causes a view to look the same even after it has been changed.</p>
<p>Using display lists also benefits animation performance because setting specific properties,
such as alpha or rotation, does not require invalidating the targeted view (it is done
@@ -275,7 +263,7 @@ changed.</li>
<p>The following table describes the support level of various operations across API levels:</p>
<style type="text/css">
- .tblGenFixed,.tblGeneric{font-size:15px}.tblGenFixed td {padding:0 3px;letter-spacing:0;word-spacing:0;background-color:#fff;z-index:1;border-top:0px none;border-left:0px none;border-bottom:1px solid #CCC;border-right:1px solid #CCC;} .dn {display:none} .tblGenFixed td.s0 {background-color:white;border-top:1px solid #CCC;border-left:1px solid #CCC;} .tblGenFixed td.s2 {background-color:#d9d9d9;color:#000000;text-align:center;} .tblGenFixed td.s1 {background-color:#434343;color:#ffffff;text-align:center;border-top:1px solid #CCC;} .tblGenFixed td.s9 {background-color:;color:#6aa84f;text-align:center;} .tblGenFixed td.s12 {background-color:white;color:#6aa84f;text-align:center;} .tblGenFixed td.s13 {background-color:#d9d9d9;color:#6aa84f;text-align:center;} .tblGenFixed td.s7 {background-color:#d9d9d9;color:#980000;text-align:center;} .tblGenFixed td.s8 {background-color:;color:#980000;text-align:center;} .tblGenFixed td.s5 {background-color:#434343;color:#ffffff;text-align:left;border-left:1px solid #CCC;} .tblGenFixed td.s6 {background-color:;font-family:courier new,monospace;color:;text-align:right;border-left:1px solid #CCC;} .tblGenFixed td.s10 {background-color:white;font-family:courier new,monospace;color:#000000;text-align:right;border-left:1px solid #CCC;} .tblGenFixed td.s3 {background-color:white;color:#000000;text-align:center;} .tblGenFixed td.s11 {background-color:white;color:#980000;text-align:center;} .tblGenFixed td.s4 {background-color:#d9d9d9;color:#000000;text-align:center;}
+ .tblGenFixed, .tblGeneric{font-size:15px}.tblGenFixed td {padding:0 3px;letter-spacing:0;word-spacing:0;background-color:#fff;z-index:1;border-top:0px none;border-left:0px none;border-bottom:1px solid #CCC;border-right:1px solid #CCC;} .dn {display:none} .tblGenFixed td.s0 {background-color:white;border-top:1px solid #CCC;border-left:1px solid #CCC;} .tblGenFixed td.s1 {background-color:#434343;color:#ffffff;text-align:center;border-top:1px solid #CCC;} .tblGenFixed td.s2 {background-color:#d9d9d9;color:#000000;text-align:center;} .tblGenFixed td.s3 {background-color:white;color:#000000;text-align:center;} .tblGenFixed td.s5 {background-color:#434343;color:#ffffff;text-align:left;border-left:1px solid #CCC;} .tblGenFixed td.s10 {background-color:white;font-family:courier new,monospace;color:#000000;text-align:right;border-left:1px solid #CCC;} .tblGenFixed td.g_pos {background-color:#d9d9d9;color:#6aa84f;text-align:center;} .tblGenFixed td.g_neg {background-color:#d9d9d9;color:#980000;text-align:center;} .tblGenFixed td.w_pos {background-color:white;color:#6aa84f;text-align:center;} .tblGenFixed td.w_neg {background-color:white;color:#980000;text-align:center;}
</style>
<table border="0" cellpadding="0" cellspacing="0" class="tblGenFixed" id="tblMain">
<tbody>
@@ -294,242 +282,329 @@ changed.</li>
<td style="display:none;"></td>
<td class="s2">&lt; 16</td>
<td class="s3">16</td>
- <td class="s4">17</td>
+ <td class="s2">17</td>
<td class="s3">18</td>
</tr>
<tr>
<td colspan="5" class="s5">Canvas</td>
</tr>
<tr>
- <td class="s6">clipPath()</td>
- <td class="s7">&#10007;</td>
- <td class="s8">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s9">&#10003;</td>
+ <td class="s10">drawBitmapMesh() (colors array)</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_pos">&#10003;</td>
</tr>
<tr>
- <td class="s10">clipRegion()</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s12">&#10003;</td>
+ <td class="s10">drawPicture()</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
</tr>
<tr>
- <td class="s10">clipRect(Region.Op.XOR)</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s12">&#10003;</td>
+ <td class="s10">drawPosText()</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_pos">&#10003;</td>
+ <td class="g_pos">&#10003;</td>
+ <td class="w_pos">&#10003;</td>
</tr>
<tr>
- <td class="s10">clipRect(Region.Op.Difference)</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s12">&#10003;</td>
+ <td class="s10">drawTextOnPath()</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_pos">&#10003;</td>
+ <td class="g_pos">&#10003;</td>
+ <td class="w_pos">&#10003;</td>
</tr>
<tr>
- <td class="s10">clipRect(Region.Op.ReverseDifference)</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s12">&#10003;</td>
+ <td class="s10">drawVertices()</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
</tr>
<tr>
- <td class="s10">drawBitmapMesh() (colors array)</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s12">&#10003;</td>
+ <td class="s10">setDrawFilter()</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_pos">&#10003;</td>
+ <td class="g_pos">&#10003;</td>
+ <td class="w_pos">&#10003;</td>
</tr>
<tr>
- <td class="s10">drawPicture()</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
+ <td class="s10">clipPath()</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_pos">&#10003;</td>
</tr>
<tr>
- <td class="s10">drawPosText()</td>
- <td class="s7">&#10007;</td>
- <td class="s12">&#10003;</td>
- <td class="s13">&#10003;</td>
- <td class="s12">&#10003;</td>
+ <td class="s10">clipRegion()</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_pos">&#10003;</td>
</tr>
<tr>
- <td class="s10">drawTextOnPath()</td>
- <td class="s7">&#10007;</td>
- <td class="s12">&#10003;</td>
- <td class="s13">&#10003;</td>
- <td class="s12">&#10003;</td>
+ <td class="s10">clipRect(Region.Op.XOR)</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_pos">&#10003;</td>
</tr>
<tr>
- <td class="s10">drawVertices()</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
+ <td class="s10">clipRect(Region.Op.Difference)</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_pos">&#10003;</td>
</tr>
<tr>
- <td class="s10">setDrawFilter()</td>
- <td class="s7">&#10007;</td>
- <td class="s12">&#10003;</td>
- <td class="s13">&#10003;</td>
- <td class="s12">&#10003;</td>
+ <td class="s10">clipRect(Region.Op.ReverseDifference)</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_pos">&#10003;</td>
+ </tr>
+ <tr>
+ <td class="s10">clipRect() with rotation/perspective</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_pos">&#10003;</td>
</tr>
<tr>
<td colspan="5" class="s5">Paint</td>
</tr>
<tr>
- <td class="s6">setAntiAlias() (for text)</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s12">&#10003;</td>
+ <td class="s10">setAntiAlias() (for text)</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_pos">&#10003;</td>
</tr>
<tr>
- <td class="s6">setAntiAlias() (for lines)</td>
- <td class="s7">&#10007;</td>
- <td class="s12">&#10003;</td>
- <td class="s13">&#10003;</td>
- <td class="s12">&#10003;</td>
+ <td class="s10">setAntiAlias() (for lines)</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_pos">&#10003;</td>
+ <td class="g_pos">&#10003;</td>
+ <td class="w_pos">&#10003;</td>
</tr>
<tr>
- <td class="s6">setFilterBitmap()</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s13">&#10003;</td>
- <td class="s12">&#10003;</td>
+ <td class="s10">setFilterBitmap()</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_pos">&#10003;</td>
+ <td class="w_pos">&#10003;</td>
</tr>
<tr>
- <td class="s6">setLinearText()</td>
- <td class="s7">&#10007;</td>
- <td class="s8">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s8">&#10007;</td>
+ <td class="s10">setLinearText()</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
</tr>
<tr>
<td class="s10">setMaskFilter()</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
</tr>
<tr>
<td class="s10">setPathEffect() (for lines)</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
</tr>
<tr>
<td class="s10">setRasterizer()</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
</tr>
<tr>
<td class="s10">setShadowLayer() (other than text)</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
</tr>
<tr>
<td class="s10">setStrokeCap() (for lines)</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s12">&#10003;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_pos">&#10003;</td>
</tr>
<tr>
<td class="s10">setStrokeCap() (for points)</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
</tr>
<tr>
<td class="s10">setSubpixelText()</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
</tr>
<tr>
<td colspan="5" class="s5">Xfermode</td>
</tr>
<tr>
- <td class="s6">AvoidXfermode</td>
- <td class="s7">&#10007;</td>
- <td class="s8">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s8">&#10007;</td>
+ <td class="s10">AvoidXfermode</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
</tr>
<tr>
<td class="s10">PixelXorXfermode</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
</tr>
<tr>
<td class="s10">PorterDuff.Mode.DARKEN (framebuffer)</td>
- <td class="s7">&#10007;</td>
- <td class="s8">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s8">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
</tr>
<tr>
<td class="s10">PorterDuff.Mode.LIGHTEN (framebuffer)</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
</tr>
<tr>
<td class="s10">PorterDuff.Mode.OVERLAY (framebuffer)</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
</tr>
<tr>
<td colspan="5" class="s5">Shader</td>
</tr>
<tr>
<td class="s10">ComposeShader inside ComposeShader</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
</tr>
<tr>
<td class="s10">Same type shaders inside ComposeShader</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
</tr>
<tr>
<td class="s10">Local matrix on ComposeShader</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10007;</td>
- <td class="s7">&#10007;</td>
- <td class="s11">&#10003;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_pos">&#10003;</td>
</tr>
</tbody>
</table>
- <p>If your application is affected by any of these missing features or limitations, you can turn
- off hardware acceleration for just the affected portion of your application by calling
- {@link android.view.View#setLayerType setLayerType(View.LAYER_TYPE_SOFTWARE, null)}. This way,
-you can still take advantage of hardware acceleratin everywhere else. See <a
-href="#controlling">Controlling Hardware Acceleration</a> for more information on how to enable and
-disable hardware acceleration at different levels in your application.
+ <h3 id="scaling">Canvas Scaling</h3>
+
+ <p>The hardware accelerated 2D rendering pipeline was built first to support unscaled drawing,
+ with some drawing operations degrading quality significantly at higher scale values. These
+ operations are implemented as textures drawn at scale 1.0, transformed by the GPU. In API level
+ &lt;17, using these operations will result in scaling artifacts increasing with scale.</p>
+
+ The following table shows when implementation was changed to correctly handle large scales:
+ <table border="0" cellpadding="0" cellspacing="0" class="tblGenFixed" id="tblMain">
+ <tbody>
+ <tr class="rShim">
+ <td class="rShim" style="width:380px;"></td>
+ <td class="rShim" style="width:120px;"></td>
+ <td class="rShim" style="width:120px;"></td>
+ <td class="rShim" style="width:120px;"></td>
+ </tr>
+ <tr>
+ <td rowspan="2" class="s0"></td>
+ <td colspan="4" class="s1">API level</td>
+ </tr>
+ <tr>
+ <td style="display:none;"></td>
+ <td class="s2">&lt; 17</td>
+ <td class="s3">17</td>
+ <td class="s2">18</td>
+ </tr>
+ <tr>
+ <td colspan="5" class="s5">Support for large scale factors</td>
+ </tr>
+ <tr>
+ <td class="s10">drawText()</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_pos">&#10003;</td>
+ </tr>
+ <tr>
+ <td class="s10">drawPosText()</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ </tr>
+ <tr>
+ <td class="s10">drawTextOnPath()</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ </tr>
+ <tr>
+ <td class="s10">Simple Shapes*</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_pos">&#10003;</td>
+ <td class="g_pos">&#10003;</td>
+ </tr>
+ <tr>
+ <td class="s10">Complex Shapes*</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ </tr>
+ <tr>
+ <td class="s10">drawPath()</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ </tr>
+ <tr>
+ <td class="s10">Shadow layer</td>
+ <td class="g_neg">&#10007;</td>
+ <td class="w_neg">&#10007;</td>
+ <td class="g_neg">&#10007;</td>
+ </tr>
+ </tbody>
+ </table>
+ <p class="note"><strong>Note</strong>: 'Simple' shapes are <code>drawRect()</code>,
+ <code>drawCircle()</code>, <code>drawOval()</code>, <code>drawRoundRect()</code>, and
+ <code>drawArc()</code> (with useCenter=false) commands issued with a Paint that doesn't have a
+ PathEffect, and doesn't contain non-default joins (via <code>setStrokeJoin()</code> /
+ <code>setStrokeMiter()</code>). Other instances of those draw commands fall under 'Complex,' in
+ the above chart.</p>
+
+ <p>If your application is affected by any of these missing features or limitations, you can turn
+ off hardware acceleration for just the affected portion of your application by calling {@link
+ android.view.View#setLayerType setLayerType(View.LAYER_TYPE_SOFTWARE, null)}. This way, you can
+ still take advantage of hardware acceleration everywhere else. See <a
+ href="#controlling">Controlling Hardware Acceleration</a> for more information on how to enable
+ and disable hardware acceleration at different levels in your application.
<h2 id="layers">View Layers</h2>
diff --git a/docs/html/index.jd b/docs/html/index.jd
index 29d6a8f71839..ce3d9ad7c4de 100644
--- a/docs/html/index.jd
+++ b/docs/html/index.jd
@@ -14,7 +14,9 @@ page.metaDescription=The official site for Android developers. Provides the Andr
<ul>
<li class="item carousel-home">
<div class="content-left col-10">
- <img src="{@docRoot}images/home/io-extended-2013.png" style="margin:90px 0 0">
+ <a href="https://developers.google.com/events/io/io-extended/?utm_source=site&utm_medium=emb&utm_campaign=extended-android-site">
+ <img src="{@docRoot}images/home/io-extended-2013.png" style="margin:90px 0 0">
+ </a>
</div>
<div class="content-right col-5">
<h1>Google I/O Extended</h1>
diff --git a/docs/html/sdk/OLD_RELEASENOTES.jd b/docs/html/sdk/OLD_RELEASENOTES.jd
index 6865db235c0b..b7fd12f7cc5b 100644
--- a/docs/html/sdk/OLD_RELEASENOTES.jd
+++ b/docs/html/sdk/OLD_RELEASENOTES.jd
@@ -1,4 +1,5 @@
page.title=Release Notes for Older SDK Versions
+excludeFromSuggestions=true
@jd:body
<div class="special">
diff --git a/docs/html/sdk/RELEASENOTES.jd b/docs/html/sdk/RELEASENOTES.jd
index c7ece4230b1b..cbcbb1299c6a 100644
--- a/docs/html/sdk/RELEASENOTES.jd
+++ b/docs/html/sdk/RELEASENOTES.jd
@@ -1,4 +1,5 @@
page.title=SDK Release Notes
+excludeFromSuggestions=true
@jd:body
<p>This document provides version-specific information about Android SDK
diff --git a/docs/html/sdk/download.jd b/docs/html/sdk/download.jd
index 800500948acd..4329102ed34a 100644
--- a/docs/html/sdk/download.jd
+++ b/docs/html/sdk/download.jd
@@ -1,4 +1,5 @@
page.title=Download an Archived Android SDK
+excludeFromSuggestions=true
hide_license_footer=true
@jd:body
diff --git a/docs/html/sdk/index.jd b/docs/html/sdk/index.jd
index 315c97780408..e1d7557a5141 100644
--- a/docs/html/sdk/index.jd
+++ b/docs/html/sdk/index.jd
@@ -1,4 +1,5 @@
page.title=Android SDK
+page.tags="download"
page.template=sdk
header.hide=1
page.metaDescription=Download the official Android SDK to develop apps for Android-powered devices.
diff --git a/docs/html/sdk/older_releases.jd b/docs/html/sdk/older_releases.jd
index bb274b67aa7a..94baa92e4e4e 100644
--- a/docs/html/sdk/older_releases.jd
+++ b/docs/html/sdk/older_releases.jd
@@ -1,4 +1,5 @@
page.title=SDK Archives
+excludeFromSuggestions=true
@jd:body
<p>This page provides a full list of archived and obsolete SDK releases,
diff --git a/docs/html/support.jd b/docs/html/support.jd
index 86427b4b2ca8..2f1222fb3fdc 100644
--- a/docs/html/support.jd
+++ b/docs/html/support.jd
@@ -21,7 +21,6 @@ fullpage=1
<a href="http://groups.google.com/group/android-security-discuss">android-security-discuss</a> support forum<br />
<a href="http://webchat.freenode.net/?channels=android">#android</a>, <a href="http://webchat.freenode.net/?channels=android-dev">#android-dev</a> <span style="color:#888">(IRC via irc.freenode.net)</span><br />
- <a href="https://plus.google.com/108967384991768947849/posts">+Android Developers Office Hours</a> <span style="color:#888">(Wednesdays 2 PM PST (UTC-7))</span><br />
</p>
@@ -47,8 +46,9 @@ uppercase;border-bottom: 1px solid #CCC;margin: 0 0 20px;">Google Play Support</
<h5 id="contact">Direct support contacts for developers</h5>
<p style="color:#888">
<a href=" https://support.google.com/googleplay/android-developer/troubleshooter/3049653">Registration, account issues</a><br />
- <a href="http://support.google.com/googleplay/android-developer/bin/request.py?contact_type=publishing">Publishing, app distribution issues</a><br />
- <a href="http://support.google.com/googleplay/android-developer/bin/request.py?contact_type=bugs">Developer Console issues</a><br />
+ <a href="https://support.google.com/googleplay/android-developer/troubleshooter/3055196">Publishing, app distribution issues</a><br />
+ <a href="https://support.google.com/googleplay/android-developer/troubleshooter/3055329">App visibility and discoverability</a><br />
+ <a href="https://support.google.com/googleplay/android-developer/troubleshooter/3076003">Billing and reporting</a><br />
<a href="http://support.google.com/googleplay/android-developer/bin/request.py?contact_type=takedown">Inappropriate apps</a><br />
<a href="http://support.google.com/googleplay/android-developer/bin/answer.py?hl=en&answer=1085703&topic=15868&ctx=topic">Report a Google Play policy violation</a>
</p>
diff --git a/docs/html/tools/help/index.jd b/docs/html/tools/help/index.jd
index 0f943956a53d..bed14d187672 100644
--- a/docs/html/tools/help/index.jd
+++ b/docs/html/tools/help/index.jd
@@ -1,4 +1,4 @@
-page.title=Tools
+page.title=Tools Help
@jd:body
diff --git a/docs/html/tools/sdk/download.jd b/docs/html/tools/sdk/download.jd
deleted file mode 100644
index af256096139c..000000000000
--- a/docs/html/tools/sdk/download.jd
+++ /dev/null
@@ -1,93 +0,0 @@
-page.title=Download an Archived Android SDK
-hide_license_footer=true
-
-@jd:body
-
-<script type="text/javascript">
- function verify() {
- document.getElementById('download-button').disabled =
-!document.getElementById('checkbox').checked;
- }
- function submit() {
- var location = window.location.href;
- if (location.indexOf('?v=') != -1) {
- var filename = location.substring(location.indexOf('=')+1,location.length);
- if (document.getElementById('checkbox').checked) {
- document.location = "http://dl.google.com/android/" + filename;
- }
- document.getElementById('click-download').setAttribute("href", "http://dl.google.com/android/"
-+ filename);
- $("#terms-form").hide(500);
- $("#next-steps").show(500);
- document.getElementById('checkbox').disabled=true;
- document.getElementById('download-button').disabled=true;
- } else {
- alert("You have not selected an SDK version. Please return to the SDK Archives page");
- }
- }
-</script>
-
-<div id="terms-form">
- <p>Please carefully review the Android SDK License Agreement before downloading the SDK.
-The License Agreement constitutes a contract between you and Google with respect to your use of the
-SDK.</p>
- <p class="note"><strong>Note:</strong> You must agree to this license agreement in order to
-download one of the archived SDKs, because these SDK packages contain Google software (whereas, the
-<a href="http://developer.android.com/sdk/index.html">current SDK</a> packages do not require a
-license agreement, because they contain only the open sourced SDK tools).</p>
-
- <iframe id="terms" style="border:1px solid #888;margin:0 0 1em;height:400px;width:95%;"
-src="terms_body.html">
- </iframe>
-
- <p>
- <input type="checkbox" id="checkbox" onclick="verify()" />
- <label for="checkbox">I agree to the terms of the Android SDK License Agreement.</label>
- </p>
- <p>
- <input type="submit" value="Download" id="download-button" disabled="disabled"
-onclick="submit()" />
- </p>
- <p>
- <script language="javascript">
- var loc = window.location.href;
- if (loc.indexOf('?v=') != -1) {
- var filename = loc.substring(loc.indexOf('=')+1,loc.length).replace(/</g,"&lt;").replace(/>/g,"&gt;");
- document.write("File: " + filename);
- }
- </script>
- </p>
-</div><!-- end terms-form -->
-
-<noscript>
- <p><strong>Please enable Javascript in your browser in order to agree to the terms and download
-the SDK.</strong></p>
-</noscript>
-
-<div class="special" id="next-steps" style="display:none">
- <p>Your download should be underway. If not, <a id="click-download">click here to start the
-download</a>.</p>
- <p>Beware that you've just downloaded a very old version of the Android SDK, which is not
-recommended. We no longer maintain documentation about how to install these archived SDKs nor
-support the tools contained within.</p>
- <p>We recommend that you instead download the latest <a
-href="http://developer.android.com/sdk/index.html">Android SDK starter package</a>, which includes
-the latest SDK tools and allows you to develop against any version of the Android platform, back to
-Android 1.1.</p>
-</div>
-
-<script type="text/javascript">
- var loc = window.location.href;
- var filename = loc.substring(loc.indexOf('=')+1,loc.length);
- version = filename.substring(filename.indexOf('.')-1,filename.lastIndexOf('.'));
- $(".addVersionPath").each(function(i) {
- var oldHref = $(this).attr("href");
- $(this).attr({href: "/sdk/" + version + "/" + oldHref});
- });
-</script>
-
-
-
-
-
-
diff --git a/docs/html/tools/workflow/publishing/publishing.jd b/docs/html/tools/workflow/publishing/publishing.jd
index 649e80dbace3..ab6321c27c33 100644
--- a/docs/html/tools/workflow/publishing/publishing.jd
+++ b/docs/html/tools/workflow/publishing/publishing.jd
@@ -83,7 +83,7 @@ to the <a href="http://www.android.com/us/developer-distribution-agreement.html"
Developer Distribution Agreement</a>. After you register you can access the Developer
Console, where you can upload applications, configure publishing options, and monitor publishing
data. If you want to sell your applications or use the in-app billing feature, you will also need
-to set up a Google Checkout merchant account. For more information about the registration process,
+to set up a Google Wallet merchant account. For more information about the registration process,
see <a href="https://support.google.com/androidmarket/developer/bin/answer.py?hl=en&answer=113468">
Developer Registration</a>.</p>
@@ -271,7 +271,7 @@ in-app purchases is the same as the transaction fee for application purchases (3
<p>Any application that you publish through Google Play can implement in-app billing. No special
account or registration is required other than a Google Play publisher account and a Google
-Checkout Merchant account. Also, because the service uses no dedicated framework APIs, you can add
+Wallet merchant account. Also, because the service uses no dedicated framework APIs, you can add
in-app billing to any application that uses a minimum API level of 4 or higher.</p>
<p>To help you integrate in-app billing into your application, the Android SDK provides a <a
diff --git a/docs/html/training/in-app-billing/preparing-iab-app.jd b/docs/html/training/in-app-billing/preparing-iab-app.jd
index de2dac5c0cde..4698cf75a72e 100644
--- a/docs/html/training/in-app-billing/preparing-iab-app.jd
+++ b/docs/html/training/in-app-billing/preparing-iab-app.jd
@@ -47,7 +47,7 @@ next.link=list-iab-products.html
<p>The Google Play Developer Console is where you publish your In-app Billing application and manage the various digital goods that are available for purchase from your application. When you create a new application entry in the Developer Console, it automatically generates a public license key for your application. You will need this key to establish a trusted connection from your application to the Google Play servers. You only need to generate this key once per application, and don’t need to repeat these steps when you update the APK file for your application.</p>
<p>To add your application to the Developer Console:</p>
<ol>
-<li>Go to the <a href="http://play.google.com/apps/publish">Google Play Developer Console</a> site and log in. You will need to register for a new developer account, if you have not registered previously. To sell in-app items, you also need to have a <a href="http://www.google.com/wallet/merchants.html">Google Checkout Merchant</a> account.</li>
+<li>Go to the <a href="http://play.google.com/apps/publish">Google Play Developer Console</a> site and log in. You will need to register for a new developer account, if you have not registered previously. To sell in-app items, you also need to have a <a href="http://www.google.com/wallet/merchants.html">Google Wallet</a> merchant account.</li>
<li>Click on <strong>Try the new design</strong> to access the preview version of the Developer Console, if you are not already logged on to that version. </li>
<li>In the <strong>All Applications</strong> tab, add a new application entry.
<ol type="a">
diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java
index 5d1990a4b85e..773328c069bf 100644
--- a/graphics/java/android/renderscript/Allocation.java
+++ b/graphics/java/android/renderscript/Allocation.java
@@ -1711,6 +1711,8 @@ public class Allocation extends BaseObj {
}
/**
+ * @hide
+ *
* Interface to handle notification when new buffers are
* available via USAGE_IO_INPUT. An application will receive
* one notification when a buffer is available. Additional
@@ -1722,6 +1724,8 @@ public class Allocation extends BaseObj {
}
/**
+ * @hide
+ *
* Set a notification handler for USAGE_IO_INPUT
*
* @param callback instance of the IoInputNotifier class to be called
diff --git a/graphics/java/android/renderscript/FieldPacker.java b/graphics/java/android/renderscript/FieldPacker.java
index decd0c79bd09..730d97352630 100644
--- a/graphics/java/android/renderscript/FieldPacker.java
+++ b/graphics/java/android/renderscript/FieldPacker.java
@@ -23,6 +23,10 @@ import java.util.BitSet;
* Utility class for packing arguments and structures from Android system objects to
* Renderscript objects.
*
+ * This class is only intended to be used to support the
+ * reflected code generated by the RS tool chain. It should not
+ * be called directly.
+ *
**/
public class FieldPacker {
public FieldPacker(int len) {
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 6f614c3767e9..4493d41aace6 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -128,6 +128,8 @@ public class RenderScript {
}
}
+ ContextType mContextType;
+
// Methods below are wrapped to protect the non-threadsafe
// lockless fifo.
native int rsnContextCreateGL(int dev, int ver, int sdkVer,
@@ -1015,6 +1017,7 @@ public class RenderScript {
static final int RS_MESSAGE_TO_CLIENT_USER = 4;
static final int RS_MESSAGE_TO_CLIENT_NEW_BUFFER = 5;
+ static final int RS_ERROR_FATAL_DEBUG = 0x0800;
static final int RS_ERROR_FATAL_UNKNOWN = 0x1000;
MessageThread(RenderScript rs) {
@@ -1057,7 +1060,17 @@ public class RenderScript {
if (msg == RS_MESSAGE_TO_CLIENT_ERROR) {
String e = mRS.nContextGetErrorMessage(mRS.mContext);
- if (subID >= RS_ERROR_FATAL_UNKNOWN) {
+ // Throw RSRuntimeException under the following conditions:
+ //
+ // 1) It is an unknown fatal error.
+ // 2) It is a debug fatal error, and we are not in a
+ // debug context.
+ // 3) It is a debug fatal error, and we do not have an
+ // error callback.
+ if (subID >= RS_ERROR_FATAL_UNKNOWN ||
+ (subID >= RS_ERROR_FATAL_DEBUG &&
+ (mRS.mContextType != ContextType.DEBUG ||
+ mRS.mErrorCallback == null))) {
throw new RSRuntimeException("Fatal error " + subID + ", details: " + e);
}
@@ -1092,6 +1105,7 @@ public class RenderScript {
}
RenderScript(Context ctx) {
+ mContextType = ContextType.NORMAL;
if (ctx != null) {
mApplicationContext = ctx.getApplicationContext();
}
@@ -1125,6 +1139,7 @@ public class RenderScript {
rs.mDev = rs.nDeviceCreate();
rs.mContext = rs.nContextCreate(rs.mDev, 0, sdkVersion, ct.mID);
+ rs.mContextType = ct;
if (rs.mContext == 0) {
throw new RSDriverException("Failed to create RS context.");
}
diff --git a/graphics/java/android/renderscript/Script.java b/graphics/java/android/renderscript/Script.java
index b4ba943482c5..f0579ca24c2b 100644
--- a/graphics/java/android/renderscript/Script.java
+++ b/graphics/java/android/renderscript/Script.java
@@ -166,6 +166,15 @@ public class Script extends BaseObj {
mRS.nScriptForEach(getID(mRS), slot, in_id, out_id, params);
}
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ * @param slot
+ * @param ain
+ * @param aout
+ * @param v
+ * @param sc
+ */
protected void forEach(int slot, Allocation ain, Allocation aout, FieldPacker v, LaunchOptions sc) {
if (ain == null && aout == null) {
throw new RSIllegalArgumentException(
@@ -310,6 +319,12 @@ public class Script extends BaseObj {
mRS.nScriptSetVarVE(getID(mRS), index, v.getData(), e.getID(mRS), dims);
}
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ * @param index
+ * @param v
+ */
public void getVarV(int index, FieldPacker v) {
mRS.nScriptGetVarV(getID(mRS), index, v.getData());
}
@@ -332,6 +347,10 @@ public class Script extends BaseObj {
}
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ */
public static class FieldBase {
protected Element mElement;
protected Allocation mAllocation;
@@ -364,16 +383,29 @@ public class Script extends BaseObj {
}
}
- public static final class LaunchOptions {
- protected int xstart = 0;
- protected int ystart = 0;
- protected int xend = 0;
- protected int yend = 0;
- protected int zstart = 0;
- protected int zend = 0;
-
- protected int strategy;
+ /**
+ * Class used to specify clipping for a kernel launch.
+ *
+ */
+ public static final class LaunchOptions {
+ private int xstart = 0;
+ private int ystart = 0;
+ private int xend = 0;
+ private int yend = 0;
+ private int zstart = 0;
+ private int zend = 0;
+ private int strategy;
+
+ /**
+ * Set the X range. If the end value is set to 0 the X dimension is not
+ * clipped.
+ *
+ * @param xstartArg Must be >= 0
+ * @param xendArg Must be >= xstartArg
+ *
+ * @return LaunchOptions
+ */
public LaunchOptions setX(int xstartArg, int xendArg) {
if (xstartArg < 0 || xendArg <= xstartArg) {
throw new RSIllegalArgumentException("Invalid dimensions");
@@ -383,6 +415,15 @@ public class Script extends BaseObj {
return this;
}
+ /**
+ * Set the Y range. If the end value is set to 0 the Y dimension is not
+ * clipped.
+ *
+ * @param ystartArg Must be >= 0
+ * @param yendArg Must be >= ystartArg
+ *
+ * @return LaunchOptions
+ */
public LaunchOptions setY(int ystartArg, int yendArg) {
if (ystartArg < 0 || yendArg <= ystartArg) {
throw new RSIllegalArgumentException("Invalid dimensions");
@@ -392,6 +433,15 @@ public class Script extends BaseObj {
return this;
}
+ /**
+ * Set the Z range. If the end value is set to 0 the Z dimension is not
+ * clipped.
+ *
+ * @param zstartArg Must be >= 0
+ * @param zendArg Must be >= zstartArg
+ *
+ * @return LaunchOptions
+ */
public LaunchOptions setZ(int zstartArg, int zendArg) {
if (zstartArg < 0 || zendArg <= zstartArg) {
throw new RSIllegalArgumentException("Invalid dimensions");
@@ -402,21 +452,51 @@ public class Script extends BaseObj {
}
+ /**
+ * Returns the current X start
+ *
+ * @return int current value
+ */
public int getXStart() {
return xstart;
}
+ /**
+ * Returns the current X end
+ *
+ * @return int current value
+ */
public int getXEnd() {
return xend;
}
+ /**
+ * Returns the current Y start
+ *
+ * @return int current value
+ */
public int getYStart() {
return ystart;
}
+ /**
+ * Returns the current Y end
+ *
+ * @return int current value
+ */
public int getYEnd() {
return yend;
}
+ /**
+ * Returns the current Z start
+ *
+ * @return int current value
+ */
public int getZStart() {
return zstart;
}
+ /**
+ * Returns the current Z end
+ *
+ * @return int current value
+ */
public int getZEnd() {
return zend;
}
diff --git a/include/android_runtime/android_app_NativeActivity.h b/include/android_runtime/android_app_NativeActivity.h
index 7977c238fb41..e096e9187bbc 100644
--- a/include/android_runtime/android_app_NativeActivity.h
+++ b/include/android_runtime/android_app_NativeActivity.h
@@ -17,7 +17,6 @@
#ifndef _ANDROID_APP_NATIVEACTIVITY_H
#define _ANDROID_APP_NATIVEACTIVITY_H
-#include <androidfw/InputTransport.h>
#include <utils/Looper.h>
#include <android/native_activity.h>
@@ -43,106 +42,4 @@ extern void android_NativeActivity_hideSoftInput(
} // namespace android
-
-/*
- * NDK input queue API.
- *
- * Here is the event flow:
- * 1. Event arrives in input consumer, and is returned by getEvent().
- * 2. Application calls preDispatchEvent():
- * a. Event is assigned a sequence ID and enqueued in mPreDispatchingKeys.
- * b. Main thread picks up event, hands to input method.
- * c. Input method eventually returns sequence # and whether it was handled.
- * d. finishPreDispatch() is called to enqueue the information.
- * e. next getEvent() call will:
- * - finish any pre-dispatch events that the input method handled
- * - return the next pre-dispatched event that the input method didn't handle.
- * f. (A preDispatchEvent() call on this event will now return false).
- * 3. Application calls finishEvent() with whether it was handled.
- * - If handled is true, the event is finished.
- * - If handled is false, the event is put on mUnhandledKeys, and:
- * a. Main thread receives event from consumeUnhandledEvent().
- * b. Java sends event through default key handler.
- * c. event is finished.
- */
-struct AInputQueue {
-public:
- /* Creates a consumer associated with an input channel. */
- explicit AInputQueue(const android::sp<android::InputChannel>& channel, int workWrite);
-
- /* Destroys the consumer and releases its input channel. */
- ~AInputQueue();
-
- void attachLooper(ALooper* looper, int ident, ALooper_callbackFunc callback, void* data);
-
- void detachLooper();
-
- int32_t hasEvents();
-
- int32_t getEvent(AInputEvent** outEvent);
-
- bool preDispatchEvent(AInputEvent* event);
-
- void finishEvent(AInputEvent* event, bool handled, bool didDefaultHandling);
-
- // ----------------------------------------------------------
-
- inline android::InputConsumer& getConsumer() { return mConsumer; }
-
- void dispatchEvent(android::KeyEvent* event);
-
- void finishPreDispatch(int seq, bool handled);
-
- android::KeyEvent* consumeUnhandledEvent();
- android::KeyEvent* consumePreDispatchingEvent(int* outSeq);
-
- android::KeyEvent* createKeyEvent();
-
- int mWorkWrite;
-
-private:
- void doUnhandledKey(android::KeyEvent* keyEvent);
- bool preDispatchKey(android::KeyEvent* keyEvent);
- void wakeupDispatchLocked();
-
- android::PooledInputEventFactory mPooledInputEventFactory;
- android::InputConsumer mConsumer;
- android::sp<android::Looper> mLooper;
-
- int mDispatchKeyRead;
- int mDispatchKeyWrite;
-
- struct in_flight_event {
- android::InputEvent* event;
- int seq; // internal sequence number for synthetic pre-dispatch events
- uint32_t finishSeq; // sequence number for sendFinishedSignal, or 0 if finish not required
- };
-
- struct finish_pre_dispatch {
- int seq;
- bool handled;
- };
-
- android::Mutex mLock;
-
- int mSeq;
-
- // All input events that are actively being processed.
- android::Vector<in_flight_event> mInFlightEvents;
-
- // Key events that the app didn't handle, and are pending for
- // delivery to the activity's default key handling.
- android::Vector<android::KeyEvent*> mUnhandledKeys;
-
- // Keys that arrived in the Java framework and need to be
- // dispatched to the app.
- android::Vector<android::KeyEvent*> mDispatchingKeys;
-
- // Key events that are pending to be pre-dispatched to the IME.
- android::Vector<in_flight_event> mPreDispatchingKeys;
-
- // Event sequence numbers that we have finished pre-dispatching.
- android::Vector<finish_pre_dispatch> mFinishPreDispatches;
-};
-
#endif // _ANDROID_APP_NATIVEACTIVITY_H
diff --git a/include/android_runtime/android_view_InputQueue.h b/include/android_runtime/android_view_InputQueue.h
new file mode 100644
index 000000000000..ba2d02d80920
--- /dev/null
+++ b/include/android_runtime/android_view_InputQueue.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ANDROID_VIEW_INPUTQUEUE_H
+#define _ANDROID_VIEW_INPUTQUEUE_H
+
+#include <androidfw/Input.h>
+#include <utils/Looper.h>
+#include <utils/TypeHelpers.h>
+#include <utils/Vector.h>
+
+#include "JNIHelp.h"
+
+/*
+ * Declare a concrete type for the NDK's AInputQueue forward declaration
+ */
+struct AInputQueue{
+};
+
+namespace android {
+
+class InputQueue : public AInputQueue, public MessageHandler {
+public:
+ virtual ~InputQueue();
+
+ void attachLooper(Looper* looper, int ident, ALooper_callbackFunc callback, void* data);
+
+ void detachLooper();
+
+ bool hasEvents();
+
+ status_t getEvent(InputEvent** outEvent);
+
+ bool preDispatchEvent(InputEvent* event);
+
+ void finishEvent(InputEvent* event, bool handled);
+
+ KeyEvent* createKeyEvent();
+
+ MotionEvent* createMotionEvent();
+
+ void recycleInputEvent(InputEvent* event);
+
+ void enqueueEvent(InputEvent* event);
+
+ static InputQueue* createQueue(jobject inputQueueObj, const sp<Looper>& looper);
+
+protected:
+ virtual void handleMessage(const Message& message);
+
+private:
+ InputQueue(jobject inputQueueObj, const sp<Looper>& looper,
+ int readDispatchFd, int writeDispatchFd);
+
+ void detachLooperLocked();
+
+ jobject mInputQueueWeakGlobal;
+ int mDispatchReadFd;
+ int mDispatchWriteFd;
+ Vector<Looper*> mAppLoopers;
+ sp<Looper> mDispatchLooper;
+ sp<WeakMessageHandler> mHandler;
+ PooledInputEventFactory mPooledInputEventFactory;
+ // Guards the pending and finished event vectors
+ mutable Mutex mLock;
+ Vector<InputEvent*> mPendingEvents;
+ Vector<key_value_pair_t<InputEvent*, bool> > mFinishedEvents;
+};
+
+} // namespace android
+
+#endif
diff --git a/include/androidfw/Input.h b/include/androidfw/Input.h
index e88835e8a523..37ab279709bf 100644
--- a/include/androidfw/Input.h
+++ b/include/androidfw/Input.h
@@ -36,6 +36,9 @@ class SkMatrix;
* Additional private constants not defined in ndk/ui/input.h.
*/
enum {
+ /* Signifies that the key is being predispatched */
+ AKEY_EVENT_FLAG_PREDISPATCH = 0x20000000,
+
/* Private control to determine when an app is tracking a key sequence. */
AKEY_EVENT_FLAG_START_TRACKING = 0x40000000,
diff --git a/keystore/java/android/security/AndroidKeyPairGenerator.java b/keystore/java/android/security/AndroidKeyPairGenerator.java
index 69755833e6f4..43d1eb607fe6 100644
--- a/keystore/java/android/security/AndroidKeyPairGenerator.java
+++ b/keystore/java/android/security/AndroidKeyPairGenerator.java
@@ -52,12 +52,12 @@ import java.security.spec.X509EncodedKeySpec;
public class AndroidKeyPairGenerator extends KeyPairGeneratorSpi {
private android.security.KeyStore mKeyStore;
- private AndroidKeyPairGeneratorSpec mSpec;
+ private KeyPairGeneratorSpec mSpec;
/**
* Generate a KeyPair which is backed by the Android keystore service. You
* must call {@link KeyPairGenerator#initialize(AlgorithmParameterSpec)}
- * with an {@link AndroidKeyPairGeneratorSpec} as the {@code params}
+ * with an {@link KeyPairGeneratorSpec} as the {@code params}
* argument before calling this otherwise an {@code IllegalStateException}
* will be thrown.
* <p>
@@ -73,7 +73,7 @@ public class AndroidKeyPairGenerator extends KeyPairGeneratorSpi {
public KeyPair generateKeyPair() {
if (mKeyStore == null || mSpec == null) {
throw new IllegalStateException(
- "Must call initialize with an AndroidKeyPairGeneratorSpec first");
+ "Must call initialize with an android.security.KeyPairGeneratorSpec first");
}
if (((mSpec.getFlags() & KeyStore.FLAG_ENCRYPTED) != 0)
@@ -156,13 +156,13 @@ public class AndroidKeyPairGenerator extends KeyPairGeneratorSpi {
throws InvalidAlgorithmParameterException {
if (params == null) {
throw new InvalidAlgorithmParameterException(
- "must supply params of type AndroidKeyPairGenericSpec");
- } else if (!(params instanceof AndroidKeyPairGeneratorSpec)) {
+ "must supply params of type android.security.KeyPairGeneratorSpec");
+ } else if (!(params instanceof KeyPairGeneratorSpec)) {
throw new InvalidAlgorithmParameterException(
- "params must be of type AndroidKeyPairGeneratorSpec");
+ "params must be of type android.security.KeyPairGeneratorSpec");
}
- AndroidKeyPairGeneratorSpec spec = (AndroidKeyPairGeneratorSpec) params;
+ KeyPairGeneratorSpec spec = (KeyPairGeneratorSpec) params;
mSpec = spec;
mKeyStore = android.security.KeyStore.getInstance();
diff --git a/keystore/java/android/security/AndroidKeyStore.java b/keystore/java/android/security/AndroidKeyStore.java
index dcc951685d59..04ee8c4bcb91 100644
--- a/keystore/java/android/security/AndroidKeyStore.java
+++ b/keystore/java/android/security/AndroidKeyStore.java
@@ -209,7 +209,7 @@ public class AndroidKeyStore extends KeyStoreSpi {
}
private void setPrivateKeyEntry(String alias, PrivateKey key, Certificate[] chain,
- AndroidKeyStoreParameter params) throws KeyStoreException {
+ KeyStoreParameter params) throws KeyStoreException {
byte[] keyBytes = null;
final String pkeyAlias;
@@ -544,15 +544,16 @@ public class AndroidKeyStore extends KeyStoreSpi {
return;
}
- if (param != null && !(param instanceof AndroidKeyStoreParameter)) {
- throw new KeyStoreException("protParam should be AndroidKeyStoreParameter; was: "
+ if (param != null && !(param instanceof KeyStoreParameter)) {
+ throw new KeyStoreException(
+ "protParam should be android.security.KeyStoreParameter; was: "
+ param.getClass().getName());
}
if (entry instanceof PrivateKeyEntry) {
PrivateKeyEntry prE = (PrivateKeyEntry) entry;
setPrivateKeyEntry(alias, prE.getPrivateKey(), prE.getCertificateChain(),
- (AndroidKeyStoreParameter) param);
+ (KeyStoreParameter) param);
return;
}
diff --git a/keystore/java/android/security/AndroidKeyStoreProvider.java b/keystore/java/android/security/AndroidKeyStoreProvider.java
index 8ca301e6b521..b17e450df216 100644
--- a/keystore/java/android/security/AndroidKeyStoreProvider.java
+++ b/keystore/java/android/security/AndroidKeyStoreProvider.java
@@ -24,7 +24,7 @@ import java.security.Provider;
* @hide
*/
public class AndroidKeyStoreProvider extends Provider {
- public static final String PROVIDER_NAME = "AndroidKeyStoreProvider";
+ public static final String PROVIDER_NAME = "AndroidKeyStore";
public AndroidKeyStoreProvider() {
super(PROVIDER_NAME, 1.0, "Android KeyStore security provider");
@@ -33,6 +33,6 @@ public class AndroidKeyStoreProvider extends Provider {
put("KeyStore." + AndroidKeyStore.NAME, AndroidKeyStore.class.getName());
// java.security.KeyPairGenerator
- put("KeyPairGenerator." + AndroidKeyStore.NAME, AndroidKeyPairGenerator.class.getName());
+ put("KeyPairGenerator.RSA", AndroidKeyPairGenerator.class.getName());
}
}
diff --git a/keystore/java/android/security/AndroidKeyPairGeneratorSpec.java b/keystore/java/android/security/KeyPairGeneratorSpec.java
index b126f0361572..59f89bcb6cb2 100644
--- a/keystore/java/android/security/AndroidKeyPairGeneratorSpec.java
+++ b/keystore/java/android/security/KeyPairGeneratorSpec.java
@@ -29,9 +29,9 @@ import javax.security.auth.x500.X500Principal;
/**
* This provides the required parameters needed for initializing the
- * {@code KeyPairGenerator} that works with <a href="{@docRoot}
- * guide/topics/security/keystore.html">Android KeyStore facility</a>. The
- * Android KeyStore facility is accessed through a
+ * {@code KeyPairGenerator} that works with
+ * <a href="{@docRoot}guide/topics/security/keystore.html">Android KeyStore
+ * facility</a>. The Android KeyStore facility is accessed through a
* {@link java.security.KeyPairGenerator} API using the {@code AndroidKeyStore}
* provider. The {@code context} passed in may be used to pop up some UI to ask
* the user to unlock or initialize the Android KeyStore facility.
@@ -49,7 +49,7 @@ import javax.security.auth.x500.X500Principal;
* The self-signed X.509 certificate may be replaced at a later time by a
* certificate signed by a real Certificate Authority.
*/
-public final class AndroidKeyPairGeneratorSpec implements AlgorithmParameterSpec {
+public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec {
private final String mKeystoreAlias;
private final Context mContext;
@@ -91,9 +91,9 @@ public final class AndroidKeyPairGeneratorSpec implements AlgorithmParameterSpec
* period
* @throws IllegalArgumentException when any argument is {@code null} or
* {@code endDate} is before {@code startDate}.
- * @hide should be built with AndroidKeyPairGeneratorSpecBuilder
+ * @hide should be built with KeyPairGeneratorSpecBuilder
*/
- public AndroidKeyPairGeneratorSpec(Context context, String keyStoreAlias,
+ public KeyPairGeneratorSpec(Context context, String keyStoreAlias,
X500Principal subjectDN, BigInteger serialNumber, Date startDate, Date endDate,
int flags) {
if (context == null) {
@@ -184,7 +184,7 @@ public final class AndroidKeyPairGeneratorSpec implements AlgorithmParameterSpec
}
/**
- * Builder class for {@link AndroidKeyPairGeneratorSpec} objects.
+ * Builder class for {@link KeyPairGeneratorSpec} objects.
* <p>
* This will build a parameter spec for use with the <a href="{@docRoot}
* guide/topics/security/keystore.html">Android KeyStore facility</a>.
@@ -198,14 +198,10 @@ public final class AndroidKeyPairGeneratorSpec implements AlgorithmParameterSpec
* Calendar end = new Calendar();
* end.add(1, Calendar.YEAR);
*
- * AndroidKeyPairGeneratorSpec spec =
- * new AndroidKeyPairGeneratorSpec.Builder(mContext)
- * .setAlias(&quot;myKey&quot;)
- * .setSubject(new X500Principal(&quot;CN=myKey&quot;))
- * .setSerial(BigInteger.valueOf(1337))
- * .setStartDate(start.getTime())
- * .setEndDate(end.getTime())
- * .build();
+ * KeyPairGeneratorSpec spec =
+ * new KeyPairGeneratorSpec.Builder(mContext).setAlias(&quot;myKey&quot;)
+ * .setSubject(new X500Principal(&quot;CN=myKey&quot;)).setSerial(BigInteger.valueOf(1337))
+ * .setStartDate(start.getTime()).setEndDate(end.getTime()).build();
* </pre>
*/
public final static class Builder {
@@ -309,13 +305,13 @@ public final class AndroidKeyPairGeneratorSpec implements AlgorithmParameterSpec
}
/**
- * Builds the instance of the {@code AndroidKeyPairGeneratorSpec}.
+ * Builds the instance of the {@code KeyPairGeneratorSpec}.
*
* @throws IllegalArgumentException if a required field is missing
- * @return built instance of {@code AndroidKeyPairGeneratorSpec}
+ * @return built instance of {@code KeyPairGeneratorSpec}
*/
- public AndroidKeyPairGeneratorSpec build() {
- return new AndroidKeyPairGeneratorSpec(mContext, mKeystoreAlias, mSubjectDN,
+ public KeyPairGeneratorSpec build() {
+ return new KeyPairGeneratorSpec(mContext, mKeystoreAlias, mSubjectDN,
mSerialNumber, mStartDate, mEndDate, mFlags);
}
}
diff --git a/keystore/java/android/security/AndroidKeyStoreParameter.java b/keystore/java/android/security/KeyStoreParameter.java
index 44f57c4ee568..621a605074b6 100644
--- a/keystore/java/android/security/AndroidKeyStoreParameter.java
+++ b/keystore/java/android/security/KeyStoreParameter.java
@@ -17,7 +17,7 @@
package android.security;
import android.content.Context;
-import android.security.AndroidKeyPairGeneratorSpec.Builder;
+import android.security.KeyPairGeneratorSpec.Builder;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
@@ -26,9 +26,9 @@ import java.security.cert.Certificate;
/**
* This provides the optional parameters that can be specified for
- * {@code KeyStore} entries that work with <a href="{@docRoot}
- * guide/topics/security/keystore.html">Android KeyStore facility</a>. The
- * Android KeyStore facility is accessed through a
+ * {@code KeyStore} entries that work with
+ * <a href="{@docRoot}guide/topics/security/keystore.html">Android KeyStore
+ * facility</a>. The Android KeyStore facility is accessed through a
* {@link java.security.KeyStore} API using the {@code AndroidKeyStore}
* provider. The {@code context} passed in may be used to pop up some UI to ask
* the user to unlock or initialize the Android KeyStore facility.
@@ -39,15 +39,15 @@ import java.security.cert.Certificate;
* {@code KeyStore}.
* <p>
* Keys may be generated using the {@link KeyPairGenerator} facility with a
- * {@link AndroidKeyPairGeneratorSpec} to specify the entry's {@code alias}. A
+ * {@link KeyPairGeneratorSpec} to specify the entry's {@code alias}. A
* self-signed X.509 certificate will be attached to generated entries, but that
* may be replaced at a later time by a certificate signed by a real Certificate
* Authority.
*/
-public final class AndroidKeyStoreParameter implements ProtectionParameter {
+public final class KeyStoreParameter implements ProtectionParameter {
private int mFlags;
- private AndroidKeyStoreParameter(int flags) {
+ private KeyStoreParameter(int flags) {
mFlags = flags;
}
@@ -67,10 +67,10 @@ public final class AndroidKeyStoreParameter implements ProtectionParameter {
}
/**
- * Builder class for {@link AndroidKeyStoreParameter} objects.
+ * Builder class for {@link KeyStoreParameter} objects.
* <p>
- * This will build protection parameters for use with the <a
- * href="{@docRoot} guide/topics/security/keystore.html">Android KeyStore
+ * This will build protection parameters for use with the
+ * <a href="{@docRoot}guide/topics/security/keystore.html">Android KeyStore
* facility</a>.
* <p>
* This can be used to require that KeyStore entries be stored encrypted.
@@ -78,8 +78,9 @@ public final class AndroidKeyStoreParameter implements ProtectionParameter {
* Example:
*
* <pre class="prettyprint">
- * AndroidKeyStoreParameter params =
- * new AndroidKeyStoreParameter.Builder(mContext).setEncryptionRequired().build();
+ * KeyStoreParameter params = new KeyStoreParameter.Builder(mContext)
+ * .setEncryptionRequired()
+ * .build();
* </pre>
*/
public final static class Builder {
@@ -105,19 +106,23 @@ public final class AndroidKeyStoreParameter implements ProtectionParameter {
* screen (e.g., PIN, password) before creating or using the generated
* key is successful.
*/
- public Builder setEncryptionRequired() {
- mFlags |= KeyStore.FLAG_ENCRYPTED;
+ public Builder setEncryptionRequired(boolean required) {
+ if (required) {
+ mFlags |= KeyStore.FLAG_ENCRYPTED;
+ } else {
+ mFlags &= ~KeyStore.FLAG_ENCRYPTED;
+ }
return this;
}
/**
- * Builds the instance of the {@code AndroidKeyPairGeneratorSpec}.
+ * Builds the instance of the {@code KeyPairGeneratorSpec}.
*
* @throws IllegalArgumentException if a required field is missing
- * @return built instance of {@code AndroidKeyPairGeneratorSpec}
+ * @return built instance of {@code KeyPairGeneratorSpec}
*/
- public AndroidKeyStoreParameter build() {
- return new AndroidKeyStoreParameter(mFlags);
+ public KeyStoreParameter build() {
+ return new KeyStoreParameter(mFlags);
}
}
}
diff --git a/keystore/tests/src/android/security/AndroidKeyPairGeneratorTest.java b/keystore/tests/src/android/security/AndroidKeyPairGeneratorTest.java
index c5cf51448869..1582f74e4ca8 100644
--- a/keystore/tests/src/android/security/AndroidKeyPairGeneratorTest.java
+++ b/keystore/tests/src/android/security/AndroidKeyPairGeneratorTest.java
@@ -65,7 +65,7 @@ public class AndroidKeyPairGeneratorTest extends AndroidTestCase {
assertFalse(mAndroidKeyStore.isUnlocked());
- mGenerator = java.security.KeyPairGenerator.getInstance("AndroidKeyStore");
+ mGenerator = java.security.KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
}
private void setupPassword() {
@@ -80,7 +80,7 @@ public class AndroidKeyPairGeneratorTest extends AndroidTestCase {
public void testKeyPairGenerator_Initialize_Params_Encrypted_Success() throws Exception {
setupPassword();
- mGenerator.initialize(new AndroidKeyPairGeneratorSpec.Builder(getContext())
+ mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
.setAlias(TEST_ALIAS_1)
.setSubject(TEST_DN_1)
.setSerialNumber(TEST_SERIAL_1)
@@ -116,7 +116,7 @@ public class AndroidKeyPairGeneratorTest extends AndroidTestCase {
setupPassword();
mGenerator.initialize(
- new AndroidKeyPairGeneratorSpec.Builder(getContext())
+ new KeyPairGeneratorSpec.Builder(getContext())
.setAlias(TEST_ALIAS_1)
.setSubject(TEST_DN_1)
.setSerialNumber(TEST_SERIAL_1)
@@ -130,7 +130,7 @@ public class AndroidKeyPairGeneratorTest extends AndroidTestCase {
public void testKeyPairGenerator_GenerateKeyPair_Encrypted_Success() throws Exception {
setupPassword();
- mGenerator.initialize(new AndroidKeyPairGeneratorSpec.Builder(getContext())
+ mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
.setAlias(TEST_ALIAS_1)
.setSubject(TEST_DN_1)
.setSerialNumber(TEST_SERIAL_1)
@@ -146,7 +146,7 @@ public class AndroidKeyPairGeneratorTest extends AndroidTestCase {
}
public void testKeyPairGenerator_GenerateKeyPair_Unencrypted_Success() throws Exception {
- mGenerator.initialize(new AndroidKeyPairGeneratorSpec.Builder(getContext())
+ mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
.setAlias(TEST_ALIAS_1)
.setSubject(TEST_DN_1)
.setSerialNumber(TEST_SERIAL_1)
@@ -163,7 +163,7 @@ public class AndroidKeyPairGeneratorTest extends AndroidTestCase {
public void testKeyPairGenerator_GenerateKeyPair_Replaced_Success() throws Exception {
// Generate the first key
{
- mGenerator.initialize(new AndroidKeyPairGeneratorSpec.Builder(getContext())
+ mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
.setAlias(TEST_ALIAS_1)
.setSubject(TEST_DN_1)
.setSerialNumber(TEST_SERIAL_1)
@@ -178,7 +178,7 @@ public class AndroidKeyPairGeneratorTest extends AndroidTestCase {
// Replace the original key
{
- mGenerator.initialize(new AndroidKeyPairGeneratorSpec.Builder(getContext())
+ mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
.setAlias(TEST_ALIAS_2)
.setSubject(TEST_DN_2)
.setSerialNumber(TEST_SERIAL_2)
@@ -196,7 +196,7 @@ public class AndroidKeyPairGeneratorTest extends AndroidTestCase {
throws Exception {
// Generate the first key
{
- mGenerator.initialize(new AndroidKeyPairGeneratorSpec.Builder(getContext())
+ mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
.setAlias(TEST_ALIAS_1)
.setSubject(TEST_DN_1)
.setSerialNumber(TEST_SERIAL_1)
@@ -211,7 +211,7 @@ public class AndroidKeyPairGeneratorTest extends AndroidTestCase {
// Attempt to replace previous key
{
- mGenerator.initialize(new AndroidKeyPairGeneratorSpec.Builder(getContext())
+ mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
.setAlias(TEST_ALIAS_1)
.setSubject(TEST_DN_2)
.setSerialNumber(TEST_SERIAL_2)
diff --git a/keystore/tests/src/android/security/AndroidKeyStoreTest.java b/keystore/tests/src/android/security/AndroidKeyStoreTest.java
index 507d41c2a0aa..8798fb5879ab 100644
--- a/keystore/tests/src/android/security/AndroidKeyStoreTest.java
+++ b/keystore/tests/src/android/security/AndroidKeyStoreTest.java
@@ -1232,8 +1232,8 @@ public class AndroidKeyStoreTest extends AndroidTestCase {
try {
mKeyStore.setEntry(TEST_ALIAS_1, entry,
- new AndroidKeyStoreParameter.Builder(getContext())
- .setEncryptionRequired()
+ new KeyStoreParameter.Builder(getContext())
+ .setEncryptionRequired(true)
.build());
fail("Shouldn't be able to insert encrypted entry when KeyStore uninitialized");
} catch (KeyStoreException expected) {
@@ -1752,8 +1752,10 @@ public class AndroidKeyStoreTest extends AndroidTestCase {
Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
try {
- mKeyStore.setEntry(TEST_ALIAS_1, entry, new AndroidKeyStoreParameter.Builder(
- getContext()).setEncryptionRequired().build());
+ mKeyStore.setEntry(TEST_ALIAS_1, entry,
+ new KeyStoreParameter.Builder(getContext())
+ .setEncryptionRequired(true)
+ .build());
fail("Should not allow setting of Entry without unlocked keystore");
} catch (KeyStoreException success) {
}
@@ -1762,8 +1764,8 @@ public class AndroidKeyStoreTest extends AndroidTestCase {
assertTrue(mAndroidKeyStore.isUnlocked());
mKeyStore.setEntry(TEST_ALIAS_1, entry,
- new AndroidKeyStoreParameter.Builder(getContext())
- .setEncryptionRequired()
+ new KeyStoreParameter.Builder(getContext())
+ .setEncryptionRequired(true)
.build());
}
}
diff --git a/keystore/tests/src/android/security/AndroidKeyPairGeneratorSpecTest.java b/keystore/tests/src/android/security/KeyPairGeneratorSpecTest.java
index 5d4ab9cfde03..113d73016277 100644
--- a/keystore/tests/src/android/security/AndroidKeyPairGeneratorSpecTest.java
+++ b/keystore/tests/src/android/security/KeyPairGeneratorSpecTest.java
@@ -23,7 +23,7 @@ import java.util.Date;
import javax.security.auth.x500.X500Principal;
-public class AndroidKeyPairGeneratorSpecTest extends AndroidTestCase {
+public class KeyPairGeneratorSpecTest extends AndroidTestCase {
private static final String TEST_ALIAS_1 = "test1";
private static final X500Principal TEST_DN_1 = new X500Principal("CN=test1");
@@ -39,8 +39,8 @@ public class AndroidKeyPairGeneratorSpecTest extends AndroidTestCase {
private static final Date NOW_PLUS_10_YEARS = new Date(NOW.getYear() + 10, 0, 1);
public void testConstructor_Success() throws Exception {
- AndroidKeyPairGeneratorSpec spec =
- new AndroidKeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1,
+ KeyPairGeneratorSpec spec =
+ new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1,
NOW, NOW_PLUS_10_YEARS, 0);
assertEquals("Context should be the one specified", getContext(), spec.getContext());
@@ -55,7 +55,7 @@ public class AndroidKeyPairGeneratorSpecTest extends AndroidTestCase {
}
public void testBuilder_Success() throws Exception {
- AndroidKeyPairGeneratorSpec spec = new AndroidKeyPairGeneratorSpec.Builder(getContext())
+ KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(getContext())
.setAlias(TEST_ALIAS_1)
.setSubject(TEST_DN_1)
.setSerialNumber(SERIAL_1)
@@ -79,7 +79,7 @@ public class AndroidKeyPairGeneratorSpecTest extends AndroidTestCase {
public void testConstructor_NullContext_Failure() throws Exception {
try {
- new AndroidKeyPairGeneratorSpec(null, TEST_ALIAS_1, TEST_DN_1, SERIAL_1, NOW,
+ new KeyPairGeneratorSpec(null, TEST_ALIAS_1, TEST_DN_1, SERIAL_1, NOW,
NOW_PLUS_10_YEARS, 0);
fail("Should throw IllegalArgumentException when context is null");
} catch (IllegalArgumentException success) {
@@ -88,7 +88,7 @@ public class AndroidKeyPairGeneratorSpecTest extends AndroidTestCase {
public void testConstructor_NullKeystoreAlias_Failure() throws Exception {
try {
- new AndroidKeyPairGeneratorSpec(getContext(), null, TEST_DN_1, SERIAL_1, NOW,
+ new KeyPairGeneratorSpec(getContext(), null, TEST_DN_1, SERIAL_1, NOW,
NOW_PLUS_10_YEARS, 0);
fail("Should throw IllegalArgumentException when keystoreAlias is null");
} catch (IllegalArgumentException success) {
@@ -97,7 +97,7 @@ public class AndroidKeyPairGeneratorSpecTest extends AndroidTestCase {
public void testConstructor_NullSubjectDN_Failure() throws Exception {
try {
- new AndroidKeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, null, SERIAL_1, NOW,
+ new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, null, SERIAL_1, NOW,
NOW_PLUS_10_YEARS, 0);
fail("Should throw IllegalArgumentException when subjectDN is null");
} catch (IllegalArgumentException success) {
@@ -106,7 +106,7 @@ public class AndroidKeyPairGeneratorSpecTest extends AndroidTestCase {
public void testConstructor_NullSerial_Failure() throws Exception {
try {
- new AndroidKeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, null, NOW,
+ new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, null, NOW,
NOW_PLUS_10_YEARS, 0);
fail("Should throw IllegalArgumentException when startDate is null");
} catch (IllegalArgumentException success) {
@@ -115,7 +115,7 @@ public class AndroidKeyPairGeneratorSpecTest extends AndroidTestCase {
public void testConstructor_NullStartDate_Failure() throws Exception {
try {
- new AndroidKeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1, null,
+ new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1, null,
NOW_PLUS_10_YEARS, 0);
fail("Should throw IllegalArgumentException when startDate is null");
} catch (IllegalArgumentException success) {
@@ -124,7 +124,7 @@ public class AndroidKeyPairGeneratorSpecTest extends AndroidTestCase {
public void testConstructor_NullEndDate_Failure() throws Exception {
try {
- new AndroidKeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1, NOW,
+ new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1, NOW,
null, 0);
fail("Should throw IllegalArgumentException when keystoreAlias is null");
} catch (IllegalArgumentException success) {
@@ -133,7 +133,7 @@ public class AndroidKeyPairGeneratorSpecTest extends AndroidTestCase {
public void testConstructor_EndBeforeStart_Failure() throws Exception {
try {
- new AndroidKeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1,
+ new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1,
NOW_PLUS_10_YEARS, NOW, 0);
fail("Should throw IllegalArgumentException when end is before start");
} catch (IllegalArgumentException success) {
diff --git a/libs/hwui/DisplayList.cpp b/libs/hwui/DisplayList.cpp
index 26abec27bc9e..b7d3d6fad1d5 100644
--- a/libs/hwui/DisplayList.cpp
+++ b/libs/hwui/DisplayList.cpp
@@ -231,7 +231,7 @@ void DisplayList::init() {
mTop = 0;
mRight = 0;
mBottom = 0;
- mClipChildren = true;
+ mClipToBounds = true;
mAlpha = 1;
mHasOverlappingRendering = true;
mTranslationX = 0;
@@ -358,7 +358,7 @@ void DisplayList::outputViewProperties(const int level) {
ALOGD("%*sScaleAlpha %.2f", level * 2, "", mAlpha);
} else {
int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
- if (mClipChildren) {
+ if (mClipToBounds) {
flags |= SkCanvas::kClipToLayer_SaveFlag;
}
ALOGD("%*sSaveLayerAlpha %.2f, %.2f, %.2f, %.2f, %d, 0x%x", level * 2, "",
@@ -366,7 +366,7 @@ void DisplayList::outputViewProperties(const int level) {
(int)(mAlpha * 255), flags);
}
}
- if (mClipChildren && !mCaching) {
+ if (mClipToBounds && !mCaching) {
ALOGD("%*sClipRect %.2f, %.2f, %.2f, %.2f", level * 2, "", 0.0f, 0.0f,
(float) mRight - mLeft, (float) mBottom - mTop);
}
@@ -411,16 +411,17 @@ void DisplayList::setViewProperties(OpenGLRenderer& renderer, T& handler,
// have to pass it into this call. In fact, this information might be in the
// location/size info that we store with the new native transform data.
int saveFlags = SkCanvas::kHasAlphaLayer_SaveFlag;
- if (mClipChildren) {
+ if (mClipToBounds) {
saveFlags |= SkCanvas::kClipToLayer_SaveFlag;
}
handler(mSaveLayerOp->reinit(0, 0, mRight - mLeft, mBottom - mTop,
- mAlpha * 255, SkXfermode::kSrcOver_Mode, saveFlags), PROPERTY_SAVECOUNT);
+ mAlpha * 255, SkXfermode::kSrcOver_Mode, saveFlags), PROPERTY_SAVECOUNT,
+ mClipToBounds);
}
}
- if (mClipChildren && !mCaching) {
+ if (mClipToBounds && !mCaching) {
handler(mClipRectOp->reinit(0, 0, mRight - mLeft, mBottom - mTop, SkRegion::kIntersect_Op),
- PROPERTY_SAVECOUNT);
+ PROPERTY_SAVECOUNT, mClipToBounds);
}
}
@@ -428,8 +429,8 @@ class DeferOperationHandler {
public:
DeferOperationHandler(DeferStateStruct& deferStruct, int level)
: mDeferStruct(deferStruct), mLevel(level) {}
- inline void operator()(DisplayListOp* operation, int saveCount) {
- operation->defer(mDeferStruct, saveCount, mLevel);
+ inline void operator()(DisplayListOp* operation, int saveCount, bool clipToBounds) {
+ operation->defer(mDeferStruct, saveCount, mLevel, clipToBounds);
}
private:
DeferStateStruct& mDeferStruct;
@@ -445,11 +446,11 @@ class ReplayOperationHandler {
public:
ReplayOperationHandler(ReplayStateStruct& replayStruct, int level)
: mReplayStruct(replayStruct), mLevel(level) {}
- inline void operator()(DisplayListOp* operation, int saveCount) {
+ inline void operator()(DisplayListOp* operation, int saveCount, bool clipToBounds) {
#if DEBUG_DISPLAY_LIST_OPS_AS_EVENTS
mReplayStruct.mRenderer.eventMark(operation->name());
#endif
- operation->replay(mReplayStruct, saveCount, mLevel);
+ operation->replay(mReplayStruct, saveCount, mLevel, clipToBounds);
}
private:
ReplayStateStruct& mReplayStruct;
@@ -492,16 +493,16 @@ void DisplayList::iterate(OpenGLRenderer& renderer, T& handler, const int level)
int restoreTo = renderer.getSaveCount();
handler(mSaveOp->reinit(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag),
- PROPERTY_SAVECOUNT);
+ PROPERTY_SAVECOUNT, mClipToBounds);
DISPLAY_LIST_LOGD("%*sSave %d %d", (level + 1) * 2, "",
SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag, restoreTo);
setViewProperties<T>(renderer, handler, level + 1);
- if (renderer.quickRejectNoScissor(0, 0, mWidth, mHeight)) {
+ if (mClipToBounds && renderer.quickRejectNoScissor(0, 0, mWidth, mHeight)) {
DISPLAY_LIST_LOGD("%*sRestoreToCount %d", level * 2, "", restoreTo);
- handler(mRestoreToCountOp->reinit(restoreTo), PROPERTY_SAVECOUNT);
+ handler(mRestoreToCountOp->reinit(restoreTo), PROPERTY_SAVECOUNT, mClipToBounds);
return;
}
@@ -510,12 +511,12 @@ void DisplayList::iterate(OpenGLRenderer& renderer, T& handler, const int level)
for (unsigned int i = 0; i < mDisplayListData->displayListOps.size(); i++) {
DisplayListOp *op = mDisplayListData->displayListOps[i];
- handler(op, saveCount);
+ handler(op, saveCount, mClipToBounds);
logBuffer.writeCommand(level, op->name());
}
DISPLAY_LIST_LOGD("%*sRestoreToCount %d", (level + 1) * 2, "", restoreTo);
- handler(mRestoreToCountOp->reinit(restoreTo), PROPERTY_SAVECOUNT);
+ handler(mRestoreToCountOp->reinit(restoreTo), PROPERTY_SAVECOUNT, mClipToBounds);
renderer.restoreToCount(restoreTo);
renderer.setOverrideLayerAlpha(1.0f);
}
diff --git a/libs/hwui/DisplayList.h b/libs/hwui/DisplayList.h
index 84f20abe0249..5f843291f847 100644
--- a/libs/hwui/DisplayList.h
+++ b/libs/hwui/DisplayList.h
@@ -137,8 +137,8 @@ public:
return mName.string();
}
- void setClipChildren(bool clipChildren) {
- mClipChildren = clipChildren;
+ void setClipToBounds(bool clipToBounds) {
+ mClipToBounds = clipToBounds;
}
void setStaticMatrix(SkMatrix* matrix) {
@@ -498,7 +498,7 @@ private:
String8 mName;
// View properties
- bool mClipChildren;
+ bool mClipToBounds;
float mAlpha;
bool mHasOverlappingRendering;
float mTranslationX, mTranslationY;
diff --git a/libs/hwui/DisplayListOp.h b/libs/hwui/DisplayListOp.h
index c277c247dc32..a0290e37012f 100644
--- a/libs/hwui/DisplayListOp.h
+++ b/libs/hwui/DisplayListOp.h
@@ -78,9 +78,11 @@ public:
kOpLogFlag_JSON = 0x2 // TODO: add?
};
- virtual void defer(DeferStateStruct& deferStruct, int saveCount, int level) = 0;
+ virtual void defer(DeferStateStruct& deferStruct, int saveCount, int level,
+ bool useQuickReject) = 0;
- virtual void replay(ReplayStateStruct& replayStruct, int saveCount, int level) = 0;
+ virtual void replay(ReplayStateStruct& replayStruct, int saveCount, int level,
+ bool useQuickReject) = 0;
virtual void output(int level, uint32_t logFlags = 0) = 0;
@@ -104,7 +106,8 @@ public:
virtual ~StateOp() {}
- virtual void defer(DeferStateStruct& deferStruct, int saveCount, int level) {
+ virtual void defer(DeferStateStruct& deferStruct, int saveCount, int level,
+ bool useQuickReject) {
// default behavior only affects immediate, deferrable state, issue directly to renderer
applyState(deferStruct.mRenderer, saveCount);
}
@@ -113,7 +116,8 @@ public:
* State operations are applied directly to the renderer, but can cause the deferred drawing op
* list to flush
*/
- virtual void replay(ReplayStateStruct& replayStruct, int saveCount, int level) {
+ virtual void replay(ReplayStateStruct& replayStruct, int saveCount, int level,
+ bool useQuickReject) {
applyState(replayStruct.mRenderer, saveCount);
}
@@ -126,9 +130,9 @@ public:
DrawOp(SkPaint* paint)
: mPaint(paint), mQuickRejected(false) {}
- virtual void defer(DeferStateStruct& deferStruct, int saveCount, int level) {
- if (mQuickRejected &&
- CC_LIKELY(deferStruct.mReplayFlags & DisplayList::kReplayFlag_ClipChildren)) {
+ virtual void defer(DeferStateStruct& deferStruct, int saveCount, int level,
+ bool useQuickReject) {
+ if (mQuickRejected && CC_LIKELY(useQuickReject)) {
return;
}
@@ -140,9 +144,9 @@ public:
deferStruct.mDeferredList.addDrawOp(deferStruct.mRenderer, this);
}
- virtual void replay(ReplayStateStruct& replayStruct, int saveCount, int level) {
- if (mQuickRejected &&
- CC_LIKELY(replayStruct.mReplayFlags & DisplayList::kReplayFlag_ClipChildren)) {
+ virtual void replay(ReplayStateStruct& replayStruct, int saveCount, int level,
+ bool useQuickReject) {
+ if (mQuickRejected && CC_LIKELY(useQuickReject)) {
return;
}
@@ -261,7 +265,8 @@ public:
SaveOp(int flags)
: mFlags(flags) {}
- virtual void defer(DeferStateStruct& deferStruct, int saveCount, int level) {
+ virtual void defer(DeferStateStruct& deferStruct, int saveCount, int level,
+ bool useQuickReject) {
int newSaveCount = deferStruct.mRenderer.save(mFlags);
deferStruct.mDeferredList.addSave(deferStruct.mRenderer, this, newSaveCount);
}
@@ -293,7 +298,8 @@ public:
RestoreToCountOp(int count)
: mCount(count) {}
- virtual void defer(DeferStateStruct& deferStruct, int saveCount, int level) {
+ virtual void defer(DeferStateStruct& deferStruct, int saveCount, int level,
+ bool useQuickReject) {
deferStruct.mDeferredList.addRestoreToCount(deferStruct.mRenderer,
this, saveCount + mCount);
deferStruct.mRenderer.restoreToCount(saveCount + mCount);
@@ -326,7 +332,8 @@ public:
int alpha, SkXfermode::Mode mode, int flags)
: mArea(left, top, right, bottom), mAlpha(alpha), mMode(mode), mFlags(flags) {}
- virtual void defer(DeferStateStruct& deferStruct, int saveCount, int level) {
+ virtual void defer(DeferStateStruct& deferStruct, int saveCount, int level,
+ bool useQuickReject) {
// NOTE: don't bother with actual saveLayer, instead issuing it at flush time
int newSaveCount = deferStruct.mRenderer.getSaveCount();
deferStruct.mDeferredList.addSaveLayer(deferStruct.mRenderer, this, newSaveCount);
@@ -490,7 +497,8 @@ class ClipOp : public StateOp {
public:
ClipOp(SkRegion::Op op) : mOp(op) {}
- virtual void defer(DeferStateStruct& deferStruct, int saveCount, int level) {
+ virtual void defer(DeferStateStruct& deferStruct, int saveCount, int level,
+ bool useQuickReject) {
// NOTE: must defer op BEFORE applying state, since it may read clip
deferStruct.mDeferredList.addClip(deferStruct.mRenderer, this);
@@ -1371,12 +1379,14 @@ public:
: DrawBoundedOp(0, 0, displayList->getWidth(), displayList->getHeight(), 0),
mDisplayList(displayList), mFlags(flags) {}
- virtual void defer(DeferStateStruct& deferStruct, int saveCount, int level) {
+ virtual void defer(DeferStateStruct& deferStruct, int saveCount, int level,
+ bool useQuickReject) {
if (mDisplayList && mDisplayList->isRenderable()) {
mDisplayList->defer(deferStruct, level + 1);
}
}
- virtual void replay(ReplayStateStruct& replayStruct, int saveCount, int level) {
+ virtual void replay(ReplayStateStruct& replayStruct, int saveCount, int level,
+ bool useQuickReject) {
if (mDisplayList && mDisplayList->isRenderable()) {
mDisplayList->replay(replayStruct, level + 1);
}
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 917a47df52be..8295c5f5cdd1 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -24,6 +24,7 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
+import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
@@ -1205,6 +1206,11 @@ public class AudioManager {
* call {@link #stopBluetoothSco()} to clear the request and turn down the bluetooth connection.
* <p>Even if a SCO connection is established, the following restrictions apply on audio
* output streams so that they can be routed to SCO headset:
+ * <p>NOTE: up to and including API version
+ * {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}, this method initiates a virtual
+ * voice call to the bluetooth headset.
+ * After API version {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2} only a raw SCO audio
+ * connection is established.
* <ul>
* <li> the stream type must be {@link #STREAM_VOICE_CALL} </li>
* <li> the format must be mono </li>
@@ -1226,7 +1232,7 @@ public class AudioManager {
public void startBluetoothSco(){
IAudioService service = getService();
try {
- service.startBluetoothSco(mICallBack);
+ service.startBluetoothSco(mICallBack, mContext.getApplicationInfo().targetSdkVersion);
} catch (RemoteException e) {
Log.e(TAG, "Dead object in startBluetoothSco", e);
}
@@ -2277,6 +2283,32 @@ public class AudioManager {
/**
* @hide
+ * Controls whether a remote control display needs periodic checks of the RemoteControlClient
+ * playback position to verify that the estimated position has not drifted from the actual
+ * position. By default the check is not performed.
+ * The IRemoteControlDisplay must have been previously registered for this to have any effect.
+ * @param rcd the IRemoteControlDisplay for which the anti-drift mechanism will be enabled
+ * or disabled. No effect is null.
+ * @param wantsSync if true, RemoteControlClient instances which expose their playback position
+ * to the framework will regularly compare the estimated playback position with the actual
+ * position, and will update the IRemoteControlDisplay implementation whenever a drift is
+ * detected.
+ */
+ public void remoteControlDisplayWantsPlaybackPositionSync(IRemoteControlDisplay rcd,
+ boolean wantsSync) {
+ if (rcd == null) {
+ return;
+ }
+ IAudioService service = getService();
+ try {
+ service.remoteControlDisplayWantsPlaybackPositionSync(rcd, wantsSync);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Dead object in remoteControlDisplayWantsPlaybackPositionSync " + e);
+ }
+ }
+
+ /**
+ * @hide
* Request the user of a RemoteControlClient to seek to the given playback position.
* @param generationId the RemoteControlClient generation counter for which this request is
* issued. Requests for an older generation than current one will be ignored.
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 637ac858fa9b..e237194e7647 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -48,6 +48,7 @@ import android.database.ContentObserver;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.os.Binder;
+import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
@@ -369,6 +370,14 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
// waiting for headset service to connect
private static final int SCO_STATE_DEACTIVATE_EXT_REQ = 4;
+ // Indicates the mode used for SCO audio connection. The mode is virtual call if the request
+ // originated from an app targeting an API version before JB MR2 and raw audio after that.
+ private int mScoAudioMode;
+ // SCO audio mode is virtual voice call (BluetoothHeadset.startScoUsingVirtualVoiceCall())
+ private static final int SCO_MODE_VIRTUAL_CALL = 0;
+ // SCO audio mode is raw audio (BluetoothHeadset.connectAudio())
+ private static final int SCO_MODE_RAW = 1;
+
// Current connection state indicated by bluetooth headset
private int mScoConnectionState;
@@ -1910,7 +1919,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
}
/** @see AudioManager#startBluetoothSco() */
- public void startBluetoothSco(IBinder cb){
+ public void startBluetoothSco(IBinder cb, int targetSdkVersion){
if (!checkAudioSettingsPermission("startBluetoothSco()") ||
!mBootCompleted) {
return;
@@ -1922,7 +1931,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
// The caller identity must be cleared after getScoClient() because it is needed if a new
// client is created.
final long ident = Binder.clearCallingIdentity();
- client.incCount();
+ client.incCount(targetSdkVersion);
Binder.restoreCallingIdentity(ident);
}
@@ -1968,9 +1977,9 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
}
}
- public void incCount() {
+ public void incCount(int targetSdkVersion) {
synchronized(mScoClients) {
- requestScoState(BluetoothHeadset.STATE_AUDIO_CONNECTED);
+ requestScoState(BluetoothHeadset.STATE_AUDIO_CONNECTED, targetSdkVersion);
if (mStartcount == 0) {
try {
mCb.linkToDeath(this, 0);
@@ -1996,7 +2005,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
Log.w(TAG, "decCount() going to 0 but not registered to binder");
}
}
- requestScoState(BluetoothHeadset.STATE_AUDIO_DISCONNECTED);
+ requestScoState(BluetoothHeadset.STATE_AUDIO_DISCONNECTED, 0);
}
}
}
@@ -2012,7 +2021,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
}
mStartcount = 0;
if (stopSco) {
- requestScoState(BluetoothHeadset.STATE_AUDIO_DISCONNECTED);
+ requestScoState(BluetoothHeadset.STATE_AUDIO_DISCONNECTED, 0);
}
}
}
@@ -2040,7 +2049,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
}
}
- private void requestScoState(int state) {
+ private void requestScoState(int state, int targetSdkVersion) {
checkScoAudioState();
if (totalCount() == 0) {
if (state == BluetoothHeadset.STATE_AUDIO_CONNECTED) {
@@ -2055,8 +2064,18 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
(mScoAudioState == SCO_STATE_INACTIVE ||
mScoAudioState == SCO_STATE_DEACTIVATE_REQ)) {
if (mScoAudioState == SCO_STATE_INACTIVE) {
+ mScoAudioMode =
+ (targetSdkVersion < Build.VERSION_CODES.JELLY_BEAN_MR2) ?
+ SCO_MODE_VIRTUAL_CALL : SCO_MODE_RAW;
if (mBluetoothHeadset != null && mBluetoothHeadsetDevice != null) {
- if (mBluetoothHeadset.connectAudio()) {
+ boolean status;
+ if (mScoAudioMode == SCO_MODE_RAW) {
+ status = mBluetoothHeadset.connectAudio();
+ } else {
+ status = mBluetoothHeadset.startScoUsingVirtualVoiceCall(
+ mBluetoothHeadsetDevice);
+ }
+ if (status) {
mScoAudioState = SCO_STATE_ACTIVE_INTERNAL;
} else {
broadcastScoConnectionState(
@@ -2078,7 +2097,14 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
mScoAudioState == SCO_STATE_ACTIVATE_REQ)) {
if (mScoAudioState == SCO_STATE_ACTIVE_INTERNAL) {
if (mBluetoothHeadset != null && mBluetoothHeadsetDevice != null) {
- if (!mBluetoothHeadset.disconnectAudio()) {
+ boolean status;
+ if (mScoAudioMode == SCO_MODE_RAW) {
+ status = mBluetoothHeadset.disconnectAudio();
+ } else {
+ status = mBluetoothHeadset.stopScoUsingVirtualVoiceCall(
+ mBluetoothHeadsetDevice);
+ }
+ if (!status) {
mScoAudioState = SCO_STATE_INACTIVE;
broadcastScoConnectionState(
AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
@@ -2251,10 +2277,20 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
switch (mScoAudioState) {
case SCO_STATE_ACTIVATE_REQ:
mScoAudioState = SCO_STATE_ACTIVE_INTERNAL;
- status = mBluetoothHeadset.connectAudio();
+ if (mScoAudioMode == SCO_MODE_RAW) {
+ status = mBluetoothHeadset.connectAudio();
+ } else {
+ status = mBluetoothHeadset.startScoUsingVirtualVoiceCall(
+ mBluetoothHeadsetDevice);
+ }
break;
case SCO_STATE_DEACTIVATE_REQ:
- status = mBluetoothHeadset.disconnectAudio();
+ if (mScoAudioMode == SCO_MODE_RAW) {
+ status = mBluetoothHeadset.disconnectAudio();
+ } else {
+ status = mBluetoothHeadset.stopScoUsingVirtualVoiceCall(
+ mBluetoothHeadsetDevice);
+ }
break;
case SCO_STATE_DEACTIVATE_EXT_REQ:
status = mBluetoothHeadset.stopVoiceRecognition(
@@ -4663,10 +4699,12 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
boolean isLocked = mKeyguardManager != null && mKeyguardManager.isKeyguardLocked();
if (!isLocked && pm.isScreenOn()) {
voiceIntent = new Intent(android.speech.RecognizerIntent.ACTION_WEB_SEARCH);
+ Log.i(TAG, "voice-based interactions: about to use ACTION_WEB_SEARCH");
} else {
voiceIntent = new Intent(RecognizerIntent.ACTION_VOICE_SEARCH_HANDS_FREE);
voiceIntent.putExtra(RecognizerIntent.EXTRA_SECURE,
isLocked && mKeyguardManager.isKeyguardSecure());
+ Log.i(TAG, "voice-based interactions: about to use ACTION_VOICE_SEARCH_HANDS_FREE");
}
// start the search activity
if (needWakeLock) {
@@ -5049,7 +5087,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
final DisplayInfoForServer di = (DisplayInfoForServer) displayIterator.next();
pw.println(" IRCD: " + di.mRcDisplay +
" -- w:" + di.mArtworkExpectedWidth +
- " -- h:" + di.mArtworkExpectedHeight);
+ " -- h:" + di.mArtworkExpectedHeight+
+ " -- wantsPosSync:" + di.mWantsPositionSync);
}
}
}
@@ -5653,6 +5692,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
private IBinder mRcDisplayBinder;
private int mArtworkExpectedWidth = -1;
private int mArtworkExpectedHeight = -1;
+ private boolean mWantsPositionSync = false;
public DisplayInfoForServer(IRemoteControlDisplay rcd, int w, int h) {
if (DEBUG_RC) Log.i(TAG, "new DisplayInfoForServer for " + rcd + " w=" + w + " h=" + h);
@@ -5716,6 +5756,9 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
try {
rcc.plugRemoteControlDisplay(di.mRcDisplay, di.mArtworkExpectedWidth,
di.mArtworkExpectedHeight);
+ if (di.mWantsPositionSync) {
+ rcc.setWantsSyncForDisplay(di.mRcDisplay, true);
+ }
} catch (RemoteException e) {
Log.e(TAG, "Error connecting RCD to RCC in RCC registration",e);
}
@@ -5869,6 +5912,52 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
}
}
+ /**
+ * Controls whether a remote control display needs periodic checks of the RemoteControlClient
+ * playback position to verify that the estimated position has not drifted from the actual
+ * position. By default the check is not performed.
+ * The IRemoteControlDisplay must have been previously registered for this to have any effect.
+ * @param rcd the IRemoteControlDisplay for which the anti-drift mechanism will be enabled
+ * or disabled. Not null.
+ * @param wantsSync if true, RemoteControlClient instances which expose their playback position
+ * to the framework will regularly compare the estimated playback position with the actual
+ * position, and will update the IRemoteControlDisplay implementation whenever a drift is
+ * detected.
+ */
+ public void remoteControlDisplayWantsPlaybackPositionSync(IRemoteControlDisplay rcd,
+ boolean wantsSync) {
+ synchronized(mRCStack) {
+ boolean rcdRegistered = false;
+ // store the information about this display
+ // (display stack traversal order doesn't matter).
+ final Iterator<DisplayInfoForServer> displayIterator = mRcDisplays.iterator();
+ while (displayIterator.hasNext()) {
+ final DisplayInfoForServer di = (DisplayInfoForServer) displayIterator.next();
+ if (di.mRcDisplay.asBinder().equals(rcd.asBinder())) {
+ di.mWantsPositionSync = wantsSync;
+ rcdRegistered = true;
+ break;
+ }
+ }
+ if (!rcdRegistered) {
+ return;
+ }
+ // notify all current RemoteControlClients
+ // (stack traversal order doesn't matter as we notify all RCCs)
+ final Iterator<RemoteControlStackEntry> stackIterator = mRCStack.iterator();
+ while (stackIterator.hasNext()) {
+ final RemoteControlStackEntry rcse = stackIterator.next();
+ if (rcse.mRcClient != null) {
+ try {
+ rcse.mRcClient.setWantsSyncForDisplay(rcd, wantsSync);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error setting position sync flag for RCD on RCC: ", e);
+ }
+ }
+ }
+ }
+ }
+
public void setRemoteControlClientPlaybackPosition(int generationId, long timeMs) {
// ignore position change requests if invalid generation ID
synchronized(mRCStack) {
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index 13f6c021cc85..fda8c1bd2ede 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -153,6 +153,20 @@ interface IAudioService {
*/
oneway void remoteControlDisplayUsesBitmapSize(in IRemoteControlDisplay rcd, int w, int h);
/**
+ * Controls whether a remote control display needs periodic checks of the RemoteControlClient
+ * playback position to verify that the estimated position has not drifted from the actual
+ * position. By default the check is not performed.
+ * The IRemoteControlDisplay must have been previously registered for this to have any effect.
+ * @param rcd the IRemoteControlDisplay for which the anti-drift mechanism will be enabled
+ * or disabled. Not null.
+ * @param wantsSync if true, RemoteControlClient instances which expose their playback position
+ * to the framework will regularly compare the estimated playback position with the actual
+ * position, and will update the IRemoteControlDisplay implementation whenever a drift is
+ * detected.
+ */
+ oneway void remoteControlDisplayWantsPlaybackPositionSync(in IRemoteControlDisplay rcd,
+ boolean wantsSync);
+ /**
* Request the user of a RemoteControlClient to seek to the given playback position.
* @param generationId the RemoteControlClient generation counter for which this request is
* issued. Requests for an older generation than current one will be ignored.
@@ -179,7 +193,7 @@ interface IAudioService {
int getRemoteStreamVolume();
oneway void registerRemoteVolumeObserverForRcc(int rccId, in IRemoteVolumeObserver rvo);
- void startBluetoothSco(IBinder cb);
+ void startBluetoothSco(IBinder cb, int targetSdkVersion);
void stopBluetoothSco(IBinder cb);
void forceVolumeControlStream(int streamType, IBinder cb);
diff --git a/media/java/android/media/IRemoteControlClient.aidl b/media/java/android/media/IRemoteControlClient.aidl
index e4cee06927a9..223612940bbd 100644
--- a/media/java/android/media/IRemoteControlClient.aidl
+++ b/media/java/android/media/IRemoteControlClient.aidl
@@ -47,5 +47,6 @@ oneway interface IRemoteControlClient
void plugRemoteControlDisplay(IRemoteControlDisplay rcd, int w, int h);
void unplugRemoteControlDisplay(IRemoteControlDisplay rcd);
void setBitmapSizeForDisplay(IRemoteControlDisplay rcd, int w, int h);
+ void setWantsSyncForDisplay(IRemoteControlDisplay rcd, boolean wantsSync);
void seekTo(int clientGeneration, long timeMs);
} \ No newline at end of file
diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java
index 1501c796727d..df87db39c2ed 100644
--- a/media/java/android/media/MediaCodecInfo.java
+++ b/media/java/android/media/MediaCodecInfo.java
@@ -44,7 +44,16 @@ public final class MediaCodecInfo {
return MediaCodecList.getSupportedTypes(mIndex);
}
+ /**
+ * Encapsulates the capabilities of a given codec component,
+ * i.e. what profile/level combinations it supports and what colorspaces
+ * it is capable of providing the decoded data in.
+ */
public static final class CodecCapabilities {
+ // Enumerates supported profile/level combinations as defined
+ // by the type of encoded data. These combinations impose restrictions
+ // on video resolution, bitrate... and limit the available encoder tools
+ // such as B-frame support, arithmetic coding...
public CodecProfileLevel[] profileLevels;
// from OMX_COLOR_FORMATTYPE
@@ -219,6 +228,11 @@ public final class MediaCodecInfo {
public int level;
};
+ /**
+ * Enumerates the capabilities of the codec component. Since a single
+ * component can support data of a variety of types, the type has to be
+ * specified to yield a meaningful result.
+ */
public final CodecCapabilities getCapabilitiesForType(
String type) {
return MediaCodecList.getCodecCapabilities(mIndex, type);
diff --git a/media/java/android/media/MediaDrm.java b/media/java/android/media/MediaDrm.java
index 31fbc4ab2dd0..a58fa5183736 100644
--- a/media/java/android/media/MediaDrm.java
+++ b/media/java/android/media/MediaDrm.java
@@ -480,21 +480,21 @@ public final class MediaDrm {
* supported by CryptoSession. The list may be empty if the DRM engine
* plugin does not support CryptoSession operations.
*/
- public static final String PROPERTY_ALGORITHM = "algorithm";
+ public static final String PROPERTY_ALGORITHMS = "algorithms";
/**
* Read a DRM engine plugin String property value, given the property name string.
* <p>
* Standard fields names are:
* {@link #PROPERTY_VENDOR}, {@link #PROPERTY_VERSION},
- * {@link #PROPERTY_DESCRIPTION}, {@link #PROPERTY_ALGORITHM}
+ * {@link #PROPERTY_DESCRIPTION}, {@link #PROPERTY_ALGORITHMS}
*/
public native String getPropertyString(String propertyName);
/**
- * The device unique identifier is established during device provisioning and
- * provides a means of uniquely identifying each device
+ * Byte array property name: the device unique identifier is established during
+ * device provisioning and provides a means of uniquely identifying each device.
*/
public static final String PROPERTY_DEVICE_UNIQUE_ID = "deviceUniqueId";
diff --git a/media/java/android/media/RemoteControlClient.java b/media/java/android/media/RemoteControlClient.java
index 61a0134e01ed..c6ae9aade2c0 100644
--- a/media/java/android/media/RemoteControlClient.java
+++ b/media/java/android/media/RemoteControlClient.java
@@ -65,6 +65,7 @@ import java.util.Iterator;
public class RemoteControlClient
{
private final static String TAG = "RemoteControlClient";
+ private final static boolean DEBUG = false;
/**
* Playback state of a RemoteControlClient which is stopped.
@@ -219,7 +220,7 @@ public class RemoteControlClient
public final static int PLAYBACKINFO_USES_STREAM = 5;
//==========================================
- // Public flags for the supported transport control capabililities
+ // Public flags for the supported transport control capabilities
/**
* Flag indicating a RemoteControlClient makes use of the "previous" media key.
*
@@ -642,6 +643,64 @@ public class RemoteControlClient
sendPlaybackState_syncCacheLock();
// update AudioService
sendAudioServiceNewPlaybackState_syncCacheLock();
+
+ // handle automatic playback position refreshes
+ initiateCheckForDrift_syncCacheLock();
+ }
+ }
+ }
+
+ private void initiateCheckForDrift_syncCacheLock() {
+ if (mEventHandler == null) {
+ return;
+ }
+ mEventHandler.removeMessages(MSG_POSITION_DRIFT_CHECK);
+ if (!mNeedsPositionSync) {
+ return;
+ }
+ if (mPlaybackPositionMs < 0) {
+ // the current playback state has no known playback position, it's no use
+ // trying to see if there is any drift at this point
+ // (this also bypasses this mechanism for older apps that use the old
+ // setPlaybackState(int) API)
+ return;
+ }
+ if (playbackPositionShouldMove(mPlaybackState)) {
+ // playback position moving, schedule next position drift check
+ mEventHandler.sendMessageDelayed(
+ mEventHandler.obtainMessage(MSG_POSITION_DRIFT_CHECK),
+ getCheckPeriodFromSpeed(mPlaybackSpeed));
+ }
+ }
+
+ private void onPositionDriftCheck() {
+ if (DEBUG) { Log.d(TAG, "onPositionDriftCheck()"); }
+ synchronized(mCacheLock) {
+ if ((mEventHandler == null) || (mPositionProvider == null) || !mNeedsPositionSync) {
+ return;
+ }
+ if ((mPlaybackPositionMs < 0) || (mPlaybackSpeed == 0.0f)) {
+ if (DEBUG) { Log.d(TAG, " no valid position or 0 speed, no check needed"); }
+ return;
+ }
+ long estPos = mPlaybackPositionMs + (long)
+ ((SystemClock.elapsedRealtime() - mPlaybackStateChangeTimeMs) / mPlaybackSpeed);
+ long actPos = mPositionProvider.onGetPlaybackPosition();
+ if (actPos >= 0) {
+ if (Math.abs(estPos - actPos) > POSITION_DRIFT_MAX_MS) {
+ // drift happened, report the new position
+ if (DEBUG) { Log.w(TAG, " drift detected: actual=" +actPos +" est=" +estPos); }
+ setPlaybackState(mPlaybackState, actPos, mPlaybackSpeed);
+ } else {
+ if (DEBUG) { Log.d(TAG, " no drift: actual=" + actPos +" est=" + estPos); }
+ // no drift, schedule the next drift check
+ mEventHandler.sendMessageDelayed(
+ mEventHandler.obtainMessage(MSG_POSITION_DRIFT_CHECK),
+ getCheckPeriodFromSpeed(mPlaybackSpeed));
+ }
+ } else {
+ // invalid position (negative value), can't check for drift
+ mEventHandler.removeMessages(MSG_POSITION_DRIFT_CHECK);
}
}
}
@@ -746,6 +805,14 @@ public class RemoteControlClient
// tell RCDs that this RCC's playback position capabilities have changed
sendTransportControlInfo_syncCacheLock();
}
+ if ((mPositionProvider != null) && (mEventHandler != null)
+ && playbackPositionShouldMove(mPlaybackState)) {
+ // playback position is already moving, but now we have a position provider,
+ // so schedule a drift check right now
+ mEventHandler.sendMessageDelayed(
+ mEventHandler.obtainMessage(MSG_POSITION_DRIFT_CHECK),
+ 0 /*check now*/);
+ }
}
}
@@ -952,6 +1019,12 @@ public class RemoteControlClient
private final PendingIntent mRcMediaIntent;
/**
+ * Reflects whether any "plugged in" IRemoteControlDisplay has mWantsPositonSync set to true.
+ */
+ // TODO consider using a ref count for IRemoteControlDisplay requiring sync instead
+ private boolean mNeedsPositionSync = false;
+
+ /**
* A class to encapsulate all the information about a remote control display.
* A RemoteControlClient's metadata and state may be displayed on multiple IRemoteControlDisplay
*/
@@ -960,6 +1033,7 @@ public class RemoteControlClient
private IRemoteControlDisplay mRcDisplay;
private int mArtworkExpectedWidth;
private int mArtworkExpectedHeight;
+ private boolean mWantsPositionSync = false;
DisplayInfoForClient(IRemoteControlDisplay rcd, int w, int h) {
mRcDisplay = rcd;
@@ -1049,6 +1123,14 @@ public class RemoteControlClient
}
}
+ public void setWantsSyncForDisplay(IRemoteControlDisplay rcd, boolean wantsSync) {
+ // only post messages, we can't block here
+ if ((mEventHandler != null) && (rcd != null)) {
+ mEventHandler.sendMessage(mEventHandler.obtainMessage(
+ MSG_DISPLAY_WANTS_POS_SYNC, wantsSync ? 1 : 0, 0/*arg2 ignored*/, rcd));
+ }
+ }
+
public void seekTo(int generationId, long timeMs) {
// only post messages, we can't block here
if (mEventHandler != null) {
@@ -1099,6 +1181,8 @@ public class RemoteControlClient
private final static int MSG_UNPLUG_DISPLAY = 8;
private final static int MSG_UPDATE_DISPLAY_ARTWORK_SIZE = 9;
private final static int MSG_SEEK_TO = 10;
+ private final static int MSG_POSITION_DRIFT_CHECK = 11;
+ private final static int MSG_DISPLAY_WANTS_POS_SYNC = 12;
private class EventHandler extends Handler {
public EventHandler(RemoteControlClient rcc, Looper looper) {
@@ -1146,6 +1230,12 @@ public class RemoteControlClient
case MSG_SEEK_TO:
onSeekTo(msg.arg1, ((Long)msg.obj).longValue());
break;
+ case MSG_POSITION_DRIFT_CHECK:
+ onPositionDriftCheck();
+ break;
+ case MSG_DISPLAY_WANTS_POS_SYNC:
+ onDisplayWantsSync((IRemoteControlDisplay)msg.obj, msg.arg1 == 1);
+ break;
default:
Log.e(TAG, "Unknown event " + msg.what + " in RemoteControlClient handler");
}
@@ -1346,14 +1436,30 @@ public class RemoteControlClient
/** pre-condition rcd != null */
private void onUnplugDisplay(IRemoteControlDisplay rcd) {
synchronized(mCacheLock) {
- final Iterator<DisplayInfoForClient> displayIterator = mRcDisplays.iterator();
+ Iterator<DisplayInfoForClient> displayIterator = mRcDisplays.iterator();
while (displayIterator.hasNext()) {
final DisplayInfoForClient di = (DisplayInfoForClient) displayIterator.next();
if (di.mRcDisplay.asBinder().equals(rcd.asBinder())) {
displayIterator.remove();
- return;
+ break;
}
}
+ // list of RCDs has changed, reevaluate whether position check is still needed
+ boolean oldNeedsPositionSync = mNeedsPositionSync;
+ boolean newNeedsPositionSync = false;
+ displayIterator = mRcDisplays.iterator();
+ while (displayIterator.hasNext()) {
+ final DisplayInfoForClient di = (DisplayInfoForClient) displayIterator.next();
+ if (di.mWantsPositionSync) {
+ newNeedsPositionSync = true;
+ break;
+ }
+ }
+ mNeedsPositionSync = newNeedsPositionSync;
+ if (oldNeedsPositionSync != mNeedsPositionSync) {
+ // update needed?
+ initiateCheckForDrift_syncCacheLock();
+ }
}
}
@@ -1376,6 +1482,31 @@ public class RemoteControlClient
}
}
+ /** pre-condition rcd != null */
+ private void onDisplayWantsSync(IRemoteControlDisplay rcd, boolean wantsSync) {
+ synchronized(mCacheLock) {
+ boolean oldNeedsPositionSync = mNeedsPositionSync;
+ boolean newNeedsPositionSync = false;
+ final Iterator<DisplayInfoForClient> displayIterator = mRcDisplays.iterator();
+ // go through the list of RCDs and for each entry, check both whether this is the RCD
+ // that gets upated, and whether the list has one entry that wants position sync
+ while (displayIterator.hasNext()) {
+ final DisplayInfoForClient di = (DisplayInfoForClient) displayIterator.next();
+ if (di.mRcDisplay.asBinder().equals(rcd.asBinder())) {
+ di.mWantsPositionSync = wantsSync;
+ }
+ if (di.mWantsPositionSync) {
+ newNeedsPositionSync = true;
+ }
+ }
+ mNeedsPositionSync = newNeedsPositionSync;
+ if (oldNeedsPositionSync != mNeedsPositionSync) {
+ // update needed?
+ initiateCheckForDrift_syncCacheLock();
+ }
+ }
+ }
+
private void onSeekTo(int generationId, long timeMs) {
synchronized (mCacheLock) {
if ((mCurrentClientGenId == generationId) && (mPositionUpdateListener != null)) {
@@ -1440,4 +1571,57 @@ public class RemoteControlClient
return false;
}
}
+
+ /**
+ * Returns whether, for the given playback state, the playback position is expected to
+ * be changing.
+ * @param playstate the playback state to evaluate
+ * @return true during any form of playback, false if it's not playing anything while in this
+ * playback state
+ */
+ private static boolean playbackPositionShouldMove(int playstate) {
+ switch(playstate) {
+ case PLAYSTATE_STOPPED:
+ case PLAYSTATE_PAUSED:
+ case PLAYSTATE_BUFFERING:
+ case PLAYSTATE_ERROR:
+ case PLAYSTATE_SKIPPING_FORWARDS:
+ case PLAYSTATE_SKIPPING_BACKWARDS:
+ return false;
+ case PLAYSTATE_PLAYING:
+ case PLAYSTATE_FAST_FORWARDING:
+ case PLAYSTATE_REWINDING:
+ default:
+ return true;
+ }
+ }
+
+ /**
+ * Period for playback position drift checks, 15s when playing at 1x or slower.
+ */
+ private final static long POSITION_REFRESH_PERIOD_PLAYING_MS = 15000;
+ /**
+ * Minimum period for playback position drift checks, never more often when every 2s, when
+ * fast forwarding or rewinding.
+ */
+ private final static long POSITION_REFRESH_PERIOD_MIN_MS = 2000;
+ /**
+ * The value above which the difference between client-reported playback position and
+ * estimated position is considered a drift.
+ */
+ private final static long POSITION_DRIFT_MAX_MS = 500;
+ /**
+ * Compute the period at which the estimated playback position should be compared against the
+ * actual playback position. Is a funciton of playback speed.
+ * @param speed 1.0f is normal playback speed
+ * @return the period in ms
+ */
+ private static long getCheckPeriodFromSpeed(float speed) {
+ if (Math.abs(speed) <= 1.0f) {
+ return POSITION_REFRESH_PERIOD_PLAYING_MS;
+ } else {
+ return Math.max((long)(POSITION_REFRESH_PERIOD_PLAYING_MS / Math.abs(speed)),
+ POSITION_REFRESH_PERIOD_MIN_MS);
+ }
+ }
}
diff --git a/native/android/input.cpp b/native/android/input.cpp
index accec64746f6..7ac73c7ffaa1 100644
--- a/native/android/input.cpp
+++ b/native/android/input.cpp
@@ -25,12 +25,15 @@
#include <utils/Vector.h>
#include <android_runtime/android_app_NativeActivity.h>
+#include <android_runtime/android_view_InputQueue.h>
#include <poll.h>
#include <errno.h>
using android::InputEvent;
+using android::InputQueue;
using android::KeyEvent;
+using android::Looper;
using android::MotionEvent;
using android::sp;
using android::Vector;
@@ -269,25 +272,37 @@ float AMotionEvent_getHistoricalAxisValue(const AInputEvent* motion_event,
void AInputQueue_attachLooper(AInputQueue* queue, ALooper* looper,
int ident, ALooper_callbackFunc callback, void* data) {
- queue->attachLooper(looper, ident, callback, data);
+ InputQueue* iq = static_cast<InputQueue*>(queue);
+ Looper* l = static_cast<Looper*>(looper);
+ iq->attachLooper(l, ident, callback, data);
}
void AInputQueue_detachLooper(AInputQueue* queue) {
- queue->detachLooper();
+ InputQueue* iq = static_cast<InputQueue*>(queue);
+ iq->detachLooper();
}
int32_t AInputQueue_hasEvents(AInputQueue* queue) {
- return queue->hasEvents();
+ InputQueue* iq = static_cast<InputQueue*>(queue);
+ return iq->hasEvents();
}
int32_t AInputQueue_getEvent(AInputQueue* queue, AInputEvent** outEvent) {
- return queue->getEvent(outEvent);
+ InputQueue* iq = static_cast<InputQueue*>(queue);
+ InputEvent* event;
+ int32_t res = iq->getEvent(&event);
+ *outEvent = event;
+ return res;
}
int32_t AInputQueue_preDispatchEvent(AInputQueue* queue, AInputEvent* event) {
- return queue->preDispatchEvent(event) ? 1 : 0;
+ InputQueue* iq = static_cast<InputQueue*>(queue);
+ InputEvent* e = static_cast<InputEvent*>(event);
+ return iq->preDispatchEvent(e) ? 1 : 0;
}
void AInputQueue_finishEvent(AInputQueue* queue, AInputEvent* event, int handled) {
- queue->finishEvent(event, handled != 0, false);
+ InputQueue* iq = static_cast<InputQueue*>(queue);
+ InputEvent* e = static_cast<InputEvent*>(event);
+ iq->finishEvent(e, handled != 0);
}
diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java
index dac3506e0923..5a2e261fa3a4 100644
--- a/opengl/java/android/opengl/GLSurfaceView.java
+++ b/opengl/java/android/opengl/GLSurfaceView.java
@@ -18,6 +18,7 @@ package android.opengl;
import java.io.Writer;
import java.lang.ref.WeakReference;
+import java.util.ArrayList;
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGL11;
@@ -29,13 +30,10 @@ import javax.microedition.khronos.opengles.GL;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.os.Trace;
+import android.content.pm.ConfigurationInfo;
+import android.os.SystemProperties;
import android.util.AttributeSet;
import android.util.Log;
-import android.view.Choreographer;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
@@ -166,25 +164,11 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
private final static String TAG = "GLSurfaceView";
private final static boolean LOG_ATTACH_DETACH = false;
private final static boolean LOG_THREADS = false;
+ private final static boolean LOG_PAUSE_RESUME = false;
private final static boolean LOG_SURFACE = false;
private final static boolean LOG_RENDERER = false;
private final static boolean LOG_RENDERER_DRAW_FRAME = false;
private final static boolean LOG_EGL = false;
- private final static boolean TRACE_ENABLED = false;
-
- private final WeakReference<GLSurfaceView> mThisWeakRef =
- new WeakReference<GLSurfaceView>(this);
- private GLThread mGLThread;
- private Renderer mRenderer;
- private boolean mDetached;
- private EGLConfigChooser mEGLConfigChooser;
- private EGLContextFactory mEGLContextFactory;
- private EGLWindowSurfaceFactory mEGLWindowSurfaceFactory;
- private GLWrapper mGLWrapper;
- private int mDebugFlags;
- private int mEGLContextClientVersion;
- private boolean mPreserveEGLContextOnPause;
-
/**
* The renderer only renders
* when the surface is created, or when {@link #requestRender} is called.
@@ -245,7 +229,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
if (mGLThread != null) {
// GLThread may still be running if this view was never
// attached to a window.
- mGLThread.quitSafely();
+ mGLThread.requestExitAndWait();
}
} finally {
super.finalize();
@@ -257,6 +241,13 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
// underlying surface is created and destroyed
SurfaceHolder holder = getHolder();
holder.addCallback(this);
+ // setFormat is done by SurfaceView in SDK 2.3 and newer. Uncomment
+ // this statement if back-porting to 2.2 or older:
+ // holder.setFormat(PixelFormat.RGB_565);
+ //
+ // setType is not needed for SDK 2.0 or newer. Uncomment this
+ // statement if back-porting this code to older SDKs.
+ // holder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
}
/**
@@ -355,16 +346,15 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
public void setRenderer(Renderer renderer) {
checkRenderThreadState();
if (mEGLConfigChooser == null) {
- mEGLConfigChooser = new SimpleEGLConfigChooser(true, mEGLContextClientVersion);
+ mEGLConfigChooser = new SimpleEGLConfigChooser(true);
}
if (mEGLContextFactory == null) {
- mEGLContextFactory = new DefaultContextFactory(mEGLContextClientVersion);
+ mEGLContextFactory = new DefaultContextFactory();
}
if (mEGLWindowSurfaceFactory == null) {
mEGLWindowSurfaceFactory = new DefaultWindowSurfaceFactory();
}
mRenderer = renderer;
-
mGLThread = new GLThread(mThisWeakRef);
mGLThread.start();
}
@@ -430,7 +420,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
* @param needDepth
*/
public void setEGLConfigChooser(boolean needDepth) {
- setEGLConfigChooser(new SimpleEGLConfigChooser(needDepth, mEGLContextClientVersion));
+ setEGLConfigChooser(new SimpleEGLConfigChooser(needDepth));
}
/**
@@ -449,7 +439,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
public void setEGLConfigChooser(int redSize, int greenSize, int blueSize,
int alphaSize, int depthSize, int stencilSize) {
setEGLConfigChooser(new ComponentSizeChooser(redSize, greenSize,
- blueSize, alphaSize, depthSize, stencilSize, mEGLContextClientVersion));
+ blueSize, alphaSize, depthSize, stencilSize));
}
/**
@@ -476,13 +466,6 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
* If
* {@link #setEGLConfigChooser(EGLConfigChooser)} has been called, then the supplied
* EGLConfigChooser is responsible for choosing an OpenGL ES 2.0-compatible config.
- *
- * This method must be called before:
- * <ul>
- * <li>{@link #setEGLConfigChooser(boolean)}
- * <li>{@link #setEGLConfigChooser(int, int, int, int, int, int)}
- * </ul>
- *
* @param version The EGLContext client version to choose. Use 2 for OpenGL ES 2.0
*/
public void setEGLContextClientVersion(int version) {
@@ -507,13 +490,6 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
* @see #RENDERMODE_WHEN_DIRTY
*/
public void setRenderMode(int renderMode) {
- switch (renderMode) {
- case RENDERMODE_WHEN_DIRTY:
- case RENDERMODE_CONTINUOUSLY:
- break;
- default:
- throw new IllegalArgumentException("renderMode");
- }
mGLThread.setRenderMode(renderMode);
}
@@ -605,13 +581,15 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
if (LOG_ATTACH_DETACH) {
Log.d(TAG, "onAttachedToWindow reattach =" + mDetached);
}
-
- final int renderMode = mGLThread != null ?
- mGLThread.mRenderMode : RENDERMODE_CONTINUOUSLY;
-
if (mDetached && (mRenderer != null)) {
+ int renderMode = RENDERMODE_CONTINUOUSLY;
+ if (mGLThread != null) {
+ renderMode = mGLThread.getRenderMode();
+ }
mGLThread = new GLThread(mThisWeakRef);
- mGLThread.setRenderMode(renderMode);
+ if (renderMode != RENDERMODE_CONTINUOUSLY) {
+ mGLThread.setRenderMode(renderMode);
+ }
mGLThread.start();
}
mDetached = false;
@@ -628,11 +606,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
Log.d(TAG, "onDetachedFromWindow");
}
if (mGLThread != null) {
- mGLThread.quitSafely();
- try {
- mGLThread.join();
- } catch (InterruptedException ex) {
- }
+ mGLThread.requestExitAndWait();
}
mDetached = true;
super.onDetachedFromWindow();
@@ -787,15 +761,11 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context);
}
- private static class DefaultContextFactory implements EGLContextFactory {
- private final int mEGLContextClientVersion;
-
- public DefaultContextFactory(int version) {
- mEGLContextClientVersion = version;
- }
+ private class DefaultContextFactory implements EGLContextFactory {
+ private int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig config) {
- int[] attrib_list = {EGL14.EGL_CONTEXT_CLIENT_VERSION, mEGLContextClientVersion,
+ int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, mEGLContextClientVersion,
EGL10.EGL_NONE };
return egl.eglCreateContext(display, config, EGL10.EGL_NO_CONTEXT,
@@ -805,9 +775,9 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
public void destroyContext(EGL10 egl, EGLDisplay display,
EGLContext context) {
if (!egl.eglDestroyContext(display, context)) {
- Log.e(TAG, "display:" + display + " context: " + context);
+ Log.e("DefaultContextFactory", "display:" + display + " context: " + context);
if (LOG_THREADS) {
- Log.d(TAG, "tid=" + Thread.currentThread().getId());
+ Log.i("DefaultContextFactory", "tid=" + Thread.currentThread().getId());
}
EglHelper.throwEglException("eglDestroyContex", egl.eglGetError());
}
@@ -837,8 +807,8 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
try {
result = egl.eglCreateWindowSurface(display, config, nativeWindow, null);
} catch (IllegalArgumentException e) {
- // This exception indicates that the surfaceflinger surface
- // is not valid. This can happen if the surfaceflinger surface has
+ // This exception indicates that the surface flinger surface
+ // is not valid. This can happen if the surface flinger surface has
// been torn down, but the application has not yet been
// notified via SurfaceHolder.Callback.surfaceDestroyed.
// In theory the application should be notified first,
@@ -874,11 +844,10 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
EGLConfig chooseConfig(EGL10 egl, EGLDisplay display);
}
- private static abstract class BaseConfigChooser
+ private abstract class BaseConfigChooser
implements EGLConfigChooser {
-
- public BaseConfigChooser(int[] configSpec, int version) {
- mConfigSpec = filterConfigSpec(configSpec, version);
+ public BaseConfigChooser(int[] configSpec) {
+ mConfigSpec = filterConfigSpec(configSpec);
}
public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
@@ -912,8 +881,8 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
protected int[] mConfigSpec;
- private int[] filterConfigSpec(int[] configSpec, int version) {
- if (version != 2) {
+ private int[] filterConfigSpec(int[] configSpec) {
+ if (mEGLContextClientVersion != 2) {
return configSpec;
}
/* We know none of the subclasses define EGL_RENDERABLE_TYPE.
@@ -923,7 +892,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
int[] newConfigSpec = new int[len + 2];
System.arraycopy(configSpec, 0, newConfigSpec, 0, len-1);
newConfigSpec[len-1] = EGL10.EGL_RENDERABLE_TYPE;
- newConfigSpec[len] = EGL14.EGL_OPENGL_ES2_BIT;
+ newConfigSpec[len] = 4; /* EGL_OPENGL_ES2_BIT */
newConfigSpec[len+1] = EGL10.EGL_NONE;
return newConfigSpec;
}
@@ -933,9 +902,9 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
* Choose a configuration with exactly the specified r,g,b,a sizes,
* and at least the specified depth and stencil sizes.
*/
- private static class ComponentSizeChooser extends BaseConfigChooser {
+ private class ComponentSizeChooser extends BaseConfigChooser {
public ComponentSizeChooser(int redSize, int greenSize, int blueSize,
- int alphaSize, int depthSize, int stencilSize, int version) {
+ int alphaSize, int depthSize, int stencilSize) {
super(new int[] {
EGL10.EGL_RED_SIZE, redSize,
EGL10.EGL_GREEN_SIZE, greenSize,
@@ -943,7 +912,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
EGL10.EGL_ALPHA_SIZE, alphaSize,
EGL10.EGL_DEPTH_SIZE, depthSize,
EGL10.EGL_STENCIL_SIZE, stencilSize,
- EGL10.EGL_NONE}, version);
+ EGL10.EGL_NONE});
mValue = new int[1];
mRedSize = redSize;
mGreenSize = greenSize;
@@ -951,7 +920,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
mAlphaSize = alphaSize;
mDepthSize = depthSize;
mStencilSize = stencilSize;
- }
+ }
@Override
public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display,
@@ -962,10 +931,14 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
int s = findConfigAttrib(egl, display, config,
EGL10.EGL_STENCIL_SIZE, 0);
if ((d >= mDepthSize) && (s >= mStencilSize)) {
- int r = findConfigAttrib(egl, display, config, EGL10.EGL_RED_SIZE, 0);
- int g = findConfigAttrib(egl, display, config, EGL10.EGL_GREEN_SIZE, 0);
- int b = findConfigAttrib(egl, display, config, EGL10.EGL_BLUE_SIZE, 0);
- int a = findConfigAttrib(egl, display, config, EGL10.EGL_ALPHA_SIZE, 0);
+ int r = findConfigAttrib(egl, display, config,
+ EGL10.EGL_RED_SIZE, 0);
+ int g = findConfigAttrib(egl, display, config,
+ EGL10.EGL_GREEN_SIZE, 0);
+ int b = findConfigAttrib(egl, display, config,
+ EGL10.EGL_BLUE_SIZE, 0);
+ int a = findConfigAttrib(egl, display, config,
+ EGL10.EGL_ALPHA_SIZE, 0);
if ((r == mRedSize) && (g == mGreenSize)
&& (b == mBlueSize) && (a == mAlphaSize)) {
return config;
@@ -992,16 +965,16 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
protected int mAlphaSize;
protected int mDepthSize;
protected int mStencilSize;
- }
+ }
/**
* This class will choose a RGB_888 surface with
* or without a depth buffer.
*
*/
- private static class SimpleEGLConfigChooser extends ComponentSizeChooser {
- public SimpleEGLConfigChooser(boolean withDepthBuffer, int version) {
- super(8, 8, 8, 0, withDepthBuffer ? 16 : 0, 0, version);
+ private class SimpleEGLConfigChooser extends ComponentSizeChooser {
+ public SimpleEGLConfigChooser(boolean withDepthBuffer) {
+ super(8, 8, 8, 0, withDepthBuffer ? 16 : 0, 0);
}
}
@@ -1018,9 +991,9 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
* Initialize EGL for a given configuration spec.
* @param configSpec
*/
- public void initialize() {
+ public void start() {
if (LOG_EGL) {
- Log.d(TAG, "initialize() tid=" + Thread.currentThread().getId());
+ Log.w("EglHelper", "start() tid=" + Thread.currentThread().getId());
}
/*
* Get an EGL instance
@@ -1061,7 +1034,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
throwEglException("createContext");
}
if (LOG_EGL) {
- Log.d(TAG, "createContext " + mEglContext + " tid=" + Thread.currentThread().getId());
+ Log.w("EglHelper", "createContext " + mEglContext + " tid=" + Thread.currentThread().getId());
}
mEglSurface = null;
@@ -1075,7 +1048,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
*/
public boolean createSurface() {
if (LOG_EGL) {
- Log.d(TAG, "createSurface() tid=" + Thread.currentThread().getId());
+ Log.w("EglHelper", "createSurface() tid=" + Thread.currentThread().getId());
}
/*
* Check preconditions.
@@ -1110,7 +1083,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
if (mEglSurface == null || mEglSurface == EGL10.EGL_NO_SURFACE) {
int error = mEgl.eglGetError();
if (error == EGL10.EGL_BAD_NATIVE_WINDOW) {
- Log.e(TAG, "createWindowSurface returned EGL_BAD_NATIVE_WINDOW.");
+ Log.e("EglHelper", "createWindowSurface returned EGL_BAD_NATIVE_WINDOW.");
}
return false;
}
@@ -1124,9 +1097,8 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
* Could not make the context current, probably because the underlying
* SurfaceView surface has been destroyed.
*/
- logEglErrorAsWarning(TAG, "eglMakeCurrent", mEgl.eglGetError());
- // we fall-through to "true" here because we do have a
- // valid EGLSurface at this point.
+ logEglErrorAsWarning("EGLHelper", "eglMakeCurrent", mEgl.eglGetError());
+ return false;
}
return true;
@@ -1136,7 +1108,8 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
* Create a GL object for the current EGL context.
* @return
*/
- public GL createGL() {
+ GL createGL() {
+
GL gl = mEglContext.getGL();
GLSurfaceView view = mGLSurfaceViewWeakRef.get();
if (view != null) {
@@ -1172,7 +1145,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
public void destroySurface() {
if (LOG_EGL) {
- Log.d(TAG, "destroySurface() tid=" + Thread.currentThread().getId());
+ Log.w("EglHelper", "destroySurface() tid=" + Thread.currentThread().getId());
}
destroySurfaceImp();
}
@@ -1190,9 +1163,9 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
}
}
- public void terminate() {
+ public void finish() {
if (LOG_EGL) {
- Log.d(TAG, "terminate() tid=" + Thread.currentThread().getId());
+ Log.w("EglHelper", "finish() tid=" + Thread.currentThread().getId());
}
if (mEglContext != null) {
GLSurfaceView view = mGLSurfaceViewWeakRef.get();
@@ -1214,7 +1187,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
public static void throwEglException(String function, int error) {
String message = formatEglError(function, error);
if (LOG_THREADS) {
- Log.e(TAG, "throwEglException tid=" + Thread.currentThread().getId() + " "
+ Log.e("EglHelper", "throwEglException tid=" + Thread.currentThread().getId() + " "
+ message);
}
throw new RuntimeException(message);
@@ -1234,423 +1207,584 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
EGLSurface mEglSurface;
EGLConfig mEglConfig;
EGLContext mEglContext;
+
}
/**
* A generic GL Thread. Takes care of initializing EGL and GL. Delegates
* to a Renderer instance to do the actual drawing. Can be configured to
* render continuously or on request.
+ *
+ * All potentially blocking synchronization is done through the
+ * sGLThreadManager object. This avoids multiple-lock ordering issues.
+ *
*/
-
- static class GLThread extends HandlerThread {
- // only accessed from GLThread
- private GL10 mGLContext;
- private int mWidth;
- private int mHeight;
- private boolean mSizeChanged;
- // current render mode
- private int mRenderMode;
- // the EGLSurface exists but isn't working for some reason
- private boolean mEglSurfaceIsBad;
- // we have an EGLContext
- private boolean mHaveEglContext;
- // we have an EGLSurface
- private boolean mHaveEglSurface;
- // we have a Surface (i.e.: EGLNativeWindowType)
- private boolean mHasSurface;
- // activity is paused
- private boolean mPaused;
-
- // constants
- private EglHelper mEglHelper;
- private Handler mGLHandler;
- private Choreographer mChoreographer;
-
- // this runnable could be called often, so we keep an instance around
- class GetRenderModeRunnable implements Runnable {
- volatile public int renderMode;
- @Override
- public void run() {
- renderMode = doGetRenderMode();
- }
- };
-
- private final GetRenderModeRunnable mGetRenderModeRunnable = new GetRenderModeRunnable();
-
- /*
- * Set once at thread construction time, nulled out when the parent view is garbage
- * called. This weak reference allows the GLSurfaceView to be garbage collected while
- * the GLThread is still alive.
- */
- private final WeakReference<GLSurfaceView> mGLSurfaceViewWeakRef;
-
- private final Runnable mExecuteDrawAction = new Runnable() {
- private int mTraceVsyncCounter = 0;
- @Override
- public void run() {
- if (TRACE_ENABLED) {
- Trace.traceCounter(Trace.TRACE_TAG_GRAPHICS,
- "GLSurfaceView VSYNC counter", (mTraceVsyncCounter++) & 0xf);
- }
- executeDraw();
- }
- };
-
- public GLThread(WeakReference<GLSurfaceView> glSurfaceViewWeakRef) {
- super("GLThread", android.os.Process.THREAD_PRIORITY_DISPLAY);
- if (LOG_THREADS) {
- Log.d(TAG, "*** Starting GLThread ***");
- }
+ static class GLThread extends Thread {
+ GLThread(WeakReference<GLSurfaceView> glSurfaceViewWeakRef) {
+ super();
mWidth = 0;
mHeight = 0;
+ mRequestRender = true;
mRenderMode = RENDERMODE_CONTINUOUSLY;
mGLSurfaceViewWeakRef = glSurfaceViewWeakRef;
}
- private void readyToRun() {
- mChoreographer = Choreographer.getInstance();
- mEglHelper = new EglHelper(mGLSurfaceViewWeakRef);
- }
-
- @Override
- public void start() {
- super.start();
- // getLooper() blocks until the thread is running
- Looper looper = getLooper();
- mGLHandler = new Handler(looper);
- // don't return until the GLThread state has been initialized
- mGLHandler.runWithScissors(new Runnable() {
- @Override
- public void run() {
- readyToRun();
- }
- }, 0);
- }
-
@Override
public void run() {
+ setName("GLThread " + getId());
+ if (LOG_THREADS) {
+ Log.i("GLThread", "starting tid=" + getId());
+ }
+
try {
- super.run();
+ guardedRun();
+ } catch (InterruptedException e) {
+ // fall thru and exit normally
} finally {
- // by definition the GLThread is not running anymore here
- stopEglContext();
- stopEglSurface();
+ sGLThreadManager.threadExiting(this);
}
}
- // only call from the GLThread
- private void stopEglSurface() {
+ /*
+ * This private method should only be called inside a
+ * synchronized(sGLThreadManager) block.
+ */
+ private void stopEglSurfaceLocked() {
if (mHaveEglSurface) {
- if (LOG_SURFACE) {
- Log.d(TAG, "releasing EGL surface because paused tid=" + getId());
- }
mHaveEglSurface = false;
mEglHelper.destroySurface();
}
}
- // only call from the GLThread
- private void stopEglContext() {
+ /*
+ * This private method should only be called inside a
+ * synchronized(sGLThreadManager) block.
+ */
+ private void stopEglContextLocked() {
if (mHaveEglContext) {
- mEglHelper.terminate();
+ mEglHelper.finish();
mHaveEglContext = false;
- if (LOG_SURFACE) {
- Log.d(TAG, "releasing EGL context because paused tid=" + getId());
- }
+ sGLThreadManager.releaseEglContextLocked(this);
}
}
+ private void guardedRun() throws InterruptedException {
+ mEglHelper = new EglHelper(mGLSurfaceViewWeakRef);
+ mHaveEglContext = false;
+ mHaveEglSurface = false;
+ try {
+ GL10 gl = null;
+ boolean createEglContext = false;
+ boolean createEglSurface = false;
+ boolean createGlInterface = false;
+ boolean lostEglContext = false;
+ boolean sizeChanged = false;
+ boolean wantRenderNotification = false;
+ boolean doRenderNotification = false;
+ boolean askedToReleaseEglContext = false;
+ int w = 0;
+ int h = 0;
+ Runnable event = null;
+
+ while (true) {
+ synchronized (sGLThreadManager) {
+ while (true) {
+ if (mShouldExit) {
+ return;
+ }
- private void updateState() {
- final boolean wasAbleToDraw = isAbleToDraw();
- if (!isReadyToDraw()) {
- return;
- }
+ if (! mEventQueue.isEmpty()) {
+ event = mEventQueue.remove(0);
+ break;
+ }
- if (!mHaveEglSurface || mSizeChanged) {
- // create EGL context if needed
- boolean reportSurfaceCreated = false;
- if (!mHaveEglContext) {
- mEglHelper.initialize();
- mHaveEglContext = true;
- reportSurfaceCreated = true;
- }
+ // Update the pause state.
+ boolean pausing = false;
+ if (mPaused != mRequestPaused) {
+ pausing = mRequestPaused;
+ mPaused = mRequestPaused;
+ sGLThreadManager.notifyAll();
+ if (LOG_PAUSE_RESUME) {
+ Log.i("GLThread", "mPaused is now " + mPaused + " tid=" + getId());
+ }
+ }
- // get the GL interface for the active EGLContext
- mGLContext = (GL10)mEglHelper.createGL();
+ // Do we need to give up the EGL context?
+ if (mShouldReleaseEglContext) {
+ if (LOG_SURFACE) {
+ Log.i("GLThread", "releasing EGL context because asked to tid=" + getId());
+ }
+ stopEglSurfaceLocked();
+ stopEglContextLocked();
+ mShouldReleaseEglContext = false;
+ askedToReleaseEglContext = true;
+ }
- // create EGL Surface
- mHaveEglSurface = mEglHelper.createSurface();
- mEglSurfaceIsBad = !mHaveEglSurface;
- mSizeChanged = false;
+ // Have we lost the EGL context?
+ if (lostEglContext) {
+ stopEglSurfaceLocked();
+ stopEglContextLocked();
+ lostEglContext = false;
+ }
- // notify use of surface size change
- GLSurfaceView view = mGLSurfaceViewWeakRef.get();
- if (view != null) {
- if (reportSurfaceCreated) {
- if (LOG_RENDERER) {
- Log.d(TAG, "onSurfaceCreated");
+ // When pausing, release the EGL surface:
+ if (pausing && mHaveEglSurface) {
+ if (LOG_SURFACE) {
+ Log.i("GLThread", "releasing EGL surface because paused tid=" + getId());
+ }
+ stopEglSurfaceLocked();
+ }
+
+ // When pausing, optionally release the EGL Context:
+ if (pausing && mHaveEglContext) {
+ GLSurfaceView view = mGLSurfaceViewWeakRef.get();
+ boolean preserveEglContextOnPause = view == null ?
+ false : view.mPreserveEGLContextOnPause;
+ if (!preserveEglContextOnPause || sGLThreadManager.shouldReleaseEGLContextWhenPausing()) {
+ stopEglContextLocked();
+ if (LOG_SURFACE) {
+ Log.i("GLThread", "releasing EGL context because paused tid=" + getId());
+ }
+ }
+ }
+
+ // When pausing, optionally terminate EGL:
+ if (pausing) {
+ if (sGLThreadManager.shouldTerminateEGLWhenPausing()) {
+ mEglHelper.finish();
+ if (LOG_SURFACE) {
+ Log.i("GLThread", "terminating EGL because paused tid=" + getId());
+ }
+ }
+ }
+
+ // Have we lost the SurfaceView surface?
+ if ((! mHasSurface) && (! mWaitingForSurface)) {
+ if (LOG_SURFACE) {
+ Log.i("GLThread", "noticed surfaceView surface lost tid=" + getId());
+ }
+ if (mHaveEglSurface) {
+ stopEglSurfaceLocked();
+ }
+ mWaitingForSurface = true;
+ mSurfaceIsBad = false;
+ sGLThreadManager.notifyAll();
+ }
+
+ // Have we acquired the surface view surface?
+ if (mHasSurface && mWaitingForSurface) {
+ if (LOG_SURFACE) {
+ Log.i("GLThread", "noticed surfaceView surface acquired tid=" + getId());
+ }
+ mWaitingForSurface = false;
+ sGLThreadManager.notifyAll();
+ }
+
+ if (doRenderNotification) {
+ if (LOG_SURFACE) {
+ Log.i("GLThread", "sending render notification tid=" + getId());
+ }
+ wantRenderNotification = false;
+ doRenderNotification = false;
+ mRenderComplete = true;
+ sGLThreadManager.notifyAll();
+ }
+
+ // Ready to draw?
+ if (readyToDraw()) {
+
+ // If we don't have an EGL context, try to acquire one.
+ if (! mHaveEglContext) {
+ if (askedToReleaseEglContext) {
+ askedToReleaseEglContext = false;
+ } else if (sGLThreadManager.tryAcquireEglContextLocked(this)) {
+ try {
+ mEglHelper.start();
+ } catch (RuntimeException t) {
+ sGLThreadManager.releaseEglContextLocked(this);
+ throw t;
+ }
+ mHaveEglContext = true;
+ createEglContext = true;
+
+ sGLThreadManager.notifyAll();
+ }
+ }
+
+ if (mHaveEglContext && !mHaveEglSurface) {
+ mHaveEglSurface = true;
+ createEglSurface = true;
+ createGlInterface = true;
+ sizeChanged = true;
+ }
+
+ if (mHaveEglSurface) {
+ if (mSizeChanged) {
+ sizeChanged = true;
+ w = mWidth;
+ h = mHeight;
+ wantRenderNotification = true;
+ if (LOG_SURFACE) {
+ Log.i("GLThread",
+ "noticing that we want render notification tid="
+ + getId());
+ }
+
+ // Destroy and recreate the EGL surface.
+ createEglSurface = true;
+
+ mSizeChanged = false;
+ }
+ mRequestRender = false;
+ sGLThreadManager.notifyAll();
+ break;
+ }
+ }
+
+ // By design, this is the only place in a GLThread thread where we wait().
+ if (LOG_THREADS) {
+ Log.i("GLThread", "waiting tid=" + getId()
+ + " mHaveEglContext: " + mHaveEglContext
+ + " mHaveEglSurface: " + mHaveEglSurface
+ + " mFinishedCreatingEglSurface: " + mFinishedCreatingEglSurface
+ + " mPaused: " + mPaused
+ + " mHasSurface: " + mHasSurface
+ + " mSurfaceIsBad: " + mSurfaceIsBad
+ + " mWaitingForSurface: " + mWaitingForSurface
+ + " mWidth: " + mWidth
+ + " mHeight: " + mHeight
+ + " mRequestRender: " + mRequestRender
+ + " mRenderMode: " + mRenderMode);
+ }
+ sGLThreadManager.wait();
}
- view.mRenderer.onSurfaceCreated(mGLContext, mEglHelper.mEglConfig);
- }
+ } // end of synchronized(sGLThreadManager)
- if (LOG_RENDERER) {
- Log.d(TAG, "onSurfaceChanged(" + mWidth + ", " + mHeight + ")");
+ if (event != null) {
+ event.run();
+ event = null;
+ continue;
}
- view.mRenderer.onSurfaceChanged(mGLContext, mWidth, mHeight);
- }
- }
- // see if we should kick the rendering loop
- if (!wasAbleToDraw && isAbleToDraw()) {
- // we're now able to draw
- if (mRenderMode == RENDERMODE_CONTINUOUSLY) {
- requestRender();
- }
- }
+ if (createEglSurface) {
+ if (LOG_SURFACE) {
+ Log.w("GLThread", "egl createSurface");
+ }
+ if (mEglHelper.createSurface()) {
+ synchronized(sGLThreadManager) {
+ mFinishedCreatingEglSurface = true;
+ sGLThreadManager.notifyAll();
+ }
+ } else {
+ synchronized(sGLThreadManager) {
+ mFinishedCreatingEglSurface = true;
+ mSurfaceIsBad = true;
+ sGLThreadManager.notifyAll();
+ }
+ continue;
+ }
+ createEglSurface = false;
+ }
- // By design, this is the only place in a GLThread thread where we wait().
- if (LOG_THREADS) {
- Log.d(TAG, "waiting tid=" + getId()
- + " mHaveEglContext: " + mHaveEglContext
- + " mHaveEglSurface: " + mHaveEglSurface
- + " mPaused: " + mPaused
- + " mHasSurface: " + mHasSurface
- + " mSurfaceIsBad: " + mEglSurfaceIsBad
- + " mWidth: " + mWidth
- + " mHeight: " + mHeight
- + " mRenderMode: " + mRenderMode);
- }
- }
+ if (createGlInterface) {
+ gl = (GL10) mEglHelper.createGL();
- private void executeDraw() {
- if (TRACE_ENABLED) {
- Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "executeDraw");
- }
+ sGLThreadManager.checkGLDriver(gl);
+ createGlInterface = false;
+ }
- if (isAbleToDraw()) {
- if (mRenderMode == RENDERMODE_CONTINUOUSLY) {
- requestRender();
- }
+ if (createEglContext) {
+ if (LOG_RENDERER) {
+ Log.w("GLThread", "onSurfaceCreated");
+ }
+ GLSurfaceView view = mGLSurfaceViewWeakRef.get();
+ if (view != null) {
+ view.mRenderer.onSurfaceCreated(gl, mEglHelper.mEglConfig);
+ }
+ createEglContext = false;
+ }
- if (LOG_RENDERER_DRAW_FRAME) {
- Log.d(TAG, "onDrawFrame tid=" + getId());
- }
+ if (sizeChanged) {
+ if (LOG_RENDERER) {
+ Log.w("GLThread", "onSurfaceChanged(" + w + ", " + h + ")");
+ }
+ GLSurfaceView view = mGLSurfaceViewWeakRef.get();
+ if (view != null) {
+ view.mRenderer.onSurfaceChanged(gl, w, h);
+ }
+ sizeChanged = false;
+ }
- GLSurfaceView view = mGLSurfaceViewWeakRef.get();
- if (view != null) {
- view.mRenderer.onDrawFrame(mGLContext);
+ if (LOG_RENDERER_DRAW_FRAME) {
+ Log.w("GLThread", "onDrawFrame tid=" + getId());
+ }
+ {
+ GLSurfaceView view = mGLSurfaceViewWeakRef.get();
+ if (view != null) {
+ view.mRenderer.onDrawFrame(gl);
+ }
+ }
int swapError = mEglHelper.swap();
switch (swapError) {
case EGL10.EGL_SUCCESS:
break;
case EGL11.EGL_CONTEXT_LOST:
if (LOG_SURFACE) {
- Log.d(TAG, "egl context lost tid=" + getId());
+ Log.i("GLThread", "egl context lost tid=" + getId());
}
- stopEglSurface();
- stopEglContext();
+ lostEglContext = true;
break;
default:
// Other errors typically mean that the current surface is bad,
// probably because the SurfaceView surface has been destroyed,
// but we haven't been notified yet.
// Log the error to help developers understand why rendering stopped.
- EglHelper.logEglErrorAsWarning(TAG, "eglSwapBuffers", swapError);
- mEglSurfaceIsBad = true;
+ EglHelper.logEglErrorAsWarning("GLThread", "eglSwapBuffers", swapError);
+
+ synchronized(sGLThreadManager) {
+ mSurfaceIsBad = true;
+ sGLThreadManager.notifyAll();
+ }
break;
}
+
+ if (wantRenderNotification) {
+ doRenderNotification = true;
+ }
}
- }
- if (TRACE_ENABLED) {
- Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS);
+ } finally {
+ /*
+ * clean-up everything...
+ */
+ synchronized (sGLThreadManager) {
+ stopEglSurfaceLocked();
+ stopEglContextLocked();
+ }
}
}
- private boolean isAbleToDraw() {
- return mHaveEglContext && mHaveEglSurface && isReadyToDraw();
- }
-
- private boolean isReadyToDraw() {
- return (!mPaused) && mHasSurface && (!mEglSurfaceIsBad)
- && (mWidth > 0) && (mHeight > 0);
+ public boolean ableToDraw() {
+ return mHaveEglContext && mHaveEglSurface && readyToDraw();
}
- private boolean isEglContextReleasedWhenPausing() {
- GLSurfaceView view = mGLSurfaceViewWeakRef.get();
- return (view != null) ? !view.mPreserveEGLContextOnPause : false;
+ private boolean readyToDraw() {
+ return (!mPaused) && mHasSurface && (!mSurfaceIsBad)
+ && (mWidth > 0) && (mHeight > 0)
+ && (mRequestRender || (mRenderMode == RENDERMODE_CONTINUOUSLY));
}
- public void queueEvent(Runnable r) {
- if (r == null) {
- throw new IllegalArgumentException("Runnable r must not be null");
+ public void setRenderMode(int renderMode) {
+ if ( !((RENDERMODE_WHEN_DIRTY <= renderMode) && (renderMode <= RENDERMODE_CONTINUOUSLY)) ) {
+ throw new IllegalArgumentException("renderMode");
}
- mGLHandler.post(r);
- }
-
- /*
- * the call-backs below all run on the GLThread and implement state
- * changes of the GLSurfaceView and Activity life cycle.
- */
-
- private void doSurfaceCreated() {
- mHasSurface = true;
- updateState();
- }
-
- private void doSurfaceDestroyed() {
- if (mHasSurface) {
- if (LOG_SURFACE) {
- Log.d(TAG, "noticed surfaceView surface lost tid=" + getId());
- }
- stopEglSurface();
+ synchronized(sGLThreadManager) {
+ mRenderMode = renderMode;
+ sGLThreadManager.notifyAll();
}
- mHasSurface = false;
}
- private void doPause() {
- if (mPaused == false) {
- mPaused = true;
- stopEglSurface();
- // When pausing, optionally release the EGL Context:
- if (mHaveEglContext && isEglContextReleasedWhenPausing()) {
- stopEglContext();
- }
+ public int getRenderMode() {
+ synchronized(sGLThreadManager) {
+ return mRenderMode;
}
}
- private void doResume() {
- mPaused = false;
- updateState();
- if (mRenderMode == RENDERMODE_WHEN_DIRTY) {
- requestRender();
+ public void requestRender() {
+ synchronized(sGLThreadManager) {
+ mRequestRender = true;
+ sGLThreadManager.notifyAll();
}
}
- private void doWindowResize(int width, int height) {
- // we were not drawing yet. Update the window size and
- // state and attempt to draw a frame.
- mSizeChanged = (mWidth != width || mHeight != height);
- mWidth = width;
- mHeight = height;
- updateState();
- // we always (attempt to) draw a frame before returning
- executeDraw();
- }
-
- private void doSetRenderMode(int renderMode) {
- mRenderMode = renderMode;
- }
-
-
- private int doGetRenderMode() {
- return mRenderMode;
- }
-
- /*
- * the call-backs below run on the main UI thread, they just
- * wait while executing work on the GLThread.
- */
-
public void surfaceCreated() {
- mGLHandler.runWithScissors(new Runnable() {
- @Override
- public void run() {
- doSurfaceCreated();
+ synchronized(sGLThreadManager) {
+ if (LOG_THREADS) {
+ Log.i("GLThread", "surfaceCreated tid=" + getId());
}
- }, 0);
+ mHasSurface = true;
+ mFinishedCreatingEglSurface = false;
+ sGLThreadManager.notifyAll();
+ while (mWaitingForSurface
+ && !mFinishedCreatingEglSurface
+ && !mExited) {
+ try {
+ sGLThreadManager.wait();
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
+ }
}
public void surfaceDestroyed() {
- mGLHandler.runWithScissors(new Runnable() {
- @Override
- public void run() {
- doSurfaceDestroyed();
+ synchronized(sGLThreadManager) {
+ if (LOG_THREADS) {
+ Log.i("GLThread", "surfaceDestroyed tid=" + getId());
}
- }, 0);
+ mHasSurface = false;
+ sGLThreadManager.notifyAll();
+ while((!mWaitingForSurface) && (!mExited)) {
+ try {
+ sGLThreadManager.wait();
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
+ }
}
public void onPause() {
- mGLHandler.runWithScissors(new Runnable() {
- @Override
- public void run() {
- doPause();
+ synchronized (sGLThreadManager) {
+ if (LOG_PAUSE_RESUME) {
+ Log.i("GLThread", "onPause tid=" + getId());
+ }
+ mRequestPaused = true;
+ sGLThreadManager.notifyAll();
+ while ((! mExited) && (! mPaused)) {
+ if (LOG_PAUSE_RESUME) {
+ Log.i("Main thread", "onPause waiting for mPaused.");
+ }
+ try {
+ sGLThreadManager.wait();
+ } catch (InterruptedException ex) {
+ Thread.currentThread().interrupt();
+ }
}
- }, 0);
+ }
}
public void onResume() {
- mGLHandler.runWithScissors(new Runnable() {
- @Override
- public void run() {
- doResume();
+ synchronized (sGLThreadManager) {
+ if (LOG_PAUSE_RESUME) {
+ Log.i("GLThread", "onResume tid=" + getId());
+ }
+ mRequestPaused = false;
+ mRequestRender = true;
+ mRenderComplete = false;
+ sGLThreadManager.notifyAll();
+ while ((! mExited) && mPaused && (!mRenderComplete)) {
+ if (LOG_PAUSE_RESUME) {
+ Log.i("Main thread", "onResume waiting for !mPaused.");
+ }
+ try {
+ sGLThreadManager.wait();
+ } catch (InterruptedException ex) {
+ Thread.currentThread().interrupt();
+ }
}
- }, 0);
+ }
}
public void onWindowResize(int w, int h) {
- final int width = w;
- final int height = h;
- mGLHandler.runWithScissors(new Runnable() {
- @Override
- public void run() {
- doWindowResize(width, height);
+ synchronized (sGLThreadManager) {
+ mWidth = w;
+ mHeight = h;
+ mSizeChanged = true;
+ mRequestRender = true;
+ mRenderComplete = false;
+ sGLThreadManager.notifyAll();
+
+ // Wait for thread to react to resize and render a frame
+ while (! mExited && !mPaused && !mRenderComplete
+ && ableToDraw()) {
+ if (LOG_SURFACE) {
+ Log.i("Main thread", "onWindowResize waiting for render complete from tid=" + getId());
+ }
+ try {
+ sGLThreadManager.wait();
+ } catch (InterruptedException ex) {
+ Thread.currentThread().interrupt();
+ }
}
- }, 0);
+ }
}
- /*
- * the methods below can be called from any thread
- */
-
- public void requestRender() {
- if (mRenderMode == RENDERMODE_CONTINUOUSLY) {
- mChoreographer.postCallback(Choreographer.CALLBACK_ANIMATION,
- mExecuteDrawAction, null);
- } else {
- /*
- * in RENDERMODE_WHEN_DIRTY we schedule the draw callback
- * immediately because the developer is manager her
- * timing loop manually -- in particular she could be
- * using the Choreographer already.
- */
- mGLHandler.post(mExecuteDrawAction);
+ public void requestExitAndWait() {
+ // don't call this from GLThread thread or it is a guaranteed
+ // deadlock!
+ synchronized(sGLThreadManager) {
+ mShouldExit = true;
+ sGLThreadManager.notifyAll();
+ while (! mExited) {
+ try {
+ sGLThreadManager.wait();
+ } catch (InterruptedException ex) {
+ Thread.currentThread().interrupt();
+ }
+ }
}
}
- public void setRenderMode(final int renderMode) {
- mGLHandler.runWithScissors(new Runnable() {
- @Override
- public void run() {
- doSetRenderMode(renderMode);
- }
- }, 0);
+ public void requestReleaseEglContextLocked() {
+ mShouldReleaseEglContext = true;
+ sGLThreadManager.notifyAll();
}
- public int getRenderMode() {
- mGLHandler.runWithScissors(mGetRenderModeRunnable, 0);
- return mGetRenderModeRunnable.renderMode;
+ /**
+ * Queue an "event" to be run on the GL rendering thread.
+ * @param r the runnable to be run on the GL rendering thread.
+ */
+ public void queueEvent(Runnable r) {
+ if (r == null) {
+ throw new IllegalArgumentException("r must not be null");
+ }
+ synchronized(sGLThreadManager) {
+ mEventQueue.add(r);
+ sGLThreadManager.notifyAll();
+ }
}
- } // class GLThread
+
+ // Once the thread is started, all accesses to the following member
+ // variables are protected by the sGLThreadManager monitor
+ private boolean mShouldExit;
+ private boolean mExited;
+ private boolean mRequestPaused;
+ private boolean mPaused;
+ private boolean mHasSurface;
+ private boolean mSurfaceIsBad;
+ private boolean mWaitingForSurface;
+ private boolean mHaveEglContext;
+ private boolean mHaveEglSurface;
+ private boolean mFinishedCreatingEglSurface;
+ private boolean mShouldReleaseEglContext;
+ private int mWidth;
+ private int mHeight;
+ private int mRenderMode;
+ private boolean mRequestRender;
+ private boolean mRenderComplete;
+ private ArrayList<Runnable> mEventQueue = new ArrayList<Runnable>();
+ private boolean mSizeChanged = true;
+
+ // End of member variables protected by the sGLThreadManager monitor.
+
+ private EglHelper mEglHelper;
+
+ /**
+ * Set once at thread construction time, nulled out when the parent view is garbage
+ * called. This weak reference allows the GLSurfaceView to be garbage collected while
+ * the GLThread is still alive.
+ */
+ private WeakReference<GLSurfaceView> mGLSurfaceViewWeakRef;
+
+ }
static class LogWriter extends Writer {
- @Override
- public void close() {
+
+ @Override public void close() {
flushBuilder();
}
- @Override
- public void flush() {
+ @Override public void flush() {
flushBuilder();
}
- @Override
- public void write(char[] buf, int offset, int count) {
- for (int i = 0; i < count; i++) {
+ @Override public void write(char[] buf, int offset, int count) {
+ for(int i = 0; i < count; i++) {
char c = buf[offset + i];
- if (c == '\n') {
+ if ( c == '\n') {
flushBuilder();
- } else {
+ }
+ else {
mBuilder.append(c);
}
}
@@ -1658,7 +1792,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
private void flushBuilder() {
if (mBuilder.length() > 0) {
- Log.v(TAG, mBuilder.toString());
+ Log.v("GLSurfaceView", mBuilder.toString());
mBuilder.delete(0, mBuilder.length());
}
}
@@ -1666,10 +1800,141 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
private StringBuilder mBuilder = new StringBuilder();
}
+
private void checkRenderThreadState() {
if (mGLThread != null) {
throw new IllegalStateException(
"setRenderer has already been called for this instance.");
}
}
+
+ private static class GLThreadManager {
+ private static String TAG = "GLThreadManager";
+
+ public synchronized void threadExiting(GLThread thread) {
+ if (LOG_THREADS) {
+ Log.i("GLThread", "exiting tid=" + thread.getId());
+ }
+ thread.mExited = true;
+ if (mEglOwner == thread) {
+ mEglOwner = null;
+ }
+ notifyAll();
+ }
+
+ /*
+ * Tries once to acquire the right to use an EGL
+ * context. Does not block. Requires that we are already
+ * in the sGLThreadManager monitor when this is called.
+ *
+ * @return true if the right to use an EGL context was acquired.
+ */
+ public boolean tryAcquireEglContextLocked(GLThread thread) {
+ if (mEglOwner == thread || mEglOwner == null) {
+ mEglOwner = thread;
+ notifyAll();
+ return true;
+ }
+ checkGLESVersion();
+ if (mMultipleGLESContextsAllowed) {
+ return true;
+ }
+ // Notify the owning thread that it should release the context.
+ // TODO: implement a fairness policy. Currently
+ // if the owning thread is drawing continuously it will just
+ // reacquire the EGL context.
+ if (mEglOwner != null) {
+ mEglOwner.requestReleaseEglContextLocked();
+ }
+ return false;
+ }
+
+ /*
+ * Releases the EGL context. Requires that we are already in the
+ * sGLThreadManager monitor when this is called.
+ */
+ public void releaseEglContextLocked(GLThread thread) {
+ if (mEglOwner == thread) {
+ mEglOwner = null;
+ }
+ notifyAll();
+ }
+
+ public synchronized boolean shouldReleaseEGLContextWhenPausing() {
+ // Release the EGL context when pausing even if
+ // the hardware supports multiple EGL contexts.
+ // Otherwise the device could run out of EGL contexts.
+ return mLimitedGLESContexts;
+ }
+
+ public synchronized boolean shouldTerminateEGLWhenPausing() {
+ checkGLESVersion();
+ return !mMultipleGLESContextsAllowed;
+ }
+
+ public synchronized void checkGLDriver(GL10 gl) {
+ if (! mGLESDriverCheckComplete) {
+ checkGLESVersion();
+ String renderer = gl.glGetString(GL10.GL_RENDERER);
+ if (mGLESVersion < kGLES_20) {
+ mMultipleGLESContextsAllowed =
+ ! renderer.startsWith(kMSM7K_RENDERER_PREFIX);
+ notifyAll();
+ }
+ mLimitedGLESContexts = !mMultipleGLESContextsAllowed;
+ if (LOG_SURFACE) {
+ Log.w(TAG, "checkGLDriver renderer = \"" + renderer + "\" multipleContextsAllowed = "
+ + mMultipleGLESContextsAllowed
+ + " mLimitedGLESContexts = " + mLimitedGLESContexts);
+ }
+ mGLESDriverCheckComplete = true;
+ }
+ }
+
+ private void checkGLESVersion() {
+ if (! mGLESVersionCheckComplete) {
+ mGLESVersion = SystemProperties.getInt(
+ "ro.opengles.version",
+ ConfigurationInfo.GL_ES_VERSION_UNDEFINED);
+ if (mGLESVersion >= kGLES_20) {
+ mMultipleGLESContextsAllowed = true;
+ }
+ if (LOG_SURFACE) {
+ Log.w(TAG, "checkGLESVersion mGLESVersion =" +
+ " " + mGLESVersion + " mMultipleGLESContextsAllowed = " + mMultipleGLESContextsAllowed);
+ }
+ mGLESVersionCheckComplete = true;
+ }
+ }
+
+ /**
+ * This check was required for some pre-Android-3.0 hardware. Android 3.0 provides
+ * support for hardware-accelerated views, therefore multiple EGL contexts are
+ * supported on all Android 3.0+ EGL drivers.
+ */
+ private boolean mGLESVersionCheckComplete;
+ private int mGLESVersion;
+ private boolean mGLESDriverCheckComplete;
+ private boolean mMultipleGLESContextsAllowed;
+ private boolean mLimitedGLESContexts;
+ private static final int kGLES_20 = 0x20000;
+ private static final String kMSM7K_RENDERER_PREFIX =
+ "Q3Dimension MSM7500 ";
+ private GLThread mEglOwner;
+ }
+
+ private static final GLThreadManager sGLThreadManager = new GLThreadManager();
+
+ private final WeakReference<GLSurfaceView> mThisWeakRef =
+ new WeakReference<GLSurfaceView>(this);
+ private GLThread mGLThread;
+ private Renderer mRenderer;
+ private boolean mDetached;
+ private EGLConfigChooser mEGLConfigChooser;
+ private EGLContextFactory mEGLContextFactory;
+ private EGLWindowSurfaceFactory mEGLWindowSurfaceFactory;
+ private GLWrapper mGLWrapper;
+ private int mDebugFlags;
+ private int mEGLContextClientVersion;
+ private boolean mPreserveEGLContextOnPause;
}
diff --git a/packages/SystemUI/ic_sysbar_internal.psd b/packages/SystemUI/ic_sysbar_internal.psd
new file mode 100644
index 000000000000..929c872775cc
--- /dev/null
+++ b/packages/SystemUI/ic_sysbar_internal.psd
Binary files differ
diff --git a/packages/SystemUI/src/com/android/systemui/settings/SettingsUI.java b/packages/SystemUI/src/com/android/systemui/settings/SettingsUI.java
index f65123aefa61..1075a73c79ad 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/SettingsUI.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/SettingsUI.java
@@ -25,6 +25,7 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
+import android.os.UserHandle;
import android.util.Slog;
import com.android.systemui.SystemUI;
@@ -66,7 +67,7 @@ public class SettingsUI extends SystemUI {
public void start() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SHOW_BRIGHTNESS_DIALOG);
- mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);
+ mContext.registerReceiverAsUser(mIntentReceiver, UserHandle.ALL, filter, null, mHandler);
}
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 5b911c12c179..683824b5e468 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -315,9 +315,9 @@ public abstract class BaseStatusBar extends SystemUI implements
protected View updateNotificationVetoButton(View row, StatusBarNotification n) {
View vetoButton = row.findViewById(R.id.veto);
if (n.isClearable()) {
- final String _pkg = n.pkg;
- final String _tag = n.tag;
- final int _id = n.id;
+ final String _pkg = n.getPackageName();
+ final String _tag = n.getTag();
+ final int _id = n.getId();
vetoButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Accessibility feedback
@@ -341,14 +341,14 @@ public abstract class BaseStatusBar extends SystemUI implements
protected void applyLegacyRowBackground(StatusBarNotification sbn, View content) {
- if (sbn.notification.contentView.getLayoutId() !=
+ if (sbn.getNotification().contentView.getLayoutId() !=
com.android.internal.R.layout.notification_template_base) {
int version = 0;
try {
- ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(sbn.pkg, 0);
+ ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(sbn.getPackageName(), 0);
version = info.targetSdkVersion;
} catch (NameNotFoundException ex) {
- Slog.e(TAG, "Failed looking up ApplicationInfo for " + sbn.pkg, ex);
+ Slog.e(TAG, "Failed looking up ApplicationInfo for " + sbn.getPackageName(), ex);
}
if (version > 0 && version < Build.VERSION_CODES.GINGERBREAD) {
content.setBackgroundResource(R.drawable.notification_row_legacy_bg);
@@ -729,8 +729,8 @@ public abstract class BaseStatusBar extends SystemUI implements
int maxHeight =
mContext.getResources().getDimensionPixelSize(R.dimen.notification_max_height);
StatusBarNotification sbn = entry.notification;
- RemoteViews oneU = sbn.notification.contentView;
- RemoteViews large = sbn.notification.bigContentView;
+ RemoteViews oneU = sbn.getNotification().contentView;
+ RemoteViews large = sbn.getNotification().bigContentView;
if (oneU == null) {
return false;
}
@@ -741,7 +741,7 @@ public abstract class BaseStatusBar extends SystemUI implements
View row = inflater.inflate(R.layout.status_bar_notification_row, parent, false);
// for blaming (see SwipeHelper.setLongPressListener)
- row.setTag(sbn.pkg);
+ row.setTag(sbn.getPackageName());
workAroundBadLayerDrawableOpacity(row);
View vetoButton = updateNotificationVetoButton(row, sbn);
@@ -756,10 +756,10 @@ public abstract class BaseStatusBar extends SystemUI implements
content.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
- PendingIntent contentIntent = sbn.notification.contentIntent;
+ PendingIntent contentIntent = sbn.getNotification().contentIntent;
if (contentIntent != null) {
final View.OnClickListener listener = new NotificationClicker(contentIntent,
- sbn.pkg, sbn.tag, sbn.id);
+ sbn.getPackageName(), sbn.getTag(), sbn.getId());
content.setOnClickListener(listener);
} else {
content.setOnClickListener(null);
@@ -775,7 +775,7 @@ public abstract class BaseStatusBar extends SystemUI implements
}
}
catch (RuntimeException e) {
- final String ident = sbn.pkg + "/0x" + Integer.toHexString(sbn.id);
+ final String ident = sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId());
Slog.e(TAG, "couldn't inflate view for notification " + ident, e);
return false;
}
@@ -904,7 +904,7 @@ public abstract class BaseStatusBar extends SystemUI implements
void handleNotificationError(IBinder key, StatusBarNotification n, String message) {
removeNotification(key);
try {
- mBarService.onNotificationError(n.pkg, n.tag, n.id, n.uid, n.initialPid, message);
+ mBarService.onNotificationError(n.getPackageName(), n.getTag(), n.getId(), n.getUid(), n.getInitialPid(), message);
} catch (RemoteException ex) {
// The end is nigh.
}
@@ -932,16 +932,16 @@ public abstract class BaseStatusBar extends SystemUI implements
}
// Construct the icon.
final StatusBarIconView iconView = new StatusBarIconView(mContext,
- notification.pkg + "/0x" + Integer.toHexString(notification.id),
- notification.notification);
+ notification.getPackageName() + "/0x" + Integer.toHexString(notification.getId()),
+ notification.getNotification());
iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
- final StatusBarIcon ic = new StatusBarIcon(notification.pkg,
- notification.user,
- notification.notification.icon,
- notification.notification.iconLevel,
- notification.notification.number,
- notification.notification.tickerText);
+ final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(),
+ notification.getUser(),
+ notification.getNotification().icon,
+ notification.getNotification().iconLevel,
+ notification.getNotification().number,
+ notification.getNotification().tickerText);
if (!iconView.set(ic)) {
handleNotificationError(key, notification, "Couldn't create icon: " + ic);
return null;
@@ -1026,19 +1026,19 @@ public abstract class BaseStatusBar extends SystemUI implements
final StatusBarNotification oldNotification = oldEntry.notification;
// XXX: modify when we do something more intelligent with the two content views
- final RemoteViews oldContentView = oldNotification.notification.contentView;
- final RemoteViews contentView = notification.notification.contentView;
- final RemoteViews oldBigContentView = oldNotification.notification.bigContentView;
- final RemoteViews bigContentView = notification.notification.bigContentView;
+ final RemoteViews oldContentView = oldNotification.getNotification().contentView;
+ final RemoteViews contentView = notification.getNotification().contentView;
+ final RemoteViews oldBigContentView = oldNotification.getNotification().bigContentView;
+ final RemoteViews bigContentView = notification.getNotification().bigContentView;
if (DEBUG) {
- Slog.d(TAG, "old notification: when=" + oldNotification.notification.when
+ Slog.d(TAG, "old notification: when=" + oldNotification.getNotification().when
+ " ongoing=" + oldNotification.isOngoing()
+ " expanded=" + oldEntry.expanded
+ " contentView=" + oldContentView
+ " bigContentView=" + oldBigContentView
+ " rowParent=" + oldEntry.row.getParent());
- Slog.d(TAG, "new notification: when=" + notification.notification.when
+ Slog.d(TAG, "new notification: when=" + notification.getNotification().when
+ " ongoing=" + oldNotification.isOngoing()
+ " contentView=" + contentView
+ " bigContentView=" + bigContentView);
@@ -1062,13 +1062,13 @@ public abstract class BaseStatusBar extends SystemUI implements
&& oldBigContentView.getPackage().equals(bigContentView.getPackage())
&& oldBigContentView.getLayoutId() == bigContentView.getLayoutId());
ViewGroup rowParent = (ViewGroup) oldEntry.row.getParent();
- boolean orderUnchanged = notification.notification.when==oldNotification.notification.when
- && notification.score == oldNotification.score;
+ boolean orderUnchanged = notification.getNotification().when== oldNotification.getNotification().when
+ && notification.getScore() == oldNotification.getScore();
// score now encompasses/supersedes isOngoing()
- boolean updateTicker = notification.notification.tickerText != null
- && !TextUtils.equals(notification.notification.tickerText,
- oldEntry.notification.notification.tickerText);
+ boolean updateTicker = notification.getNotification().tickerText != null
+ && !TextUtils.equals(notification.getNotification().tickerText,
+ oldEntry.notification.getNotification().tickerText);
boolean isTopAnyway = isTopNotification(rowParent, oldEntry);
if (contentsUnchanged && bigContentsUnchanged && (orderUnchanged || isTopAnyway)) {
if (DEBUG) Slog.d(TAG, "reusing notification for key: " + key);
@@ -1080,20 +1080,20 @@ public abstract class BaseStatusBar extends SystemUI implements
bigContentView.reapply(mContext, oldEntry.getLargeView(), mOnClickHandler);
}
// update the contentIntent
- final PendingIntent contentIntent = notification.notification.contentIntent;
+ final PendingIntent contentIntent = notification.getNotification().contentIntent;
if (contentIntent != null) {
final View.OnClickListener listener = makeClicker(contentIntent,
- notification.pkg, notification.tag, notification.id);
+ notification.getPackageName(), notification.getTag(), notification.getId());
oldEntry.content.setOnClickListener(listener);
} else {
oldEntry.content.setOnClickListener(null);
}
// Update the icon.
- final StatusBarIcon ic = new StatusBarIcon(notification.pkg,
- notification.user,
- notification.notification.icon, notification.notification.iconLevel,
- notification.notification.number,
- notification.notification.tickerText);
+ final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(),
+ notification.getUser(),
+ notification.getNotification().icon, notification.getNotification().iconLevel,
+ notification.getNotification().number,
+ notification.getNotification().tickerText);
if (!oldEntry.icon.set(ic)) {
handleNotificationError(key, notification, "Couldn't update icon: " + ic);
return;
@@ -1144,7 +1144,7 @@ public abstract class BaseStatusBar extends SystemUI implements
if (DEBUG) Slog.d(TAG, "updating the current intruder:" + notification);
// XXX: this is a hack for Alarms. The real implementation will need to *update*
// the intruder.
- if (notification.notification.fullScreenIntent == null) { // TODO(dsandler): consistent logic with add()
+ if (notification.getNotification().fullScreenIntent == null) { // TODO(dsandler): consistent logic with add()
if (DEBUG) Slog.d(TAG, "no longer intrudes!");
mHandler.sendEmptyMessage(MSG_HIDE_INTRUDER);
}
@@ -1155,9 +1155,9 @@ public abstract class BaseStatusBar extends SystemUI implements
// A: Almost none! Only things coming from the system (package is "android") that also
// have special "kind" tags marking them as relevant for setup (see below).
protected boolean showNotificationEvenIfUnprovisioned(StatusBarNotification sbn) {
- if ("android".equals(sbn.pkg)) {
- if (sbn.notification.kind != null) {
- for (String aKind : sbn.notification.kind) {
+ if ("android".equals(sbn.getPackageName())) {
+ if (sbn.getNotification().kind != null) {
+ for (String aKind : sbn.getNotification().kind) {
// IME switcher, created by InputMethodManagerService
if ("android.system.imeswitcher".equals(aKind)) return true;
// OTA availability & errors, created by SystemUpdateService
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
index 886ed772d9cd..2c7a2a89907a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
@@ -89,10 +89,10 @@ public class NotificationData {
public int compare(Entry a, Entry b) {
final StatusBarNotification na = a.notification;
final StatusBarNotification nb = b.notification;
- int d = na.score - nb.score;
+ int d = na.getScore() - nb.getScore();
return (d != 0)
? d
- : (int)(na.notification.when - nb.notification.when);
+ : (int)(na.getNotification().when - nb.getNotification().when);
}
};
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index d98f08efb91d..edb317226708 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -863,7 +863,7 @@ public class PhoneStatusBar extends BaseStatusBar {
}
public void addNotification(IBinder key, StatusBarNotification notification) {
- if (DEBUG) Slog.d(TAG, "addNotification score=" + notification.score);
+ if (DEBUG) Slog.d(TAG, "addNotification score=" + notification.getScore());
StatusBarIconView iconView = addNotificationViews(key, notification);
if (iconView == null) return;
@@ -912,7 +912,7 @@ public class PhoneStatusBar extends BaseStatusBar {
} else
*/
- if (notification.notification.fullScreenIntent != null) {
+ if (notification.getNotification().fullScreenIntent != null) {
// Stop screensaver if the notification has a full-screen intent.
// (like an incoming phone call)
awakenDreams();
@@ -920,7 +920,7 @@ public class PhoneStatusBar extends BaseStatusBar {
// not immersive & a full-screen alert should be shown
if (DEBUG) Slog.d(TAG, "Notification has fullScreenIntent; sending fullScreenIntent");
try {
- notification.notification.fullScreenIntent.send();
+ notification.getNotification().fullScreenIntent.send();
} catch (PendingIntent.CanceledException e) {
}
} else {
@@ -1053,7 +1053,7 @@ public class PhoneStatusBar extends BaseStatusBar {
// If the device hasn't been through Setup, we only show system notifications
for (int i=0; i<N; i++) {
Entry ent = mNotificationData.get(N-i-1);
- if (!((provisioned && ent.notification.score >= HIDE_ICONS_BELOW_SCORE)
+ if (!((provisioned && ent.notification.getScore() >= HIDE_ICONS_BELOW_SCORE)
|| showNotificationEvenIfUnprovisioned(ent.notification))) continue;
if (!notificationIsForCurrentUser(ent.notification)) continue;
toShow.add(ent.icon);
@@ -1961,7 +1961,7 @@ public class PhoneStatusBar extends BaseStatusBar {
// until status bar window is attached to the window manager,
// because... well, what's the point otherwise? And trying to
// run a ticker without being attached will crash!
- if (n.notification.tickerText != null && mStatusBarWindow.getWindowToken() != null) {
+ if (n.getNotification().tickerText != null && mStatusBarWindow.getWindowToken() != null) {
if (0 == (mDisabled & (StatusBarManager.DISABLE_NOTIFICATION_ICONS
| StatusBarManager.DISABLE_NOTIFICATION_TICKER))) {
mTicker.addEntry(n);
@@ -2066,9 +2066,9 @@ public class PhoneStatusBar extends BaseStatusBar {
NotificationData.Entry e = mNotificationData.get(i);
pw.println(" [" + i + "] key=" + e.key + " icon=" + e.icon);
StatusBarNotification n = e.notification;
- pw.println(" pkg=" + n.pkg + " id=" + n.id + " score=" + n.score);
- pw.println(" notification=" + n.notification);
- pw.println(" tickerText=\"" + n.notification.tickerText + "\"");
+ pw.println(" pkg=" + n.getPackageName() + " id=" + n.getId() + " score=" + n.getScore());
+ pw.println(" notification=" + n.getNotification());
+ pw.println(" tickerText=\"" + n.getNotification().tickerText + "\"");
}
}
@@ -2369,9 +2369,9 @@ public class PhoneStatusBar extends BaseStatusBar {
try {
mBarService.onNotificationClear(
- mCurrentlyIntrudingNotification.pkg,
- mCurrentlyIntrudingNotification.tag,
- mCurrentlyIntrudingNotification.id);
+ mCurrentlyIntrudingNotification.getPackageName(),
+ mCurrentlyIntrudingNotification.getTag(),
+ mCurrentlyIntrudingNotification.getId());
} catch (android.os.RemoteException ex) {
// oh well
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/Ticker.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/Ticker.java
index 976dd01c9c6c..f3f6a8007901 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/Ticker.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/Ticker.java
@@ -189,25 +189,25 @@ public abstract class Ticker {
// a notification storm).
if (initialCount > 0) {
final Segment seg = mSegments.get(0);
- if (n.pkg.equals(seg.notification.pkg)
- && n.notification.icon == seg.notification.notification.icon
- && n.notification.iconLevel == seg.notification.notification.iconLevel
- && CharSequences.equals(seg.notification.notification.tickerText,
- n.notification.tickerText)) {
+ if (n.getPackageName().equals(seg.notification.getPackageName())
+ && n.getNotification().icon == seg.notification.getNotification().icon
+ && n.getNotification().iconLevel == seg.notification.getNotification().iconLevel
+ && CharSequences.equals(seg.notification.getNotification().tickerText,
+ n.getNotification().tickerText)) {
return;
}
}
final Drawable icon = StatusBarIconView.getIcon(mContext,
- new StatusBarIcon(n.pkg, n.user, n.notification.icon, n.notification.iconLevel, 0,
- n.notification.tickerText));
- final CharSequence text = n.notification.tickerText;
+ new StatusBarIcon(n.getPackageName(), n.getUser(), n.getNotification().icon, n.getNotification().iconLevel, 0,
+ n.getNotification().tickerText));
+ final CharSequence text = n.getNotification().tickerText;
final Segment newSegment = new Segment(n, icon, text);
// If there's already a notification schedule for this package and id, remove it.
for (int i=0; i<mSegments.size(); i++) {
Segment seg = mSegments.get(i);
- if (n.id == seg.notification.id && n.pkg.equals(seg.notification.pkg)) {
+ if (n.getId() == seg.notification.getId() && n.getPackageName().equals(seg.notification.getPackageName())) {
// just update that one to use this new data instead
mSegments.remove(i--); // restart iteration here
}
@@ -235,7 +235,7 @@ public abstract class Ticker {
public void removeEntry(StatusBarNotification n) {
for (int i=mSegments.size()-1; i>=0; i--) {
Segment seg = mSegments.get(i);
- if (n.id == seg.notification.id && n.pkg.equals(seg.notification.pkg)) {
+ if (n.getId() == seg.notification.getId() && n.getPackageName().equals(seg.notification.getPackageName())) {
mSegments.remove(i);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
index 05bba897399f..bfa1b635f06b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
@@ -859,12 +859,12 @@ public class TabletStatusBar extends BaseStatusBar implements
final boolean immersive = isImmersive();
if (false && immersive) {
// TODO: immersive mode popups for tablet
- } else if (notification.notification.fullScreenIntent != null) {
+ } else if (notification.getNotification().fullScreenIntent != null) {
// not immersive & a full-screen alert should be shown
Slog.w(TAG, "Notification has fullScreenIntent and activity is not immersive;"
+ " sending fullScreenIntent");
try {
- notification.notification.fullScreenIntent.send();
+ notification.getNotification().fullScreenIntent.send();
} catch (PendingIntent.CanceledException e) {
}
} else {
@@ -971,14 +971,14 @@ public class TabletStatusBar extends BaseStatusBar implements
}
// If they asked for FLAG_ONLY_ALERT_ONCE, then only show this notification
// if it's a new notification.
- if (!firstTime && (n.notification.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0) {
+ if (!firstTime && (n.getNotification().flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0) {
return;
}
// Show the ticker if one is requested. Also don't do this
// until status bar window is attached to the window manager,
// because... well, what's the point otherwise? And trying to
// run a ticker without being attached will crash!
- if (hasTicker(n.notification) && mStatusBarView.getWindowToken() != null) {
+ if (hasTicker(n.getNotification()) && mStatusBarView.getWindowToken() != null) {
if (0 == (mDisabled & (StatusBarManager.DISABLE_NOTIFICATION_ICONS
| StatusBarManager.DISABLE_NOTIFICATION_TICKER))) {
mTicker.add(key, n);
@@ -1410,7 +1410,7 @@ public class TabletStatusBar extends BaseStatusBar implements
for (int i=0; toShow.size()< maxNotificationIconsCount; i++) {
if (i >= N) break;
Entry ent = mNotificationData.get(N-i-1);
- if ((provisioned && ent.notification.score >= HIDE_ICONS_BELOW_SCORE)
+ if ((provisioned && ent.notification.getScore() >= HIDE_ICONS_BELOW_SCORE)
|| showNotificationEvenIfUnprovisioned(ent.notification)) {
toShow.add(ent.icon);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java
index 725d9e6ab954..095c4410552d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java
@@ -249,7 +249,7 @@ public class TabletTicker
}
private View makeTickerView(StatusBarNotification notification) {
- final Notification n = notification.notification;
+ final Notification n = notification.getNotification();
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
@@ -274,8 +274,8 @@ public class TabletTicker
exception = e;
}
if (expanded == null) {
- final String ident = notification.pkg
- + "/0x" + Integer.toHexString(notification.id);
+ final String ident = notification.getPackageName()
+ + "/0x" + Integer.toHexString(notification.getId());
Slog.e(TAG, "couldn't inflate view for notification " + ident, exception);
return null;
}
@@ -286,7 +286,7 @@ public class TabletTicker
} else if (n.tickerText != null) {
group = (ViewGroup)inflater.inflate(R.layout.system_bar_ticker_compat, mWindow, false);
final Drawable icon = StatusBarIconView.getIcon(mContext,
- new StatusBarIcon(notification.pkg, notification.user, n.icon, n.iconLevel, 0,
+ new StatusBarIcon(notification.getPackageName(), notification.getUser(), n.icon, n.iconLevel, 0,
n.tickerText));
ImageView iv = (ImageView)group.findViewById(iconId);
iv.setImageDrawable(icon);
@@ -313,12 +313,12 @@ public class TabletTicker
}
if (CLICKABLE_TICKER) {
- PendingIntent contentIntent = notification.notification.contentIntent;
+ PendingIntent contentIntent = notification.getNotification().contentIntent;
if (contentIntent != null) {
// create the usual notification clicker, but chain it together with a halt() call
// to abort the ticker too
final View.OnClickListener clicker = mBar.makeClicker(contentIntent,
- notification.pkg, notification.tag, notification.id);
+ notification.getPackageName(), notification.getTag(), notification.getId());
group.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
halt();
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 7f3fc43ec5a3..0fb3244e26c5 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -18,6 +18,7 @@ package com.android.internal.policy.impl;
import android.app.ActivityManager;
import android.app.ActivityManagerNative;
import android.app.AppOpsManager;
+import android.app.IUiModeManager;
import android.app.ProgressDialog;
import android.app.SearchManager;
import android.app.UiModeManager;
@@ -31,6 +32,7 @@ import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -125,6 +127,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
static final boolean SHOW_STARTING_ANIMATIONS = true;
static final boolean SHOW_PROCESSES_ON_ALT_MENU = false;
+ // Whether to allow dock apps with METADATA_DOCK_HOME to temporarily take over the Home key.
+ // No longer recommended for desk docks; still useful in car docks.
+ static final boolean ENABLE_CAR_DOCK_HOME_CAPTURE = true;
+ static final boolean ENABLE_DESK_DOCK_HOME_CAPTURE = false;
+
static final int LONG_PRESS_POWER_NOTHING = 0;
static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1;
static final int LONG_PRESS_POWER_SHUT_OFF = 2;
@@ -247,6 +254,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
boolean mSystemReady;
boolean mSystemBooted;
boolean mHdmiPlugged;
+ int mUiMode;
int mDockMode = Intent.EXTRA_DOCK_STATE_UNDOCKED;
int mLidOpenRotation;
int mCarDockRotation;
@@ -832,6 +840,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mSettingsObserver.observe();
mShortcutManager = new ShortcutManager(context, mHandler);
mShortcutManager.observe();
+ mUiMode = context.getResources().getInteger(
+ com.android.internal.R.integer.config_defaultUiModeType);
mHomeIntent = new Intent(Intent.ACTION_MAIN, null);
mHomeIntent.addCategory(Intent.CATEGORY_HOME);
mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
@@ -3951,6 +3961,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (Intent.ACTION_DOCK_EVENT.equals(intent.getAction())) {
mDockMode = intent.getIntExtra(Intent.EXTRA_DOCK_STATE,
Intent.EXTRA_DOCK_STATE_UNDOCKED);
+ } else {
+ try {
+ IUiModeManager uiModeService = IUiModeManager.Stub.asInterface(
+ ServiceManager.getService(Context.UI_MODE_SERVICE));
+ mUiMode = uiModeService.getCurrentModeType();
+ } catch (RemoteException e) {
+ }
}
updateRotation(true);
synchronized (mLock) {
@@ -4587,9 +4604,70 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
+ /**
+ * Return an Intent to launch the currently active dock app as home. Returns
+ * null if the standard home should be launched, which is the case if any of the following is
+ * true:
+ * <ul>
+ * <li>The device is not in either car mode or desk mode
+ * <li>The device is in car mode but ENABLE_CAR_DOCK_HOME_CAPTURE is false
+ * <li>The device is in desk mode but ENABLE_DESK_DOCK_HOME_CAPTURE is false
+ * <li>The device is in car mode but there's no CAR_DOCK app with METADATA_DOCK_HOME
+ * <li>The device is in desk mode but there's no DESK_DOCK app with METADATA_DOCK_HOME
+ * </ul>
+ * @return
+ */
+ Intent createHomeDockIntent() {
+ Intent intent = null;
+
+ // What home does is based on the mode, not the dock state. That
+ // is, when in car mode you should be taken to car home regardless
+ // of whether we are actually in a car dock.
+ if (mUiMode == Configuration.UI_MODE_TYPE_CAR) {
+ if (ENABLE_CAR_DOCK_HOME_CAPTURE) {
+ intent = mCarDockIntent;
+ }
+ } else if (mUiMode == Configuration.UI_MODE_TYPE_DESK) {
+ if (ENABLE_DESK_DOCK_HOME_CAPTURE) {
+ intent = mDeskDockIntent;
+ }
+ }
+
+ if (intent == null) {
+ return null;
+ }
+
+ ActivityInfo ai = null;
+ ResolveInfo info = mContext.getPackageManager().resolveActivityAsUser(
+ intent,
+ PackageManager.MATCH_DEFAULT_ONLY,
+ UserHandle.USER_CURRENT);
+ if (info != null) {
+ ai = info.activityInfo;
+ }
+ if (ai != null
+ && ai.metaData != null
+ && ai.metaData.getBoolean(Intent.METADATA_DOCK_HOME)) {
+ intent = new Intent(intent);
+ intent.setClassName(ai.packageName, ai.name);
+ return intent;
+ }
+
+ return null;
+ }
+
void startDockOrHome() {
awakenDreams();
- // We don't have dock home anymore. Home is home. If you lived here, you'd be home by now.
+
+ Intent dock = createHomeDockIntent();
+ if (dock != null) {
+ try {
+ mContext.startActivityAsUser(dock, UserHandle.CURRENT);
+ return;
+ } catch (ActivityNotFoundException e) {
+ }
+ }
+
mContext.startActivityAsUser(mHomeIntent, UserHandle.CURRENT);
}
@@ -4616,6 +4694,18 @@ public class PhoneWindowManager implements WindowManagerPolicy {
} else {
ActivityManagerNative.getDefault().stopAppSwitches();
sendCloseSystemWindows();
+ Intent dock = createHomeDockIntent();
+ if (dock != null) {
+ int result = ActivityManagerNative.getDefault()
+ .startActivityAsUser(null, null, dock,
+ dock.resolveTypeIfNeeded(mContext.getContentResolver()),
+ null, null, 0,
+ ActivityManager.START_FLAG_ONLY_IF_NEEDED,
+ null, null, null, UserHandle.USER_CURRENT);
+ if (result == ActivityManager.START_RETURN_INTENT_TO_CALLER) {
+ return false;
+ }
+ }
}
int result = ActivityManagerNative.getDefault()
.startActivityAsUser(null, null, mHomeIntent,
@@ -4844,7 +4934,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
pw.print(prefix); pw.print("mLastFocusNeedsMenu=");
pw.println(mLastFocusNeedsMenu);
}
- pw.print(prefix); pw.print("mDockMode="); pw.print(mDockMode);
+ pw.print(prefix); pw.print("mUiMode="); pw.print(mUiMode);
+ pw.print(" mDockMode="); pw.print(mDockMode);
pw.print(" mCarDockRotation="); pw.print(mCarDockRotation);
pw.print(" mDeskDockRotation="); pw.println(mDeskDockRotation);
pw.print(prefix); pw.print("mUserRotationMode="); pw.print(mUserRotationMode);
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
index 7fcf1d5d4c68..fbeca4f6bd24 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
@@ -1589,7 +1589,13 @@ public class KeyguardHostView extends KeyguardViewBase {
@Override
public void cleanUp() {
-
+ // Make sure we let go of all widgets and their package contexts promptly. If we don't do
+ // this, and the associated application is uninstalled, it can cause a soft reboot.
+ int count = mAppWidgetContainer.getChildCount();
+ for (int i = 0; i < count; i++) {
+ KeyguardWidgetFrame frame = mAppWidgetContainer.getWidgetPageAt(i);
+ frame.removeAllViews();
+ }
}
/**
@@ -1609,8 +1615,6 @@ public class KeyguardHostView extends KeyguardViewBase {
return !configDisabled || isTestHarness || fileOverride;
}
-
-
public void goToUserSwitcher() {
mAppWidgetContainer.setCurrentPage(getWidgetPosition(R.id.keyguard_multi_user_selector));
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetPager.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetPager.java
index 1bcee4e6bd33..770fafcfa390 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetPager.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetPager.java
@@ -169,6 +169,7 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
KeyguardWidgetFrame newWidgetPage = getWidgetPageAt(newPageIndex);
if (newWidgetPage != null) {
newWidgetPage.onActive(true);
+ newWidgetPage.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
newWidgetPage.requestAccessibilityFocus();
}
if (mParent != null && AccessibilityManager.getInstance(mContext).isEnabled()) {
diff --git a/services/input/InputReader.cpp b/services/input/InputReader.cpp
index ab38ed20e315..3d6b6e783c2a 100644
--- a/services/input/InputReader.cpp
+++ b/services/input/InputReader.cpp
@@ -6110,15 +6110,42 @@ void JoystickInputMapper::populateDeviceInfo(InputDeviceInfo* info) {
for (size_t i = 0; i < mAxes.size(); i++) {
const Axis& axis = mAxes.valueAt(i);
- info->addMotionRange(axis.axisInfo.axis, AINPUT_SOURCE_JOYSTICK,
- axis.min, axis.max, axis.flat, axis.fuzz, axis.resolution);
+ addMotionRange(axis.axisInfo.axis, axis, info);
+
if (axis.axisInfo.mode == AxisInfo::MODE_SPLIT) {
- info->addMotionRange(axis.axisInfo.highAxis, AINPUT_SOURCE_JOYSTICK,
- axis.min, axis.max, axis.flat, axis.fuzz, axis.resolution);
+ addMotionRange(axis.axisInfo.highAxis, axis, info);
+
}
}
}
+void JoystickInputMapper::addMotionRange(int32_t axisId, const Axis& axis,
+ InputDeviceInfo* info) {
+ info->addMotionRange(axisId, AINPUT_SOURCE_JOYSTICK,
+ axis.min, axis.max, axis.flat, axis.fuzz, axis.resolution);
+ /* In order to ease the transition for developers from using the old axes
+ * to the newer, more semantically correct axes, we'll continue to register
+ * the old axes as duplicates of their corresponding new ones. */
+ int32_t compatAxis = getCompatAxis(axisId);
+ if (compatAxis >= 0) {
+ info->addMotionRange(compatAxis, AINPUT_SOURCE_JOYSTICK,
+ axis.min, axis.max, axis.flat, axis.fuzz, axis.resolution);
+ }
+}
+
+/* A mapping from axes the joystick actually has to the axes that should be
+ * artificially created for compatibility purposes.
+ * Returns -1 if no compatibility axis is needed. */
+int32_t JoystickInputMapper::getCompatAxis(int32_t axis) {
+ switch(axis) {
+ case AMOTION_EVENT_AXIS_LTRIGGER:
+ return AMOTION_EVENT_AXIS_BRAKE;
+ case AMOTION_EVENT_AXIS_RTRIGGER:
+ return AMOTION_EVENT_AXIS_GAS;
+ }
+ return -1;
+}
+
void JoystickInputMapper::dump(String8& dump) {
dump.append(INDENT2 "Joystick Input Mapper:\n");
@@ -6373,9 +6400,10 @@ void JoystickInputMapper::sync(nsecs_t when, bool force) {
size_t numAxes = mAxes.size();
for (size_t i = 0; i < numAxes; i++) {
const Axis& axis = mAxes.valueAt(i);
- pointerCoords.setAxisValue(axis.axisInfo.axis, axis.currentValue);
+ setPointerCoordsAxisValue(&pointerCoords, axis.axisInfo.axis, axis.currentValue);
if (axis.axisInfo.mode == AxisInfo::MODE_SPLIT) {
- pointerCoords.setAxisValue(axis.axisInfo.highAxis, axis.highCurrentValue);
+ setPointerCoordsAxisValue(&pointerCoords, axis.axisInfo.highAxis,
+ axis.highCurrentValue);
}
}
@@ -6391,6 +6419,19 @@ void JoystickInputMapper::sync(nsecs_t when, bool force) {
getListener()->notifyMotion(&args);
}
+void JoystickInputMapper::setPointerCoordsAxisValue(PointerCoords* pointerCoords,
+ int32_t axis, float value) {
+ pointerCoords->setAxisValue(axis, value);
+ /* In order to ease the transition for developers from using the old axes
+ * to the newer, more semantically correct axes, we'll continue to produce
+ * values for the old axes as mirrors of the value of their corresponding
+ * new axes. */
+ int32_t compatAxis = getCompatAxis(axis);
+ if (compatAxis >= 0) {
+ pointerCoords->setAxisValue(compatAxis, value);
+ }
+}
+
bool JoystickInputMapper::filterAxes(bool force) {
bool atLeastOneSignificantChange = force;
size_t numAxes = mAxes.size();
diff --git a/services/input/InputReader.h b/services/input/InputReader.h
index 312f19bc4ff3..ed2a5c10b052 100644
--- a/services/input/InputReader.h
+++ b/services/input/InputReader.h
@@ -1805,6 +1805,11 @@ private:
float newValue, float currentValue, float thresholdValue);
static bool isCenteredAxis(int32_t axis);
+ static int32_t getCompatAxis(int32_t axis);
+
+ static void addMotionRange(int32_t axisId, const Axis& axis, InputDeviceInfo* info);
+ static void setPointerCoordsAxisValue(PointerCoords* pointerCoords, int32_t axis,
+ float value);
};
} // namespace android
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index 01625dd1eb8a..3e19094bba71 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -432,6 +432,9 @@ public class ConnectivityService extends IConnectivityManager.Stub {
mRadioAttributes[r.mType] = r;
}
+ // TODO: What is the "correct" way to do determine if this is a wifi only device?
+ boolean wifiOnly = SystemProperties.getBoolean("ro.radio.noril", false);
+ log("wifiOnly=" + wifiOnly);
String[] naStrings = context.getResources().getStringArray(
com.android.internal.R.array.networkAttributes);
for (String naString : naStrings) {
@@ -442,6 +445,11 @@ public class ConnectivityService extends IConnectivityManager.Stub {
n.type);
continue;
}
+ if (wifiOnly && ConnectivityManager.isNetworkTypeMobile(n.type)) {
+ log("networkAttributes - ignoring mobile as this dev is wifiOnly " +
+ n.type);
+ continue;
+ }
if (mNetConfigs[n.type] != null) {
loge("Error in networkAttributes - ignoring attempt to redefine type " +
n.type);
@@ -544,7 +552,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
mTethering.getTetherableBluetoothRegexs().length != 0) &&
mTethering.getUpstreamIfaceTypes().length != 0);
- mVpn = new Vpn(mContext, mVpnCallback, mNetd);
+ mVpn = new Vpn(mContext, mVpnCallback, mNetd, this);
mVpn.startMonitoring(mContext, mTrackerHandler);
mClat = new Nat464Xlat(mContext, mNetd, this, mTrackerHandler);
@@ -3448,4 +3456,19 @@ public class ConnectivityService extends IConnectivityManager.Stub {
mNetTrackers[networkType].supplyMessenger(messenger);
}
}
+
+ public int findConnectionTypeForIface(String iface) {
+ enforceConnectivityInternalPermission();
+
+ if (TextUtils.isEmpty(iface)) return ConnectivityManager.TYPE_NONE;
+ for (NetworkStateTracker tracker : mNetTrackers) {
+ if (tracker != null) {
+ LinkProperties lp = tracker.getLinkProperties();
+ if (lp != null && iface.equals(lp.getInterfaceName())) {
+ return tracker.getNetworkInfo().getType();
+ }
+ }
+ }
+ return ConnectivityManager.TYPE_NONE;
+ }
}
diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java
index b47e8a041efc..26753094a978 100644
--- a/services/java/com/android/server/LocationManagerService.java
+++ b/services/java/com/android/server/LocationManagerService.java
@@ -380,7 +380,10 @@ public class LocationManagerService extends ILocationManager.Stub {
mContext,
LocationManager.NETWORK_PROVIDER,
NETWORK_LOCATION_SERVICE_ACTION,
- providerPackageNames, mLocationHandler);
+ com.android.internal.R.bool.config_enableNetworkLocationOverlay,
+ com.android.internal.R.string.config_networkLocationProviderPackageName,
+ com.android.internal.R.array.config_locationProviderPackageNames,
+ mLocationHandler);
if (networkProvider != null) {
mRealProviders.put(LocationManager.NETWORK_PROVIDER, networkProvider);
mProxyProviders.add(networkProvider);
@@ -394,7 +397,10 @@ public class LocationManagerService extends ILocationManager.Stub {
mContext,
LocationManager.FUSED_PROVIDER,
FUSED_LOCATION_SERVICE_ACTION,
- providerPackageNames, mLocationHandler);
+ com.android.internal.R.bool.config_enableFusedLocationOverlay,
+ com.android.internal.R.string.config_fusedLocationProviderPackageName,
+ com.android.internal.R.array.config_locationProviderPackageNames,
+ mLocationHandler);
if (fusedLocationProvider != null) {
addProviderLocked(fusedLocationProvider);
mProxyProviders.add(fusedLocationProvider);
@@ -406,15 +412,22 @@ public class LocationManagerService extends ILocationManager.Stub {
}
// bind to geocoder provider
- mGeocodeProvider = GeocoderProxy.createAndBind(mContext, providerPackageNames,
+ mGeocodeProvider = GeocoderProxy.createAndBind(mContext,
+ com.android.internal.R.bool.config_enableGeocoderOverlay,
+ com.android.internal.R.string.config_geocoderProviderPackageName,
+ com.android.internal.R.array.config_locationProviderPackageNames,
mLocationHandler);
if (mGeocodeProvider == null) {
Slog.e(TAG, "no geocoder provider found");
}
// bind to geofence provider
- GeofenceProxy provider = GeofenceProxy.createAndBind(mContext, providerPackageNames,
- mLocationHandler, gpsProvider.getGpsGeofenceProxy());
+ GeofenceProxy provider = GeofenceProxy.createAndBind(mContext,
+ com.android.internal.R.bool.config_enableGeofenceOverlay,
+ com.android.internal.R.string.config_geofenceProviderPackageName,
+ com.android.internal.R.array.config_locationProviderPackageNames,
+ mLocationHandler,
+ gpsProvider.getGpsGeofenceProxy());
if (provider == null) {
Slog.e(TAG, "no geofence provider found");
}
@@ -1290,14 +1303,14 @@ public class LocationManagerService extends ILocationManager.Stub {
if (name == null) {
throw new IllegalArgumentException("provider name must not be null");
}
+
+ if (D) Log.d(TAG, "request " + Integer.toHexString(System.identityHashCode(receiver))
+ + " " + name + " " + request + " from " + packageName + "(" + uid + ")");
LocationProviderInterface provider = mProvidersByName.get(name);
if (provider == null) {
throw new IllegalArgumentException("provider doesn't exisit: " + provider);
}
- if (D) Log.d(TAG, "request " + Integer.toHexString(System.identityHashCode(receiver))
- + " " + name + " " + request + " from " + packageName + "(" + uid + ")");
-
UpdateRecord record = new UpdateRecord(name, request, receiver);
UpdateRecord oldRecord = receiver.mUpdateRecords.put(name, record);
if (oldRecord != null) {
diff --git a/services/java/com/android/server/LockSettingsService.java b/services/java/com/android/server/LockSettingsService.java
index 41cc4d781a42..d52a8e2b3b9b 100644
--- a/services/java/com/android/server/LockSettingsService.java
+++ b/services/java/com/android/server/LockSettingsService.java
@@ -108,24 +108,31 @@ public class LockSettingsService extends ILockSettings.Stub {
final ContentResolver cr = mContext.getContentResolver();
List<UserInfo> users = um.getUsers();
for (int user = 0; user < users.size(); user++) {
- int userId = users.get(user).getUserHandle().getIdentifier();
- for (String perUserSetting : MIGRATE_SETTINGS_PER_USER) {
- // Handle Strings
- String value = Settings.Secure.getStringForUser(cr, perUserSetting, userId);
- if (value != null) {
- setString(perUserSetting, value, userId);
- Settings.Secure.putStringForUser(cr, perUserSetting, "", userId);
- continue;
- }
+ // Migrate owner info
+ final int userId = users.get(user).id;
+ final String OWNER_INFO = Secure.LOCK_SCREEN_OWNER_INFO;
+ String ownerInfo = Settings.Secure.getStringForUser(cr, OWNER_INFO, userId);
+ if (ownerInfo != null) {
+ setString(OWNER_INFO, ownerInfo, userId);
+ Settings.Secure.putStringForUser(cr, ownerInfo, "", userId);
+ }
- // Handle integers
- try {
- int ivalue = Settings.Secure.getIntForUser(cr, perUserSetting, userId);
- setLong(perUserSetting, ivalue, userId);
- Settings.Secure.putIntForUser(cr, perUserSetting, 0, userId);
- } catch (SettingNotFoundException e) {
+ // Migrate owner info enabled. Note there was a bug where older platforms only
+ // stored this value if the checkbox was toggled at least once. The code detects
+ // this case by handling the exception.
+ final String OWNER_INFO_ENABLED = Secure.LOCK_SCREEN_OWNER_INFO_ENABLED;
+ boolean enabled;
+ try {
+ int ivalue = Settings.Secure.getIntForUser(cr, OWNER_INFO_ENABLED, userId);
+ enabled = ivalue != 0;
+ setLong(OWNER_INFO_ENABLED, enabled ? 1 : 0, userId);
+ } catch (SettingNotFoundException e) {
+ // Setting was never stored. Store it if the string is not empty.
+ if (!TextUtils.isEmpty(ownerInfo)) {
+ setLong(OWNER_INFO_ENABLED, 1, userId);
}
}
+ Settings.Secure.putIntForUser(cr, OWNER_INFO_ENABLED, 0, userId);
}
// No need to move the password / pattern files. They're already in the right place.
setString("migrated_user_specific", "true", 0);
@@ -447,11 +454,9 @@ public class LockSettingsService extends ILockSettings.Stub {
Secure.LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED
};
- private static final String[] MIGRATE_SETTINGS_PER_USER = new String[] {
+ // These are protected with a read permission
+ private static final String[] READ_PROFILE_PROTECTED_SETTINGS = new String[] {
Secure.LOCK_SCREEN_OWNER_INFO_ENABLED,
Secure.LOCK_SCREEN_OWNER_INFO
};
-
- // These are protected with a read permission
- private static final String[] READ_PROFILE_PROTECTED_SETTINGS = MIGRATE_SETTINGS_PER_USER;
}
diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java
index 9a93f637e072..cc74b9202014 100644
--- a/services/java/com/android/server/NotificationManagerService.java
+++ b/services/java/com/android/server/NotificationManagerService.java
@@ -49,7 +49,6 @@ import android.media.IAudioService;
import android.media.IRingtonePlayer;
import android.net.Uri;
import android.os.Binder;
-import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
@@ -237,7 +236,7 @@ public class NotificationManagerService extends INotificationManager.Stub
try {
listener.onNotificationPosted(sbn);
} catch (RemoteException ex) {
- // not there?
+ Log.e(TAG, "unable to notify listener (posted): " + listener, ex);
}
}
@@ -246,7 +245,7 @@ public class NotificationManagerService extends INotificationManager.Stub
try {
listener.onNotificationRemoved(sbn);
} catch (RemoteException ex) {
- // not there?
+ Log.e(TAG, "unable to notify listener (removed): " + listener, ex);
}
}
@@ -285,14 +284,7 @@ public class NotificationManagerService extends INotificationManager.Stub
public void record(StatusBarNotification nr) {
// Nuke heavy parts of notification before storing in archive
- nr.notification.tickerView = null;
- nr.notification.contentView = null;
- nr.notification.bigContentView = null;
- nr.notification.largeIcon = null;
- final Bundle extras = nr.notification.extras;
- extras.remove(Notification.EXTRA_LARGE_ICON);
- extras.remove(Notification.EXTRA_LARGE_ICON_BIG);
- extras.remove(Notification.EXTRA_PICTURE);
+ nr.getNotification().lightenPayload();
if (mBuffer.size() == BUFFER_SIZE) {
mBuffer.removeFirst();
@@ -319,7 +311,7 @@ public class NotificationManagerService extends INotificationManager.Stub
private StatusBarNotification findNext() {
while (iter.hasNext()) {
StatusBarNotification nr = iter.next();
- if ((pkg == null || nr.pkg == pkg)
+ if ((pkg == null || nr.getPackageName() == pkg)
&& (userId == UserHandle.USER_ALL || nr.getUserId() == userId)) {
return nr;
}
@@ -746,7 +738,8 @@ public class NotificationManagerService extends INotificationManager.Stub
* asynchronously notify all listeners about a new notification
*/
private void notifyPostedLocked(NotificationRecord n) {
- final StatusBarNotification sbn = n.sbn;
+ // make a copy in case changes are made to the underlying Notification object
+ final StatusBarNotification sbn = n.sbn.clone();
for (final NotificationListenerInfo info : mListeners) {
mHandler.post(new Runnable() {
@Override
@@ -760,12 +753,15 @@ public class NotificationManagerService extends INotificationManager.Stub
* asynchronously notify all listeners about a removed notification
*/
private void notifyRemovedLocked(NotificationRecord n) {
- final StatusBarNotification sbn = n.sbn;
+ // make a copy in case changes are made to the underlying Notification object
+ // NOTE: this copy is lightweight: it doesn't include heavyweight parts of the notification
+ final StatusBarNotification sbn_light = n.sbn.cloneLight();
+
for (final NotificationListenerInfo info : mListeners) {
mHandler.post(new Runnable() {
@Override
public void run() {
- info.notifyRemovedIfUserMatch(sbn);
+ info.notifyRemovedIfUserMatch(sbn_light);
}});
}
}
@@ -789,7 +785,7 @@ public class NotificationManagerService extends INotificationManager.Stub
*
* @param token The binder for the listener, to check that the caller is allowed
*/
- public void clearAllNotificationsFromListener(INotificationListener token) {
+ public void cancelAllNotificationsFromListener(INotificationListener token) {
NotificationListenerInfo info = checkListenerToken(token);
long identity = Binder.clearCallingIdentity();
try {
@@ -806,7 +802,7 @@ public class NotificationManagerService extends INotificationManager.Stub
*
* @param token The binder for the listener, to check that the caller is allowed
*/
- public void clearNotificationFromListener(INotificationListener token, String pkg, String tag, int id) {
+ public void cancelNotificationFromListener(INotificationListener token, String pkg, String tag, int id) {
NotificationListenerInfo info = checkListenerToken(token);
long identity = Binder.clearCallingIdentity();
try {
@@ -819,6 +815,30 @@ public class NotificationManagerService extends INotificationManager.Stub
}
}
+ /**
+ * Allow an INotificationListener to request the list of outstanding notifications seen by
+ * the current user. Useful when starting up, after which point the listener callbacks should
+ * be used.
+ *
+ * @param token The binder for the listener, to check that the caller is allowed
+ */
+ public StatusBarNotification[] getActiveNotificationsFromListener(INotificationListener token) {
+ NotificationListenerInfo info = checkListenerToken(token);
+
+ StatusBarNotification[] result = new StatusBarNotification[0];
+ ArrayList<StatusBarNotification> list = new ArrayList<StatusBarNotification>();
+ synchronized (mNotificationList) {
+ final int N = mNotificationList.size();
+ for (int i=0; i<N; i++) {
+ StatusBarNotification sbn = mNotificationList.get(i).sbn;
+ if (info.enabledAndUserMatches(sbn)) {
+ list.add(sbn);
+ }
+ }
+ }
+ return list.toArray(result);
+ }
+
// -- end of listener APIs --
public static final class NotificationRecord
@@ -831,17 +851,17 @@ public class NotificationManagerService extends INotificationManager.Stub
this.sbn = sbn;
}
- public Notification getNotification() { return sbn.notification; }
- public int getFlags() { return sbn.notification.flags; }
+ public Notification getNotification() { return sbn.getNotification(); }
+ public int getFlags() { return sbn.getNotification().flags; }
public int getUserId() { return sbn.getUserId(); }
void dump(PrintWriter pw, String prefix, Context baseContext) {
- final Notification notification = sbn.notification;
+ final Notification notification = sbn.getNotification();
pw.println(prefix + this);
- pw.println(prefix + " uid=" + sbn.uid + " userId=" + sbn.getUserId());
+ pw.println(prefix + " uid=" + sbn.getUid() + " userId=" + sbn.getUserId());
pw.println(prefix + " icon=0x" + Integer.toHexString(notification.icon)
- + " / " + idDebugString(baseContext, sbn.pkg, notification.icon));
- pw.println(prefix + " pri=" + notification.priority + " score=" + sbn.score);
+ + " / " + idDebugString(baseContext, sbn.getPackageName(), notification.icon));
+ pw.println(prefix + " pri=" + notification.priority + " score=" + sbn.getScore());
pw.println(prefix + " contentIntent=" + notification.contentIntent);
pw.println(prefix + " deleteIntent=" + notification.deleteIntent);
pw.println(prefix + " tickerText=" + notification.tickerText);
@@ -900,8 +920,8 @@ public class NotificationManagerService extends INotificationManager.Stub
return String.format(
"NotificationRecord(0x%08x: pkg=%s user=%s id=%d tag=%s score=%d: %s)",
System.identityHashCode(this),
- this.sbn.pkg, this.sbn.user, this.sbn.id, this.sbn.tag,
- this.sbn.score, this.sbn.notification);
+ this.sbn.getPackageName(), this.sbn.getUser(), this.sbn.getId(), this.sbn.getTag(),
+ this.sbn.getScore(), this.sbn.getNotification());
}
}
@@ -1520,7 +1540,7 @@ public class NotificationManagerService extends INotificationManager.Stub
final int N = mNotificationList.size();
for (int i=0; i<N; i++) {
final NotificationRecord r = mNotificationList.get(i);
- if (r.sbn.pkg.equals(pkg) && r.sbn.getUserId() == userId) {
+ if (r.sbn.getPackageName().equals(pkg) && r.sbn.getUserId() == userId) {
count++;
if (count >= MAX_PACKAGE_NOTIFICATIONS) {
Slog.e(TAG, "Package has already posted " + count
@@ -1637,7 +1657,7 @@ public class NotificationManagerService extends INotificationManager.Stub
long identity = Binder.clearCallingIdentity();
try {
r.statusBarKey = mStatusBar.addNotification(n);
- if ((n.notification.flags & Notification.FLAG_SHOW_LIGHTS) != 0
+ if ((n.getNotification().flags & Notification.FLAG_SHOW_LIGHTS) != 0
&& canInterrupt) {
mAttentionLight.pulse();
}
@@ -1753,7 +1773,7 @@ public class NotificationManagerService extends INotificationManager.Stub
// does not have the VIBRATE permission.
long identity = Binder.clearCallingIdentity();
try {
- mVibrator.vibrate(r.sbn.uid, r.sbn.basePkg,
+ mVibrator.vibrate(r.sbn.getUid(), r.sbn.getBasePkg(),
useDefaultVibrate ? mDefaultVibrationPattern
: mFallbackVibrationPattern,
((notification.flags & Notification.FLAG_INSISTENT) != 0) ? 0: -1);
@@ -1762,7 +1782,7 @@ public class NotificationManagerService extends INotificationManager.Stub
}
} else if (notification.vibrate.length > 1) {
// If you want your own vibration pattern, you need the VIBRATE permission
- mVibrator.vibrate(r.sbn.uid, r.sbn.basePkg, notification.vibrate,
+ mVibrator.vibrate(r.sbn.getUid(), r.sbn.getBasePkg(), notification.vibrate,
((notification.flags & Notification.FLAG_INSISTENT) != 0) ? 0: -1);
}
}
@@ -1819,7 +1839,7 @@ public class NotificationManagerService extends INotificationManager.Stub
} catch (PendingIntent.CanceledException ex) {
// do nothing - there's no relevant way to recover, and
// no reason to let this propagate
- Slog.w(TAG, "canceled PendingIntent for " + r.sbn.pkg, ex);
+ Slog.w(TAG, "canceled PendingIntent for " + r.sbn.getPackageName(), ex);
}
}
}
@@ -1944,7 +1964,7 @@ public class NotificationManagerService extends INotificationManager.Stub
if ((r.getFlags() & mustNotHaveFlags) != 0) {
continue;
}
- if (pkg != null && !r.sbn.pkg.equals(pkg)) {
+ if (pkg != null && !r.sbn.getPackageName().equals(pkg)) {
continue;
}
canceledSomething = true;
@@ -2044,7 +2064,7 @@ public class NotificationManagerService extends INotificationManager.Stub
if (mLedNotification == null || mInCall || mScreenOn) {
mNotificationLight.turnOff();
} else {
- final Notification ledno = mLedNotification.sbn.notification;
+ final Notification ledno = mLedNotification.sbn.getNotification();
int ledARGB = ledno.ledARGB;
int ledOnMS = ledno.ledOnMS;
int ledOffMS = ledno.ledOffMS;
@@ -2068,19 +2088,19 @@ public class NotificationManagerService extends INotificationManager.Stub
final int len = list.size();
for (int i=0; i<len; i++) {
NotificationRecord r = list.get(i);
- if (!notificationMatchesUserId(r, userId) || r.sbn.id != id) {
+ if (!notificationMatchesUserId(r, userId) || r.sbn.getId() != id) {
continue;
}
if (tag == null) {
- if (r.sbn.tag != null) {
+ if (r.sbn.getTag() != null) {
continue;
}
} else {
- if (!tag.equals(r.sbn.tag)) {
+ if (!tag.equals(r.sbn.getTag())) {
continue;
}
}
- if (r.sbn.pkg.equals(pkg)) {
+ if (r.sbn.getPackageName().equals(pkg)) {
return i;
}
}
diff --git a/services/java/com/android/server/ServiceWatcher.java b/services/java/com/android/server/ServiceWatcher.java
index 6078d8ad4530..5c7bfab7ec20 100644
--- a/services/java/com/android/server/ServiceWatcher.java
+++ b/services/java/com/android/server/ServiceWatcher.java
@@ -27,6 +27,7 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.content.pm.Signature;
+import android.content.res.Resources;
import android.os.Handler;
import android.os.IBinder;
import android.os.UserHandle;
@@ -36,6 +37,7 @@ import com.android.internal.content.PackageMonitor;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashSet;
import java.util.List;
@@ -53,6 +55,13 @@ public class ServiceWatcher implements ServiceConnection {
private final PackageManager mPm;
private final List<HashSet<Signature>> mSignatureSets;
private final String mAction;
+
+ /**
+ * If mServicePackageName is not null, only this package will be searched for the service that
+ * implements mAction. When null, all packages in the system that matches one of the signature
+ * in mSignatureSets are searched.
+ */
+ private final String mServicePackageName;
private final Runnable mNewServiceWork;
private final Handler mHandler;
@@ -87,19 +96,40 @@ public class ServiceWatcher implements ServiceConnection {
}
public ServiceWatcher(Context context, String logTag, String action,
- List<String> initialPackageNames, Runnable newServiceWork, Handler handler) {
+ int overlaySwitchResId, int defaultServicePackageNameResId,
+ int initialPackageNamesResId, Runnable newServiceWork,
+ Handler handler) {
mContext = context;
mTag = logTag;
mAction = action;
mPm = mContext.getPackageManager();
mNewServiceWork = newServiceWork;
mHandler = handler;
+ Resources resources = context.getResources();
+
+ // Whether to enable service overlay.
+ boolean enableOverlay = resources.getBoolean(overlaySwitchResId);
+ ArrayList<String> initialPackageNames = new ArrayList<String>();
+ if (enableOverlay) {
+ // A list of package names used to create the signatures.
+ String[] pkgs = resources.getStringArray(initialPackageNamesResId);
+ if (pkgs != null) initialPackageNames.addAll(Arrays.asList(pkgs));
+ mServicePackageName = null;
+ if (D) Log.d(mTag, "Overlay enabled, packages=" + Arrays.toString(pkgs));
+ } else {
+ // The default package name that is searched for service implementation when overlay is
+ // disabled.
+ String servicePackageName = resources.getString(defaultServicePackageNameResId);
+ if (servicePackageName != null) initialPackageNames.add(servicePackageName);
+ mServicePackageName = servicePackageName;
+ if (D) Log.d(mTag, "Overlay disabled, default package=" + servicePackageName);
+ }
mSignatureSets = getSignatureSets(context, initialPackageNames);
}
public boolean start() {
synchronized (mLock) {
- if (!bindBestPackageLocked(null)) return false;
+ if (!bindBestPackageLocked(mServicePackageName)) return false;
}
// listen for user change
@@ -115,8 +145,10 @@ public class ServiceWatcher implements ServiceConnection {
}
}, UserHandle.ALL, intentFilter, null, mHandler);
- // listen for relevant package changes
- mPackageMonitor.register(mContext, null, UserHandle.ALL, true);
+ // listen for relevant package changes if service overlay is enabled.
+ if (mServicePackageName == null) {
+ mPackageMonitor.register(mContext, null, UserHandle.ALL, true);
+ }
return true;
}
@@ -133,50 +165,55 @@ public class ServiceWatcher implements ServiceConnection {
if (justCheckThisPackage != null) {
intent.setPackage(justCheckThisPackage);
}
- List<ResolveInfo> rInfos = mPm.queryIntentServicesAsUser(new Intent(mAction),
+ List<ResolveInfo> rInfos = mPm.queryIntentServicesAsUser(intent,
PackageManager.GET_META_DATA, UserHandle.USER_OWNER);
int bestVersion = Integer.MIN_VALUE;
String bestPackage = null;
boolean bestIsMultiuser = false;
- for (ResolveInfo rInfo : rInfos) {
- String packageName = rInfo.serviceInfo.packageName;
-
- // check signature
- try {
- PackageInfo pInfo;
- pInfo = mPm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
- if (!isSignatureMatch(pInfo.signatures)) {
- Log.w(mTag, packageName + " resolves service " + mAction +
- ", but has wrong signature, ignoring");
+ if (rInfos != null) {
+ for (ResolveInfo rInfo : rInfos) {
+ String packageName = rInfo.serviceInfo.packageName;
+
+ // check signature
+ try {
+ PackageInfo pInfo;
+ pInfo = mPm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
+ if (!isSignatureMatch(pInfo.signatures)) {
+ Log.w(mTag, packageName + " resolves service " + mAction
+ + ", but has wrong signature, ignoring");
+ continue;
+ }
+ } catch (NameNotFoundException e) {
+ Log.wtf(mTag, e);
continue;
}
- } catch (NameNotFoundException e) {
- Log.wtf(mTag, e);
- continue;
- }
- // check metadata
- int version = Integer.MIN_VALUE;
- boolean isMultiuser = false;
- if (rInfo.serviceInfo.metaData != null) {
- version = rInfo.serviceInfo.metaData.getInt(EXTRA_SERVICE_VERSION,
- Integer.MIN_VALUE);
- isMultiuser = rInfo.serviceInfo.metaData.getBoolean(EXTRA_SERVICE_IS_MULTIUSER);
+ // check metadata
+ int version = Integer.MIN_VALUE;
+ boolean isMultiuser = false;
+ if (rInfo.serviceInfo.metaData != null) {
+ version = rInfo.serviceInfo.metaData.getInt(
+ EXTRA_SERVICE_VERSION, Integer.MIN_VALUE);
+ isMultiuser = rInfo.serviceInfo.metaData.getBoolean(EXTRA_SERVICE_IS_MULTIUSER);
+ }
+
+ if (version > mVersion) {
+ bestVersion = version;
+ bestPackage = packageName;
+ bestIsMultiuser = isMultiuser;
+ }
}
- if (version > mVersion) {
- bestVersion = version;
- bestPackage = packageName;
- bestIsMultiuser = isMultiuser;
+ if (D) {
+ Log.d(mTag, String.format("bindBestPackage for %s : %s found %d, %s", mAction,
+ (justCheckThisPackage == null ? ""
+ : "(" + justCheckThisPackage + ") "), rInfos.size(),
+ (bestPackage == null ? "no new best package"
+ : "new best package: " + bestPackage)));
}
+ } else {
+ if (D) Log.d(mTag, "Unable to query intent services for action: " + mAction);
}
-
- if (D) Log.d(mTag, String.format("bindBestPackage for %s : %s found %d, %s", mAction,
- (justCheckThisPackage == null ? "" : "(" + justCheckThisPackage + ") "),
- rInfos.size(),
- (bestPackage == null ? "no new best package" : "new best package: "
- + bestPackage)));
-
if (bestPackage != null) {
bindToPackageLocked(bestPackage, bestVersion, bestIsMultiuser);
return true;
@@ -243,8 +280,9 @@ public class ServiceWatcher implements ServiceConnection {
// package updated, make sure to rebind
unbindLocked();
}
- // check the updated package in case it is better
- bindBestPackageLocked(packageName);
+ // Need to check all packages because this method is also called when a
+ // system app is uninstalled and the stock version in reinstalled.
+ bindBestPackageLocked(null);
}
}
@@ -256,7 +294,7 @@ public class ServiceWatcher implements ServiceConnection {
unbindLocked();
}
// check the new package is case it is better
- bindBestPackageLocked(packageName);
+ bindBestPackageLocked(null);
}
}
@@ -271,6 +309,20 @@ public class ServiceWatcher implements ServiceConnection {
}
}
}
+
+ @Override
+ public boolean onPackageChanged(String packageName, int uid, String[] components) {
+ synchronized (mLock) {
+ if (packageName.equals(mPackageName)) {
+ // service enabled or disabled, make sure to rebind
+ unbindLocked();
+ }
+ // the service might be disabled, need to search for a new
+ // package
+ bindBestPackageLocked(null);
+ }
+ return super.onPackageChanged(packageName, uid, components);
+ }
};
@Override
@@ -323,7 +375,7 @@ public class ServiceWatcher implements ServiceConnection {
synchronized (mLock) {
if (!mIsMultiuser) {
unbindLocked();
- bindBestPackageLocked(null);
+ bindBestPackageLocked(mServicePackageName);
}
}
}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index a30fc3b323f8..681c21da57f1 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -26,6 +26,7 @@ import android.content.pm.IPackageManager;
import android.content.res.Configuration;
import android.media.AudioService;
import android.net.wifi.p2p.WifiP2pService;
+import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
@@ -1055,6 +1056,8 @@ public class SystemServer {
// as efficient as possible with its memory usage.
VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
+ Environment.setUserRequired(true);
+
System.loadLibrary("android_servers");
init1(args);
}
diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
index 2f64908e0506..3fd534e5ce3a 100644
--- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -542,7 +542,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
return -1;
}
- public void registerUiTestAutomationService(IBinder owner, IAccessibilityServiceClient serviceClient,
+ public void registerUiTestAutomationService(IBinder owner,
+ IAccessibilityServiceClient serviceClient,
AccessibilityServiceInfo accessibilityServiceInfo) {
mSecurityPolicy.enforceCallingPermission(Manifest.permission.RETRIEVE_WINDOW_CONTENT,
FUNCTION_REGISTER_UI_TEST_AUTOMATION_SERVICE);
@@ -1260,6 +1261,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
}
private void onUserStateChangedLocked(UserState userState) {
+ updateLegacyCapabilities(userState);
updateServicesLocked(userState);
updateTouchExplorationLocked(userState);
updateEnhancedWebAccessibilityLocked(userState);
@@ -1267,6 +1269,28 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
scheduleUpdateClientsIfNeededLocked(userState);
}
+ private void updateLegacyCapabilities(UserState userState) {
+ // Up to JB-MR1 we had a white list with services that can enable touch
+ // exploration. When a service is first started we show a dialog to the
+ // use to get a permission to white list the service.
+ final int installedServiceCount = userState.mInstalledServices.size();
+ for (int i = 0; i < installedServiceCount; i++) {
+ AccessibilityServiceInfo serviceInfo = userState.mInstalledServices.get(i);
+ ResolveInfo resolveInfo = serviceInfo.getResolveInfo();
+ if ((serviceInfo.getCapabilities()
+ & AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION) == 0
+ && resolveInfo.serviceInfo.applicationInfo.targetSdkVersion
+ <= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+ ComponentName componentName = new ComponentName(
+ resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name);
+ if (userState.mTouchExplorationGrantedServices.contains(componentName)) {
+ serviceInfo.setCapabilities(serviceInfo.getCapabilities()
+ | AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION);
+ }
+ }
+ }
+ }
+
private void updateServicesLocked(UserState userState) {
if (userState.mIsAccessibilityEnabled) {
manageServicesLocked(userState);
@@ -1657,8 +1681,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
Intent mIntent;
- boolean mCanRetrieveScreenContent;
-
boolean mIsAutomation;
final Rect mTempBounds = new Rect();
@@ -1694,15 +1716,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
mAccessibilityServiceInfo = accessibilityServiceInfo;
mIsAutomation = (sFakeAccessibilityServiceComponentName.equals(componentName));
if (!mIsAutomation) {
- mCanRetrieveScreenContent = (accessibilityServiceInfo.getCapabilities()
- & AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION) != 0;
mIntent = new Intent().setComponent(mComponentName);
mIntent.putExtra(Intent.EXTRA_CLIENT_LABEL,
com.android.internal.R.string.accessibility_binding_label);
mIntent.putExtra(Intent.EXTRA_CLIENT_INTENT, PendingIntent.getActivity(
mContext, 0, new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS), 0));
- } else {
- mCanRetrieveScreenContent = true;
}
setDynamicallyConfigurableProperties(accessibilityServiceInfo);
}
@@ -1732,14 +1750,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
mFetchFlags &= ~AccessibilityNodeInfo.FLAG_REPORT_VIEW_IDS;
}
- if (mResolveInfo != null) {
- mRequestTouchExplorationMode = (info.flags
- & AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE) != 0;
- mRequestEnhancedWebAccessibility = (info.flags
- & AccessibilityServiceInfo.FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY) != 0;
- mRequestFilterKeyEvents = (info.flags
- & AccessibilityServiceInfo.FLAG_REQUEST_FILTER_KEY_EVENTS) != 0;
- }
+ mRequestTouchExplorationMode = (info.flags
+ & AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE) != 0;
+ mRequestEnhancedWebAccessibility = (info.flags
+ & AccessibilityServiceInfo.FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY) != 0;
+ mRequestFilterKeyEvents = (info.flags
+ & AccessibilityServiceInfo.FLAG_REQUEST_FILTER_KEY_EVENTS) != 0;
}
/**
@@ -2153,7 +2169,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
.loadLabel(mContext.getPackageManager()));
pw.append(", feedbackType"
+ AccessibilityServiceInfo.feedbackTypeToString(mFeedbackType));
- pw.append(", canRetrieveScreenContent=" + mCanRetrieveScreenContent);
+ pw.append(", capabilities=" + mAccessibilityServiceInfo.getCapabilities());
pw.append(", eventTypes="
+ AccessibilityEvent.eventTypeToString(mEventTypes));
pw.append(", notificationTimeout=" + mNotificationTimeout);
@@ -2743,7 +2759,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
}
public boolean canRetrieveWindowContent(Service service) {
- return service.mCanRetrieveScreenContent;
+ return (service.mAccessibilityServiceInfo.getCapabilities()
+ & AccessibilityServiceInfo.CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT) != 0;
}
public void enforceCanRetrieveWindowContent(Service service) throws RemoteException {
diff --git a/services/java/com/android/server/accounts/AccountManagerService.java b/services/java/com/android/server/accounts/AccountManagerService.java
index fd7cd784aa9b..241b224807fb 100644
--- a/services/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/java/com/android/server/accounts/AccountManagerService.java
@@ -30,6 +30,7 @@ import android.accounts.IAccountManager;
import android.accounts.IAccountManagerResponse;
import android.app.ActivityManager;
import android.app.ActivityManagerNative;
+import android.app.AppGlobals;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
@@ -1874,6 +1875,20 @@ public class AccountManagerService
return getAccountsAsUser(null, UserHandle.getCallingUserId(), packageName, uid);
}
+ @Override
+ public Account[] getAccountsByTypeForPackage(String type, String packageName) {
+ checkBinderPermission(android.Manifest.permission.INTERACT_ACROSS_USERS);
+ int packageUid = -1;
+ try {
+ packageUid = AppGlobals.getPackageManager().getPackageUid(
+ packageName, UserHandle.getCallingUserId());
+ } catch (RemoteException re) {
+ Slog.e(TAG, "Couldn't determine the packageUid for " + packageName + re);
+ return new Account[0];
+ }
+ return getAccountsAsUser(type, UserHandle.getCallingUserId(), packageName, packageUid);
+ }
+
public void getAccountsByFeatures(IAccountManagerResponse response,
String type, String[] features) {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
diff --git a/services/java/com/android/server/am/NativeCrashListener.java b/services/java/com/android/server/am/NativeCrashListener.java
index de439d71329e..a9454bd4a4be 100644
--- a/services/java/com/android/server/am/NativeCrashListener.java
+++ b/services/java/com/android/server/am/NativeCrashListener.java
@@ -219,6 +219,14 @@ class NativeCrashListener extends Thread {
pr = mAm.mPidsSelfLocked.get(pid);
}
if (pr != null) {
+ // Don't attempt crash reporting for persistent apps
+ if (pr.persistent) {
+ if (DEBUG) {
+ Slog.v(TAG, "Skipping report for persistent app " + pr);
+ }
+ return;
+ }
+
int bytes;
do {
// get some data
diff --git a/services/java/com/android/server/connectivity/Vpn.java b/services/java/com/android/server/connectivity/Vpn.java
index 533db46c371b..10c7e2776921 100644
--- a/services/java/com/android/server/connectivity/Vpn.java
+++ b/services/java/com/android/server/connectivity/Vpn.java
@@ -21,9 +21,11 @@ import static android.Manifest.permission.BIND_VPN_SERVICE;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -33,6 +35,7 @@ import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.net.BaseNetworkStateTracker;
import android.net.ConnectivityManager;
+import android.net.IConnectivityManager;
import android.net.INetworkManagementEventObserver;
import android.net.LinkProperties;
import android.net.LocalSocket;
@@ -71,6 +74,7 @@ import java.net.Inet4Address;
import java.net.InetAddress;
import java.nio.charset.Charsets;
import java.util.Arrays;
+import java.util.concurrent.atomic.AtomicInteger;
import libcore.io.IoUtils;
@@ -92,12 +96,15 @@ public class Vpn extends BaseNetworkStateTracker {
private LegacyVpnRunner mLegacyVpnRunner;
private PendingIntent mStatusIntent;
private boolean mEnableNotif = true;
+ private final IConnectivityManager mConnService;
- public Vpn(Context context, VpnCallback callback, INetworkManagementService netService) {
+ public Vpn(Context context, VpnCallback callback, INetworkManagementService netService,
+ IConnectivityManager connService) {
// TODO: create dedicated TYPE_VPN network type
super(ConnectivityManager.TYPE_DUMMY);
mContext = context;
mCallback = callback;
+ mConnService = connService;
try {
netService.registerObserver(mObserver);
@@ -562,7 +569,6 @@ public class Vpn extends BaseNetworkStateTracker {
if (!profile.searchDomains.isEmpty()) {
config.searchDomains = Arrays.asList(profile.searchDomains.split(" +"));
}
-
startLegacyVpn(config, racoon, mtpd);
}
@@ -630,9 +636,32 @@ public class Vpn extends BaseNetworkStateTracker {
private final String[][] mArguments;
private final LocalSocket[] mSockets;
private final String mOuterInterface;
+ private final AtomicInteger mOuterConnection =
+ new AtomicInteger(ConnectivityManager.TYPE_NONE);
private long mTimer = -1;
+ /**
+ * Watch for the outer connection (passing in the constructor) going away.
+ */
+ private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
+ if (intent.getIntExtra(ConnectivityManager.EXTRA_NETWORK_TYPE,
+ ConnectivityManager.TYPE_NONE) == mOuterConnection.get()) {
+ NetworkInfo info = (NetworkInfo)intent.getExtra(
+ ConnectivityManager.EXTRA_NETWORK_INFO);
+ if (info != null && !info.isConnectedOrConnecting()) {
+ try {
+ mObserver.interfaceStatusChanged(mOuterInterface, false);
+ } catch (RemoteException e) {}
+ }
+ }
+ }
+ }
+ };
+
public LegacyVpnRunner(VpnConfig config, String[] racoon, String[] mtpd) {
super(TAG);
mConfig = config;
@@ -644,7 +673,22 @@ public class Vpn extends BaseNetworkStateTracker {
// This is the interface which VPN is running on,
// mConfig.interfaze will change to point to OUR
// internal interface soon. TODO - add inner/outer to mconfig
+ // TODO - we have a race - if the outer iface goes away/disconnects before we hit this
+ // we will leave the VPN up. We should check that it's still there/connected after
+ // registering
mOuterInterface = mConfig.interfaze;
+
+ try {
+ mOuterConnection.set(
+ mConnService.findConnectionTypeForIface(mOuterInterface));
+ } catch (Exception e) {
+ mOuterConnection.set(ConnectivityManager.TYPE_NONE);
+ }
+
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
+ mContext.registerReceiver(mBroadcastReceiver, filter);
+
}
public void check(String interfaze) {
@@ -661,6 +705,9 @@ public class Vpn extends BaseNetworkStateTracker {
IoUtils.closeQuietly(socket);
}
updateState(DetailedState.DISCONNECTED, "exit");
+ try {
+ mContext.unregisterReceiver(mBroadcastReceiver);
+ } catch (IllegalArgumentException e) {}
}
@Override
diff --git a/services/java/com/android/server/firewall/IntentFirewall.java b/services/java/com/android/server/firewall/IntentFirewall.java
index edba2431c251..4496aae7b6e4 100644
--- a/services/java/com/android/server/firewall/IntentFirewall.java
+++ b/services/java/com/android/server/firewall/IntentFirewall.java
@@ -107,6 +107,7 @@ public class IntentFirewall {
public IntentFirewall(AMSInterface ams) {
mAms = ams;
File rulesFile = getRulesFile();
+ rulesFile.getParentFile().mkdirs();
readRules(rulesFile);
diff --git a/services/java/com/android/server/location/GeocoderProxy.java b/services/java/com/android/server/location/GeocoderProxy.java
index 810369572d8d..5d4a7701fbfb 100644
--- a/services/java/com/android/server/location/GeocoderProxy.java
+++ b/services/java/com/android/server/location/GeocoderProxy.java
@@ -40,8 +40,10 @@ public class GeocoderProxy {
private final ServiceWatcher mServiceWatcher;
public static GeocoderProxy createAndBind(Context context,
- List<String> initialPackageNames, Handler handler) {
- GeocoderProxy proxy = new GeocoderProxy(context, initialPackageNames, handler);
+ int overlaySwitchResId, int defaultServicePackageNameResId,
+ int initialPackageNamesResId, Handler handler) {
+ GeocoderProxy proxy = new GeocoderProxy(context, overlaySwitchResId,
+ defaultServicePackageNameResId, initialPackageNamesResId, handler);
if (proxy.bind()) {
return proxy;
} else {
@@ -49,11 +51,13 @@ public class GeocoderProxy {
}
}
- public GeocoderProxy(Context context, List<String> initialPackageNames, Handler handler) {
+ private GeocoderProxy(Context context,
+ int overlaySwitchResId, int defaultServicePackageNameResId,
+ int initialPackageNamesResId, Handler handler) {
mContext = context;
- mServiceWatcher = new ServiceWatcher(mContext, TAG, SERVICE_ACTION, initialPackageNames,
- null, handler);
+ mServiceWatcher = new ServiceWatcher(mContext, TAG, SERVICE_ACTION, overlaySwitchResId,
+ defaultServicePackageNameResId, initialPackageNamesResId, null, handler);
}
private boolean bind () {
diff --git a/services/java/com/android/server/location/GeofenceProxy.java b/services/java/com/android/server/location/GeofenceProxy.java
index 36e9fcc3839b..f6be27b6194b 100644
--- a/services/java/com/android/server/location/GeofenceProxy.java
+++ b/services/java/com/android/server/location/GeofenceProxy.java
@@ -59,8 +59,10 @@ public final class GeofenceProxy {
};
public static GeofenceProxy createAndBind(Context context,
- List<String> initialPackageNames, Handler handler, IGpsGeofenceHardware gpsGeofence) {
- GeofenceProxy proxy = new GeofenceProxy(context, initialPackageNames, handler, gpsGeofence);
+ int overlaySwitchResId, int defaultServicePackageNameResId,
+ int initialPackageNamesResId, Handler handler, IGpsGeofenceHardware gpsGeofence) {
+ GeofenceProxy proxy = new GeofenceProxy(context, overlaySwitchResId,
+ defaultServicePackageNameResId, initialPackageNamesResId, handler, gpsGeofence);
if (proxy.bindGeofenceProvider()) {
return proxy;
} else {
@@ -68,11 +70,12 @@ public final class GeofenceProxy {
}
}
- private GeofenceProxy(Context context, List<String> initialPackageName, Handler handler,
- IGpsGeofenceHardware gpsGeofence) {
+ private GeofenceProxy(Context context,
+ int overlaySwitchResId, int defaultServicePackageNameResId,
+ int initialPackageNamesResId, Handler handler, IGpsGeofenceHardware gpsGeofence) {
mContext = context;
- mServiceWatcher = new ServiceWatcher(context, TAG, SERVICE_ACTION, initialPackageName,
- mRunnable, handler);
+ mServiceWatcher = new ServiceWatcher(context, TAG, SERVICE_ACTION, overlaySwitchResId,
+ defaultServicePackageNameResId, initialPackageNamesResId, mRunnable, handler);
mGpsGeofenceHardware = gpsGeofence;
bindHardwareGeofence();
}
diff --git a/services/java/com/android/server/location/LocationProviderProxy.java b/services/java/com/android/server/location/LocationProviderProxy.java
index 7faf72c33284..14db862065e3 100644
--- a/services/java/com/android/server/location/LocationProviderProxy.java
+++ b/services/java/com/android/server/location/LocationProviderProxy.java
@@ -53,10 +53,13 @@ public class LocationProviderProxy implements LocationProviderInterface {
private ProviderRequest mRequest = null;
private WorkSource mWorksource = new WorkSource();
- public static LocationProviderProxy createAndBind(Context context, String name, String action,
- List<String> initialPackageNames, Handler handler) {
+ public static LocationProviderProxy createAndBind(
+ Context context, String name, String action,
+ int overlaySwitchResId, int defaultServicePackageNameResId,
+ int initialPackageNamesResId, Handler handler) {
LocationProviderProxy proxy = new LocationProviderProxy(context, name, action,
- initialPackageNames, handler);
+ overlaySwitchResId, defaultServicePackageNameResId, initialPackageNamesResId,
+ handler);
if (proxy.bind()) {
return proxy;
} else {
@@ -65,10 +68,12 @@ public class LocationProviderProxy implements LocationProviderInterface {
}
private LocationProviderProxy(Context context, String name, String action,
- List<String> initialPackageNames, Handler handler) {
+ int overlaySwitchResId, int defaultServicePackageNameResId,
+ int initialPackageNamesResId, Handler handler) {
mContext = context;
mName = name;
- mServiceWatcher = new ServiceWatcher(mContext, TAG, action, initialPackageNames,
+ mServiceWatcher = new ServiceWatcher(mContext, TAG + "-" + name, action, overlaySwitchResId,
+ defaultServicePackageNameResId, initialPackageNamesResId,
mNewServiceWork, handler);
}
diff --git a/services/java/com/android/server/power/ElectronBeam.java b/services/java/com/android/server/power/ElectronBeam.java
index 4a74149cdcf4..379e704ab1d9 100644
--- a/services/java/com/android/server/power/ElectronBeam.java
+++ b/services/java/com/android/server/power/ElectronBeam.java
@@ -389,10 +389,14 @@ final class ElectronBeam {
mTexNamesGenerated = true;
}
- SurfaceTexture st = new SurfaceTexture(mTexNames[0]);
- SurfaceControl.screenshot(SurfaceControl.getBuiltInDisplay(
- SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN),
- new Surface(st));
+ final SurfaceTexture st = new SurfaceTexture(mTexNames[0]);
+ final Surface s = new Surface(st);
+ try {
+ SurfaceControl.screenshot(SurfaceControl.getBuiltInDisplay(
+ SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN), s);
+ } finally {
+ s.release();
+ }
st.updateTexImage();
st.getTransformMatrix(mTexMatrix);
diff --git a/services/java/com/android/server/wifi/WifiService.java b/services/java/com/android/server/wifi/WifiService.java
index 4d23e5cfeb60..5cf1966e4e42 100644
--- a/services/java/com/android/server/wifi/WifiService.java
+++ b/services/java/com/android/server/wifi/WifiService.java
@@ -121,8 +121,6 @@ public final class WifiService extends IWifiManager.Stub {
* on this */
private WorkSource mScanWorkSource;
- private boolean mIsReceiverRegistered = false;
-
/**
* Asynchronous channel to WifiStateMachine
*/
@@ -272,6 +270,11 @@ public final class WifiService extends IWifiManager.Stub {
}
}
}, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
+
+ // Adding optimizations of only receiving broadcasts when wifi is enabled
+ // can result in race conditions when apps toggle wifi in the background
+ // without active user involvement. Always receive broadcasts.
+ registerForBroadcasts();
}
private WifiController mWifiController;
@@ -404,7 +407,7 @@ public final class WifiService extends IWifiManager.Stub {
try {
/* Turning off Wi-Fi when scans are still available */
- if (!enable && isScanningAlwaysAvailable()) {
+ if (!enable && isScanAlwaysAvailable()) {
/* Notify if device is provisioned and user has not opted out of the notification */
if (mNotifyScanMode.get() && mDeviceProvisioned.get()) {
Intent intent = new Intent(WifiManager.ACTION_NOTIFY_SCAN_ALWAYS_AVAILABLE);
@@ -421,17 +424,6 @@ public final class WifiService extends IWifiManager.Stub {
}
mWifiController.sendMessage(CMD_WIFI_TOGGLED);
-
- if (enable) {
- if (!mIsReceiverRegistered) {
- registerForBroadcasts();
- mIsReceiverRegistered = true;
- }
- } else if (mIsReceiverRegistered) {
- mContext.unregisterReceiver(mReceiver);
- mIsReceiverRegistered = false;
- }
-
return true;
}
@@ -497,7 +489,7 @@ public final class WifiService extends IWifiManager.Stub {
* @return {@code true} if the enable/disable operation was
* started or is already in the queue.
*/
- public boolean isScanningAlwaysAvailable() {
+ public boolean isScanAlwaysAvailable() {
enforceAccessPermission();
return mSettingsStore.isScanAlwaysAvailable();
}
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index f093b52a1c3f..547ae9598916 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -71,7 +71,7 @@ interface IWifiManager
DhcpInfo getDhcpInfo();
- boolean isScanningAlwaysAvailable();
+ boolean isScanAlwaysAvailable();
boolean acquireWifiLock(IBinder lock, int lockType, String tag, in WorkSource ws);
diff --git a/wifi/java/android/net/wifi/WifiEnterpriseConfig.java b/wifi/java/android/net/wifi/WifiEnterpriseConfig.java
index 4e7497cb68af..6e3034b07856 100644
--- a/wifi/java/android/net/wifi/WifiEnterpriseConfig.java
+++ b/wifi/java/android/net/wifi/WifiEnterpriseConfig.java
@@ -223,6 +223,9 @@ public class WifiEnterpriseConfig implements Parcelable {
public static final int PWD = 3;
/** @hide */
public static final String[] strings = { "PEAP", "TLS", "TTLS", "PWD" };
+
+ /** Prevent initialization */
+ private Eap() {}
}
/** The inner authentication method used */
@@ -239,6 +242,9 @@ public class WifiEnterpriseConfig implements Parcelable {
private static final String PREFIX = "auth=";
/** @hide */
public static final String[] strings = {EMPTY_VALUE, "PAP", "MSCHAP", "MSCHAPV2", "GTC" };
+
+ /** Prevent initialization */
+ private Phase2() {}
}
/** Internal use only */
@@ -363,6 +369,16 @@ public class WifiEnterpriseConfig implements Parcelable {
}
/**
+ * Get the password.
+ *
+ * Returns locally set password value. For networks fetched from
+ * framework, returns "*".
+ */
+ public String getPassword() {
+ return getFieldValue(PASSWORD_KEY, "");
+ }
+
+ /**
* Set CA certificate alias.
*
* <p> See the {@link android.security.KeyChain} for details on installing or choosing
@@ -396,14 +412,27 @@ public class WifiEnterpriseConfig implements Parcelable {
* @throws IllegalArgumentException if not a CA certificate
*/
public void setCaCertificate(X509Certificate cert) {
- if (cert.getBasicConstraints() >= 0) {
- mCaCert = cert;
+ if (cert != null) {
+ if (cert.getBasicConstraints() >= 0) {
+ mCaCert = cert;
+ } else {
+ throw new IllegalArgumentException("Not a CA certificate");
+ }
} else {
- throw new IllegalArgumentException("Not a CA certificate");
+ mCaCert = null;
}
}
/**
+ * Get CA certificate
+ *
+ * @return X.509 CA certificate
+ */
+ public X509Certificate getCaCertificate() {
+ return mCaCert;
+ }
+
+ /**
* Set Client certificate alias.
*
* <p> See the {@link android.security.KeyChain} for details on installing or choosing
@@ -463,6 +492,15 @@ public class WifiEnterpriseConfig implements Parcelable {
mClientCertificate = clientCertificate;
}
+ /**
+ * Get client certificate
+ *
+ * @return X.509 client certificate
+ */
+ public X509Certificate getClientCertificate() {
+ return mClientCertificate;
+ }
+
boolean needsKeyStore() {
// Has no keys to be installed
if (mClientCertificate == null && mCaCert == null) return false;
@@ -645,6 +683,7 @@ public class WifiEnterpriseConfig implements Parcelable {
}
private String removeDoubleQuotes(String string) {
+ if (TextUtils.isEmpty(string)) return "";
int length = string.length();
if ((length > 1) && (string.charAt(0) == '"')
&& (string.charAt(length - 1) == '"')) {
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 0c0a144ae234..a7a59240683c 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -794,9 +794,9 @@ public class WifiManager {
*
* To change this setting, see {@link #ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE}.
*/
- public boolean isScanningAlwaysAvailable() {
+ public boolean isScanAlwaysAvailable() {
try {
- return mService.isScanningAlwaysAvailable();
+ return mService.isScanAlwaysAvailable();
} catch (RemoteException e) {
return false;
}