summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt1
-rw-r--r--core/java/android/app/ActivityManagerNative.java21
-rw-r--r--core/java/android/app/ActivityThread.java13
-rw-r--r--core/java/android/app/ContextImpl.java5
-rw-r--r--core/java/android/app/DownloadManager.java5
-rw-r--r--core/java/android/app/IActivityManager.java2
-rw-r--r--core/java/android/bluetooth/BluetoothAdapter.java36
-rw-r--r--core/java/android/bluetooth/BluetoothDevice.java27
-rw-r--r--core/java/android/bluetooth/BluetoothSocket.java4
-rw-r--r--core/java/android/content/AsyncTaskLoader.java11
-rw-r--r--core/java/android/content/ContentProviderClient.java176
-rw-r--r--core/java/android/content/ContentResolver.java5
-rw-r--r--core/java/android/hardware/camera2/CameraManager.java22
-rw-r--r--core/java/android/hardware/camera2/CameraMetadata.java5
-rw-r--r--core/java/android/hardware/camera2/CaptureResult.java5
-rw-r--r--core/java/android/provider/DocumentsContract.java48
-rw-r--r--core/java/android/provider/MediaStore.java9
-rw-r--r--core/java/android/util/Log.java25
-rw-r--r--core/java/android/util/Slog.java16
-rw-r--r--core/java/android/view/AccessibilityInteractionController.java10
-rw-r--r--core/java/android/view/SurfaceView.java2
-rw-r--r--core/java/android/view/View.java1
-rw-r--r--core/java/android/view/ViewRootImpl.java9
-rw-r--r--core/java/android/view/WindowManager.java49
-rw-r--r--core/java/android/view/accessibility/AccessibilityNodeProvider.java15
-rw-r--r--core/java/android/widget/AbsListView.java26
-rw-r--r--core/java/android/widget/EdgeEffect.java10
-rw-r--r--core/java/com/android/internal/app/ProcessStats.java250
-rw-r--r--core/java/com/android/internal/app/ResolverActivity.java16
-rw-r--r--core/res/res/drawable-hdpi/btn_check_on_pressed_holo_dark.pngbin1069 -> 1044 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_check_on_pressed_holo_light.pngbin1077 -> 1077 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_grayedout_printer.pngbin0 -> 3418 bytes
-rw-r--r--core/res/res/drawable-hdpi/overscroll_edge.pngbin1345 -> 705 bytes
-rw-r--r--core/res/res/drawable-hdpi/overscroll_glow.pngbin36241 -> 38955 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_check_on_pressed_holo_dark.pngbin824 -> 827 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_check_on_pressed_holo_light.pngbin823 -> 823 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_grayedout_printer.pngbin0 -> 3418 bytes
-rw-r--r--core/res/res/drawable-mdpi/overscroll_edge.pngbin903 -> 534 bytes
-rw-r--r--core/res/res/drawable-mdpi/overscroll_glow.pngbin20055 -> 16033 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.pngbin1380 -> 1369 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_light.pngbin1385 -> 1385 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_grayedout_printer.pngbin0 -> 3418 bytes
-rw-r--r--core/res/res/drawable-xhdpi/overscroll_edge.pngbin1889 -> 862 bytes
-rw-r--r--core/res/res/drawable-xhdpi/overscroll_glow.pngbin50899 -> 70364 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/btn_check_on_pressed_holo_dark.pngbin1890 -> 1891 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/overscroll_edge.pngbin3900 -> 1994 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/overscroll_glow.pngbin63177 -> 123685 bytes
-rw-r--r--core/res/res/values-af/strings.xml14
-rw-r--r--core/res/res/values-am/strings.xml14
-rw-r--r--core/res/res/values-ar/strings.xml14
-rw-r--r--core/res/res/values-be/strings.xml28
-rw-r--r--core/res/res/values-bg/strings.xml25
-rw-r--r--core/res/res/values-ca/strings.xml16
-rw-r--r--core/res/res/values-cs/strings.xml14
-rw-r--r--core/res/res/values-da/strings.xml14
-rw-r--r--core/res/res/values-de/strings.xml14
-rw-r--r--core/res/res/values-el/strings.xml14
-rw-r--r--core/res/res/values-en-rGB/strings.xml14
-rw-r--r--core/res/res/values-en-rIN/strings.xml14
-rw-r--r--core/res/res/values-es-rUS/strings.xml25
-rw-r--r--core/res/res/values-es/strings.xml18
-rw-r--r--core/res/res/values-et-rEE/strings.xml14
-rw-r--r--core/res/res/values-fa/strings.xml14
-rw-r--r--core/res/res/values-fi/strings.xml14
-rw-r--r--core/res/res/values-fr-rCA/strings.xml25
-rw-r--r--core/res/res/values-fr/strings.xml25
-rw-r--r--core/res/res/values-hi/strings.xml14
-rw-r--r--core/res/res/values-hr/strings.xml14
-rw-r--r--core/res/res/values-hu/strings.xml14
-rw-r--r--core/res/res/values-hy-rAM/strings.xml25
-rw-r--r--core/res/res/values-in/strings.xml25
-rw-r--r--core/res/res/values-it/strings.xml14
-rw-r--r--core/res/res/values-iw/strings.xml14
-rw-r--r--core/res/res/values-ja/strings.xml27
-rw-r--r--core/res/res/values-ka-rGE/strings.xml25
-rw-r--r--core/res/res/values-km-rKH/strings.xml18
-rw-r--r--core/res/res/values-ko/strings.xml27
-rw-r--r--core/res/res/values-lo-rLA/strings.xml16
-rw-r--r--core/res/res/values-lt/strings.xml25
-rw-r--r--core/res/res/values-lv/strings.xml14
-rw-r--r--core/res/res/values-mn-rMN/strings.xml14
-rw-r--r--core/res/res/values-ms-rMY/strings.xml27
-rw-r--r--core/res/res/values-nb/strings.xml25
-rw-r--r--core/res/res/values-nl/strings.xml14
-rw-r--r--core/res/res/values-pl/strings.xml25
-rw-r--r--core/res/res/values-pt-rPT/strings.xml14
-rw-r--r--core/res/res/values-pt/strings.xml27
-rw-r--r--core/res/res/values-rm/strings.xml28
-rw-r--r--core/res/res/values-ro/strings.xml25
-rw-r--r--core/res/res/values-ru/strings.xml29
-rw-r--r--core/res/res/values-sk/strings.xml27
-rw-r--r--core/res/res/values-sl/strings.xml14
-rw-r--r--core/res/res/values-sr/strings.xml25
-rw-r--r--core/res/res/values-sv/strings.xml14
-rw-r--r--core/res/res/values-sw/strings.xml29
-rw-r--r--core/res/res/values-th/strings.xml25
-rw-r--r--core/res/res/values-tl/strings.xml25
-rw-r--r--core/res/res/values-tr/strings.xml33
-rw-r--r--core/res/res/values-uk/strings.xml14
-rw-r--r--core/res/res/values-vi/strings.xml25
-rw-r--r--core/res/res/values-zh-rCN/strings.xml25
-rw-r--r--core/res/res/values-zh-rHK/strings.xml25
-rw-r--r--core/res/res/values-zh-rTW/strings.xml25
-rw-r--r--core/res/res/values-zu/strings.xml14
-rw-r--r--core/res/res/values/integers.xml2
-rw-r--r--core/res/res/values/strings.xml5
-rw-r--r--core/res/res/values/symbols.xml3
-rw-r--r--docs/html/about/dashboards/index.jd43
-rw-r--r--graphics/java/android/graphics/drawable/InsetDrawable.java8
-rw-r--r--graphics/java/android/graphics/drawable/NinePatchDrawable.java24
-rw-r--r--media/java/android/media/AudioService.java4
-rw-r--r--media/java/android/media/MediaPlayer.java27
-rw-r--r--packages/DocumentsUI/AndroidManifest.xml1
-rw-r--r--packages/DocumentsUI/res/animator-ldrtl/dir_down.xml (renamed from packages/Keyguard/res/anim/keyguard_security_fade_in.xml)16
-rw-r--r--packages/DocumentsUI/res/animator-ldrtl/dir_up.xml (renamed from packages/Keyguard/res/anim/keyguard_security_fade_out.xml)17
-rw-r--r--packages/DocumentsUI/res/drawable-hdpi/ic_dir_shadow_am.9.png (renamed from packages/DocumentsUI/res/drawable-hdpi/ic_dir_shadow.9.png)bin184 -> 184 bytes
-rw-r--r--packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow_tablet_am.9.png (renamed from packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow_tablet.9.png)bin279 -> 279 bytes
-rw-r--r--packages/DocumentsUI/res/drawable-mdpi/ic_dir_shadow_am.9.png (renamed from packages/DocumentsUI/res/drawable-mdpi/ic_dir_shadow.9.png)bin163 -> 163 bytes
-rw-r--r--packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow_tablet_am.9.png (renamed from packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow_tablet.9.png)bin225 -> 225 bytes
-rw-r--r--packages/DocumentsUI/res/drawable-xhdpi/ic_dir_shadow_am.9.png (renamed from packages/DocumentsUI/res/drawable-xhdpi/ic_dir_shadow.9.png)bin193 -> 193 bytes
-rw-r--r--packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow_tablet_am.9.png (renamed from packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow_tablet.9.png)bin305 -> 305 bytes
-rw-r--r--packages/DocumentsUI/res/drawable-xxhdpi/ic_dir_shadow_am.9.png (renamed from packages/DocumentsUI/res/drawable-xxhdpi/ic_dir_shadow.9.png)bin233 -> 233 bytes
-rw-r--r--packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow_tablet_am.9.png (renamed from packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow_tablet.9.png)bin1225 -> 1225 bytes
-rw-r--r--packages/DocumentsUI/res/drawable/ic_dir_shadow.xml23
-rw-r--r--packages/DocumentsUI/res/drawable/ic_drawer_shadow_tablet.xml23
-rw-r--r--packages/DocumentsUI/res/values/strings.xml2
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java26
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java64
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java13
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/DirectoryView.java2
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java42
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.java17
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/ProviderExecutor.java64
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java94
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/RootsCache.java7
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java10
-rw-r--r--packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java55
-rw-r--r--packages/Keyguard/res/anim/keyguard_security_animate_in.xml33
-rw-r--r--packages/Keyguard/res/anim/keyguard_security_animate_out.xml32
-rw-r--r--packages/Keyguard/res/layout/keyguard_glow_pad_container.xml4
-rw-r--r--packages/Keyguard/res/values-ca/strings.xml2
-rw-r--r--packages/Keyguard/res/values-sl/strings.xml2
-rw-r--r--packages/Keyguard/res/values-sw360dp/dimens.xml6
-rw-r--r--packages/Keyguard/res/values-zh-rTW/strings.xml2
-rw-r--r--packages/Keyguard/res/values/dimens.xml3
-rw-r--r--packages/Keyguard/res/values/integers.xml2
-rw-r--r--packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java51
-rw-r--r--packages/PrintSpooler/res/layout/select_printer_activity.xml43
-rw-r--r--packages/PrintSpooler/res/values-af/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-am/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-ar/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-bg/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-ca/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-cs/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-da/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-de/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-el/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-en-rGB/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-en-rIN/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-es-rUS/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-es/strings.xml5
-rw-r--r--packages/PrintSpooler/res/values-et-rEE/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-fa/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-fi/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-fr-rCA/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-fr/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-hi/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-hr/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-hu/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-hy-rAM/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-in/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-it/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-iw/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-ja/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-ka-rGE/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-km-rKH/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-ko/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-lo-rLA/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-lt/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-lv/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-mn-rMN/strings.xml3
-rw-r--r--packages/PrintSpooler/res/values-ms-rMY/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-nb/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-nl/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-pl/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-pt-rPT/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-pt/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-ro/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-ru/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-sk/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-sl/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-sr/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-sv/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-sw/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-th/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-tl/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-tr/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-uk/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-vi/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-zh-rCN/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-zh-rHK/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-zh-rTW/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values-zu/strings.xml1
-rw-r--r--packages/PrintSpooler/res/values/strings.xml7
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java132
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java2
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java82
-rw-r--r--packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java2
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindowManager.java2
-rw-r--r--services/java/com/android/server/ClipboardService.java4
-rw-r--r--services/java/com/android/server/InputMethodManagerService.java2
-rw-r--r--services/java/com/android/server/accounts/AccountManagerService.java16
-rw-r--r--services/java/com/android/server/am/ActiveServices.java95
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java29
-rw-r--r--services/java/com/android/server/am/ActivityStack.java33
-rw-r--r--services/java/com/android/server/am/ActivityStackSupervisor.java5
-rw-r--r--services/java/com/android/server/am/AppErrorDialog.java4
-rw-r--r--services/java/com/android/server/am/AppNotRespondingDialog.java4
-rw-r--r--services/java/com/android/server/am/ProcessStatsService.java27
-rw-r--r--services/java/com/android/server/am/ServiceRecord.java14
-rw-r--r--services/java/com/android/server/am/StrictModeViolationDialog.java5
-rw-r--r--services/java/com/android/server/connectivity/Vpn.java3
-rw-r--r--services/java/com/android/server/content/ContentService.java2
-rwxr-xr-xservices/java/com/android/server/pm/PackageManagerService.java2
-rw-r--r--services/java/com/android/server/power/PowerManagerService.java3
-rw-r--r--services/java/com/android/server/power/WirelessChargerDetector.java117
-rw-r--r--services/java/com/android/server/print/UserState.java7
-rw-r--r--services/java/com/android/server/wm/Session.java2
-rw-r--r--services/java/com/android/server/wm/WindowManagerService.java88
-rw-r--r--services/java/com/android/server/wm/WindowState.java4
231 files changed, 2736 insertions, 768 deletions
diff --git a/api/current.txt b/api/current.txt
index 3b8fa2df92dd..22fe71ef5138 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -29528,6 +29528,7 @@ package android.view.accessibility {
ctor public AccessibilityNodeProvider();
method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int);
method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(java.lang.String, int);
+ method public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
method public boolean performAction(int, int, android.os.Bundle);
}
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index 3b88973940ca..961ee5768b94 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -758,6 +758,14 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
return true;
}
+ case APP_NOT_RESPONDING_VIA_PROVIDER_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ IBinder b = data.readStrongBinder();
+ appNotRespondingViaProvider(b);
+ reply.writeNoException();
+ return true;
+ }
+
case REMOVE_CONTENT_PROVIDER_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
IBinder b = data.readStrongBinder();
@@ -2891,6 +2899,7 @@ class ActivityManagerProxy implements IActivityManager
reply.recycle();
return res;
}
+
public void unstableProviderDied(IBinder connection) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
@@ -2902,6 +2911,18 @@ class ActivityManagerProxy implements IActivityManager
reply.recycle();
}
+ @Override
+ public void appNotRespondingViaProvider(IBinder connection) throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ data.writeStrongBinder(connection);
+ mRemote.transact(APP_NOT_RESPONDING_VIA_PROVIDER_TRANSACTION, data, reply, 0);
+ reply.readException();
+ data.recycle();
+ reply.recycle();
+ }
+
public void removeContentProvider(IBinder connection, boolean stable) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 6605b5b49c21..02faeac0b6bb 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -4653,6 +4653,19 @@ public final class ActivityThread {
}
}
+ final void appNotRespondingViaProvider(IBinder provider) {
+ synchronized (mProviderMap) {
+ ProviderRefCount prc = mProviderRefCountMap.get(provider);
+ if (prc != null) {
+ try {
+ ActivityManagerNative.getDefault()
+ .appNotRespondingViaProvider(prc.holder.connection);
+ } catch (RemoteException e) {
+ }
+ }
+ }
+ }
+
private ProviderClientRecord installProviderAuthoritiesLocked(IContentProvider provider,
ContentProvider localProvider, IActivityManager.ContentProviderHolder holder) {
final String auths[] = PATTERN_SEMICOLON.split(holder.info.authority);
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 0ba2ac5fcea2..300424cbf871 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -2200,5 +2200,10 @@ class ContextImpl extends Context {
public void unstableProviderDied(IContentProvider icp) {
mMainThread.handleUnstableProviderDied(icp.asBinder(), true);
}
+
+ @Override
+ public void appNotRespondingViaProvider(IContentProvider icp) {
+ mMainThread.appNotRespondingViaProvider(icp.asBinder());
+ }
}
}
diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java
index 800ead9b8944..b741cc5c85b3 100644
--- a/core/java/android/app/DownloadManager.java
+++ b/core/java/android/app/DownloadManager.java
@@ -16,6 +16,8 @@
package android.app;
+import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
@@ -267,18 +269,21 @@ public class DownloadManager {
/**
* Broadcast intent action sent by the download manager when a download completes.
*/
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public final static String ACTION_DOWNLOAD_COMPLETE = "android.intent.action.DOWNLOAD_COMPLETE";
/**
* Broadcast intent action sent by the download manager when the user clicks on a running
* download, either from a system notification or from the downloads UI.
*/
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public final static String ACTION_NOTIFICATION_CLICKED =
"android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED";
/**
* Intent action to launch an activity to display all downloads.
*/
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public final static String ACTION_VIEW_DOWNLOADS = "android.intent.action.VIEW_DOWNLOADS";
/**
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 9a7737748d11..dfea73671dc3 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -139,6 +139,7 @@ public interface IActivityManager extends IInterface {
public boolean refContentProvider(IBinder connection, int stableDelta, int unstableDelta)
throws RemoteException;
public void unstableProviderDied(IBinder connection) throws RemoteException;
+ public void appNotRespondingViaProvider(IBinder connection) throws RemoteException;
public PendingIntent getRunningServiceControlPanel(ComponentName service)
throws RemoteException;
public ComponentName startService(IApplicationThread caller, Intent service,
@@ -691,4 +692,5 @@ public interface IActivityManager extends IInterface {
int TAKE_PERSISTABLE_URI_PERMISSION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+179;
int RELEASE_PERSISTABLE_URI_PERMISSION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+180;
int GET_PERSISTED_URI_PERMISSIONS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+181;
+ int APP_NOT_RESPONDING_VIA_PROVIDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+182;
}
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 2172a7b20699..e2bc80aad66d 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -923,42 +923,6 @@ public final class BluetoothAdapter {
}
/**
- * Create a listening, L2CAP Bluetooth socket.
- * <p>A remote device connecting to this socket will optionally be
- * authenticated and communication on this socket will optionally be
- * encrypted.
- * <p>Use {@link BluetoothServerSocket#accept} to retrieve incoming
- * connections from a listening {@link BluetoothServerSocket}.
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}
- * @param secure whether security and authentication are required
- * @param fixedChannel whether we're looking for a PSM-based connection or a fixed channel
- * @param channel L2CAP PSM or channel to use
- * @return a listening L2CAP BluetoothServerSocket
- * @throws IOException on error, for example Bluetooth not available, or
- * insufficient permissions, or channel in use.
- * @hide
- */
- public BluetoothServerSocket listenUsingL2CapOn(boolean secure, boolean fixedChannel,
- int channel) throws IOException {
- BluetoothServerSocket socket;
-
- if (fixedChannel) {
- channel |= BluetoothSocket.PORT_MASK_FIXED_CHAN;
- }
-
- socket = new BluetoothServerSocket(
- BluetoothSocket.TYPE_L2CAP, secure, secure, channel);
- int errno = socket.mSocket.bindListen();
- if (errno != 0) {
- //TODO(BT): Throw the same exception error code
- // that the previous code was using.
- //socket.mSocket.throwErrnoNative(errno);
- throw new IOException("Error: " + errno);
- }
- return socket;
- }
-
- /**
* Create a listening, secure RFCOMM Bluetooth socket.
* <p>A remote device connecting to this socket will be authenticated and
* communication on this socket will be encrypted.
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index 1efdc8186442..5eb642cafb09 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -1172,33 +1172,6 @@ public final class BluetoothDevice implements Parcelable {
return new BluetoothSocket(BluetoothSocket.TYPE_SCO, -1, true, true, this, -1, null);
}
-
- /**
- * Construct a L2CAP socket ready to start an outgoing connection.
- * Call #connect on the returned #BluetoothSocket to begin the connection.
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}
- *
- * @param secure select whether security will be required
- * @param fixedChannel select if this will be a "fixed channel" L2CAP connection
- * or a PSM-based connection
- * @param channel fixed channel or PSM to connect to
- * @return a L2CAP BluetoothSocket
- * @throws IOException on error, for example Bluetooth not available, or
- * insufficient permissions.
- * @hide
- */
- public BluetoothSocket createL2CapSocket(boolean secure, boolean fixedChannel, int channel)
- throws IOException {
-
- if (fixedChannel) {
- channel |= BluetoothSocket.PORT_MASK_FIXED_CHAN;
- }
-
- return new BluetoothSocket(BluetoothSocket.TYPE_L2CAP, -1, secure, secure, this,
- channel, null);
- }
-
-
/**
* Check that a pin is valid and convert to byte array.
*
diff --git a/core/java/android/bluetooth/BluetoothSocket.java b/core/java/android/bluetooth/BluetoothSocket.java
index 191bf67af340..d10eaea2fba1 100644
--- a/core/java/android/bluetooth/BluetoothSocket.java
+++ b/core/java/android/bluetooth/BluetoothSocket.java
@@ -103,8 +103,6 @@ public final class BluetoothSocket implements Closeable {
/*package*/ static final int SEC_FLAG_ENCRYPT = 1;
/*package*/ static final int SEC_FLAG_AUTH = 1 << 1;
- /*package*/ static final int PORT_MASK_FIXED_CHAN = 1 << 16;
-
private final int mType; /* one of TYPE_RFCOMM etc */
private BluetoothDevice mDevice; /* remote device */
private String mAddress; /* remote address */
@@ -117,7 +115,7 @@ public final class BluetoothSocket implements Closeable {
private LocalSocket mSocket;
private InputStream mSocketIS;
private OutputStream mSocketOS;
- private int mPort; /* RFCOMM channel or L2CAP psm/channel */
+ private int mPort; /* RFCOMM channel or L2CAP psm */
private int mFd;
private String mServiceName;
private static int PROXY_CONNECTION_TIMEOUT = 5000;
diff --git a/core/java/android/content/AsyncTaskLoader.java b/core/java/android/content/AsyncTaskLoader.java
index 612c67f01cc0..eb7426e4b261 100644
--- a/core/java/android/content/AsyncTaskLoader.java
+++ b/core/java/android/content/AsyncTaskLoader.java
@@ -26,6 +26,7 @@ import android.util.TimeUtils;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
/**
* Abstract Loader that provides an {@link AsyncTask} to do the work. See
@@ -123,6 +124,8 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> {
}
}
+ private final Executor mExecutor;
+
volatile LoadTask mTask;
volatile LoadTask mCancellingTask;
@@ -131,7 +134,13 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> {
Handler mHandler;
public AsyncTaskLoader(Context context) {
+ this(context, AsyncTask.THREAD_POOL_EXECUTOR);
+ }
+
+ /** {@hide} */
+ public AsyncTaskLoader(Context context, Executor executor) {
super(context);
+ mExecutor = executor;
}
/**
@@ -223,7 +232,7 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> {
}
}
if (DEBUG) Slog.v(TAG, "Executing: " + mTask);
- mTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null);
+ mTask.executeOnExecutor(mExecutor, (Void[]) null);
}
}
diff --git a/core/java/android/content/ContentProviderClient.java b/core/java/android/content/ContentProviderClient.java
index 065079835207..cefc27f331fd 100644
--- a/core/java/android/content/ContentProviderClient.java
+++ b/core/java/android/content/ContentProviderClient.java
@@ -16,15 +16,20 @@
package android.content;
+import android.content.res.AssetFileDescriptor;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.DeadObjectException;
+import android.os.Handler;
import android.os.ICancellationSignal;
-import android.os.RemoteException;
+import android.os.Looper;
import android.os.ParcelFileDescriptor;
-import android.content.res.AssetFileDescriptor;
+import android.os.RemoteException;
+import android.util.Log;
+
+import com.android.internal.annotations.GuardedBy;
import dalvik.system.CloseGuard;
@@ -45,26 +50,64 @@ import java.util.ArrayList;
* until you are finished with the data they have returned.
*/
public class ContentProviderClient {
- private final IContentProvider mContentProvider;
+ private static final String TAG = "ContentProviderClient";
+
+ @GuardedBy("ContentProviderClient.class")
+ private static Handler sAnrHandler;
+
private final ContentResolver mContentResolver;
+ private final IContentProvider mContentProvider;
private final String mPackageName;
private final boolean mStable;
- private boolean mReleased;
private final CloseGuard mGuard = CloseGuard.get();
- /**
- * @hide
- */
- ContentProviderClient(ContentResolver contentResolver,
- IContentProvider contentProvider, boolean stable) {
- mContentProvider = contentProvider;
+ private long mAnrTimeout;
+ private NotRespondingRunnable mAnrRunnable;
+
+ private boolean mReleased;
+
+ /** {@hide} */
+ ContentProviderClient(
+ ContentResolver contentResolver, IContentProvider contentProvider, boolean stable) {
mContentResolver = contentResolver;
+ mContentProvider = contentProvider;
mPackageName = contentResolver.mPackageName;
mStable = stable;
+
mGuard.open("release");
}
+ /** {@hide} */
+ public void setDetectNotResponding(long timeoutMillis) {
+ synchronized (ContentProviderClient.class) {
+ mAnrTimeout = timeoutMillis;
+
+ if (timeoutMillis > 0) {
+ if (mAnrRunnable == null) {
+ mAnrRunnable = new NotRespondingRunnable();
+ }
+ if (sAnrHandler == null) {
+ sAnrHandler = new Handler(Looper.getMainLooper(), null, true /* async */);
+ }
+ } else {
+ mAnrRunnable = null;
+ }
+ }
+ }
+
+ private void beforeRemote() {
+ if (mAnrRunnable != null) {
+ sAnrHandler.postDelayed(mAnrRunnable, mAnrTimeout);
+ }
+ }
+
+ private void afterRemote() {
+ if (mAnrRunnable != null) {
+ sAnrHandler.removeCallbacks(mAnrRunnable);
+ }
+ }
+
/** See {@link ContentProvider#query ContentProvider.query} */
public Cursor query(Uri url, String[] projection, String selection,
String[] selectionArgs, String sortOrder) throws RemoteException {
@@ -72,28 +115,31 @@ public class ContentProviderClient {
}
/** See {@link ContentProvider#query ContentProvider.query} */
- public Cursor query(Uri url, String[] projection, String selection,
- String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal)
- throws RemoteException {
- ICancellationSignal remoteCancellationSignal = null;
- if (cancellationSignal != null) {
- cancellationSignal.throwIfCanceled();
- remoteCancellationSignal = mContentProvider.createCancellationSignal();
- cancellationSignal.setRemote(remoteCancellationSignal);
- }
+ public Cursor query(Uri url, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder, CancellationSignal cancellationSignal) throws RemoteException {
+ beforeRemote();
try {
- return mContentProvider.query(mPackageName, url, projection, selection, selectionArgs,
+ ICancellationSignal remoteCancellationSignal = null;
+ if (cancellationSignal != null) {
+ cancellationSignal.throwIfCanceled();
+ remoteCancellationSignal = mContentProvider.createCancellationSignal();
+ cancellationSignal.setRemote(remoteCancellationSignal);
+ }
+ return mContentProvider.query(mPackageName, url, projection, selection, selectionArgs,
sortOrder, remoteCancellationSignal);
} catch (DeadObjectException e) {
if (!mStable) {
mContentResolver.unstableProviderDied(mContentProvider);
}
throw e;
+ } finally {
+ afterRemote();
}
}
/** See {@link ContentProvider#getType ContentProvider.getType} */
public String getType(Uri url) throws RemoteException {
+ beforeRemote();
try {
return mContentProvider.getType(url);
} catch (DeadObjectException e) {
@@ -101,11 +147,14 @@ public class ContentProviderClient {
mContentResolver.unstableProviderDied(mContentProvider);
}
throw e;
+ } finally {
+ afterRemote();
}
}
/** See {@link ContentProvider#getStreamTypes ContentProvider.getStreamTypes} */
public String[] getStreamTypes(Uri url, String mimeTypeFilter) throws RemoteException {
+ beforeRemote();
try {
return mContentProvider.getStreamTypes(url, mimeTypeFilter);
} catch (DeadObjectException e) {
@@ -113,11 +162,14 @@ public class ContentProviderClient {
mContentResolver.unstableProviderDied(mContentProvider);
}
throw e;
+ } finally {
+ afterRemote();
}
}
/** See {@link ContentProvider#canonicalize} */
public final Uri canonicalize(Uri url) throws RemoteException {
+ beforeRemote();
try {
return mContentProvider.canonicalize(mPackageName, url);
} catch (DeadObjectException e) {
@@ -125,11 +177,14 @@ public class ContentProviderClient {
mContentResolver.unstableProviderDied(mContentProvider);
}
throw e;
+ } finally {
+ afterRemote();
}
}
/** See {@link ContentProvider#uncanonicalize} */
public final Uri uncanonicalize(Uri url) throws RemoteException {
+ beforeRemote();
try {
return mContentProvider.uncanonicalize(mPackageName, url);
} catch (DeadObjectException e) {
@@ -137,12 +192,14 @@ public class ContentProviderClient {
mContentResolver.unstableProviderDied(mContentProvider);
}
throw e;
+ } finally {
+ afterRemote();
}
}
/** See {@link ContentProvider#insert ContentProvider.insert} */
- public Uri insert(Uri url, ContentValues initialValues)
- throws RemoteException {
+ public Uri insert(Uri url, ContentValues initialValues) throws RemoteException {
+ beforeRemote();
try {
return mContentProvider.insert(mPackageName, url, initialValues);
} catch (DeadObjectException e) {
@@ -150,11 +207,14 @@ public class ContentProviderClient {
mContentResolver.unstableProviderDied(mContentProvider);
}
throw e;
+ } finally {
+ afterRemote();
}
}
/** See {@link ContentProvider#bulkInsert ContentProvider.bulkInsert} */
public int bulkInsert(Uri url, ContentValues[] initialValues) throws RemoteException {
+ beforeRemote();
try {
return mContentProvider.bulkInsert(mPackageName, url, initialValues);
} catch (DeadObjectException e) {
@@ -162,12 +222,15 @@ public class ContentProviderClient {
mContentResolver.unstableProviderDied(mContentProvider);
}
throw e;
+ } finally {
+ afterRemote();
}
}
/** See {@link ContentProvider#delete ContentProvider.delete} */
public int delete(Uri url, String selection, String[] selectionArgs)
throws RemoteException {
+ beforeRemote();
try {
return mContentProvider.delete(mPackageName, url, selection, selectionArgs);
} catch (DeadObjectException e) {
@@ -175,12 +238,15 @@ public class ContentProviderClient {
mContentResolver.unstableProviderDied(mContentProvider);
}
throw e;
+ } finally {
+ afterRemote();
}
}
/** See {@link ContentProvider#update ContentProvider.update} */
public int update(Uri url, ContentValues values, String selection,
String[] selectionArgs) throws RemoteException {
+ beforeRemote();
try {
return mContentProvider.update(mPackageName, url, values, selection, selectionArgs);
} catch (DeadObjectException e) {
@@ -188,6 +254,8 @@ public class ContentProviderClient {
mContentResolver.unstableProviderDied(mContentProvider);
}
throw e;
+ } finally {
+ afterRemote();
}
}
@@ -212,19 +280,22 @@ public class ContentProviderClient {
*/
public ParcelFileDescriptor openFile(Uri url, String mode, CancellationSignal signal)
throws RemoteException, FileNotFoundException {
- ICancellationSignal remoteSignal = null;
- if (signal != null) {
- signal.throwIfCanceled();
- remoteSignal = mContentProvider.createCancellationSignal();
- signal.setRemote(remoteSignal);
- }
+ beforeRemote();
try {
+ ICancellationSignal remoteSignal = null;
+ if (signal != null) {
+ signal.throwIfCanceled();
+ remoteSignal = mContentProvider.createCancellationSignal();
+ signal.setRemote(remoteSignal);
+ }
return mContentProvider.openFile(mPackageName, url, mode, remoteSignal);
} catch (DeadObjectException e) {
if (!mStable) {
mContentResolver.unstableProviderDied(mContentProvider);
}
throw e;
+ } finally {
+ afterRemote();
}
}
@@ -249,19 +320,22 @@ public class ContentProviderClient {
*/
public AssetFileDescriptor openAssetFile(Uri url, String mode, CancellationSignal signal)
throws RemoteException, FileNotFoundException {
- ICancellationSignal remoteSignal = null;
- if (signal != null) {
- signal.throwIfCanceled();
- remoteSignal = mContentProvider.createCancellationSignal();
- signal.setRemote(remoteSignal);
- }
+ beforeRemote();
try {
+ ICancellationSignal remoteSignal = null;
+ if (signal != null) {
+ signal.throwIfCanceled();
+ remoteSignal = mContentProvider.createCancellationSignal();
+ signal.setRemote(remoteSignal);
+ }
return mContentProvider.openAssetFile(mPackageName, url, mode, remoteSignal);
} catch (DeadObjectException e) {
if (!mStable) {
mContentResolver.unstableProviderDied(mContentProvider);
}
throw e;
+ } finally {
+ afterRemote();
}
}
@@ -275,13 +349,14 @@ public class ContentProviderClient {
public final AssetFileDescriptor openTypedAssetFileDescriptor(Uri uri,
String mimeType, Bundle opts, CancellationSignal signal)
throws RemoteException, FileNotFoundException {
- ICancellationSignal remoteSignal = null;
- if (signal != null) {
- signal.throwIfCanceled();
- remoteSignal = mContentProvider.createCancellationSignal();
- signal.setRemote(remoteSignal);
- }
+ beforeRemote();
try {
+ ICancellationSignal remoteSignal = null;
+ if (signal != null) {
+ signal.throwIfCanceled();
+ remoteSignal = mContentProvider.createCancellationSignal();
+ signal.setRemote(remoteSignal);
+ }
return mContentProvider.openTypedAssetFile(
mPackageName, uri, mimeType, opts, remoteSignal);
} catch (DeadObjectException e) {
@@ -289,12 +364,15 @@ public class ContentProviderClient {
mContentResolver.unstableProviderDied(mContentProvider);
}
throw e;
+ } finally {
+ afterRemote();
}
}
/** See {@link ContentProvider#applyBatch ContentProvider.applyBatch} */
public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)
throws RemoteException, OperationApplicationException {
+ beforeRemote();
try {
return mContentProvider.applyBatch(mPackageName, operations);
} catch (DeadObjectException e) {
@@ -302,12 +380,14 @@ public class ContentProviderClient {
mContentResolver.unstableProviderDied(mContentProvider);
}
throw e;
+ } finally {
+ afterRemote();
}
}
/** See {@link ContentProvider#call(String, String, Bundle)} */
- public Bundle call(String method, String arg, Bundle extras)
- throws RemoteException {
+ public Bundle call(String method, String arg, Bundle extras) throws RemoteException {
+ beforeRemote();
try {
return mContentProvider.call(mPackageName, method, arg, extras);
} catch (DeadObjectException e) {
@@ -315,6 +395,8 @@ public class ContentProviderClient {
mContentResolver.unstableProviderDied(mContentProvider);
}
throw e;
+ } finally {
+ afterRemote();
}
}
@@ -359,7 +441,7 @@ public class ContentProviderClient {
}
/** {@hide} */
- public static void closeQuietly(ContentProviderClient client) {
+ public static void releaseQuietly(ContentProviderClient client) {
if (client != null) {
try {
client.release();
@@ -367,4 +449,12 @@ public class ContentProviderClient {
}
}
}
+
+ private class NotRespondingRunnable implements Runnable {
+ @Override
+ public void run() {
+ Log.w(TAG, "Detected provider not responding: " + mContentProvider);
+ mContentResolver.appNotRespondingViaProvider(mContentProvider);
+ }
+ }
}
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index f659e20f4940..fbf1fd0aa362 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -287,6 +287,11 @@ public abstract class ContentResolver {
/** @hide */
public abstract void unstableProviderDied(IContentProvider icp);
+ /** @hide */
+ public void appNotRespondingViaProvider(IContentProvider icp) {
+ throw new UnsupportedOperationException("appNotRespondingViaProvider");
+ }
+
/**
* Return the MIME type of the given content URL.
*
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index 798ad7b7fc13..f5ee367c70ca 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -369,10 +369,30 @@ public final class CameraManager {
}
mDeviceIdList = new ArrayList<String>();
+ CameraMetadataNative info = new CameraMetadataNative();
for (int i = 0; i < numCameras; ++i) {
// Non-removable cameras use integers starting at 0 for their
// identifiers
- mDeviceIdList.add(String.valueOf(i));
+ boolean isDeviceSupported = false;
+ try {
+ mCameraService.getCameraCharacteristics(i, info);
+ if (!info.isEmpty()) {
+ isDeviceSupported = true;
+ } else {
+ throw new AssertionError("Expected to get non-empty characteristics");
+ }
+ } catch(IllegalArgumentException e) {
+ // Got a BAD_VALUE from service, meaning that this
+ // device is not supported.
+ } catch(CameraRuntimeException e) {
+ throw e.asChecked();
+ } catch(RemoteException e) {
+ // impossible
+ }
+
+ if (isDeviceSupported) {
+ mDeviceIdList.add(String.valueOf(i));
+ }
}
}
diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java
index be556c3d8543..1d6ff7db869b 100644
--- a/core/java/android/hardware/camera2/CameraMetadata.java
+++ b/core/java/android/hardware/camera2/CameraMetadata.java
@@ -19,6 +19,7 @@ package android.hardware.camera2;
import android.hardware.camera2.impl.CameraMetadataNative;
import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -105,7 +106,9 @@ public abstract class CameraMetadata {
Field[] fields = type.getDeclaredFields();
for (Field field : fields) {
- if (field.getDeclaringClass().isAssignableFrom(Key.class)) {
+ // Filter for Keys that are public
+ if (field.getType().isAssignableFrom(Key.class) &&
+ (field.getModifiers() & Modifier.PUBLIC) != 0) {
Key<?> key;
try {
key = (Key<?>) field.get(instance);
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index 30bffc45c9f9..c9626f1b074e 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -60,6 +60,11 @@ public final class CaptureResult extends CameraMetadata {
@Override
public <T> T get(Key<T> key) {
+ if (key == STATISTICS_FACES) { // Don't throw IllegalArgumentException
+ // TODO: Implement android.statistics.faces
+ return null;
+ }
+
return mResults.get(key);
}
diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java
index 85ec80368c2a..8bf6e4faf686 100644
--- a/core/java/android/provider/DocumentsContract.java
+++ b/core/java/android/provider/DocumentsContract.java
@@ -635,17 +635,18 @@ public final class DocumentsContract {
documentUri.getAuthority());
try {
return getDocumentThumbnail(client, documentUri, size, signal);
- } catch (RemoteException e) {
+ } catch (Exception e) {
+ Log.w(TAG, "Failed to load thumbnail for " + documentUri + ": " + e);
return null;
} finally {
- ContentProviderClient.closeQuietly(client);
+ ContentProviderClient.releaseQuietly(client);
}
}
/** {@hide} */
public static Bitmap getDocumentThumbnail(
ContentProviderClient client, Uri documentUri, Point size, CancellationSignal signal)
- throws RemoteException {
+ throws RemoteException, IOException {
final Bundle openOpts = new Bundle();
openOpts.putParcelable(DocumentsContract.EXTRA_THUMBNAIL_SIZE, size);
@@ -693,9 +694,6 @@ public final class DocumentsContract {
}
return BitmapFactory.decodeFileDescriptor(fd, null, opts);
}
- } catch (IOException e) {
- Log.w(TAG, "Failed to load thumbnail for " + documentUri + ": " + e);
- return null;
} finally {
IoUtils.closeQuietly(afd);
}
@@ -717,55 +715,53 @@ public final class DocumentsContract {
parentDocumentUri.getAuthority());
try {
return createDocument(client, parentDocumentUri, mimeType, displayName);
+ } catch (Exception e) {
+ Log.w(TAG, "Failed to create document", e);
+ return null;
} finally {
- ContentProviderClient.closeQuietly(client);
+ ContentProviderClient.releaseQuietly(client);
}
}
/** {@hide} */
public static Uri createDocument(ContentProviderClient client, Uri parentDocumentUri,
- String mimeType, String displayName) {
+ String mimeType, String displayName) throws RemoteException {
final Bundle in = new Bundle();
in.putString(Document.COLUMN_DOCUMENT_ID, getDocumentId(parentDocumentUri));
in.putString(Document.COLUMN_MIME_TYPE, mimeType);
in.putString(Document.COLUMN_DISPLAY_NAME, displayName);
- try {
- final Bundle out = client.call(METHOD_CREATE_DOCUMENT, null, in);
- return buildDocumentUri(
- parentDocumentUri.getAuthority(), out.getString(Document.COLUMN_DOCUMENT_ID));
- } catch (Exception e) {
- Log.w(TAG, "Failed to create document", e);
- return null;
- }
+ final Bundle out = client.call(METHOD_CREATE_DOCUMENT, null, in);
+ return buildDocumentUri(
+ parentDocumentUri.getAuthority(), out.getString(Document.COLUMN_DOCUMENT_ID));
}
/**
* Delete the given document.
*
* @param documentUri document with {@link Document#FLAG_SUPPORTS_DELETE}
+ * @return if the document was deleted successfully.
*/
public static boolean deleteDocument(ContentResolver resolver, Uri documentUri) {
final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
documentUri.getAuthority());
try {
- return deleteDocument(client, documentUri);
+ deleteDocument(client, documentUri);
+ return true;
+ } catch (Exception e) {
+ Log.w(TAG, "Failed to delete document", e);
+ return false;
} finally {
- ContentProviderClient.closeQuietly(client);
+ ContentProviderClient.releaseQuietly(client);
}
}
/** {@hide} */
- public static boolean deleteDocument(ContentProviderClient client, Uri documentUri) {
+ public static void deleteDocument(ContentProviderClient client, Uri documentUri)
+ throws RemoteException {
final Bundle in = new Bundle();
in.putString(Document.COLUMN_DOCUMENT_ID, getDocumentId(documentUri));
- try {
- final Bundle out = client.call(METHOD_DELETE_DOCUMENT, null, in);
- return true;
- } catch (Exception e) {
- Log.w(TAG, "Failed to delete document", e);
- return false;
- }
+ client.call(METHOD_DELETE_DOCUMENT, null, in);
}
}
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index ad6839b63f3f..f69cad096d38 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -118,6 +118,7 @@ public final class MediaStore {
* sense for apps that can support large-scale search of music, such as services connected
* to an online database of music which can be streamed and played on the device.
*/
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH =
"android.media.action.MEDIA_PLAY_FROM_SEARCH";
@@ -134,6 +135,7 @@ public final class MediaStore {
* sense for apps that can support large-scale search of text media, such as services connected
* to an online database of books and/or magazines which can be read on the device.
*/
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String INTENT_ACTION_TEXT_OPEN_FROM_SEARCH =
"android.media.action.TEXT_OPEN_FROM_SEARCH";
@@ -150,6 +152,7 @@ public final class MediaStore {
* sense for apps that can support large-scale search of video, such as services connected to an
* online database of videos which can be streamed and played on the device.
*/
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String INTENT_ACTION_VIDEO_PLAY_FROM_SEARCH =
"android.media.action.VIDEO_PLAY_FROM_SEARCH";
@@ -202,6 +205,7 @@ public final class MediaStore {
/**
* The name of the Intent action used to launch a camera in still image mode.
*/
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String INTENT_ACTION_STILL_IMAGE_CAMERA = "android.media.action.STILL_IMAGE_CAMERA";
/**
@@ -216,12 +220,14 @@ public final class MediaStore {
* this flag is used, so launching more than one activity is strongly
* discouraged.
*/
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE =
"android.media.action.STILL_IMAGE_CAMERA_SECURE";
/**
* The name of the Intent action used to launch a camera in video mode.
*/
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String INTENT_ACTION_VIDEO_CAMERA = "android.media.action.VIDEO_CAMERA";
/**
@@ -235,6 +241,7 @@ public final class MediaStore {
* value of EXTRA_OUTPUT.
* @see #EXTRA_OUTPUT
*/
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public final static String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE";
/**
@@ -256,6 +263,7 @@ public final class MediaStore {
* @see #ACTION_IMAGE_CAPTURE
* @see #EXTRA_OUTPUT
*/
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_IMAGE_CAPTURE_SECURE =
"android.media.action.IMAGE_CAPTURE_SECURE";
@@ -274,6 +282,7 @@ public final class MediaStore {
* @see #EXTRA_SIZE_LIMIT
* @see #EXTRA_DURATION_LIMIT
*/
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public final static String ACTION_VIDEO_CAPTURE = "android.media.action.VIDEO_CAPTURE";
/**
diff --git a/core/java/android/util/Log.java b/core/java/android/util/Log.java
index 6a6f027f8088..8c1cf5fec8a1 100644
--- a/core/java/android/util/Log.java
+++ b/core/java/android/util/Log.java
@@ -84,14 +84,14 @@ public final class Log {
public static final int ASSERT = 7;
/**
- * Exception class used to capture a stack trace in {@link #wtf()}.
+ * Exception class used to capture a stack trace in {@link #wtf}.
*/
private static class TerribleFailure extends Exception {
TerribleFailure(String msg, Throwable cause) { super(msg, cause); }
}
/**
- * Interface to handle terrible failures from {@link #wtf()}.
+ * Interface to handle terrible failures from {@link #wtf}.
*
* @hide
*/
@@ -257,6 +257,15 @@ public final class Log {
}
/**
+ * Like {@link #wtf(String, String)}, but also writes to the log the full
+ * call stack.
+ * @hide
+ */
+ public static int wtfStack(String tag, String msg) {
+ return wtfStack(LOG_ID_MAIN, tag, msg);
+ }
+
+ /**
* What a Terrible Failure: Report an exception that should never happen.
* Similar to {@link #wtf(String, String)}, with an exception to log.
* @param tag Used to identify the source of a log message.
@@ -274,8 +283,18 @@ public final class Log {
* @param tr An exception to log. May be null.
*/
public static int wtf(String tag, String msg, Throwable tr) {
+ return wtf(LOG_ID_MAIN, tag, msg, tr);
+ }
+
+ static int wtfStack(int logId, String tag, String msg) {
+ TerribleFailure here = new TerribleFailure("here", null);
+ here.fillInStackTrace();
+ return wtf(logId, tag, msg, here);
+ }
+
+ static int wtf(int logId, String tag, String msg, Throwable tr) {
TerribleFailure what = new TerribleFailure(msg, tr);
- int bytes = println_native(LOG_ID_MAIN, ASSERT, tag, msg + '\n' + getStackTraceString(tr));
+ int bytes = println_native(logId, ASSERT, tag, msg + '\n' + getStackTraceString(tr));
sWtfHandler.onTerribleFailure(tag, what);
return bytes;
}
diff --git a/core/java/android/util/Slog.java b/core/java/android/util/Slog.java
index ecf5ea153c2e..a5c22ffbacd1 100644
--- a/core/java/android/util/Slog.java
+++ b/core/java/android/util/Slog.java
@@ -78,6 +78,22 @@ public final class Slog {
msg + '\n' + Log.getStackTraceString(tr));
}
+ public static int wtf(String tag, String msg) {
+ return Log.wtf(Log.LOG_ID_SYSTEM, tag, msg, null);
+ }
+
+ public static int wtfStack(String tag, String msg) {
+ return Log.wtfStack(Log.LOG_ID_SYSTEM, tag, msg);
+ }
+
+ public static int wtf(String tag, Throwable tr) {
+ return Log.wtf(Log.LOG_ID_SYSTEM, tag, tr.getMessage(), tr);
+ }
+
+ public static int wtf(String tag, String msg, Throwable tr) {
+ return Log.wtf(Log.LOG_ID_SYSTEM, tag, msg, tr);
+ }
+
public static int println(int priority, String tag, String msg) {
return Log.println_native(Log.LOG_ID_SYSTEM, priority, tag, msg);
}
diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java
index e835a9708169..41d37001b848 100644
--- a/core/java/android/view/AccessibilityInteractionController.java
+++ b/core/java/android/view/AccessibilityInteractionController.java
@@ -423,9 +423,15 @@ final class AccessibilityInteractionController {
}
} break;
case AccessibilityNodeInfo.FOCUS_INPUT: {
- // Input focus cannot go to virtual views.
View target = root.findFocus();
- if (target != null && isShown(target)) {
+ if (target == null || !isShown(target)) {
+ break;
+ }
+ AccessibilityNodeProvider provider = target.getAccessibilityNodeProvider();
+ if (provider != null) {
+ focused = provider.findFocus(focusType);
+ }
+ if (focused == null) {
focused = target.createAccessibilityNodeInfo();
}
} break;
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index c283170ad3dd..316cbf0f3760 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -483,7 +483,7 @@ public class SurfaceView extends View {
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
;
if (!getContext().getResources().getCompatibilityInfo().supportsScreen()) {
- mLayout.flags |= WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
+ mLayout.flags |= WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
}
mLayout.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION;
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index c4ce6541ae33..9a47cd441a96 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -5381,6 +5381,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
info.setAccessibilityFocused(isAccessibilityFocused());
info.setSelected(isSelected());
info.setLongClickable(isLongClickable());
+ info.setLiveRegion(getAccessibilityLiveRegion());
// TODO: These make sense only if we are in an AdapterView but all
// views can be selected. Maybe from accessibility perspective
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 0e17b7254d0c..b66b0bc74671 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -82,7 +82,6 @@ import java.io.OutputStream;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashSet;
-import java.util.Locale;
/**
* The top of a view hierarchy, implementing the needed protocol between View
@@ -468,7 +467,7 @@ public final class ViewRootImpl implements ViewParent,
if (DEBUG_LAYOUT) Log.d(TAG, "WindowLayout in setView:" + attrs);
if (!compatibilityInfo.supportsScreen()) {
- attrs.flags |= WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
+ attrs.flags |= WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
mLastInCompatMode = true;
}
@@ -750,7 +749,7 @@ public final class ViewRootImpl implements ViewParent,
mClientWindowLayoutFlags = attrs.flags;
// preserve compatible window flag if exists.
int compatibleWindowFlag =
- mWindowAttributes.flags & WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
+ mWindowAttributes.flags & WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
// transfer over system UI visibility values as they carry current state.
attrs.systemUiVisibility = mWindowAttributes.systemUiVisibility;
attrs.subtreeSystemUiVisibility = mWindowAttributes.subtreeSystemUiVisibility;
@@ -1147,10 +1146,10 @@ public final class ViewRootImpl implements ViewParent,
mFullRedrawNeeded = true;
mLayoutRequested = true;
if (mLastInCompatMode) {
- params.flags &= ~WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
+ params.flags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
mLastInCompatMode = false;
} else {
- params.flags |= WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
+ params.flags |= WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
mLastInCompatMode = true;
}
}
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index c9c74e7603e0..53f4d773b40d 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -841,6 +841,15 @@ public interface WindowManager extends ViewManager {
// ----- HIDDEN FLAGS.
// These start at the high bit and go down.
+ /**
+ * Flag for a window in local focus mode.
+ * Window in local focus mode can control focus independent of window manager using
+ * {@link Window#setLocalFocus(boolean, boolean)}.
+ * Usually window in this mode will not get touch/key events from window manager, but will
+ * get events only via local injection using {@link Window#injectInputEvent(InputEvent)}.
+ */
+ public static final int FLAG_LOCAL_FOCUS_MODE = 0x10000000;
+
/** Window flag: Enable touches to slide out of a window into neighboring
* windows in mid-gesture instead of being captured for the duration of
* the gesture.
@@ -851,7 +860,7 @@ public interface WindowManager extends ViewManager {
*
* {@hide}
*/
- public static final int FLAG_SLIPPERY = 0x04000000;
+ public static final int FLAG_SLIPPERY = 0x20000000;
/**
* Flag for a window belonging to an activity that responds to {@link KeyEvent#KEYCODE_MENU}
@@ -864,29 +873,8 @@ public interface WindowManager extends ViewManager {
*
* {@hide}
*/
- public static final int FLAG_NEEDS_MENU_KEY = 0x08000000;
+ public static final int FLAG_NEEDS_MENU_KEY = 0x40000000;
- /**
- * Flag for a window in local focus mode.
- * Window in local focus mode can control focus independent of window manager using
- * {@link Window#setLocalFocus(boolean, boolean)}.
- * Usually window in this mode will not get touch/key events from window manager, but will
- * get events only via local injection using {@link Window#injectInputEvent(InputEvent)}.
- */
- public static final int FLAG_LOCAL_FOCUS_MODE = 0x10000000;
-
- /** Window flag: special flag to limit the size of the window to be
- * original size ([320x480] x density). Used to create window for applications
- * running under compatibility mode.
- *
- * {@hide} */
- public static final int FLAG_COMPATIBLE_WINDOW = 0x20000000;
-
- /** Window flag: a special option intended for system dialogs. When
- * this flag is set, the window will demand focus unconditionally when
- * it is created.
- * {@hide} */
- public static final int FLAG_SYSTEM_ERROR = 0x40000000;
/**
* Various behavioral options/flags. Default is none.
@@ -1045,6 +1033,19 @@ public interface WindowManager extends ViewManager {
* {@hide} */
public static final int PRIVATE_FLAG_NO_MOVE_ANIMATION = 0x00000040;
+ /** Window flag: special flag to limit the size of the window to be
+ * original size ([320x480] x density). Used to create window for applications
+ * running under compatibility mode.
+ *
+ * {@hide} */
+ public static final int PRIVATE_FLAG_COMPATIBLE_WINDOW = 0x00000080;
+
+ /** Window flag: a special option intended for system dialogs. When
+ * this flag is set, the window will demand focus unconditionally when
+ * it is created.
+ * {@hide} */
+ public static final int PRIVATE_FLAG_SYSTEM_ERROR = 0x00000100;
+
/**
* Control flags that are private to the platform.
* @hide
@@ -1783,7 +1784,7 @@ public interface WindowManager extends ViewManager {
sb.append(" rotAnim=");
sb.append(rotationAnimation);
}
- if ((flags & FLAG_COMPATIBLE_WINDOW) != 0) {
+ if ((flags & PRIVATE_FLAG_COMPATIBLE_WINDOW) != 0) {
sb.append(" compatible=true");
}
if (systemUiVisibility != 0) {
diff --git a/core/java/android/view/accessibility/AccessibilityNodeProvider.java b/core/java/android/view/accessibility/AccessibilityNodeProvider.java
index 688cbdf3c9f7..718c32fd8d25 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeProvider.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeProvider.java
@@ -132,4 +132,19 @@ public abstract class AccessibilityNodeProvider {
int virtualViewId) {
return null;
}
+
+ /**
+ * Find the virtual view, i.e. a descendant of the host View, that has the
+ * specified focus type.
+ *
+ * @param focus The focus to find. One of
+ * {@link AccessibilityNodeInfo#FOCUS_INPUT} or
+ * {@link AccessibilityNodeInfo#FOCUS_ACCESSIBILITY}.
+ * @return The node info of the focused view or null.
+ * @see AccessibilityNodeInfo#FOCUS_INPUT
+ * @see AccessibilityNodeInfo#FOCUS_ACCESSIBILITY
+ */
+ public AccessibilityNodeInfo findFocus(int focus) {
+ return null;
+ }
}
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 4680267ab8e1..636641d9ca70 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -2254,6 +2254,13 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
}
} else {
isScrap[0] = true;
+
+ // Clear any system-managed transient state so that we can
+ // recycle this view and bind it to different data.
+ if (child.isAccessibilityFocused()) {
+ child.clearAccessibilityFocus();
+ }
+
child.dispatchFinishTemporaryDetach();
}
} else {
@@ -5073,6 +5080,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
count++;
int position = firstPosition + i;
if (position >= headerViewsCount && position < footerViewsStart) {
+ // The view will be rebound to new data, clear any
+ // system-managed transient state.
+ if (child.isAccessibilityFocused()) {
+ child.clearAccessibilityFocus();
+ }
mRecycler.addScrapView(child, position);
}
}
@@ -5091,6 +5103,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
count++;
int position = firstPosition + i;
if (position >= headerViewsCount && position < footerViewsStart) {
+ // The view will be rebound to new data, clear any
+ // system-managed transient state.
+ if (child.isAccessibilityFocused()) {
+ child.clearAccessibilityFocus();
+ }
mRecycler.addScrapView(child, position);
}
}
@@ -6664,8 +6681,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
lp.scrappedFromPosition = position;
- // Don't scrap header or footer views, or views that should
- // otherwise not be recycled.
+ // Remove but don't scrap header or footer views, or views that
+ // should otherwise not be recycled.
final int viewType = lp.viewType;
if (!shouldRecycleViewType(viewType)) {
return;
@@ -6704,6 +6721,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
mScrapViews[viewType].add(scrap);
}
+ // Clear any system-managed transient state.
+ if (scrap.isAccessibilityFocused()) {
+ scrap.clearAccessibilityFocus();
+ }
+
scrap.setAccessibilityDelegate(null);
if (mRecyclerListener != null) {
diff --git a/core/java/android/widget/EdgeEffect.java b/core/java/android/widget/EdgeEffect.java
index bb4a4cff902c..30752e00d542 100644
--- a/core/java/android/widget/EdgeEffect.java
+++ b/core/java/android/widget/EdgeEffect.java
@@ -68,6 +68,8 @@ public class EdgeEffect {
// Minimum velocity that will be absorbed
private static final int MIN_VELOCITY = 100;
+ // Maximum velocity, clamps at this value
+ private static final int MAX_VELOCITY = 10000;
private static final float EPSILON = 0.001f;
@@ -115,7 +117,7 @@ public class EdgeEffect {
private static final float PULL_DISTANCE_ALPHA_GLOW_FACTOR = 1.1f;
private static final int VELOCITY_EDGE_FACTOR = 8;
- private static final int VELOCITY_GLOW_FACTOR = 16;
+ private static final int VELOCITY_GLOW_FACTOR = 12;
private int mState = STATE_IDLE;
@@ -283,10 +285,10 @@ public class EdgeEffect {
*/
public void onAbsorb(int velocity) {
mState = STATE_ABSORB;
- velocity = Math.max(MIN_VELOCITY, Math.abs(velocity));
+ velocity = Math.min(Math.max(MIN_VELOCITY, Math.abs(velocity)), MAX_VELOCITY);
mStartTime = AnimationUtils.currentAnimationTimeMillis();
- mDuration = 0.1f + (velocity * 0.03f);
+ mDuration = 0.15f + (velocity * 0.02f);
// The edge should always be at least partially visible, regardless
// of velocity.
@@ -294,7 +296,7 @@ public class EdgeEffect {
mEdgeScaleY = mEdgeScaleYStart = 0.f;
// The glow depends more on the velocity, and therefore starts out
// nearly invisible.
- mGlowAlphaStart = 0.5f;
+ mGlowAlphaStart = 0.3f;
mGlowScaleYStart = 0.f;
// Factor the velocity by 8. Testing on device shows this works best to
diff --git a/core/java/com/android/internal/app/ProcessStats.java b/core/java/com/android/internal/app/ProcessStats.java
index a95bac818c8b..430e43a2c59b 100644
--- a/core/java/com/android/internal/app/ProcessStats.java
+++ b/core/java/com/android/internal/app/ProcessStats.java
@@ -44,6 +44,7 @@ import java.util.Objects;
public final class ProcessStats implements Parcelable {
static final String TAG = "ProcessStats";
static final boolean DEBUG = false;
+ static final boolean DEBUG_PARCEL = false;
public static final String SERVICE_NAME = "procstats";
@@ -1076,7 +1077,7 @@ public final class ProcessStats implements Parcelable {
final int[] table = new int[size];
for (int i=0; i<size; i++) {
table[i] = in.readInt();
- if (DEBUG) Slog.i(TAG, "Reading in " + name + " table #" + i + ": "
+ if (DEBUG_PARCEL) Slog.i(TAG, "Reading in " + name + " table #" + i + ": "
+ ProcessStats.printLongOffset(table[i]));
if (!validateLongOffset(table[i])) {
Slog.w(TAG, "Ignoring existing stats; bad " + what + " table entry: "
@@ -1294,10 +1295,10 @@ public final class ProcessStats implements Parcelable {
byte[] data = new byte[initialAvail > 0 ? (initialAvail+1) : 16384];
while (true) {
int amt = stream.read(data, pos, data.length-pos);
- if (DEBUG) Slog.i("foo", "Read " + amt + " bytes at " + pos
+ if (DEBUG_PARCEL) Slog.i("foo", "Read " + amt + " bytes at " + pos
+ " of avail " + data.length);
if (amt < 0) {
- if (DEBUG) Slog.i("foo", "**** FINISHED READING: pos=" + pos
+ if (DEBUG_PARCEL) Slog.i("foo", "**** FINISHED READING: pos=" + pos
+ " len=" + data.length);
outLen[0] = pos;
return data;
@@ -1305,7 +1306,7 @@ public final class ProcessStats implements Parcelable {
pos += amt;
if (pos >= data.length) {
byte[] newData = new byte[pos+16384];
- if (DEBUG) Slog.i(TAG, "Copying " + pos + " bytes to new array len "
+ if (DEBUG_PARCEL) Slog.i(TAG, "Copying " + pos + " bytes to new array len "
+ newData.length);
System.arraycopy(data, 0, newData, 0, pos);
data = newData;
@@ -1422,12 +1423,13 @@ public final class ProcessStats implements Parcelable {
return;
}
}
- if (DEBUG) Slog.d(TAG, "Adding process: " + procName + " " + uid + " " + proc);
+ if (DEBUG_PARCEL) Slog.d(TAG, "Adding process: " + procName + " " + uid
+ + " " + proc);
mProcesses.put(procName, uid, proc);
}
}
- if (DEBUG) Slog.d(TAG, "Read " + mProcesses.getMap().size() + " processes");
+ if (DEBUG_PARCEL) Slog.d(TAG, "Read " + mProcesses.getMap().size() + " processes");
int NPKG = in.readInt();
if (NPKG < 0) {
@@ -1468,10 +1470,10 @@ public final class ProcessStats implements Parcelable {
return;
}
int hasProc = in.readInt();
- if (DEBUG) Slog.d(TAG, "Reading package " + pkgName + " " + uid
+ if (DEBUG_PARCEL) Slog.d(TAG, "Reading package " + pkgName + " " + uid
+ " process " + procName + " hasProc=" + hasProc);
ProcessState commonProc = mProcesses.get(procName, uid);
- if (DEBUG) Slog.d(TAG, "Got common proc " + procName + " " + uid
+ if (DEBUG_PARCEL) Slog.d(TAG, "Got common proc " + procName + " " + uid
+ ": " + commonProc);
if (commonProc == null) {
mReadError = "no common proc: " + procName;
@@ -1493,11 +1495,11 @@ public final class ProcessStats implements Parcelable {
return;
}
}
- if (DEBUG) Slog.d(TAG, "Adding package " + pkgName + " process: "
+ if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: "
+ procName + " " + uid + " " + proc);
pkgState.mProcesses.put(procName, proc);
} else {
- if (DEBUG) Slog.d(TAG, "Adding package " + pkgName + " process: "
+ if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: "
+ procName + " " + uid + " " + commonProc);
pkgState.mProcesses.put(procName, commonProc);
}
@@ -1522,7 +1524,7 @@ public final class ProcessStats implements Parcelable {
if (!serv.readFromParcel(in)) {
return;
}
- if (DEBUG) Slog.d(TAG, "Adding package " + pkgName + " service: "
+ if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " service: "
+ serviceName + " " + uid + " " + serv);
pkgState.mServices.put(serviceName, serv);
}
@@ -1531,7 +1533,7 @@ public final class ProcessStats implements Parcelable {
mIndexToCommonString = null;
- if (DEBUG) Slog.d(TAG, "Successfully read procstats!");
+ if (DEBUG_PARCEL) Slog.d(TAG, "Successfully read procstats!");
}
int addLongData(int index, int type, int num) {
@@ -1577,7 +1579,7 @@ public final class ProcessStats implements Parcelable {
if (idx >= LONGS_SIZE) {
return false;
}
- if (DEBUG) Slog.d(TAG, "Validated long " + printLongOffset(off)
+ if (DEBUG_PARCEL) Slog.d(TAG, "Validated long " + printLongOffset(off)
+ ": " + getLong(off, 0));
return true;
}
@@ -1639,13 +1641,16 @@ public final class ProcessStats implements Parcelable {
if (commonProc == null) {
commonProc = new ProcessState(this, packageName, uid, processName);
mProcesses.put(processName, uid, commonProc);
+ if (DEBUG) Slog.d(TAG, "GETPROC created new common " + commonProc);
}
if (!commonProc.mMultiPackage) {
if (packageName.equals(commonProc.mPackage)) {
// This common process is not in use by multiple packages, and
// is for the calling package, so we can just use it directly.
ps = commonProc;
+ if (DEBUG) Slog.d(TAG, "GETPROC also using for pkg " + commonProc);
} else {
+ if (DEBUG) Slog.d(TAG, "GETPROC need to split common proc!");
// This common process has not been in use by multiple packages,
// but it was created for a different package than the caller.
// We need to convert it to a multi-package process.
@@ -1659,22 +1664,39 @@ public final class ProcessStats implements Parcelable {
// that under the now unique state for its original package name.
final PackageState commonPkgState = getPackageStateLocked(commonProc.mPackage, uid);
if (commonPkgState != null) {
- commonPkgState.mProcesses.put(commonProc.mName, commonProc.clone(
- commonProc.mPackage, now));
+ ProcessState cloned = commonProc.clone(commonProc.mPackage, now);
+ if (DEBUG) Slog.d(TAG, "GETPROC setting clone to pkg " + commonProc.mPackage
+ + ": " + cloned);
+ commonPkgState.mProcesses.put(commonProc.mName, cloned);
+ // If this has active services, we need to update their process pointer
+ // to point to the new package-specific process state.
+ for (int i=commonPkgState.mServices.size()-1; i>=0; i--) {
+ ServiceState ss = commonPkgState.mServices.valueAt(i);
+ if (ss.mProc == commonProc) {
+ if (DEBUG) Slog.d(TAG, "GETPROC switching service to cloned: "
+ + ss);
+ ss.mProc = cloned;
+ } else if (DEBUG) {
+ Slog.d(TAG, "GETPROC leaving proc of " + ss);
+ }
+ }
} else {
Slog.w(TAG, "Cloning proc state: no package state " + commonProc.mPackage
+ "/" + uid + " for proc " + commonProc.mName);
}
// And now make a fresh new process state for the new package name.
ps = new ProcessState(commonProc, packageName, uid, processName, now);
+ if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps);
}
} else {
// The common process is for multiple packages, we need to create a
// separate object for the per-package data.
ps = new ProcessState(commonProc, packageName, uid, processName,
SystemClock.uptimeMillis());
+ if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps);
}
pkgState.mProcesses.put(processName, ps);
+ if (DEBUG) Slog.d(TAG, "GETPROC adding new pkg " + ps);
return ps;
}
@@ -1683,12 +1705,14 @@ public final class ProcessStats implements Parcelable {
final ProcessStats.PackageState as = getPackageStateLocked(packageName, uid);
ProcessStats.ServiceState ss = as.mServices.get(className);
if (ss != null) {
+ if (DEBUG) Slog.d(TAG, "GETSVC: returning existing " + ss);
return ss;
}
final ProcessStats.ProcessState ps = processName != null
? getProcessStateLocked(packageName, uid, processName) : null;
ss = new ProcessStats.ServiceState(this, packageName, className, processName, ps);
as.mServices.put(className, ss);
+ if (DEBUG) Slog.d(TAG, "GETSVC: creating " + ss + " in " + ps);
return ss;
}
@@ -1719,7 +1743,7 @@ public final class ProcessStats implements Parcelable {
}
public void dumpLocked(PrintWriter pw, String reqPackage, long now, boolean dumpSummary,
- boolean dumpAll) {
+ boolean dumpAll, boolean activeOnly) {
long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor,
mStartTime, now);
ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap();
@@ -1746,6 +1770,11 @@ public final class ProcessStats implements Parcelable {
if (!dumpSummary || dumpAll) {
for (int iproc=0; iproc<NPROCS; iproc++) {
ProcessState proc = pkgState.mProcesses.valueAt(iproc);
+ if (activeOnly && !proc.isInUse()) {
+ pw.print(" (Not active: ");
+ pw.print(pkgState.mProcesses.keyAt(iproc)); pw.println(")");
+ continue;
+ }
pw.print(" Process ");
pw.print(pkgState.mProcesses.keyAt(iproc));
pw.print(" (");
@@ -1761,12 +1790,22 @@ public final class ProcessStats implements Parcelable {
} else {
ArrayList<ProcessState> procs = new ArrayList<ProcessState>();
for (int iproc=0; iproc<NPROCS; iproc++) {
- procs.add(pkgState.mProcesses.valueAt(iproc));
+ ProcessState proc = pkgState.mProcesses.valueAt(iproc);
+ if (activeOnly && !proc.isInUse()) {
+ continue;
+ }
+ procs.add(proc);
}
dumpProcessSummaryLocked(pw, " ", procs, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
NON_CACHED_PROC_STATES, now, totalTime);
}
for (int isvc=0; isvc<NSRVS; isvc++) {
+ ServiceState svc = pkgState.mServices.valueAt(isvc);
+ if (activeOnly && !svc.isInUse()) {
+ pw.print(" (Not active: ");
+ pw.print(pkgState.mServices.keyAt(isvc)); pw.println(")");
+ continue;
+ }
if (dumpAll) {
pw.print(" Service ");
} else {
@@ -1774,7 +1813,6 @@ public final class ProcessStats implements Parcelable {
}
pw.print(pkgState.mServices.keyAt(isvc));
pw.println(":");
- ServiceState svc = pkgState.mServices.valueAt(isvc);
pw.print(" Process: "); pw.println(svc.mProcessName);
dumpServiceStats(pw, " ", " ", " ", "Running", svc,
svc.mRunCount, ServiceState.SERVICE_RUN, svc.mRunState,
@@ -1789,7 +1827,9 @@ public final class ProcessStats implements Parcelable {
svc.mExecCount, ServiceState.SERVICE_EXEC, svc.mExecState,
svc.mExecStartTime, now, totalTime, !dumpSummary || dumpAll);
if (dumpAll) {
- pw.print(" mActive="); pw.println(svc.mActive);
+ if (svc.mOwner != null) {
+ pw.print(" mOwner="); pw.println(svc.mOwner);
+ }
}
}
}
@@ -1816,6 +1856,10 @@ public final class ProcessStats implements Parcelable {
pw.println("Per-Process Stats:");
printedHeader = true;
}
+ if (activeOnly && !proc.isInUse()) {
+ pw.print(" (Not active: "); pw.print(procName); pw.println(")");
+ continue;
+ }
pw.print(" * "); pw.print(procName); pw.print(" / ");
UserHandle.formatUid(pw, uid);
pw.print(" ("); pw.print(proc.mDurationsTableSize);
@@ -1838,7 +1882,7 @@ public final class ProcessStats implements Parcelable {
pw.println();
if (dumpSummary) {
pw.println("Summary:");
- dumpSummaryLocked(pw, reqPackage, now);
+ dumpSummaryLocked(pw, reqPackage, now, activeOnly);
} else {
dumpTotalsLocked(pw, now);
}
@@ -1916,11 +1960,11 @@ public final class ProcessStats implements Parcelable {
}
}
- public void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now) {
+ public void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now, boolean activeOnly) {
long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor,
mStartTime, now);
dumpFilteredSummaryLocked(pw, null, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ,
- ALL_PROC_STATES, NON_CACHED_PROC_STATES, now, totalTime, reqPackage);
+ ALL_PROC_STATES, NON_CACHED_PROC_STATES, now, totalTime, reqPackage, activeOnly);
pw.println();
dumpTotalsLocked(pw, now);
}
@@ -1961,9 +2005,9 @@ public final class ProcessStats implements Parcelable {
void dumpFilteredSummaryLocked(PrintWriter pw, String header, String prefix,
int[] screenStates, int[] memStates, int[] procStates,
- int[] sortProcStates, long now, long totalTime, String reqPackage) {
+ int[] sortProcStates, long now, long totalTime, String reqPackage, boolean activeOnly) {
ArrayList<ProcessState> procs = collectProcessesLocked(screenStates, memStates,
- procStates, sortProcStates, now, reqPackage);
+ procStates, sortProcStates, now, reqPackage, activeOnly);
if (procs.size() > 0) {
if (header != null) {
pw.println();
@@ -1975,7 +2019,8 @@ public final class ProcessStats implements Parcelable {
}
public ArrayList<ProcessState> collectProcessesLocked(int[] screenStates, int[] memStates,
- int[] procStates, int sortProcStates[], long now, String reqPackage) {
+ int[] procStates, int sortProcStates[], long now, String reqPackage,
+ boolean activeOnly) {
ArraySet<ProcessState> foundProcs = new ArraySet<ProcessState>();
ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap();
for (int ip=0; ip<pkgMap.size(); ip++) {
@@ -1987,6 +2032,9 @@ public final class ProcessStats implements Parcelable {
PackageState state = procs.valueAt(iu);
for (int iproc=0; iproc<state.mProcesses.size(); iproc++) {
ProcessState proc = state.mProcesses.valueAt(iproc);
+ if (activeOnly && !proc.isInUse()) {
+ continue;
+ }
foundProcs.add(proc.mCommonProcess);
}
}
@@ -1994,8 +2042,7 @@ public final class ProcessStats implements Parcelable {
ArrayList<ProcessState> outProcs = new ArrayList<ProcessState>(foundProcs.size());
for (int i=0; i<foundProcs.size(); i++) {
ProcessState proc = foundProcs.valueAt(i);
- if (computeProcessTimeLocked(proc, screenStates, memStates,
- procStates, now) > 0) {
+ if (computeProcessTimeLocked(proc, screenStates, memStates, procStates, now) > 0) {
outProcs.add(proc);
if (procStates != sortProcStates) {
computeProcessTimeLocked(proc, screenStates, memStates, sortProcStates, now);
@@ -2229,7 +2276,7 @@ public final class ProcessStats implements Parcelable {
void writeDurationsToParcel(Parcel out) {
out.writeInt(mDurationsTableSize);
for (int i=0; i<mDurationsTableSize; i++) {
- if (DEBUG) Slog.i(TAG, "Writing in " + mName + " dur #" + i + ": "
+ if (DEBUG_PARCEL) Slog.i(TAG, "Writing in " + mName + " dur #" + i + ": "
+ printLongOffset(mDurationsTable[i]));
out.writeInt(mDurationsTable[i]);
}
@@ -2350,6 +2397,7 @@ public final class ProcessStats implements Parcelable {
pnew.mAvgCachedKillPss = mAvgCachedKillPss;
pnew.mMaxCachedKillPss = mMaxCachedKillPss;
pnew.mActive = mActive;
+ pnew.mNumActiveServices = mNumActiveServices;
pnew.mNumStartedServices = mNumStartedServices;
return pnew;
}
@@ -2396,7 +2444,7 @@ public final class ProcessStats implements Parcelable {
if (!mDead) {
return;
}
- throw new IllegalStateException("ProcessState dead: name=" + mName
+ Slog.wtfStack(TAG, "ProcessState dead: name=" + mName
+ " pkg=" + mPackage + " uid=" + mUid + " common.name=" + mCommonProcess.mName);
}
@@ -2405,7 +2453,7 @@ public final class ProcessStats implements Parcelable {
writeDurationsToParcel(out);
out.writeInt(mPssTableSize);
for (int i=0; i<mPssTableSize; i++) {
- if (DEBUG) Slog.i(TAG, "Writing in " + mName + " pss #" + i + ": "
+ if (DEBUG_PARCEL) Slog.i(TAG, "Writing in " + mName + " pss #" + i + ": "
+ printLongOffset(mPssTable[i]));
out.writeInt(mPssTable[i]);
}
@@ -2424,11 +2472,11 @@ public final class ProcessStats implements Parcelable {
if (fully) {
mMultiPackage = multiPackage;
}
- if (DEBUG) Slog.d(TAG, "Reading durations table...");
+ if (DEBUG_PARCEL) Slog.d(TAG, "Reading durations table...");
if (!readDurationsFromParcel(in)) {
return false;
}
- if (DEBUG) Slog.d(TAG, "Reading pss table...");
+ if (DEBUG_PARCEL) Slog.d(TAG, "Reading pss table...");
mPssTable = mStats.readTableFromParcel(in, mName, "pss");
if (mPssTable == BAD_TABLE) {
return false;
@@ -2512,21 +2560,34 @@ public final class ProcessStats implements Parcelable {
mStartTime = now;
}
- void incActiveServices() {
+ void incActiveServices(String serviceName) {
+ if (DEBUG && "".equals(mName)) {
+ RuntimeException here = new RuntimeException("here");
+ here.fillInStackTrace();
+ Slog.d(TAG, "incActiveServices: " + this + " service=" + serviceName
+ + " to " + (mNumActiveServices+1), here);
+ }
if (mCommonProcess != this) {
- mCommonProcess.incActiveServices();
+ mCommonProcess.incActiveServices(serviceName);
}
mNumActiveServices++;
}
- void decActiveServices() {
+ void decActiveServices(String serviceName) {
+ if (DEBUG && "".equals(mName)) {
+ RuntimeException here = new RuntimeException("here");
+ here.fillInStackTrace();
+ Slog.d(TAG, "decActiveServices: " + this + " service=" + serviceName
+ + " to " + (mNumActiveServices-1), here);
+ }
if (mCommonProcess != this) {
- mCommonProcess.decActiveServices();
+ mCommonProcess.decActiveServices(serviceName);
}
mNumActiveServices--;
if (mNumActiveServices < 0) {
- throw new IllegalStateException("Proc active services underrun: pkg="
- + mPackage + " uid=" + mUid + " name=" + mName);
+ Slog.wtfStack(TAG, "Proc active services underrun: pkg=" + mPackage
+ + " uid=" + mUid + " proc=" + mName + " service=" + serviceName);
+ mNumActiveServices = 0;
}
}
@@ -2548,8 +2609,9 @@ public final class ProcessStats implements Parcelable {
if (mNumStartedServices == 0 && mCurState == STATE_SERVICE_RESTARTING) {
setState(STATE_NOTHING, memFactor, now, null);
} else if (mNumStartedServices < 0) {
- throw new IllegalStateException("Proc started services underrun: pkg="
+ Slog.wtfStack(TAG, "Proc started services underrun: pkg="
+ mPackage + " uid=" + mUid + " name=" + mName);
+ mNumStartedServices = 0;
}
}
@@ -2689,8 +2751,7 @@ public final class ProcessStats implements Parcelable {
// The array map is still pointing to a common process state
// that is now shared across packages. Update it to point to
// the new per-package state.
- ProcessState proc = mStats.mPackages.get(pkgName,
- mUid).mProcesses.get(mName);
+ ProcessState proc = mStats.mPackages.get(pkgName, mUid).mProcesses.get(mName);
if (proc == null) {
throw new IllegalStateException("Didn't create per-package process");
}
@@ -2717,11 +2778,13 @@ public final class ProcessStats implements Parcelable {
PackageState pkg = mStats.mPackages.get(pkgList.keyAt(index), proc.mUid);
if (pkg == null) {
throw new IllegalStateException("No existing package "
- + pkgList.keyAt(index) + " for multi-proc " + proc.mName);
+ + pkgList.keyAt(index) + "/" + proc.mUid
+ + " for multi-proc " + proc.mName);
}
proc = pkg.mProcesses.get(proc.mName);
if (proc == null) {
- throw new IllegalStateException("Didn't create per-package process");
+ throw new IllegalStateException("Didn't create per-package process "
+ + proc.mName + " in pkg " + pkg.mPackageName + "/" + pkg.mUid);
}
pkgList.setValueAt(index, proc);
}
@@ -2770,6 +2833,17 @@ public final class ProcessStats implements Parcelable {
int idx = binarySearch(mPssTable, mPssTableSize, state);
return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_MAXIMUM) : 0;
}
+
+ public String toString() {
+ StringBuilder sb = new StringBuilder(128);
+ sb.append("ProcessState{").append(Integer.toHexString(System.identityHashCode(this)))
+ .append(" ").append(mName).append("/").append(mUid)
+ .append(" pkg=").append(mPackage);
+ if (mMultiPackage) sb.append(" (multi)");
+ if (mCommonProcess != this) sb.append(" (sub)");
+ sb.append("}");
+ return sb.toString();
+ }
}
public static final class ServiceState extends DurationsTable {
@@ -2777,7 +2851,7 @@ public final class ProcessStats implements Parcelable {
public final String mProcessName;
ProcessState mProc;
- int mActive = 0;
+ Object mOwner;
public static final int SERVICE_RUN = 0;
public static final int SERVICE_STARTED = 1;
@@ -2809,27 +2883,69 @@ public final class ProcessStats implements Parcelable {
mProc = proc;
}
- public void makeActive() {
- if (mActive == 0) {
- mProc.incActiveServices();
+ public void applyNewOwner(Object newOwner) {
+ if (mOwner != newOwner) {
+ if (mOwner == null) {
+ mOwner = newOwner;
+ mProc.incActiveServices(mName);
+ } else {
+ // There was already an old owner, reset this object for its
+ // new owner.
+ mOwner = newOwner;
+ if (mStartedState != STATE_NOTHING || mBoundState != STATE_NOTHING
+ || mExecState != STATE_NOTHING) {
+ long now = SystemClock.uptimeMillis();
+ if (mStartedState != STATE_NOTHING) {
+ if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner
+ + " from " + mOwner + " while started: pkg="
+ + mPackage + " service=" + mName + " proc=" + mProc);
+ setStarted(false, 0, now);
+ }
+ if (mBoundState != STATE_NOTHING) {
+ if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner
+ + " from " + mOwner + " while bound: pkg="
+ + mPackage + " service=" + mName + " proc=" + mProc);
+ setBound(false, 0, now);
+ }
+ if (mExecState != STATE_NOTHING) {
+ if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner
+ + " from " + mOwner + " while executing: pkg="
+ + mPackage + " service=" + mName + " proc=" + mProc);
+ setExecuting(false, 0, now);
+ }
+ }
+ }
}
- mActive++;
}
- public void makeInactive() {
- /*
- RuntimeException here = new RuntimeException("here");
- here.fillInStackTrace();
- Slog.i(TAG, "Making " + this + " inactive", here);
- */
- mActive--;
- if (mActive == 0) {
- mProc.decActiveServices();
+ public void clearCurrentOwner(Object owner) {
+ if (mOwner == owner) {
+ mOwner = null;
+ mProc.decActiveServices(mName);
+ if (mStartedState != STATE_NOTHING || mBoundState != STATE_NOTHING
+ || mExecState != STATE_NOTHING) {
+ long now = SystemClock.uptimeMillis();
+ if (mStartedState != STATE_NOTHING) {
+ Slog.wtfStack(TAG, "Service owner " + owner + " cleared while started: pkg="
+ + mPackage + " service=" + mName + " proc=" + mProc);
+ setStarted(false, 0, now);
+ }
+ if (mBoundState != STATE_NOTHING) {
+ Slog.wtfStack(TAG, "Service owner " + owner + " cleared while bound: pkg="
+ + mPackage + " service=" + mName + " proc=" + mProc);
+ setBound(false, 0, now);
+ }
+ if (mExecState != STATE_NOTHING) {
+ Slog.wtfStack(TAG, "Service owner " + owner + " cleared while exec: pkg="
+ + mPackage + " service=" + mName + " proc=" + mProc);
+ setExecuting(false, 0, now);
+ }
+ }
}
}
public boolean isInUse() {
- return mActive > 0;
+ return mOwner != null;
}
void add(ServiceState other) {
@@ -2904,8 +3020,8 @@ public final class ProcessStats implements Parcelable {
}
public void setStarted(boolean started, int memFactor, long now) {
- if (mActive <= 0) {
- throw new IllegalStateException("Service " + this + " has mActive=" + mActive);
+ if (mOwner == null) {
+ Slog.wtf(TAG, "Starting service " + this + " without owner");
}
final boolean wasStarted = mStartedState != STATE_NOTHING;
final int state = started ? memFactor : STATE_NOTHING;
@@ -2931,8 +3047,8 @@ public final class ProcessStats implements Parcelable {
}
public void setBound(boolean bound, int memFactor, long now) {
- if (mActive <= 0) {
- throw new IllegalStateException("Service " + this + " has mActive=" + mActive);
+ if (mOwner == null) {
+ Slog.wtf(TAG, "Binding service " + this + " without owner");
}
final int state = bound ? memFactor : STATE_NOTHING;
if (mBoundState != state) {
@@ -2949,8 +3065,8 @@ public final class ProcessStats implements Parcelable {
}
public void setExecuting(boolean executing, int memFactor, long now) {
- if (mActive <= 0) {
- throw new IllegalStateException("Service " + this + " has mActive=" + mActive);
+ if (mOwner == null) {
+ Slog.wtf(TAG, "Executing service " + this + " without owner");
}
final int state = executing ? memFactor : STATE_NOTHING;
if (mExecState != state) {
@@ -2974,6 +3090,12 @@ public final class ProcessStats implements Parcelable {
}
return time;
}
+
+ public String toString() {
+ return "ServiceState{" + Integer.toHexString(System.identityHashCode(this))
+ + " " + mName + " pkg=" + mPackage + " proc="
+ + Integer.toHexString(System.identityHashCode(this)) + "}";
+ }
}
public static final class PackageState {
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index 05fd613ee659..cd853b62e622 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -100,8 +100,20 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte
@Override
protected void onCreate(Bundle savedInstanceState) {
- onCreate(savedInstanceState, makeMyIntent(),
- getResources().getText(com.android.internal.R.string.whichApplication),
+ // Use a specialized prompt when we're handling the 'Home' app startActivity()
+ final int titleResource;
+ final Intent intent = makeMyIntent();
+ final Set<String> categories = intent.getCategories();
+ if (Intent.ACTION_MAIN.equals(intent.getAction())
+ && categories != null
+ && categories.size() == 1
+ && categories.contains(Intent.CATEGORY_HOME)) {
+ titleResource = com.android.internal.R.string.whichHomeApplication;
+ } else {
+ titleResource = com.android.internal.R.string.whichApplication;
+ }
+
+ onCreate(savedInstanceState, intent, getResources().getText(titleResource),
null, null, true);
}
diff --git a/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_dark.png b/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_dark.png
index 266ac98358af..7de0448775ac 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_light.png b/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_light.png
index 49b375f353e9..5b916c987f2e 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_grayedout_printer.png b/core/res/res/drawable-hdpi/ic_grayedout_printer.png
new file mode 100644
index 000000000000..5e54970d6b3f
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_grayedout_printer.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/overscroll_edge.png b/core/res/res/drawable-hdpi/overscroll_edge.png
index 08fc02262971..1952e0ed3ac3 100644
--- a/core/res/res/drawable-hdpi/overscroll_edge.png
+++ b/core/res/res/drawable-hdpi/overscroll_edge.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/overscroll_glow.png b/core/res/res/drawable-hdpi/overscroll_glow.png
index 8f0c2cb04f0e..45c01353296e 100644
--- a/core/res/res/drawable-hdpi/overscroll_glow.png
+++ b/core/res/res/drawable-hdpi/overscroll_glow.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_dark.png b/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_dark.png
index af5c463c2963..eafc5538be7f 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_light.png b/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_light.png
index 819c55258756..6583e99b044f 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_grayedout_printer.png b/core/res/res/drawable-mdpi/ic_grayedout_printer.png
new file mode 100644
index 000000000000..5e54970d6b3f
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_grayedout_printer.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/overscroll_edge.png b/core/res/res/drawable-mdpi/overscroll_edge.png
index 4c87a8bce61f..baf2d0c400af 100644
--- a/core/res/res/drawable-mdpi/overscroll_edge.png
+++ b/core/res/res/drawable-mdpi/overscroll_edge.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/overscroll_glow.png b/core/res/res/drawable-mdpi/overscroll_glow.png
index 8389ef4c5820..c6cddd42220d 100644
--- a/core/res/res/drawable-mdpi/overscroll_glow.png
+++ b/core/res/res/drawable-mdpi/overscroll_glow.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png b/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png
index 0e1b9484e510..028eed6a3645 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png b/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png
index 8d8aabc78097..61efd3ab2784 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_grayedout_printer.png b/core/res/res/drawable-xhdpi/ic_grayedout_printer.png
new file mode 100644
index 000000000000..5e54970d6b3f
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_grayedout_printer.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/overscroll_edge.png b/core/res/res/drawable-xhdpi/overscroll_edge.png
index 4fe6c273717c..b5e6e61cd02c 100644
--- a/core/res/res/drawable-xhdpi/overscroll_edge.png
+++ b/core/res/res/drawable-xhdpi/overscroll_edge.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/overscroll_glow.png b/core/res/res/drawable-xhdpi/overscroll_glow.png
index 75c3eb487714..779c3a590309 100644
--- a/core/res/res/drawable-xhdpi/overscroll_glow.png
+++ b/core/res/res/drawable-xhdpi/overscroll_glow.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_check_on_pressed_holo_dark.png b/core/res/res/drawable-xxhdpi/btn_check_on_pressed_holo_dark.png
index 81b0f8797c72..668548b11ee0 100644
--- a/core/res/res/drawable-xxhdpi/btn_check_on_pressed_holo_dark.png
+++ b/core/res/res/drawable-xxhdpi/btn_check_on_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/overscroll_edge.png b/core/res/res/drawable-xxhdpi/overscroll_edge.png
index 1a927373cbe2..734bfa762777 100644
--- a/core/res/res/drawable-xxhdpi/overscroll_edge.png
+++ b/core/res/res/drawable-xxhdpi/overscroll_edge.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/overscroll_glow.png b/core/res/res/drawable-xxhdpi/overscroll_glow.png
index c187e95e7b37..dc1f2795f9ba 100644
--- a/core/res/res/drawable-xxhdpi/overscroll_glow.png
+++ b/core/res/res/drawable-xxhdpi/overscroll_glow.png
Binary files differ
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 3f3b0bf0ccae..8d4bec8ef79e 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"gaan in by Bluetooth-instellings"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Laat die program toe om die plaaslike Bluetooth-tablet op te stel, en om met afstandbeheer toestelle saam te bind."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Laat die program toe om die plaaslike Bluetooth-foon op te stel en te ontdek en met afgeleë toestelle saam te bind."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"laat program saambind deur Bluetooth"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Laat die program sonder gebruikerinteraksie met afgeleë toestelle saambind."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Laat die program sonder gebruikerinteraksie met afgeleë toestelle saambind."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"koppel aan en ontkoppel van WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Laat die program toe om te bepaal of WiMAX geaktiveer is en of enige WiMAX-netwerke gekoppel is."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Verander WiMAX-status"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Probeer later weer"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Sleep van bo af na onder om volskerm te verlaat"</string>
+ <string name="done_label" msgid="2093726099505892398">"Klaar"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Ure se sirkelglyer"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Minute se sirkelglyer"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Kies ure"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Kies minute"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Maandrooster van dae"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Jaarlys"</string>
+ <string name="select_day" msgid="7774759604701773332">"Kies maand en dag"</string>
+ <string name="select_year" msgid="7952052866994196170">"Kies jaar"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> gekies"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> uitgevee"</string>
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index b263bec50391..9214d117fb42 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"የብሉቱዝ ቅንብሮችን ድረስባቸው"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"የአካባቢውን ብሉቱዝ ጡባዊ ለማዋቀር እና አግኝቶ ከሩቅ መሣሪያዎች ጋር ለማጣመር ለመተግበሪያው ይፈቅዳሉ።"</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"የአካባቢውን ብሉቱዝ ጡባዊ ለማዋቀር እና አግኝቶ ከሩቅ መሣሪያዎች ጋር ለማጣመር ለመተግበሪያው ይፈቅዳሉ።"</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"በመተግበሪያ የብሉቱዝ ማጣመር ይፍቀዱ"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"መተግበሪያው ያለተጠቃሚ ጣልቃ-ገብነት ከርቀት መሣሪያዎች ጋር እንዲጣመር ያስችለዋል።"</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"መተግበሪያው ያለተጠቃሚ ጣልቃ-ገብነት ከርቀት መሣሪያዎች ጋር እንዲጣመር ያስችለዋል።"</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"ከWiMAX ጋር ይገናኙ እና ያላቅቁ"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"መተግበሪያው WiMAX እንደነቃ እና ስለማናቸውም የተገናኙ የWiMAX አውታረ መረቦች መረጃ እንዲወስን ይፈቅድለታል።"</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"የWiMAX ሁኔታ ለውጥ"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"ቆይተው እንደገና ይሞክሩ"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"ከሙሉ ገጽ ማያ ለመውጣት ከላይ ወደታች ጣትዎን ያንቀሳቅሱ"</string>
+ <string name="done_label" msgid="2093726099505892398">"ተከናውኗል"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"የሰዓታት ክብ ተንሸራታች"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"የደቂቃዎች ክብ ተንሸራታች"</string>
+ <string name="select_hours" msgid="6043079511766008245">"ሰዓታትን ይምረጡ"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"ደቂቃዎችን ይምረጡ"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"የቀናት የወር ፍርግርግ"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"የዓመት ዝርዝር"</string>
+ <string name="select_day" msgid="7774759604701773332">"ወር እና ቀን ይምረጡ"</string>
+ <string name="select_year" msgid="7952052866994196170">"ዓመት ይምረጡ"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> ተመርጧል"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> ተሰርዟል"</string>
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index f311875150d3..3309b9db1da7 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"الدخول إلى إعدادات بلوتوث"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"للسماح للتطبيق بتهيئة لوحة البلوتوث المحلي، واكتشاف أجهزة التحكم عن بعد والاقتران بها."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"للسماح للتطبيق بتهيئة هاتف البلوتوث المحلي، واكتشاف أجهزة التحكم عن بعد والاقتران بها."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"السماح بإقران البلوتوث مع التطبيق"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"للسماح بإقران لتطبيق مع الأجهزة البعيدة بدون تدخل المستخدم."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"للسماح بإقران لتطبيق مع الأجهزة البعيدة بدون تدخل المستخدم."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"الاتصال بـشبكة WiMAX وقطع الاتصال بها"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"للسماح للتطبيق بتحديد ما إذا تم تمكين WiMAX وتحديد معلومات حول أية شبكات WiMAX متصلة."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"تغيير حالة WiMAX"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"أعد المحاولة لاحقًا"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"التمرير من أعلى لأسفل للخروج من وضع ملء الشاشة"</string>
+ <string name="done_label" msgid="2093726099505892398">"تم"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"شريط التمرير الدائري للساعات"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"شريط التمرير الدائري للدقائق"</string>
+ <string name="select_hours" msgid="6043079511766008245">"تحديد الساعات"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"تحديد الدقائق"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"شبكة الشهر مكونة من الأيام"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"قائمة الأعوام"</string>
+ <string name="select_day" msgid="7774759604701773332">"تحديد الشهر واليوم"</string>
+ <string name="select_year" msgid="7952052866994196170">"تحديد العام"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"تم تحديد <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"تم حذف <xliff:g id="KEY">%1$s</xliff:g>"</string>
</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index e92e549c699f..245079626fd5 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -645,6 +645,12 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"атрыманне доступу да налад прылады Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Дазваляе прыкладанням наладжваць лакальны планшэт Bluetooth, выяўляць і падлучаць выдаленыя прылады."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Дазваляе прыкладанням наладжваць лакальны тэлефон Bluetooth, а таксама знаходзіць выдаленыя прылады i падлучацца да ix."</string>
+ <!-- no translation found for permlab_bluetoothPriv (4009494246009513828) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetoothPriv (8045735193417468857) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetoothPriv (8045735193417468857) -->
+ <skip />
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"падключаць да WiMAX i адключаць ад яго"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Дазваляе прыкладанню вызначаць, ці ўключаны WiMAX, і інфармацыю пра любую сетку WiMAX, якая спалучана з iншымi."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Змяніць стан WiMAX"</string>
@@ -1791,4 +1797,26 @@
<skip />
<!-- no translation found for transient_navigation_confirmation (8554991488096662508) -->
<skip />
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index aea6ed495ae4..609ac4d1a523 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"достъп до настройките за Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Разрешава на приложението да конфигурира локалния таблет с Bluetooth, както и да открива и да се сдвоява с отдалечени устройства."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Разрешава на приложението да конфигурира локалния телефон с Bluetooth, както и да открива и да се сдвоява с отдалечени устройства."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"разрешаване на сдвояване чрез Bluetooth от приложението"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Разрешава на приложението да се сдвоява с отдалечени устройства без потребителско взаимодействие."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Разрешава на приложението да се сдвоява с отдалечени устройства без потребителско взаимодействие."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"установяване и прекратяване на връзката с WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Разрешава на приложението да определя дали WiMAX мрежата е активирана, както и информация за всички такива мрежи, които са свързани."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Промяна на състоянието на WiMAX мрежата"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Опитайте отново по-късно"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"За изх. от цял екр. прeк. пръст отгоре надолу"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 4bbf33a3b8cd..3f512eea6259 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -249,7 +249,7 @@
<string name="permlab_install_shortcut" msgid="4279070216371564234">"instal·la dreceres"</string>
<string name="permdesc_install_shortcut" msgid="8341295916286736996">"Permet que una aplicació afegeixi dreceres a la pantalla d\'inici sense la intervenció de l\'usuari."</string>
<string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"desinstal·la dreceres"</string>
- <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Permet que l\'aplicació suprimeixi les dreceres a la pantalla d\'inici sense la intervenció de l\'usuari."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Permet que l\'aplicació suprimeixi les dreceres de la pantalla d\'inici sense la intervenció de l\'usuari."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"desviació de les trucades sortints"</string>
<string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"Permet que l\'aplicació processi les trucades sortints i que canviï el número que es marcarà. Aquest permís permet que l\'aplicació supervisi, redirigeixi o bloquegi les trucades sortints."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"recepció de missatges de text (SMS)"</string>
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"accés a la configuració de Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permet que l\'aplicació configuri la tauleta Bluetooth local i que detecti i emparelli dispositius remots."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permet que l\'aplicació configuri el telèfon Bluetooth local i que detecti i emparelli dispositius remots."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"permet l\'emparellament de l\'aplicació mitjançant Bluetooth"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Permet que l\'aplicació s\'emparelli amb dispositius remots sense la interacció de l\'usuari."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Permet que l\'aplicació s\'emparelli amb dispositius remots sense la interacció de l\'usuari."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"connecta i desconnecta de WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permet que l\'aplicació determini si WiMAX està activat i que vegi la informació sobre totes les xarxes WiMAX que estan connectades."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Canvia l\'estat de WiMAX"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Torna-ho a provar més tard"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Fes llis. dit avall per sortir de pant. comp."</string>
+ <string name="done_label" msgid="2093726099505892398">"Fet"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Control circular de les hores"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Control circular dels minuts"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Selecciona les hores"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Selecciona els minuts"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Graella mensual de dies"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Llista anual"</string>
+ <string name="select_day" msgid="7774759604701773332">"Selecciona un mes i un dia"</string>
+ <string name="select_year" msgid="7952052866994196170">"Selecciona un any"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> seleccionat"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> suprimit"</string>
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 56015a4b000c..31d5323572a8 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"přístup do nastavení Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Umožňuje aplikaci konfigurovat místní tablet s rozhraním Bluetooth a vyhledávat a párovat vzdálená zařízení."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Umožňuje aplikaci konfigurovat místní telefon s rozhraním Bluetooth a vyhledávat a párovat vzdálená zařízení."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"povolit párování Bluetooth prostřednictvím aplikace"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Povoluje aplikaci provést be zásahu uživatele spárování se vzdálenými zařízeními."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Povoluje aplikaci provést be zásahu uživatele spárování se vzdálenými zařízeními."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"připojení a odpojení od sítě WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Umožňuje aplikaci zjistit, zda je povoleno připojení WiMAX, a také získat informace o všech připojených sítích WiMAX."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Změnit stav připojení WiMAX"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Zkuste to znovu později"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Režim celé obrazovky ukončíte přejetím dolů"</string>
+ <string name="done_label" msgid="2093726099505892398">"Hotovo"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Kruhový posuvník hodin"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Kruhový posuvník minut"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Zvolte hodiny"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Zvolte minuty"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Dny uspořádané po měsících"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Seznam roků"</string>
+ <string name="select_day" msgid="7774759604701773332">"Vyberte měsíc a den"</string>
+ <string name="select_year" msgid="7952052866994196170">"Vyberte rok"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Vybrána položka <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"Číslice <xliff:g id="KEY">%1$s</xliff:g> byla smazána"</string>
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 039a6e1612fa..ad48c48045b5 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"få adgang til Bluetooth-indstillinger"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Tillader, at appen kan konfigurere den lokale Bluetooth-tablet samt finde og parre med fjerne enheder."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Tillader, at appen kan konfigurere den lokale Bluetooth-telefon samt finde og parre med eksterne enheder."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"tillader Bluetooth-parring efter applikation"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Tillader, at appen parrer med eksterne enheder uden brugerinteraktion."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Tillader, at appen parrer med eksterne enheder uden brugerinteraktion."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"tilslut og afbryd fra WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Tillader, at appen kan bestemme, hvorvidt WiMAX er aktiveret, og oplysninger om eventuelle WiMAX-netværk, der er forbundet."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Skift WiMAX-tilstand"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Prøv igen senere"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Stryg ned fra toppen for at stoppe fuld skærm"</string>
+ <string name="done_label" msgid="2093726099505892398">"Udfør"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Cirkulær timevælger"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Cirkulær minutvælger"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Vælg timer"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Vælg minutter"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Månedsgitter med dage"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Liste over år"</string>
+ <string name="select_day" msgid="7774759604701773332">"Vælg måned og dag"</string>
+ <string name="select_year" msgid="7952052866994196170">"Vælg år"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> er valgt"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> er slettet"</string>
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index fc2f86b54f4e..ee60e054800c 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Auf Bluetooth-Einstellungen zugreifen"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Ermöglicht der App, das lokale Bluetooth-Tablet zu konfigurieren, Remote-Geräte zu erkennen und eine Verbindung zu diesen herzustellen"</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Ermöglicht der App, das lokale Bluetooth-Telefon zu konfigurieren, Remote-Geräte zu erkennen und eine Verbindung zu diesen herzustellen"</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Bluetooth-Pairing nach App ermöglichen"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Ermöglicht der App, Pairing mit Remote-Geräten ohne Eingriff des Nutzers durchzuführen"</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Ermöglicht der App, Pairing mit Remote-Geräten ohne Eingriff des Nutzers durchzuführen"</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX-Verbindungen herstellen und trennen"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Ermöglicht der App festzustellen, ob WiMAX aktiviert ist. Zudem kann sie Informationen zu verbundenen WiMAX-Netzwerken abrufen."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX-Status ändern"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Später erneut versuchen"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Zum Schließen des Vollbilds von oben nach unten wischen"</string>
+ <string name="done_label" msgid="2093726099505892398">"Fertig"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Kreisförmiger Schieberegler für Stunden"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Kreisförmiger Schieberegler für Minuten"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Stunden auswählen"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Minuten auswählen"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Monatsraster mit einzelnen Tagen"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Jahresliste"</string>
+ <string name="select_day" msgid="7774759604701773332">"Monat und Tag auswählen"</string>
+ <string name="select_year" msgid="7952052866994196170">"Jahr auswählen"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> ausgewählt"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> gelöscht"</string>
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 8318f6f91f9c..f88143e4c2ee 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"πρόσβαση στις ρυθμίσεις Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Επιτρέπει στην εφαρμογή τη διαμόρφωση του τοπικού tablet Bluetooth, τον εντοπισμό και τη σύζευξη με απομακρυσμένες συσκευές."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Επιτρέπει στην εφαρμογή τη διαμόρφωση του τοπικού tablet Bluetooth, τον εντοπισμό και τη σύζευξη με απομακρυσμένες συσκευές."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"να επιτρέπεται η σύζευξη Bluetooth ανά εφαρμογή"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Επιτρέπει στην εφαρμογή τη σύζευξη με απομακρυσμένες συσκευές χωρίς αλληλεπίδραση του χρήστη."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Επιτρέπει στην εφαρμογή τη σύζευξη με απομακρυσμένες συσκευές χωρίς αλληλεπίδραση του χρήστη."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"σύνδεση και αποσύνδεση από το WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Επιτρέπει στην εφαρμογή να προσδιορίζει εάν το WiMAX είναι ενεργοποιημένο και πληροφορίες σχετικά με τυχόν δίκτυα WiMAX που είναι συνδεδεμένα."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Αλλαγή κατάστασης WiMAX"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Δοκιμάστε ξανά αργότερα"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Σάρωση προς τα κάτω για έξοδο από πλήρη οθόνη"</string>
+ <string name="done_label" msgid="2093726099505892398">"Τέλος"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Κυκλικό ρυθμιστικό ωρών"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Κυκλικό ρυθμιστικό λεπτών"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Επιλογή ωρών"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Επιλογή λεπτών"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Πλέγμα ημερών του μήνα"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Λίστα ετών"</string>
+ <string name="select_day" msgid="7774759604701773332">"Επιλογή μήνα και ημέρας"</string>
+ <string name="select_year" msgid="7952052866994196170">"Επιλογή έτους"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Επιλέχτηκε το στοιχείο <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> διαγράφηκε"</string>
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index c634adc4be87..d5486ad0ee04 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"access Bluetooth settings"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Allows the app to configure the local Bluetooth tablet and to discover and pair with remote devices."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Allows the app to configure the local Bluetooth phone and to discover and pair with remote devices."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"allow Bluetooth pairing by Application"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Allows the app to pair with remote devices without user interaction."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Allows the app to pair with remote devices without user interaction."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"connect and disconnect from WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Allows the app to determine whether WiMAX is enabled and information about any WiMAX networks that are connected."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"change WiMAX state"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Try again later"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Swipe down from the top to exit full screen"</string>
+ <string name="done_label" msgid="2093726099505892398">"Finished"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Hours circular slider"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Minutes circular slider"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Select hours"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Select minutes"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Month grid of days"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Year list"</string>
+ <string name="select_day" msgid="7774759604701773332">"Select month and day"</string>
+ <string name="select_year" msgid="7952052866994196170">"Select year"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> selected"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> deleted"</string>
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index c634adc4be87..d5486ad0ee04 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"access Bluetooth settings"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Allows the app to configure the local Bluetooth tablet and to discover and pair with remote devices."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Allows the app to configure the local Bluetooth phone and to discover and pair with remote devices."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"allow Bluetooth pairing by Application"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Allows the app to pair with remote devices without user interaction."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Allows the app to pair with remote devices without user interaction."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"connect and disconnect from WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Allows the app to determine whether WiMAX is enabled and information about any WiMAX networks that are connected."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"change WiMAX state"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Try again later"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Swipe down from the top to exit full screen"</string>
+ <string name="done_label" msgid="2093726099505892398">"Finished"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Hours circular slider"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Minutes circular slider"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Select hours"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Select minutes"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Month grid of days"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Year list"</string>
+ <string name="select_day" msgid="7774759604701773332">"Select month and day"</string>
+ <string name="select_year" msgid="7952052866994196170">"Select year"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> selected"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> deleted"</string>
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 2dca772e415e..5b5076ca6edd 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"acceder a la configuración de Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permite que la aplicación configure la tablet Bluetooth local y descubra y se sincronice con dispositivos remotos."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permite que la aplicación configure el dispositivo Bluetooth local y descubra y se sincronice con dispositivos remotos."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"permitir que la aplicación realice la sincronización por Bluetooth"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Permite que la aplicación se sincronice con dispositivos remotos sin la interacción del usuario."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Permite que la aplicación se sincronice con dispositivos remotos sin la interacción del usuario."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"conectarse y desconectarse de WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permite que la aplicación determine si está activada la conexión WiMAX y que obtenga información sobre las redes WiMAX que están conectadas."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Cambiar el estado de WiMAX"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Vuelve a intentar más tarde."</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Salir de pantalla completa: deslizar abajo"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index ebc8b0dcab16..c78577237320 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -132,8 +132,8 @@
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Se ha agotado el espacio de almacenamiento del tablet. Elimina algunos archivos para liberar espacio."</string>
<string name="low_memory" product="default" msgid="3475999286680000541">"Se ha agotado el espacio de almacenamiento del teléfono. Elimina algunos archivos para liberar espacio."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Es posible que la red esté supervisada"</string>
- <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"De un tercero desconocido"</string>
- <string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"De <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
+ <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Por un tercero desconocido"</string>
+ <string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="me" msgid="6545696007631404292">"Yo"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opciones del tablet"</string>
<string name="power_dialog" product="default" msgid="1319919075463988638">"Opciones del teléfono"</string>
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"acceder a los ajustes de Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permite que la aplicación configure el tablet Bluetooth local y que detecte dispositivos remotos y se vincule con ellos."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permite que la aplicación configure el teléfono Bluetooth local y que detecte dispositivos remotos y se vincule con ellos."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Permitir que la aplicación sincronice el Bluetooth"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Permite que la aplicación se sincronice con dispositivos remotos sin la interacción del usuario."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Permite que la aplicación se sincronice con dispositivos remotos sin la interacción del usuario."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"conectarse a WiMAX y desconectarse de esta red"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permite que la aplicación determine si está habilitada la conexión WiMAX y obtenga información sobre las redes WiMAX que están conectadas."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Cambiar estado de WiMAX"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Volver a intentar más tarde"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Desliza hacia abajo para salir de la pantalla completa"</string>
+ <string name="done_label" msgid="2093726099505892398">"Listo"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Control deslizante circular de horas"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Control deslizante circular de minutos"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Seleccionar horas"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Seleccionar minutos"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Cuadrícula mensual de días"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Lista de años"</string>
+ <string name="select_day" msgid="7774759604701773332">"Seleccionar mes y día"</string>
+ <string name="select_year" msgid="7952052866994196170">"Seleccionar año"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> seleccionado"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> eliminado"</string>
</resources>
diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml
index 6e5834963cff..0becbc3a6096 100644
--- a/core/res/res/values-et-rEE/strings.xml
+++ b/core/res/res/values-et-rEE/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"juurdepääs Bluetoothi ​​seadetele"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Võimaldab rakendusel seadistada kohalikku Bluetooth-tahvelarvutit ning leida ja siduda seda kaugseadmetega."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Võimaldab rakendusel seadistada kohalikku Bluetooth-telefoni ning leida ja siduda seda kaugseadmetega."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"luba Bluetoothi sidumist rakendusega"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Lubab rakendusel siduda ennast kaugseadmetega kasutaja sekkumiseta."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Lubab rakendusel siduda ennast kaugseadmetega kasutaja sekkumiseta."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX-iga ühenduse loomine ja ühenduse katkestamine"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Võimaldab rakendusel määrata, kas WiMAX on lubatud, ja vaadata teavet kõikide ühendatud WiMAX-võrkude kohta."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX-i oleku muutmine"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Proovige hiljem uuesti"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Täisekraani sulgemiseks pühkige ülevalt alla"</string>
+ <string name="done_label" msgid="2093726099505892398">"Valmis"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Ringikujuline tunniliugur"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Ringikujuline minutiliugur"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Tundide valimine"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Minutite valimine"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Päevad kuu ruudustikus"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Aastate loend"</string>
+ <string name="select_day" msgid="7774759604701773332">"Kuu ja päeva valimine"</string>
+ <string name="select_year" msgid="7952052866994196170">"Aasta valimine"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> on valitud"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> on kustutatud"</string>
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index e294014315d7..3512e3e43fbe 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"دسترسی به تنظیمات بلوتوث"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"به برنامه اجازه می‎دهد تا رایانهٔ لوحی بلوتوث محلی را پیکربندی کرده، دستگاه‌های راه دور را شناسایی کرده و با آن‌ها جفت شود."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"به برنامه اجازه می‎دهد تا تلفن بلوتوث محلی را پیکربندی کند و دستگاه‌های راه دور را پیدا کند و با آن‌ها جفت شود."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"امکان جفت‌سازی بلوتوث از طریق برنامه"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"به برنامه امکان می‌دهد بدون تعامل کاربر با دستگاه‌های راه دور جفت شود."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"به برنامه امکان می‌دهد بدون تعامل کاربر با دستگاه‌های راه دور جفت شود."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"اتصال و قطع اتصال از WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"به برنامه امکان می‌دهد فعال بودن وایمکس و اطلاعات مربوط به هر یک از شبکه‌های وایمکس متصل را مشخص کند."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"تغییر وضعیت WiMAX"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"بعداً دوباره امتحان کنید"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"برای خروج از تمام صفحه از بالا به پایین بکشید"</string>
+ <string name="done_label" msgid="2093726099505892398">"انجام شد"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"لغزنده دایره‌ای ساعت"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"لغزنده دایره‌ای دقیقه"</string>
+ <string name="select_hours" msgid="6043079511766008245">"انتخاب ساعت"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"انتخاب دقیقه"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"روزهای ماه به صورت جدول"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"لیست سال‌ها"</string>
+ <string name="select_day" msgid="7774759604701773332">"انتخاب ماه و روز"</string>
+ <string name="select_year" msgid="7952052866994196170">"انتخاب سال"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> انتخاب شد"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> حذف شد"</string>
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 7876316e808f..d498af41e623 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"käytä Bluetooth-asetuksia"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Antaa sovelluksen määrittää paikallisen Bluetooth-tabletin asetukset sekä tunnistaa muita laitteita ja muodostaa niiden kanssa laitepareja."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Antaa sovelluksen määrittää paikallisen Bluetooth-puhelimen asetukset sekä tunnistaa muita laitteita ja muodostaa niiden kanssa laitepareja."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"anna sovelluksen muodostaa Bluetooth-laitepari"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Antaa sovelluksen muodostaa laiteparin etälaitteiden kanssa ilman käyttäjän toimia."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Antaa sovelluksen muodostaa laiteparin etälaitteiden kanssa ilman käyttäjän toimia."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"muodosta yhteys WiMAXiin ja katkaise yhteys"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Antaa sovelluksen määrittää, onko WiMAX käytössä, sekä saada selville tietoja WiMAX-verkoista, joihin on muodostettu yhteys."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Vaihda WiMAX-verkon tilaa"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Yritä myöhemmin uudelleen"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Poistu koko näytön tilasta liu\'uttamalla alas"</string>
+ <string name="done_label" msgid="2093726099505892398">"Valmis"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Tuntien ympyränmuotoinen liukusäädin"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Minuuttien ympyränmuotoinen liukusäädin"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Valitse tunnit"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Valitse minuutit"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Päiväruudukko kuukausittain"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Vuosiluettelo"</string>
+ <string name="select_day" msgid="7774759604701773332">"Valitse kuukausi ja päivä"</string>
+ <string name="select_year" msgid="7952052866994196170">"Valitse vuosi"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> on valittu"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> poistettiin"</string>
</resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 8c4c8bf518ce..ea56e9b9f2a7 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"accéder aux paramètres Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permet à l\'application de configurer la tablette Bluetooth locale, d\'identifier des appareils distants et de les associer à la tablette."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permet à l\'application de configurer le téléphone Bluetooth local, d\'identifier des appareils distants et de les associer au téléphone."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"autoriser l\'application à s\'associer par Bluetooth"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Permet à l\'application de s\'associer aux appareils à distance sans interaction avec l\'utilisateur."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Permet à l\'application de s\'associer aux appareils à distance sans interaction avec l\'utilisateur."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"se connecter au réseau WiMAX et s\'en déconnecter"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permet à l\'application de déterminer si le WiMAX est activé et d\'obtenir des détails sur tous les réseaux WiMAX connectés."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Modifier l\'état du WiMAX"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Réessayez plus tard"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Balayez vers le bas pour quitter plein écran"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 654810d638d7..b4792d8884b7 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"accéder aux paramètres Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permet à l\'application de configurer la tablette Bluetooth locale, d\'identifier des appareils distants et de les associer à la tablette."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permet à l\'application de configurer le téléphone Bluetooth local, d\'identifier des appareils distants et de les associer au téléphone."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"autoriser l\'application à s\'associer via le Bluetooth"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Permettre à l\'application de s\'associer aux appareils à distance sans intervention de l\'utilisateur"</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Permettre à l\'application de s\'associer aux appareils à distance sans intervention de l\'utilisateur"</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"se connecter au réseau WiMAX et s\'en déconnecter"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permet à l\'application de déterminer si le WiMAX est activé et d\'obtenir des informations sur tous les réseaux WiMAX connectés."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Modifier l\'état du WiMAX"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Veuillez réessayer ultérieurement."</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Balayer vers le bas pour quitter le plein écran"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 4b0d15682f32..ee01622f0267 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth सेटिंग पर पहुंचें"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"किसी एप्‍स को स्‍थानीय Bluetooth टेबलेट कॉन्‍फ़िगर करने की और रिमोट उपकरणों के साथ खोजने और युग्‍मित करने देता है."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"एप्‍स को स्‍थानीय Bluetooth फ़ोन कॉन्‍फ़िगर करने देता है, और रिमोट उपकरणों के साथ खोजने और युग्‍मित करने देता है."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"एप्‍लिकेशन के द्वारा Bluetooth युग्‍मन करने देती है"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"एप्‍लिकेशन को उपयोगकर्ता के इंटरैक्शन के बिना दूरस्‍थ उपकरणों के साथ युग्‍मित करने देती है."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"एप्‍लिकेशन को उपयोगकर्ता के इंटरैक्शन के बिना दूरस्‍थ उपकरणों के साथ युग्‍मित करने देती है."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX से कनेक्ट और डिस्कनेक्ट करें"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"एप्स को WiMAX सक्षम है या नहीं और कनेक्‍ट किए गए किसी WiMAX नेटवर्क के बारे में जानकारी निर्धारित करने देता है."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX स्‍थिति बदलें"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"बाद में पुनः प्रयास करें"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"पूर्ण स्क्रीन से बाहर आने हेतु ऊपर से नीचे स्वाइप करें"</string>
+ <string name="done_label" msgid="2093726099505892398">"पूर्ण"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"घंटो का चक्राकार स्लाइडर"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"मिनटों का चक्राकार स्लाइडर"</string>
+ <string name="select_hours" msgid="6043079511766008245">"घंटे चुनें"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"मिनट चुनें"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"दिनों की माह ग्रिड"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"वर्ष की सूची"</string>
+ <string name="select_day" msgid="7774759604701773332">"माह और दिन चुनें"</string>
+ <string name="select_year" msgid="7952052866994196170">"वर्ष चुनें"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> चयनित"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> को हटा दिया गया"</string>
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index bf7dd60468b6..1df215e74793 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"pristupanje postavkama Bluetootha"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Aplikaciji omogućuje konfiguraciju lokalnog tabletnog računala s Bluetoothom te otkrivanje i uparivanje s udaljenim uređajima."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Aplikaciji omogućuje konfiguraciju lokalnog Bluetooth telefona i otkrivanje i uparivanje s udaljenim uređajima."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"omogući aplikaciji uparivanje putem Bluetootha"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Aplikaciji se omogućuje uparivanje s udaljenim uređajima bez interakcije korisnika."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Aplikaciji se omogućuje uparivanje s udaljenim uređajima bez interakcije korisnika."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"uspostavljanje i prekidanje veze s WiMAX-om"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Aplikaciji omogućuje utvrđivanje omogućenosti WiMAX mreže te daje informaciju o tome je li spojena neka WiMAX mreža."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Promjena stanja WiMAX mreže"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Pokušajte ponovo kasnije"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Prijeđite prstom s vrha prema dolje za izlaz"</string>
+ <string name="done_label" msgid="2093726099505892398">"Gotovo"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Kružni klizač sati"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Kružni klizač minuta"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Odaberite sate"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Odaberite minute"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Mreža dana u mjesecu"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Popis godina"</string>
+ <string name="select_day" msgid="7774759604701773332">"Odaberite mjesec i dan"</string>
+ <string name="select_year" msgid="7952052866994196170">"Odaberite godinu"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Odabrana je stavka <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"Izbrisan je broj <xliff:g id="KEY">%1$s</xliff:g>"</string>
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index aa4a9d411c01..a13c12c6ef19 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth-beállítások elérése"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Lehetővé teszi az alkalmazás számára, hogy konfigurálja a helyi Bluetooth-t, valamint hogy távoli eszközöket fedezzen fel és párosítson."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Lehetővé teszi az alkalmazás számára, hogy konfigurálja a helyi Bluetooth telefont, valamint hogy távoli eszközöket fedezzen fel és párosítson."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Bluetooth-párosítás engedélyezése az alkalmazás számára"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Lehetővé teszi az alkalmazás számára a távoli eszközök párosítását felhasználói beavatkozás nélkül."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Lehetővé teszi az alkalmazás számára a távoli eszközök párosítását felhasználói beavatkozás nélkül."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX-kapcsolódás és a kapcsolat bontása"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Lehetővé teszi az alkalmazás számára, hogy ellenőrizze, a WiMax engedélyezve van-e, valamint hogy információt gyűjtsön a csatlakoztatott WiMax-hálózatokról."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX-állapot módosítása"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Próbálkozzon később"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"A kilépéshez húzza ujját a tetejétől lefelé"</string>
+ <string name="done_label" msgid="2093726099505892398">"Kész"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Óra kör alakú csúszkája"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Perc kör alakú csúszkája"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Óra kiválasztása"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Perc kiválasztása"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Napok havi leosztásban"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Évek listája"</string>
+ <string name="select_day" msgid="7774759604701773332">"Válassza ki a hónapot és a napot"</string>
+ <string name="select_year" msgid="7952052866994196170">"Válassza ki az évet"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> kiválasztva"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"A(z) <xliff:g id="KEY">%1$s</xliff:g> érték törölve"</string>
</resources>
diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml
index dd3fe096d58e..0d16903aca82 100644
--- a/core/res/res/values-hy-rAM/strings.xml
+++ b/core/res/res/values-hy-rAM/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"մուտք գործել Bluetooth-ի կարգավորումներ"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Թույլ է տալիս հավելվածին կարգավորել տեղային Bluetooth գրասալիկը և հայտնաբերել ու զուգակցվել հեռակա սարքերի հետ:"</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Թույլ է տալիս հավելվածին կարգավորել տեղային Bluetooth հեռախոսը և հայտնաբերել ու զուգակցվել հեռակա սարքերի հետ:"</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"թույլ տալ Bluetooth զուգավորումը՝ հավելվածի միջոցով"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Թույլ է տալիս, որ հավելվածը զուգավորվի հեռավոր սարքերի հետ՝ առանց օգտվողի փոխազդեցության:"</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Թույլ է տալիս, որ հավելվածը զուգավորվի հեռավոր սարքերի հետ՝ առանց օգտվողի փոխազդեցության:"</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"միանալ WiMAX-ին և անջատվել դրանից"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Թույլ է տալիս հավելվածին պարզել, արդյոք WiMAX-ը միացված է և ցանկացած միացված WiMAX ցանցի մասին տեղեկություններ:"</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Փոխել WiMAX-ի կարգավիճակը"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Կրկին փորձեք մի փոքր ուշ"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Սահահարվածեք վերից վար՝ ամբողջական էկրանից դուրս գալու համար"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 13d861da894d..5c369e8f2b87 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"akses setelan Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Mengizinkan apl mengonfigurasi tablet Bluetooth lokal, dan menemukan serta menyandingkan dengan perangkat jarak jauh."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Mengizinkan apl mengonfigurasi ponsel Bluetooth lokal, dan menemukan serta menyandingkan dengan perangkat jarak jauh."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"memungkinkan penyandingan Bluetooth oleh Aplikasi"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Memungkinkan aplikasi disandingkan dengan perangkat jarak jauh tanpa interaksi pengguna."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Memungkinkan aplikasi disandingkan dengan perangkat jarak jauh tanpa interaksi pengguna."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"sambungkan dan putuskan dari WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Memungkinkan aplikasi menentukan apakah WiMAX diaktifkan dan informasi tentang jaringan WiMAX apa saja yang tersambung."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Ubah status WiMAX"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Coba lagi nanti"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Gesek ke bawah untuk keluar dari layar penuh"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 7c68638bdcfa..a9e78ba6cda5 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"accesso alle impostazioni Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Consente all\'applicazione di configurare il tablet Bluetooth locale e di rilevare ed effettuare l\'accoppiamento con dispositivi remoti."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Consente all\'applicazione di configurare il telefono Bluetooth locale e di rilevare ed effettuare l\'accoppiamento con dispositivi remoti."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"accoppiamento Bluetooth dall\'applicazione"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Consente l\'accoppiamento dell\'app con dispositivi remoti senza l\'interazione dell\'utente."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Consente l\'accoppiamento dell\'app con dispositivi remoti senza l\'interazione dell\'utente."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"connessione e disconnessione da WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Consente all\'applicazione di determinare se WiMAX è abilitato e informazioni su eventuali reti WiMAX che sono connesse."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Modifica stato WiMAX"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Riprova più tardi"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Uscita schermo intero: scorri in basso da alto"</string>
+ <string name="done_label" msgid="2093726099505892398">"Fine"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Dispositivo di scorrimento circolare per le ore"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Dispositivo di scorrimento circolare per i minuti"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Seleziona le ore"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Seleziona i minuti"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Griglia di giorni suddivisi per mese"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Elenco degli anni"</string>
+ <string name="select_day" msgid="7774759604701773332">"Seleziona mese e giorno"</string>
+ <string name="select_year" msgid="7952052866994196170">"Seleziona anno"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Elemento selezionato: <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> eliminato"</string>
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 09b7a54c28b8..63c430c2ff34 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"גישה להגדרות Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"מאפשר לאפליקציה להגדיר את תצורתו של הטאבלט המקומי מסוג Bluetooth וכן לגלות מכשירים מרוחקים ולבצע התאמה איתם."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"מאפשר לאפליקציה להגדיר את תצורתו של הטלפון המקומי מסוג Bluetooth וכן לגלות מכשירים מרוחקים ולבצע התאמה איתם."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"אפשר התאמת Bluetooth על ידי האפליקציה"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"מאפשרת לאפליקציה לבצע התאמה עם מכשירים מרוחקים ללא התערבות המשתמש."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"מאפשרת לאפליקציה לבצע התאמה עם מכשירים מרוחקים ללא התערבות המשתמש."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"התחברות והתנתקות מ-WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"מאפשר לאפליקציה לדעת האם WiNMAX מופעל, כמו גם לקבל מידע האם רשתות WiNMAX כלשהן מחוברות."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"שנה את מצב WiMAX"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"נסה שוב מאוחר יותר"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"החלק מטה מהחלק העליון כדי לצאת ממסך מלא"</string>
+ <string name="done_label" msgid="2093726099505892398">"בוצע"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"מחוון שעות מעגלי"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"מחוון דקות מעגלי"</string>
+ <string name="select_hours" msgid="6043079511766008245">"בחר שעות"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"בחר דקות"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"בחירת ימים בחודש בתצוגת רשת"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"רשימת שנים"</string>
+ <string name="select_day" msgid="7774759604701773332">"בחר חודש ויום"</string>
+ <string name="select_year" msgid="7952052866994196170">"בחר שנה"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> נבחר"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> נמחק"</string>
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 4feb55c0cccc..33ce32a24507 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -132,7 +132,7 @@
<string name="low_memory" product="tablet" msgid="6494019234102154896">"タブレットのストレージに空き領域がありません。ファイルを削除して空き領域を確保してください。"</string>
<string name="low_memory" product="default" msgid="3475999286680000541">"端末のストレージに空き領域がありません。ファイルを削除して空き領域を確保してください。"</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ネットワークが監視される場合があります"</string>
- <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"不明な第三者によって監視される場合があります"</string>
+ <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"不明な第三者"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>によって監視される場合があります"</string>
<string name="me" msgid="6545696007631404292">"自分"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"タブレットオプション"</string>
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetoothの設定へのアクセス"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"ローカルのBluetoothタブレットを設定することと、リモート端末を検出してペアに設定することをアプリに許可します。"</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"ローカルのBluetooth携帯端末を設定することと、リモート端末を検出してペアに設定することをアプリに許可します。"</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"アプリによるBluetoothペア設定を許可"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"ユーザーの操作なしでリモート端末とペア設定することをアプリに許可します。"</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"ユーザーの操作なしでリモート端末とペア設定することをアプリに許可します。"</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAXへの接続と切断"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"WiMAXがONになっているかどうかを識別し、接続されているWiMAXネットワークの情報を表示することをアプリに許可します。"</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX状態の変更"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"しばらくしてから再試行"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"全画面表示を終了するには、上から下にスワイプ"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml
index f23395749446..30a02c377180 100644
--- a/core/res/res/values-ka-rGE/strings.xml
+++ b/core/res/res/values-ka-rGE/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth-ის პარამეტრებზე წვდომა"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"აპს შეეძლება ადგილობრივი Bluetooth ტაბლეტის პარამეტრების დაყენება და დისტანციური მოწყობილობების აღმოჩენა და დაწყვილება."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"აპს შეეძლება ტელეფონის ადგილობრივი Bluetooth პარამეტრების დაყენება და დისტანციური მოწყობილობების აღმოჩენა და დაწყვილება."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"აპლიკაციის მიერ Bluetooth დაწყვილების განხორციელების ნების დართვა"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"უფლებას ანიჭებს აპს დააწყვილოს დისტანციური მოწყობილობები მომხმარებელთან ინტერაქციის გარეშე."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"უფლებას ანიჭებს აპს დააწყვილოს დისტანციური მოწყობილობები მომხმარებელთან ინტერაქციის გარეშე."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX-თან დაკავშირება და კავშირის გაწყვეტა"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"აპს შეეძლება განსაზღვროს, WiMAX არის თუ არა ჩართული და ასევე ინფორმაცია ნებისმიერი დაკავშირებული WiMAX ქსელის შესახებ."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX მდგომარეობის შეცვლა"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"სცადეთ მოგვიანებით"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"ჩამოასრიალეთ ზევიდან სრული ეკრანის დასახურად"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml
index 366cc619f2d2..de0aaead0c6d 100644
--- a/core/res/res/values-km-rKH/strings.xml
+++ b/core/res/res/values-km-rKH/strings.xml
@@ -163,9 +163,9 @@
<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>
- <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"របៀប​ជិះ​យន្តហោះ"</string>
+ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ពេល​ជិះ​យន្តហោះ"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"បាន​បើក​របៀប​ពេល​ជិះ​យន្ត​ហោះ"</string>
- <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"បាន​បិទ​របៀប​យន្តហោះ"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"បាន​បិទ​របៀបពេលជិះ​យន្តហោះ"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="safeMode" msgid="2788228061547930246">"របៀប​​​សុវត្ថិភាព"</string>
<string name="android_system_label" msgid="6577375335728551336">"ប្រព័ន្ធ​​ Android"</string>
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"ចូល​ដំណើរការ​​ការ​កំណត់​ប៊្លូធូស"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"ឲ្យ​កម្មវិធី​កំណត់​រចនាសម្ព័ន្ធ​កុំព្យូទ័រ​បន្ទះ​ប៊្លូធូស​មូលដ្ឋាន និង​រកមើល ព្រម​ទាំង​ផ្គូផ្គង​ជា​មួយ​ឧបករណ៍​ពី​ចម្ងាយ។"</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"ឲ្យ​កម្មវិធី​មើល​​ការ​កំណត់​រចនាសម្ព័ន្ធ​ប៊្លូធូស​ក្នុង​ទូរស័ព្ទ ដើម្បី​រកមើល និង​ផ្គូផ្គង​ជា​មួយ​ឧបករណ៍​ពី​ចម្ងាយ។"</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"ឲ្យ​ប៊្លូធូស​ផ្គូផ្គង​ជា​មួយ​កម្មវិធី"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"ឲ្យ​កម្មវិធី​ផ្គូផ្គង​ជា​មួយ​ឧបករណ៍​ពី​ចម្ងាយ​ដោយ​គ្មាន​អំពើ​​ពី​អ្នកប្រើ។"</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"ឲ្យ​កម្មវិធី​ផ្គូផ្គង​ជា​មួយ​ឧបករណ៍​ពី​ចម្ងាយ​ដោយ​គ្មាន​អំពើ​​ពី​អ្នកប្រើ។"</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"ភ្ជាប់ និង​ផ្ដាច់​ពី WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"ឲ្យ​កម្មវិធី​កំណត់​ថា​តើ WiMAX ត្រូវ​បាន​បើក និង​ព័ត៌មាន​អំពី​បណ្ដាញ WiMAX ដែល​ត្រូវ​បាន​តភ្ជាប់។"</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"ប្ដូរ​ស្ថានភាព WiMAX"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"សូម​ព្យាយាម​ម្ដងទៀត​នៅ​ពេល​ក្រោយ។"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"អូស​​​ចុះក្រោម ដើម្បី​ចេញ​ពី​ការ​បង្ហាញ​ពេញ​អេក្រង់"</string>
+ <string name="done_label" msgid="2093726099505892398">"រួចរាល់"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"គ្រាប់​រំកិល​រង្វង់​ម៉ោង"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"គ្រាប់​រំកិល​រង្វង់​នាទី"</string>
+ <string name="select_hours" msgid="6043079511766008245">"ជ្រើស​ម៉ោង"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"ជ្រើស​នាទី"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"ក្រឡា​​​ខែ​នៃ​ថ្ងៃ"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"បញ្ជី​ឆ្នាំ"</string>
+ <string name="select_day" msgid="7774759604701773332">"ជ្រើស​ខែ និង​ថ្ងៃ"</string>
+ <string name="select_year" msgid="7952052866994196170">"ជ្រើស​ឆ្នាំ"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"បាន​ជ្រើស <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"បាន​លុប <xliff:g id="KEY">%1$s</xliff:g>"</string>
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 1033a423bfa5..fb3fa683b33c 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -132,7 +132,7 @@
<string name="low_memory" product="tablet" msgid="6494019234102154896">"태블릿 저장공간이 꽉 찼습니다. 일부 파일을 삭제하여 저장 여유 공간을 늘리세요."</string>
<string name="low_memory" product="default" msgid="3475999286680000541">"휴대전화 저장공간이 꽉 찼습니다. 일부 파일을 삭제하여 저장공간을 늘리세요."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"네트워크가 모니터링될 수 있음"</string>
- <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"알 수 없는 제3자가 모니터링"</string>
+ <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"알 수 없는 제3자의 모니터링"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>에서 모니터링"</string>
<string name="me" msgid="6545696007631404292">"나"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"태블릿 옵션"</string>
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"블루투스 설정에 액세스"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"앱이 로컬 블루투스 태블릿을 설정한 다음 원격 기기를 검색하여 페어링할 수 있도록 허용합니다."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"앱이 로컬 블루투스 휴대전화를 설정한 다음 원격 기기를 검색하여 페어링할 수 있도록 허용합니다."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"애플리케이션에서 블루투스 페어링 허용"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"앱이 사용자 상호작용 없이 원격 기기와 페어링할 수 있도록 허용합니다."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"앱이 사용자 상호작용 없이 원격 기기와 페어링할 수 있도록 허용합니다."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX 연결 및 연결 해제"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"앱이 WiMAX를 사용하도록 설정했는지 여부와 연결된 WiMAX 네트워크에 대한 정보를 결정할 수 있도록 허용합니다."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX 상태 변경"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"나중에 다시 시도"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"전체화면을 종료하려면 위에서 아래로 스와이프"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml
index 0d0bb79224d2..b04c319c1b6d 100644
--- a/core/res/res/values-lo-rLA/strings.xml
+++ b/core/res/res/values-lo-rLA/strings.xml
@@ -145,7 +145,7 @@
<string name="silent_mode_silent" msgid="319298163018473078">"ປິດສຽງຣິງໂທນ"</string>
<string name="silent_mode_vibrate" msgid="7072043388581551395">"ສັ່ນພ້ອມສຽງຣິງໂທນ"</string>
<string name="silent_mode_ring" msgid="8592241816194074353">"ເປີດສຽງໂທເຂົ້າແລ້ວ"</string>
- <string name="shutdown_progress" msgid="2281079257329981203">"ກຳລັງປິດລົງ..."</string>
+ <string name="shutdown_progress" msgid="2281079257329981203">"ກຳລັງປິດລະບົບລົງ..."</string>
<string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"ແທັບເລັດຂອງທ່ານຈະຖືກປິດ."</string>
<string name="shutdown_confirm" product="default" msgid="649792175242821353">"ໂທລະສັບຂອງທ່ານຈະຖືກປິດ."</string>
<string name="shutdown_confirm_question" msgid="2906544768881136183">"ທ່ານຕ້ອງການທີ່ຈະປິດບໍ່?"</string>
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"ເຂົ້າເຖິງການຕັ້ງຄ່າ Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"ອະນຸຍາດໃຫ້ແອັບຯຕັ້ງຄ່າແທັບເລັດ Bluetooth ພາຍໃນ ແລະຊອກຫາ ແລະເຊື່ອມຕໍ່ໄວ້ກັບອຸປະກອນພາຍນອກ."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"ອະນຸຍາດໃຫ້ແອັບຯຕັ້ງຄ່າ Bluetooth ໃນໂທລະສັບ ເພື່ອຊອກຫາ ແລະການເຊື່ອມຕໍ່ກັບອຸປະກອນໄຮ້ສາຍພາຍນອກ."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"ອະນຸຍາດໃຫ້ແອັບພລິເຄຊັນຈັບຄູ່ Bluetooth"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"ອະນຸຍາດໃຫ້ແອັບຯ ຈັບຄູ່ອຸປະກອນຈາກໄລຍະໄກ ໂດຍຜູ່ໃຊ້ບໍ່ຕ້ອງເຮັດຫຍັງ."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"ອະນຸຍາດໃຫ້ແອັບຯ ຈັບຄູ່ອຸປະກອນຈາກໄລຍະໄກ ໂດຍຜູ່ໃຊ້ບໍ່ຕ້ອງເຮັດຫຍັງ."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"ເຊື່ອມຕໍ່ ແລະຕັດການເຊື່ອມຕໍ່ຈາກ WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"ອະນຸຍາດໃຫ້ແອັບຯກວດເບິ່ງວ່າ WiMAX ຖືກເປີດນຳໃຊ້ຢູ່ບໍ່ ແລະຂໍ້ມູນກ່ຽວກັບເຄືອຂ່າຍ WiMAX ອື່ນໆທີ່ກຳລັງເຊື່ອມຕໍ່ຢູ່."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"ປ່ຽນສະຖານະ WiMAX"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"ລອງໃໝ່ອີກຄັ້ງໃນພາຍຫລັງ."</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"ປັດລົງຈາກເທິງສຸດເພື່ອອກຈາກໂໝດເຕັມໜ້າຈໍ"</string>
+ <string name="done_label" msgid="2093726099505892398">"ແລ້ວໆ"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"ໂຕໝຸນປັບຊົ່ວໂມງ"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"ໂຕໝຸນປັບນາທີ"</string>
+ <string name="select_hours" msgid="6043079511766008245">"ເລືອກ​ຊົ່ວ​ໂມງ"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"ເລືອກນາ​ທີ"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"ຕາຕາລາງວັນທີເດືອນປີ"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"ລາຍການປີ"</string>
+ <string name="select_day" msgid="7774759604701773332">"ເລືອກເດືອນ ແລະ ວັນ"</string>
+ <string name="select_year" msgid="7952052866994196170">"ເລືອກ​ປີ"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> ຖືກເລືອກແລ້ວ"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> ຖືກລຶບແລ້ວ"</string>
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index b9cd13ad2597..10cce954ccb7 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"pasiekti „Bluetooth“ nustatymus"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Leidžiama programai konfigūruoti vietinį „Bluetooth“ planšetinį kompiuterį ir atrasti nuotolinius įrenginius bei su jais susieti."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Leidžiama programai konfigūruoti vietinį „Bluetooth“ telefoną ir atrasti bei susieti su nuotoliniais įrenginiais."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"leisti „Bluetooth“ susiejimą naudojant programą"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Leidžiama programai susieti su nuotolinio valdymo įrenginiais be naudotojo įsikišimo."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Leidžiama programai susieti su nuotolinio valdymo įrenginiais be naudotojo įsikišimo."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"prisijungti prie WiMAX ir atsijungti nuo jo"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Leidžiama programai nustatyti, ar įgalintas „WiMAX“, ir informaciją apie visus prijungtus tinklus."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Keisti „WiMAX“ būseną"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Vėliau bandykite dar kartą"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Perbr. žemyn, kad išeit. iš viso ekr. rež."</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 17bbafbf2df1..79be527d346a 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"piekļūt Bluetooth iestatījumiem"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Ļauj lietotnei konfigurēt vietējo Bluetooth planšetdatoru, kā arī atklāt attālas ierīces un savienot tās pārī."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Ļauj lietotnei konfigurēt vietējo Bluetooth tālruni, kā arī atklāt attālas ierīces un savienot tās pārī."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Bluetooth ierīču savienošana pārī, izmantojot lietojumprogrammu"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Ļauj lietotnei izveidot savienojumu pārī ar tālvadības ierīcēm bez lietotāju mijiedarbības."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Ļauj lietotnei izveidot savienojumu pārī ar tālvadības ierīcēm bez lietotāju mijiedarbības."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX savienojuma izveide un pārtraukšana"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Ļauj lietotnei noteikt, vai WiMAX ir iespējots, un sniedz informāciju par visiem WiMAX tīkliem, ar kuriem ir izveidots savienojums."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX statusa mainīšana"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Vēlāk mēģiniet vēlreiz."</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Lai izietu no pilnekr., velc. no augšas lejup."</string>
+ <string name="done_label" msgid="2093726099505892398">"Gatavs"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Stundu apļveida slīdnis"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Minūšu apļveida slīdnis"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Atlasiet stundas."</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Atlasiet minūtes."</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Režģis ar mēneša dienām"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Gadu saraksts"</string>
+ <string name="select_day" msgid="7774759604701773332">"Atlasiet mēnesi un dienu."</string>
+ <string name="select_year" msgid="7952052866994196170">"Atlasiet gadu."</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Atlasīts: <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> tika dzēsts."</string>
</resources>
diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml
index 2ff211904e6c..24d730936244 100644
--- a/core/res/res/values-mn-rMN/strings.xml
+++ b/core/res/res/values-mn-rMN/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Блютүүт тохиргоонд хандах"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Апп нь дотоод блютүүт таблетын тохиргоог харах боломжтой ба хос болох төхөөрөмжтэй холболтыг зөвшөөрөх болон хийх боломжтой"</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Апп нь утасны дотоод блютүүтыг тохируулах боломжтой ба гадаад төхөөрөмжийг олох болон хос үүсгэх боломжтой."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Аппликешнд Блютүүт хоallow Bluetooth pairing by Application"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Апп-д хэрэглэгчтэй харьцахгүйгээр зайны төхөөрөмжүүдтэй хослох боломж олгоно."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Апп-д хэрэглэгчтэй харьцахгүйгээр зайны төхөөрөмжүүдтэй хослох боломж олгоно."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX-д холбогдох болон салах"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Апп нь WiMAX идэвхтэй эсэх болон холбогдсон WiMAX сүлжээний талаар мэдээллийг тодорхойлох боломжтой."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX статусыг өөрчлөх"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Дараа дахин оролдоно уу"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Бүтэн дэлгэцээс гарахын тулд дээрээс нь эхлэн доош шудрана уу"</string>
+ <string name="done_label" msgid="2093726099505892398">"Дууссан"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Цаг гүйлгэгч"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Минут гүйлгэгч"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Цаг сонгоно уу"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Минут сонгоно уу"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Өдрүүдийг сараар"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Жилийн жагсаалт"</string>
+ <string name="select_day" msgid="7774759604701773332">"Сар болон өдрийг сонгоно уу"</string>
+ <string name="select_year" msgid="7952052866994196170">"Жилийг сонгоно уу"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> сонгогдсон"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> устсан"</string>
</resources>
diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml
index d787536ac3b1..8bd9a9785d77 100644
--- a/core/res/res/values-ms-rMY/strings.xml
+++ b/core/res/res/values-ms-rMY/strings.xml
@@ -249,7 +249,7 @@
<string name="permlab_install_shortcut" msgid="4279070216371564234">"pasang pintasan"</string>
<string name="permdesc_install_shortcut" msgid="8341295916286736996">"Membenarkan aplikasi menambah pintasan Skrin Laman Utama tanpa campur tangan pengguna."</string>
<string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"nyahpasang pintasan"</string>
- <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Membenarkan aplikasi memadam pintasan Skrin Laman Utama tanpa campur tangan pengguna."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Membenarkan aplikasi mengalih keluar pintasan Skrin Laman Utama tanpa campur tangan pengguna."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"tukar laluan panggilan keluar"</string>
<string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"Membenarkan apl memproses panggilan keluar dan menukar nombor yang perlu didail. Kebenaran ini membolehkan apl memantau, mengalih atau menghalang panggilan keluar."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"terima mesej teks (SMS)"</string>
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"akses tetapan Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Membenarkan apl mengkonfigurasikan tablet Bluetooth setempat dan menemui serta berpasangan dengan peranti jauh."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Membenarkan apl mengkonfigurasikan telefon Bluetooth setempat dan menemui serta berpasangan dengan peranti jauh."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"benarkan perpasangan Bluetooth oleh Aplikasi"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Membenarkan apl berpasangan dengan peranti jauh tanpa interaksi pengguna."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Membenarkan apl berpasangan dengan peranti jauh tanpa interaksi pengguna."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"sambung dan putuskan sambungan WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Membenarkan apl menentukan sama ada WiMaX didayakan dan maklumat tentang sebarang rangkaian WiMaX yang disambungkan."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Tukar keadaan WiMAX"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Cuba sebentar lagi"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Leret ke bawah untuk keluar dari skrin penuh"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 3540c0fc0cfb..f948dd6f946b 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"endre Bluetooth-innstillinger"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Lar appen konfigurere det lokale Bluetooth-nettbrettet, samt oppdage og koble sammen med eksterne enheter."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Lar appen konfigurere den lokale Bluetooth-telefonen, samt oppdage og koble sammen med eksterne enheter."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"tillate Bluetooth-sammenkobling av appen"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Lar appen koble til eksterne enheter uten medvirkning fra brukeren."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Lar appen koble til eksterne enheter uten medvirkning fra brukeren."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"koble til eller fra WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Lar appen avgjøre hvorvidt WiMAX er aktivert og finne informasjon om eventuelle tilkoblede WiMAX-nettverk."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Endre WiMAX-status"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Prøv på nytt senere"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Sveip ned for å avslutte fullskjermvisning"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 6a85d9282271..0f5d72d0f80d 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth-instellingen openen"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Hiermee kan de app de lokale Bluetooth-tablet configureren en externe apparaten zoeken en koppelen."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Hiermee kan de app de lokale Bluetooth-telefoon configureren en externe apparaten zoeken en koppelen."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Bluetooth-koppeling door app toestaan"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"De app toestaan te koppelen met externe apparaten zonder tussenkomst van de gebruiker."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"De app toestaan te koppelen met externe apparaten zonder tussenkomst van de gebruiker."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX-verbinding maken en verbreken"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Hiermee kan de app bepalen of WiMAX is ingeschakeld en informatie bekijken over alle WiMAX-netwerken waarmee verbinding is gemaakt."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX-status wijzigen"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Probeer het later opnieuw"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Van boven omlaag vegen: voll. scherm sluiten"</string>
+ <string name="done_label" msgid="2093726099505892398">"Gereed"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Ronde schuifregelaar voor uren"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Ronde schuifregelaar voor minuten"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Uren selecteren"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Minuten selecteren"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Maandraster van dagen"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Jaarlijst"</string>
+ <string name="select_day" msgid="7774759604701773332">"Maand en dag selecteren"</string>
+ <string name="select_year" msgid="7952052866994196170">"Jaar selecteren"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> geselecteerd"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> verwijderd"</string>
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 525e75432b74..e4099f4a3d1d 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"uzyskiwanie dostępu do ustawień Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Pozwala aplikacji na konfigurowanie lokalnego tabletu z funkcją Bluetooth oraz na wykrywanie urządzeń zdalnych i parowanie z nimi."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Pozwala aplikacji na konfigurowanie lokalnego telefonu z funkcją Bluetooth oraz na wykrywanie urządzeń zdalnych i parowanie z nimi."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"zezwól aplikacji na parowanie się przez Bluetooth"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Umożliwia aplikacji parowanie się z urządzeniami zdalnymi bez interakcji użytkownika."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Umożliwia aplikacji parowanie się z urządzeniami zdalnymi bez interakcji użytkownika."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"łączenie się i rozłączanie z siecią WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Pozawala aplikacji określić, czy obsługa WiMAX jest włączona, oraz uzyskać informacje o wszystkich podłączonych sieciach WiMAX."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"zmienianie stanu WiMAX"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Spróbuj ponownie później"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Przesuń z góry w dół, by zamknąć pełny ekran"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index b7fe21fafb16..852dddf5e6b4 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"aceder às definições de Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permite à aplicação configurar o tablet Bluetooth local, bem como descobrir e emparelhar com dispositivos remotos."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permite que a aplicação configure o telemóvel Bluetooth local, bem como descobrir e emparelhar com dispositivos remotos."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"permitir a sincronização Bluetooth por aplicação"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Permite que a aplicação seja sincronizada com dispositivos remotos sem interação do utilizador."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Permite que a aplicação seja sincronizada com dispositivos remotos sem interação do utilizador."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"ligar e desligar do WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permite que a aplicação determine se o WiMAX está ativado e aceda a informações acerca de qualquer rede WiMAX que esteja ligada."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Alterar estado do WiMAX"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Tente novamente mais tarde"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Deslize para baixo para sair do ecrã inteiro"</string>
+ <string name="done_label" msgid="2093726099505892398">"Concluído"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Controlo de deslize circular das horas"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Controlo de deslize circular dos minutos"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Selecionar horas"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Selecionar minutos"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Grelha de dias do mês"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Lista de anos"</string>
+ <string name="select_day" msgid="7774759604701773332">"Selecionar mês e dia"</string>
+ <string name="select_year" msgid="7952052866994196170">"Selecionar ano"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> selecionado"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> eliminado"</string>
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index d889331dcd1b..3554ccfd1908 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"acessar configurações de Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permite que um aplicativo configure o tablet Bluetooth local, descubra dispositivos remotos e emparelhe com eles."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permite que um aplicativo configure o telefone Bluetooth local, descubra e emparelhe com dispositivos remotos."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"permitir pareamento via Bluetooth pelo aplicativo"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Permite que o aplicativo faça pareamento com dispositivos remotos sem interação com o usuário."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Permite que o aplicativo faça pareamento com dispositivos remotos sem interação com o usuário."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"conectar e desconectar do WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permite que o aplicativo determine se o WiMAX está ativado e acesse informações sobre as redes WiMAX conectadas."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Alterar estado do WiMAX"</string>
@@ -639,7 +642,7 @@
<string name="permdesc_writeDictionary" msgid="8185385716255065291">"Permite que o aplicativo grave novas palavras no dicionário do usuário."</string>
<string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"ler conteúdo do armaz. USB"</string>
<string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"ler conteúdo do cartão SD"</string>
- <string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"Permite que o aplicativo leia o conteúdo do cartão SD."</string>
+ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"Perm. que app leia cartão SD."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"Permite que o aplicativo leia o conteúdo do cartão SD."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"modificar ou excluir conteúdo do armazenamento USB"</string>
<string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"modificar ou excluir o conteúdo do cartão SD"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Tente novamente mais tarde"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Deslize para baixo para sair da tela inteira"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml
index 25e3c4f72b12..ae52b93d01bc 100644
--- a/core/res/res/values-rm/strings.xml
+++ b/core/res/res/values-rm/strings.xml
@@ -1025,6 +1025,12 @@
<skip />
<!-- no translation found for permdesc_bluetoothAdmin (8931682159331542137) -->
<skip />
+ <!-- no translation found for permlab_bluetoothPriv (4009494246009513828) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetoothPriv (8045735193417468857) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetoothPriv (8045735193417468857) -->
+ <skip />
<!-- no translation found for permlab_accessWimaxState (4195907010610205703) -->
<skip />
<!-- no translation found for permdesc_accessWimaxState (6360102877261978887) -->
@@ -2728,4 +2734,26 @@
<skip />
<!-- no translation found for transient_navigation_confirmation (8554991488096662508) -->
<skip />
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 965f22f60e57..087832faecb7 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"accesează setările Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permite aplicaţiei să configureze tableta Bluetooth locală, să descopere şi să se împerecheze cu dispozitive la distanţă."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permite aplicaţiei să configureze telefonul Bluetooth local, să descopere şi să se împerecheze cu dispozitive la distanţă."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"permiteți conectarea aplicației prin Bluetooth"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Permite aplicației să se conecteze la dispozitive de la distanță, fără intervenția utilizatorului."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Permite aplicației să se conecteze la dispozitive de la distanță, fără intervenția utilizatorului."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"se conectează şi se deconectează de la WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permite aplicaţiei să stabilească dacă o reţea WiMAX este activată şi să vadă informaţiile cu privire la toate reţelele WiMAX conectate."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Schimbaţi starea WiMAX"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Reîncercați mai târziu"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Glisați în jos pt. a ieși din ecran complet"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 9cf7724e46b7..db38dd26d6db 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Доступ к настройкам Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Приложение сможет настраивать параметры локального планшетного ПК с поддержкой Bluetooth, а также обнаруживать удаленные устройства и выполнять сопряжение с ними."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Приложение сможет настраивать параметры локального телефона с поддержкой Bluetooth, а также обнаруживать удаленные устройства и выполнять сопряжение с ними."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Подключение устройств через Bluetooth"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Приложение сможет самостоятельно подключаться к удаленным устройствам."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Приложение сможет самостоятельно подключаться к удаленным устройствам."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"подключать/отключать сеть WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Приложение сможет определять, активирован ли WiMAX, а также получать информацию о подключенных сетях WiMAX."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Изменение статуса WiMAX"</string>
@@ -639,8 +642,8 @@
<string name="permdesc_writeDictionary" msgid="8185385716255065291">"Приложение сможет добавлять слова в пользовательский словарь."</string>
<string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"Просмотр данных на USB-накопителе"</string>
<string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"Считывание содержимого SD-карты"</string>
- <string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"Приложение сможет считывать данные с USB-накопителя."</string>
- <string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"Приложение сможет считывать содержимое SD-карты."</string>
+ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"Приложение сможет считывать данные на USB-накопителе."</string>
+ <string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"Приложение сможет считывать данные на SD-карте."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"Изменение/удаление данных на USB-накопителе"</string>
<string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"Изменение или удаление содержимого SD-карты"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Приложение сможет записывать данные на USB-накопитель."</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Повторите попытку позже."</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Чтобы вернуться в обычный режим, проведите пальцем вниз"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 5c9072ecb0aa..efecfc62b5b2 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"pristupovať k nastaveniam Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Umožňuje aplikácii konfigurovať miestny tablet s rozhraním Bluetooth a vyhľadávať a spárovať vzdialené zariadenia."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Umožňuje aplikácii konfigurovať miestny telefón s rozhraním Bluetooth, vyhľadávať a spárovať vzdialené zariadenia."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"povoliť aplikácii párovanie prostredníctvom rozhrania Bluetooth"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Umožňuje aplikácii párovanie so vzdialenými zariadeniami bez zásahu používateľa."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Umožňuje aplikácii párovanie so vzdialenými zariadeniami bez zásahu používateľa."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"pripojiť a odpojiť od WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Umožňuje aplikácii určiť, či je povolený štandard WiMAX, a tiež informácie o všetkých pripojených sieťach WiMAX."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Zmeniť stav siete WiMAX"</string>
@@ -1258,7 +1261,7 @@
<string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"Všetky súbory uložené v ukladacom priestore USB budú vymazané. Táto akcia sa nedá vrátiť späť!"</string>
<string name="extmedia_format_message" product="default" msgid="14131895027543830">"Všetky údaje na vašej karte budú stratené."</string>
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formát"</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"Ladenie cez rozhranie USB pripojené"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"Ladenie cez USB pripojené"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Dotknutím zakážete ladenie USB."</string>
<string name="select_input_method" msgid="4653387336791222978">"Zvoliť metódu vstupu"</string>
<string name="configure_input_methods" msgid="9091652157722495116">"Nastavenie metód vstupu"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Skúste to znova neskôr"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Režim celej obraz. ukončíte posunutím nadol"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 59c8821223b5..ac685036f9a6 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"dostop do nastavitev Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Programu omogoča konfiguriranje lokalnega tabličnega računalnika Bluetooth ter zaznavanje oddaljenih naprav in združevanje z njimi."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Programu omogoča konfiguriranje lokalnega telefona s tehnologijo Bluetooth ter odkrivanje oddaljenih naprav in povezovanje z njimi."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"aplikaciji dovoli seznanjanje prek povezave Bluetooth"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Aplikaciji dovoljuje seznanjanje z oddaljenimi napravami brez interakcije uporabnika."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Aplikaciji dovoljuje seznanjanje z oddaljenimi napravami brez interakcije uporabnika."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"vzpostavitev povezave z omrežjem WiMax in prekinitev povezave z njim"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Aplikaciji omogoča, da ugotovi, ali je WiMAX omogočen, in ogled podatkov o povezanih omrežjih WiMAX."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Sprememba stanja omrežja WiMAX"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Poskusite znova pozneje"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Povlecite z vrha, da zaprete celozas. način"</string>
+ <string name="done_label" msgid="2093726099505892398">"Dokončano"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Okrogli drsnik za ure"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Okrogli drsnik za minute"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Izberite ure"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Izberite minute"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Mesečna mreža dni"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Seznam let"</string>
+ <string name="select_day" msgid="7774759604701773332">"Izberite mesec in dan"</string>
+ <string name="select_year" msgid="7952052866994196170">"Izberite leto"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Izbrano: <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"Številka <xliff:g id="KEY">%1$s</xliff:g> je izbrisana"</string>
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 81ffdd625dce..1a34c8917fc5 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"приступ Bluetooth подешавањима"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Дозвољава апликацији да конфигурише локални Bluetooth таблет, као и да открије даљинске уређаје и упари се са њима."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Дозвољава апликацији да конфигурише локални Bluetooth телефон, као и да открије даљинске уређаје и упари се са њима."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"омогућавање упаривања апликације преко Bluetooth-а"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Омогућава апликацији да се упарује са удаљеним уређајима без интеракције корисника."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Омогућава апликацији да се упарује са удаљеним уређајима без интеракције корисника."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"повезивање и прекид везе са WiMAX-ом"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Дозвољава апликацији да утврди да ли је WiMAX омогућен, као и информације о било којим повезаним WiMAX мрежама."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Промени WiMAX статус"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Покушајте поново касније"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Превуците надоле од врха за излаз из целог екрана"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index eb347041ef5e..dca9067e19e3 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"få åtkomst till Bluetooth-inställningar"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Tillåter att appen konfigurerar den lokala Bluetooth-surfplattan samt upptäcker och parkopplar den med fjärranslutna enheter."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Tillåter att appen konfigurerar den lokala Bluetooth-mobilen samt upptäcker och parkopplar den med fjärranslutna enheter."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"tillåt Bluetooth-koppling för appen"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Tillåter att appen kopplas till fjärrenheter utan interaktion med användare."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Tillåter att appen kopplas till fjärrenheter utan interaktion med användare."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"ansluta till och koppla från WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Tillåter att appen avgör om WiMAX är aktiverat och kommer åt information om eventuella anslutna WiMAX-nätverk."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"ändra WiMAX-status"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Försök igen senare"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Dra nedåt om du vill avbryta fullskärmsläget"</string>
+ <string name="done_label" msgid="2093726099505892398">"Klart"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Cirkelreglage för timmar"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Cirkelreglage för minuter"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Välj timmar"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Välj minuter"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Rutnät för månad"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Lista över år"</string>
+ <string name="select_day" msgid="7774759604701773332">"Välj månad och dag"</string>
+ <string name="select_year" msgid="7952052866994196170">"Välj år"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> har markerats"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> har tagits bort"</string>
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index b8391b995bc9..c67af9e8b327 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -247,9 +247,9 @@
<string name="permlab_expandStatusBar" msgid="1148198785937489264">"panua/kunja mwambaa hali"</string>
<string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Inaruhusu programu kupanua au kukunja upau wa hali."</string>
<string name="permlab_install_shortcut" msgid="4279070216371564234">"sakinisha njia za mkato"</string>
- <string name="permdesc_install_shortcut" msgid="8341295916286736996">"Huruhusu programu kuongeza njia za mkato za Skrini ya nyumbani bila mtumiaji kuhusika."</string>
+ <string name="permdesc_install_shortcut" msgid="8341295916286736996">"Huruhusu programu kuongeza njia za mkato za Skrini ya kwanza bila mtumiaji kuingilia."</string>
<string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"ondoa njia za mikato"</string>
- <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Huruhusu programu kuondoa njia za mkato za Skrini ya nyumbani bila mtumiaji kuhusika."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Huruhusu programu kuondoa njia za mkato za Skrini ya kwanza bila mtumiaji kuingilia."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"panga upya simu zinazotoka"</string>
<string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"Inaruhusu programu kuchakata simu zinazotoka nje na kubadilisha nambari ya kupigwa. Idhini hii inaruhusu programu kuchunguza, kuelekeza upya, au kuzuia simu zinazotoka nje."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"pokea ujumbe wa maandishi wa SMS"</string>
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"fikia mipangilio ya Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Inaruhusu programu kusanidi kompyuta kibao ya karibu ya Bluetooth na kutambua na kuoanisha na vifaa vya kudhibiti."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Inaruhusu programu kusanidi simu ya karibu ya Bluetooth, na kutambua na kuoanisha na vifaa vya mbali."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"ruhusu uoanishaji wa Bluetooth kwa Programu"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Inaruhusu programu kuoanisha na vifaa vya mbali bila mtumiaji kuingilia."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Inaruhusu programu kuoanisha na vifaa vya mbali bila mtumiaji kuingilia."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"unganisha na uukate muunaganisho kutoka kwenye WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Inaruhusu programu kuthibitisha ikiwa WiMAX imewezeshwa na taarifa kuhusu mitandao yoyote ya WiMAX ambayo imeunganishwa."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Badilisha hali ya WiMAX"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Jaribu tena baadaye"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Telezesha kidole kwa kasi chini kuanzia juu ili uondoke kwenye skrini kamili"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index d167471739f4..ad61bf689350 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"เข้าถึงการตั้งค่าบลูทูธ"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"อนุญาตให้แอปพลิเคชันกำหนดค่าแท็บเล็ตบลูทูธในตัวเครื่อง รวมทั้งค้นหาและจับคู่กับอุปกรณ์ที่อยู่ระยะไกล"</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"อนุญาตให้แอปพลิเคชันกำหนดค่าโทรศัพท์บลูทูธในตัวเครื่อง ตลอดจนค้นหาและจับคู่กับอุปกรณ์ที่อยู่ระยะไกล"</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"อนุญาตให้แอปพลิเคชันจับคู่บลูทูธ"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"อนุญาตให้แอปจับคู่กับอุปกรณ์ระยะไกลโดยไม่ต้องมีการโต้ตอบของผู้ใช้"</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"อนุญาตให้แอปจับคู่กับอุปกรณ์ระยะไกลโดยไม่ต้องมีการโต้ตอบของผู้ใช้"</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"เชื่อมต่อและเลิกเชื่อมต่อจาก WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"อนุญาตให้แอปพลิเคชันตรวจสอบว่า WiMAX เปิดใช้งานอยู่หรือไม่และข้อมูลเกี่ยวกับเครือข่าย WiMAX ใดๆ ที่เชื่อมต่ออยู่"</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"เปลี่ยนสถานะของ WiMAX"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"ลองอีกครั้งในภายหลัง"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"กวาดนิ้วจากบนลงล่างเพื่อออกจากโหมดเต็มหน้าจอ"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index b0b707e9fbd0..bd56c7804c91 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"I-access ang mga setting ng Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Pinapayagan ang app na i-configure ang lokal na Bluetooth tablet, at tumuklas ng at ipares sa mga malayuang device."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Pinapayagan ang app na i-configure ang lokal na Bluetooth na telepono, at tumuklas ng at ipares sa mga malayuang device."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"payagan ang pagpapares ng Bluetooth sa pamamagitan ng Application"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Pinapayagan ang app na pumares sa mga malayuang device nang walang pakikipag-ugnay sa user."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Pinapayagan ang app na pumares sa mga malayuang device nang walang pakikipag-ugnay sa user."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"kumonekta at magdiskonekta mula sa WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Pinapayagan ang app na tukuyin kung pinapagana ang WiMAX at impormasyon tungkol sa anumang mga WiMAX network na nakakonekta."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Baguhin ang katayuan ng WiMAX"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Subukang muli sa ibang pagkakataon"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Mag-swipe pababa upang lumabas sa full screen"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 35c68d47287d..b0ce115180c6 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -246,10 +246,10 @@
<string name="permdesc_statusBarService" msgid="716113660795976060">"Uygulamaya, durum çubuğu olma izni verir."</string>
<string name="permlab_expandStatusBar" msgid="1148198785937489264">"durum çubuğunu genişlet/daralt"</string>
<string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Uygulamaya, durum çubuğunu genişletip daraltma izni verir."</string>
- <string name="permlab_install_shortcut" msgid="4279070216371564234">"kısayolları yükle"</string>
- <string name="permdesc_install_shortcut" msgid="8341295916286736996">"Uygulamaya, kullanıcı müdahalesi olmadan kısayolları Ana ekrana ekleme izni verir."</string>
- <string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"kısayolların yüklemesini kaldır"</string>
- <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Uygulamaya, kullanıcının müdahalesi olmadan kısayolları Ana ekrandan kaldırma izni verir."</string>
+ <string name="permlab_install_shortcut" msgid="4279070216371564234">"kısayolları yükleme"</string>
+ <string name="permdesc_install_shortcut" msgid="8341295916286736996">"Uygulamaya, kullanıcı müdahalesi olmadan kısayolları Ana Ekrana ekleme izni verir."</string>
+ <string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"kısayolların yüklemesini kaldırma"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Uygulamaya, kullanıcının müdahalesi olmadan kısayolları Ana Ekrandan kaldırma izni verir."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"giden çağrıları yeniden yönlendir"</string>
<string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"Uygulamaya, yapılan çağrıları işleme ve aranacak numarayı değiştirme izni verir. Bu izin, uygulamanın yapılan çağrıları izlemesine, yönlendirmesine ve önlemesine olanak sağlar."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"kısa mesajları al (SMS)"</string>
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth ayarlara eriş"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Uygulamaya, yerel Bluetooth tabletini yapılandırma ve uzak cihazları keşfedip bunlarla eşleşme izni verir."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Uygulamaya, yerel Bluetooth telefonunu yapılandırma ve uzak cihazları keşfedip bunlarla eşleşme izni verir."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Uygulama tarafından yapılan Bluetooth eşleştirmelerine izin ver"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Uygulamaya, kullanıcının müdahalesi olmadan uzak cihazlarla eşleme izni verir."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Uygulamaya, kullanıcının müdahalesi olmadan uzak cihazlarla eşleme izni verir."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX\'e bağlan veya WiMAX bağlantısını kes"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Uygulamaya, WiMAX\'in etkin olup olmadığını belirleme ve bağlı tüm WiMAX ağlarıyla ilgili bilgilere erişme izni verir."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX durumunu değiştir"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Daha sonra tekrar deneyin"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Tam ekrandan çıkmak için aşağıya hızlıca kaydırın"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 9fc8b5e36777..796de25eb6e6 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"отримувати доступ до налаштувань Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Дозволяє програмі налаштовувати планшетний ПК із локальним Bluetooth, а також знаходити віддалені пристрої та створювати з ними пару."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Дозволяє програмі налаштовувати телефон із локальним Bluetooth, а також знаходити віддалені пристрої та створювати з ними пару."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"дозволити програмі створювати пару з Bluetooth"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Дозволяє програмі самостійно підключатись до віддалених пристроїв."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Дозволяє програмі самостійно підключатись до віддалених пристроїв."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"під’єднуватися та від’єднуватися від WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Дозволяє програмі визначати, чи ввімкнено WiMAX, а також переглядати інформацію про будь-які під’єднані мережі WiMAX."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Змінити стан WiMAX"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Спробуйте пізніше"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Проведіть пальцем зверху вниз, щоб зменшити"</string>
+ <string name="done_label" msgid="2093726099505892398">"Готово"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Вибір годин на циферблаті"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Вибір хвилин на циферблаті"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Виберіть години"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Виберіть хвилини"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Дні місяця – ескізи"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Роки – список"</string>
+ <string name="select_day" msgid="7774759604701773332">"Виберіть місяць і день"</string>
+ <string name="select_year" msgid="7952052866994196170">"Виберіть рік"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Вибрано: <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> видалено"</string>
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 348d8852a423..589fd6f21929 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"truy cập cài đặt Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Cho phép ứng dụng định cấu hình máy tính bảng Bluetooth cục bộ cũng như phát hiện và ghép nối với các thiết bị từ xa."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Cho phép ứng dụng định cấu hình điện thoại Bluetooth cục bộ cũng như phát hiện và ghép nối với các thiết bị từ xa."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"cho phép ghép nối Bluetooth theo ứng dụng"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Cho phép ứng dụng ghép nối với các thiết bị từ xa mà không cần tương tác của người dùng."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Cho phép ứng dụng ghép nối với các thiết bị từ xa mà không cần tương tác của người dùng."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"kết nối và ngắt kết nối khỏi WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Cho phép ứng dụng xác định liệu WiMAX đã được bật chưa và thông tin về bất kỳ mạng WiMAX nào được kết nối."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Thay đổi trạng thái WiMAX"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Hãy thử lại sau"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Vuốt từ trên xuống để thoát toàn màn hình"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index a06cf6a89bbf..ac52a2c69b25 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"访问蓝牙设置"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"允许应用配置本地蓝牙平板电脑,以及发现远程设备并进行配对。"</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"允许应用配置本地蓝牙手机,以及发现远程设备并进行配对。"</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"允许应用进行蓝牙配对"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"允许应用自行与远程设备配对。"</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"允许应用自行与远程设备配对。"</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"建立或中断 WiMAX 网络连接"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"允许该应用确定是否启用了 WiMAX 以及连接的任何 WiMAX 网络的相关信息。"</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"更改 WiMAX 状态"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"稍后重试"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"从顶部向下滑动即可退出全屏模式"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index c6d40a80b1c5..2df25dd397f0 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"存取藍牙設定"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"允許應用程式設定本機藍牙平板電腦,以及與偵測到的遠端裝置配對。"</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"允許應用程式設定本機藍牙手機,以及與偵測到的遠端裝置配對。"</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"允許應用程式執行藍牙配對"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"允許應用程式繞過用戶授權直接與遠端裝置配對。"</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"允許應用程式繞過用戶授權直接與遠端裝置配對。"</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"建立或中斷與 WiMAX 網絡的連線"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"允許應用程式確定是否已啟用 WiMAX,以及判斷任何已連接 WiMAX 網絡的相關資訊。"</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"更改 WiMAX 狀態"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"稍後再試"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"從頂端往下快速滑動即可退出全螢幕"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index c9c3262a361a..c2e8321649a2 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -611,6 +611,9 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"存取藍牙設定"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"允許應用程式設定本機藍牙平板電腦,以及搜尋遠端裝置並配對連線。"</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"允許應用程式設定本機藍牙手機,以及搜尋遠端裝置並配對連線。"</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"允許應用程式執行藍牙配對"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"允許應用程式自動與遠端裝置配對。"</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"允許應用程式自動與遠端裝置配對。"</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"建立或中斷與 WiMAX 網路的連線"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"允許應用程式判斷是否已啟用 WiMAX,以及判讀任何已連上 WiMAX 網路的相關資訊。"</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"變更 WiMAX 狀態"</string>
@@ -1647,4 +1650,26 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"稍後再試"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"從頂端往下滑動即可結束全螢幕"</string>
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index cf2389730ed8..e9cb99516c78 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -611,6 +611,9 @@
<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_bluetoothPriv" msgid="4009494246009513828">"vumela ukumataniswa kwe-Bluetooth ngohlelo lokusebenza"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Ivumela uhlelo lokusebenza ukuthi lubhanqwe ngamadivayisi wesilawuli kude ngaphandle kokuhlanganyela nomsebenzisi."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Ivumela uhlelo lokusebenza ukuthi lubhanqwe ngamadivayisi wesilawuli kude ngaphandle kokuhlanganyela nomsebenzisi."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"xhuma futhi unqamule kusuka ku-WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Ivumela uhlelo lokusebenza ukucacisa ukuthi ingabe i-WiMAX inikwe amandla futhi ulwazi mayelana namanethiwekhi e-WiMAX axhunyiwe."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Shintsha isimo se-WiMAX"</string>
@@ -1647,4 +1650,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Zama futhi emva kwesikhathi"</string>
<string name="transient_navigation_confirmation" msgid="8554991488096662508">"Swayipha ngezansi kusuka ngaphezulu ukuze uphume kusikrini esigcwele"</string>
+ <string name="done_label" msgid="2093726099505892398">"Kwenziwe"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Amahora weslayidi esiyindingilizi"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Amaminithi weslayidi esiyindingilizi"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Khetha amahora"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Khetha amaminithi"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Igridi yenyanga yezinsuku"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Uhlu lonyaka"</string>
+ <string name="select_day" msgid="7774759604701773332">"Khetha inyanga nosuku"</string>
+ <string name="select_year" msgid="7952052866994196170">"Khetha unyaka"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"I-<xliff:g id="ITEM">%1$s</xliff:g> ekhethiwe"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"I-<xliff:g id="KEY">%1$s</xliff:g> isusiwe"</string>
</resources>
diff --git a/core/res/res/values/integers.xml b/core/res/res/values/integers.xml
index 053fc851ca31..dc90bbff1aae 100644
--- a/core/res/res/values/integers.xml
+++ b/core/res/res/values/integers.xml
@@ -18,7 +18,5 @@
-->
<resources>
<integer name="kg_carousel_angle">75</integer>
- <integer name="kg_security_flip_duration">100</integer>
- <integer name="kg_security_fade_duration">100</integer>
<integer name="kg_glowpad_rotation_offset">0</integer>
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 93a132418c81..6d91833451ed 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -3187,6 +3187,8 @@
<!-- Title of intent resolver dialog when selecting an application to run. -->
<string name="whichApplication">Complete action using</string>
+ <!-- Title of intent resolver dialog when selecting a HOME application to run. -->
+ <string name="whichHomeApplication">Select a home app</string>
<!-- Option to always use the selected application resolution in the future. See the "Complete action using" dialog title-->
<string name="alwaysUse">Use by default for this action.</string>
<!-- Text displayed when the user selects the check box for setting default application. See the "Use by default for this action" check box. -->
@@ -4454,6 +4456,9 @@
<!-- Print fail reason: unknown. [CHAR LIMIT=25] -->
<string name="reason_unknown">unknown</string>
+ <!-- Print fail reason: the print service that has to process the print job is not available. [CHAR LIMIT=none] -->
+ <string name="reason_service_unavailable">Print service not enabled</string>
+
<!-- Title for the notification that a print service was installed. [CHAR LIMIT=50] -->
<string name="print_service_installed_title"><xliff:g id="name" example="Cloud Print">%s</xliff:g> service installed</string>
<!-- Message for the notification that a print service was installed. [CHAR LIMIT=50] -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index a519bd2e8713..aaf8085d1639 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -801,6 +801,7 @@
<java-symbol type="string" name="web_user_agent_target_content" />
<java-symbol type="string" name="webpage_unresponsive" />
<java-symbol type="string" name="whichApplication" />
+ <java-symbol type="string" name="whichHomeApplication" />
<java-symbol type="string" name="wifi_available_sign_in" />
<java-symbol type="string" name="network_available_sign_in" />
<java-symbol type="string" name="network_available_sign_in_detailed" />
@@ -928,6 +929,7 @@
<java-symbol type="string" name="mediasize_japanese_kahu" />
<java-symbol type="string" name="mediasize_japanese_kaku2" />
<java-symbol type="string" name="mediasize_japanese_you4" />
+ <java-symbol type="string" name="reason_service_unavailable" />
<java-symbol type="string" name="reason_unknown" />
<java-symbol type="string" name="restr_pin_enter_admin_pin" />
<java-symbol type="string" name="restr_pin_enter_pin" />
@@ -1041,6 +1043,7 @@
<java-symbol type="drawable" name="ic_text_dot" />
<java-symbol type="drawable" name="ic_print" />
<java-symbol type="drawable" name="ic_print_error" />
+ <java-symbol type="drawable" name="ic_grayedout_printer" />
<java-symbol type="drawable" name="indicator_code_lock_drag_direction_green_up" />
<java-symbol type="drawable" name="indicator_code_lock_drag_direction_red_up" />
<java-symbol type="drawable" name="indicator_code_lock_point_area_default_holo" />
diff --git a/docs/html/about/dashboards/index.jd b/docs/html/about/dashboards/index.jd
index ff194763e71d..1df2e22967b0 100644
--- a/docs/html/about/dashboards/index.jd
+++ b/docs/html/about/dashboards/index.jd
@@ -61,7 +61,7 @@ Platform Versions</a>.</p>
</div>
-<p style="clear:both"><em>Data collected during a 7-day period ending on September 4, 2013.
+<p style="clear:both"><em>Data collected during a 7-day period ending on October 2, 2013.
<br/>Any versions with less than 0.1% distribution are not shown.</em>
</p>
@@ -92,7 +92,7 @@ Screens</a>.</p>
</div>
-<p style="clear:both"><em>Data collected during a 7-day period ending on September 4, 2013
+<p style="clear:both"><em>Data collected during a 7-day period ending on October 2, 2013
<br/>Any screen configurations with less than 0.1% distribution are not shown.</em></p>
@@ -139,7 +139,7 @@ uses.</p>
-<p style="clear:both"><em>Data collected during a 7-day period ending on September 4, 2013</em></p>
+<p style="clear:both"><em>Data collected during a 7-day period ending on October 2, 2013</em></p>
@@ -157,17 +157,17 @@ uses.</p>
var VERSION_DATA =
[
{
- "chart": "//chart.googleapis.com/chart?chs=500x250&cht=p&chco=c4df9b%2C6fad0c&chd=t%3A2.4%2C30.7%2C0.1%2C21.7%2C45.1&chf=bg%2Cs%2C00000000&chl=Froyo%7CGingerbread%7CHoneycomb%7CIce%20Cream%20Sandwich%7CJelly%20Bean",
+ "chart": "//chart.googleapis.com/chart?chs=500x250&cht=p&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A2.2%2C28.5%2C0.1%2C20.6%2C48.6&chl=Froyo%7CGingerbread%7CHoneycomb%7CIce%20Cream%20Sandwich%7CJelly%20Bean",
"data": [
{
"api": 8,
"name": "Froyo",
- "perc": "2.4"
+ "perc": "2.2"
},
{
"api": 10,
"name": "Gingerbread",
- "perc": "30.7"
+ "perc": "28.5"
},
{
"api": 13,
@@ -177,17 +177,22 @@ var VERSION_DATA =
{
"api": 15,
"name": "Ice Cream Sandwich",
- "perc": "21.7"
+ "perc": "20.6"
},
{
"api": 16,
"name": "Jelly Bean",
- "perc": "36.6"
+ "perc": "36.5"
},
{
"api": 17,
"name": "Jelly Bean",
- "perc": "8.5"
+ "perc": "10.6"
+ },
+ {
+ "api": 18,
+ "name": "Jelly Bean",
+ "perc": "1.5"
}
]
}
@@ -202,21 +207,21 @@ var SCREEN_DATA =
{
"data": {
"Large": {
- "hdpi": "0.4",
+ "hdpi": "0.5",
"ldpi": "0.6",
- "mdpi": "3.4",
+ "mdpi": "3.5",
"tvdpi": "1.2",
- "xhdpi": "0.5"
+ "xhdpi": "0.6"
},
"Normal": {
- "hdpi": "33.6",
+ "hdpi": "33.5",
"ldpi": "0.1",
- "mdpi": "15.7",
- "xhdpi": "23.1",
- "xxhdpi": "7.1"
+ "mdpi": "15.3",
+ "xhdpi": "22.8",
+ "xxhdpi": "7.7"
},
"Small": {
- "ldpi": "9.5"
+ "ldpi": "9.4"
},
"Xlarge": {
"hdpi": "0.3",
@@ -224,8 +229,8 @@ var SCREEN_DATA =
"xhdpi": "0.1"
}
},
- "densitychart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chd=t%3A10.2%2C23.5%2C1.2%2C34.3%2C23.7%2C7.1&chf=bg%2Cs%2C00000000&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi",
- "layoutchart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chd=t%3A4.8%2C6.1%2C79.6%2C9.5&chf=bg%2Cs%2C00000000&chl=Xlarge%7CLarge%7CNormal%7CSmall"
+ "densitychart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A10.1%2C23.3%2C1.2%2C34.3%2C23.5%2C7.7&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi",
+ "layoutchart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A4.8%2C6.4%2C79.5%2C9.4&chl=Xlarge%7CLarge%7CNormal%7CSmall"
}
];
diff --git a/graphics/java/android/graphics/drawable/InsetDrawable.java b/graphics/java/android/graphics/drawable/InsetDrawable.java
index e3a7e2bfa84e..818878254acb 100644
--- a/graphics/java/android/graphics/drawable/InsetDrawable.java
+++ b/graphics/java/android/graphics/drawable/InsetDrawable.java
@@ -202,7 +202,13 @@ public class InsetDrawable extends Drawable implements Drawable.Callback
public void setColorFilter(ColorFilter cf) {
mInsetState.mDrawable.setColorFilter(cf);
}
-
+
+ /** {@hide} */
+ @Override
+ public void setLayoutDirection(int layoutDirection) {
+ mInsetState.mDrawable.setLayoutDirection(layoutDirection);
+ }
+
@Override
public int getOpacity() {
return mInsetState.mDrawable.getOpacity();
diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
index 720494be4b7b..ab34c0fd5649 100644
--- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java
+++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
@@ -219,16 +219,15 @@ public class NinePatchDrawable extends Drawable {
@Override
public void draw(Canvas canvas) {
final Rect bounds = getBounds();
- final boolean needMirroring = isAutoMirrored() &&
- getLayoutDirection() == LayoutDirection.RTL;
- if (needMirroring) {
+ final boolean needsMirroring = needsMirroring();
+ if (needsMirroring) {
canvas.save();
// Mirror the 9patch
canvas.translate(bounds.right - bounds.left, 0);
canvas.scale(-1.0f, 1.0f);
}
mNinePatch.draw(canvas, bounds, mPaint);
- if (needMirroring) {
+ if (needsMirroring) {
canvas.restore();
}
}
@@ -240,7 +239,11 @@ public class NinePatchDrawable extends Drawable {
@Override
public boolean getPadding(Rect padding) {
- padding.set(mPadding);
+ if (needsMirroring()) {
+ padding.set(mPadding.right, mPadding.top, mPadding.left, mPadding.bottom);
+ } else {
+ padding.set(mPadding);
+ }
return true;
}
@@ -249,7 +252,12 @@ public class NinePatchDrawable extends Drawable {
*/
@Override
public Insets getOpticalInsets() {
- return mOpticalInsets;
+ if (needsMirroring()) {
+ return Insets.of(mOpticalInsets.right, mOpticalInsets.top, mOpticalInsets.right,
+ mOpticalInsets.bottom);
+ } else {
+ return mOpticalInsets;
+ }
}
@Override
@@ -297,6 +305,10 @@ public class NinePatchDrawable extends Drawable {
mNinePatchState.mAutoMirrored = mirrored;
}
+ private boolean needsMirroring() {
+ return isAutoMirrored() && getLayoutDirection() == LayoutDirection.RTL;
+ }
+
@Override
public boolean isAutoMirrored() {
return mNinePatchState.mAutoMirrored;
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 3425c91aac07..84ea4c90d62b 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -2687,7 +2687,11 @@ public class AudioService extends IAudioService.Stub {
*/
private void queueMsgUnderWakeLock(Handler handler, int msg,
int arg1, int arg2, Object obj, int delay) {
+ final long ident = Binder.clearCallingIdentity();
+ // Always acquire the wake lock as AudioService because it is released by the
+ // message handler.
mAudioEventWakeLock.acquire();
+ Binder.restoreCallingIdentity(ident);
sendMsg(handler, msg, SENDMSG_QUEUE, arg1, arg2, obj, delay);
}
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index def9aa7f74e3..0abd5f861d43 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -2162,6 +2162,7 @@ public class MediaPlayer implements SubtitleController.Listener
private static final int MEDIA_STARTED = 6;
private static final int MEDIA_PAUSED = 7;
private static final int MEDIA_STOPPED = 8;
+ private static final int MEDIA_SKIPPED = 9;
private static final int MEDIA_TIMED_TEXT = 99;
private static final int MEDIA_ERROR = 100;
private static final int MEDIA_INFO = 200;
@@ -2227,6 +2228,9 @@ public class MediaPlayer implements SubtitleController.Listener
if (mOnSeekCompleteListener != null) {
mOnSeekCompleteListener.onSeekComplete(mMediaPlayer);
}
+ // fall through
+
+ case MEDIA_SKIPPED:
if (mTimeProvider != null) {
mTimeProvider.onSeekComplete(mMediaPlayer);
}
@@ -2812,6 +2816,7 @@ public class MediaPlayer implements SubtitleController.Listener
private Handler mEventHandler;
private boolean mRefresh = false;
private boolean mPausing = false;
+ private boolean mSeeking = false;
private static final int NOTIFY = 1;
private static final int NOTIFY_TIME = 0;
private static final int REFRESH_AND_NOTIFY_TIME = 1;
@@ -2849,7 +2854,15 @@ public class MediaPlayer implements SubtitleController.Listener
}
private void scheduleNotification(int type, long delayUs) {
+ // ignore time notifications until seek is handled
+ if (mSeeking &&
+ (type == NOTIFY_TIME || type == REFRESH_AND_NOTIFY_TIME)) {
+ return;
+ }
+
if (DEBUG) Log.v(TAG, "scheduleNotification " + type + " in " + delayUs);
+ mStopped = type == NOTIFY_STOP;
+ mSeeking = type == NOTIFY_SEEK;
mEventHandler.removeMessages(NOTIFY);
Message msg = mEventHandler.obtainMessage(NOTIFY, type, 0);
mEventHandler.sendMessageDelayed(msg, (int) (delayUs / 1000));
@@ -2876,7 +2889,6 @@ public class MediaPlayer implements SubtitleController.Listener
synchronized(this) {
if (DEBUG) Log.d(TAG, "onPaused: " + paused);
if (mStopped) { // handle as seek if we were stopped
- mStopped = false;
scheduleNotification(NOTIFY_SEEK, 0 /* delay */);
} else {
mPausing = paused; // special handling if player disappeared
@@ -2890,7 +2902,6 @@ public class MediaPlayer implements SubtitleController.Listener
synchronized(this) {
if (DEBUG) Log.d(TAG, "onStopped");
mPaused = true;
- mStopped = true;
scheduleNotification(NOTIFY_STOP, 0 /* delay */);
}
}
@@ -2899,7 +2910,6 @@ public class MediaPlayer implements SubtitleController.Listener
@Override
public void onSeekComplete(MediaPlayer mp) {
synchronized(this) {
- mStopped = false;
scheduleNotification(NOTIFY_SEEK, 0 /* delay */);
}
}
@@ -2914,6 +2924,7 @@ public class MediaPlayer implements SubtitleController.Listener
}
private synchronized void notifySeek() {
+ mSeeking = false;
try {
long timeUs = getCurrentTimeUs(true, false);
if (DEBUG) Log.d(TAG, "onSeekComplete at " + timeUs);
@@ -3025,6 +3036,11 @@ public class MediaPlayer implements SubtitleController.Listener
}
long nextTimeUs = nowUs;
+ if (mSeeking) {
+ // skip timed-event notifications until seek is complete
+ return;
+ }
+
if (DEBUG) {
StringBuilder sb = new StringBuilder();
sb.append("notifyTimedEvent(").append(mLastTimeUs).append(" -> ")
@@ -3124,6 +3140,11 @@ public class MediaPlayer implements SubtitleController.Listener
if (monotonic && mLastTimeUs < mLastReportedTime) {
/* have to adjust time */
mTimeAdjustment = mLastReportedTime - mLastTimeUs;
+ if (mTimeAdjustment > 1000000) {
+ // schedule seeked event if time jumped significantly
+ // TODO: do this properly by introducing an exception
+ scheduleNotification(NOTIFY_SEEK, 0 /* delay */);
+ }
} else {
mTimeAdjustment = 0;
}
diff --git a/packages/DocumentsUI/AndroidManifest.xml b/packages/DocumentsUI/AndroidManifest.xml
index 71a05673de0b..6faf7f870f59 100644
--- a/packages/DocumentsUI/AndroidManifest.xml
+++ b/packages/DocumentsUI/AndroidManifest.xml
@@ -2,6 +2,7 @@
package="com.android.documentsui">
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
+ <uses-permission android:name="android.permission.REMOVE_TASKS" />
<application
android:name=".DocumentsApplication"
diff --git a/packages/Keyguard/res/anim/keyguard_security_fade_in.xml b/packages/DocumentsUI/res/animator-ldrtl/dir_down.xml
index c66c6049d52f..6c7e2244c712 100644
--- a/packages/Keyguard/res/anim/keyguard_security_fade_in.xml
+++ b/packages/DocumentsUI/res/animator-ldrtl/dir_down.xml
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 The Android Open Source Project
+<!-- 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.
@@ -14,9 +13,10 @@
limitations under the License.
-->
-<alpha xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:interpolator/decelerate_quad"
- android:fromAlpha="0.0" android:toAlpha="1.0"
- android:duration="@integer/kg_security_fade_duration" />
-
-
+<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:valueFrom="-1"
+ android:valueTo="0"
+ android:propertyName="position"
+ android:valueType="floatType"
+ android:duration="@android:integer/config_mediumAnimTime"
+ android:interpolator="@android:interpolator/decelerate_quad" />
diff --git a/packages/Keyguard/res/anim/keyguard_security_fade_out.xml b/packages/DocumentsUI/res/animator-ldrtl/dir_up.xml
index 6465b35fab65..8e2925c9760d 100644
--- a/packages/Keyguard/res/anim/keyguard_security_fade_out.xml
+++ b/packages/DocumentsUI/res/animator-ldrtl/dir_up.xml
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 The Android Open Source Project
+<!-- 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.
@@ -13,9 +12,11 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<alpha xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:interpolator/accelerate_quad"
- android:fromAlpha="1.0"
- android:toAlpha="0.0"
- android:duration="@integer/kg_security_fade_duration"
-/>
+
+<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:valueFrom="0"
+ android:valueTo="-1"
+ android:propertyName="position"
+ android:valueType="floatType"
+ android:duration="@android:integer/config_mediumAnimTime"
+ android:interpolator="@android:interpolator/accelerate_quad" />
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_dir_shadow.9.png b/packages/DocumentsUI/res/drawable-hdpi/ic_dir_shadow_am.9.png
index 904d5253672c..904d5253672c 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_dir_shadow.9.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_dir_shadow_am.9.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow_tablet.9.png b/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow_tablet_am.9.png
index a1bbc8b7965d..a1bbc8b7965d 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow_tablet.9.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow_tablet_am.9.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_dir_shadow.9.png b/packages/DocumentsUI/res/drawable-mdpi/ic_dir_shadow_am.9.png
index 068619be0b43..068619be0b43 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_dir_shadow.9.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_dir_shadow_am.9.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow_tablet.9.png b/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow_tablet_am.9.png
index fabb56ed2980..fabb56ed2980 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow_tablet.9.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow_tablet_am.9.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_dir_shadow.9.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_dir_shadow_am.9.png
index e38a8685dcea..e38a8685dcea 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_dir_shadow.9.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_dir_shadow_am.9.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow_tablet.9.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow_tablet_am.9.png
index 2c39a67ffc22..2c39a67ffc22 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow_tablet.9.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow_tablet_am.9.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dir_shadow.9.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dir_shadow_am.9.png
index 0b332e410a77..0b332e410a77 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dir_shadow.9.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dir_shadow_am.9.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow_tablet.9.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow_tablet_am.9.png
index 3c9579097fdf..3c9579097fdf 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow_tablet.9.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow_tablet_am.9.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable/ic_dir_shadow.xml b/packages/DocumentsUI/res/drawable/ic_dir_shadow.xml
new file mode 100644
index 000000000000..1153e693f4d3
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable/ic_dir_shadow.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 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.
+ */
+-->
+
+<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/ic_dir_shadow_am"
+ android:autoMirrored="true">
+</nine-patch>
diff --git a/packages/DocumentsUI/res/drawable/ic_drawer_shadow_tablet.xml b/packages/DocumentsUI/res/drawable/ic_drawer_shadow_tablet.xml
new file mode 100644
index 000000000000..382ebff764af
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable/ic_drawer_shadow_tablet.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 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.
+ */
+-->
+
+<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/ic_drawer_shadow_tablet_am"
+ android:autoMirrored="true">
+</nine-patch>
diff --git a/packages/DocumentsUI/res/values/strings.xml b/packages/DocumentsUI/res/values/strings.xml
index b7dcb71ee76d..92c30baa0c60 100644
--- a/packages/DocumentsUI/res/values/strings.xml
+++ b/packages/DocumentsUI/res/values/strings.xml
@@ -64,6 +64,8 @@
<string name="save_error">Failed to save document</string>
<!-- Toast shown when creating a folder failed with an error [CHAR LIMIT=48] -->
<string name="create_error">Failed to create folder</string>
+ <!-- Error message shown when querying for a list of documents failed [CHAR LIMIT=48] -->
+ <string name="query_error">Failed to query documents</string>
<!-- Title of storage root location that contains recently modified or used documents [CHAR LIMIT=24] -->
<string name="root_recent">Recent</string>
diff --git a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java
index 48bfaf0d7c34..22dd6e40285f 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java
@@ -16,10 +16,13 @@
package com.android.documentsui;
+import static com.android.documentsui.DocumentsActivity.TAG;
+
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.FragmentManager;
+import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
@@ -29,6 +32,7 @@ import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
@@ -36,8 +40,6 @@ import android.widget.Toast;
import com.android.documentsui.model.DocumentInfo;
-import java.io.FileNotFoundException;
-
/**
* Dialog to create a new directory.
*/
@@ -67,7 +69,12 @@ public class CreateDirectoryFragment extends DialogFragment {
@Override
public void onClick(DialogInterface dialog, int which) {
final String displayName = text1.getText().toString();
- new CreateDirectoryTask(displayName).execute();
+
+ final DocumentsActivity activity = (DocumentsActivity) getActivity();
+ final DocumentInfo cwd = activity.getCurrentDirectory();
+
+ new CreateDirectoryTask(displayName).executeOnExecutor(
+ ProviderExecutor.forAuthority(cwd.authority));
}
});
builder.setNegativeButton(android.R.string.cancel, null);
@@ -88,12 +95,19 @@ public class CreateDirectoryFragment extends DialogFragment {
final ContentResolver resolver = activity.getContentResolver();
final DocumentInfo cwd = activity.getCurrentDirectory();
- final Uri childUri = DocumentsContract.createDocument(
- resolver, cwd.derivedUri, Document.MIME_TYPE_DIR, mDisplayName);
+
+ ContentProviderClient client = null;
try {
+ client = DocumentsApplication.acquireUnstableProviderOrThrow(
+ resolver, cwd.derivedUri.getAuthority());
+ final Uri childUri = DocumentsContract.createDocument(
+ client, cwd.derivedUri, Document.MIME_TYPE_DIR, mDisplayName);
return DocumentInfo.fromUri(resolver, childUri);
- } catch (FileNotFoundException e) {
+ } catch (Exception e) {
+ Log.w(TAG, "Failed to create directory", e);
return null;
+ } finally {
+ ContentProviderClient.releaseQuietly(client);
}
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
index 1f11aed91358..59caad0ecf57 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
@@ -27,10 +27,12 @@ import static com.android.documentsui.model.DocumentInfo.getCursorInt;
import static com.android.documentsui.model.DocumentInfo.getCursorLong;
import static com.android.documentsui.model.DocumentInfo.getCursorString;
+import android.app.ActivityManager;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.app.LoaderManager.LoaderCallbacks;
+import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
@@ -112,6 +114,7 @@ public class DirectoryFragment extends Fragment {
private boolean mHideGridTitles = false;
+ private boolean mSvelteRecents;
private Point mThumbSize;
private DocumentsAdapter mAdapter;
@@ -203,6 +206,19 @@ public class DirectoryFragment extends Fragment {
}
@Override
+ public void onDestroyView() {
+ super.onDestroyView();
+
+ // Cancel any outstanding thumbnail requests
+ final ViewGroup target = (mListView.getAdapter() != null) ? mListView : mGridView;
+ final int count = target.getChildCount();
+ for (int i = 0; i < count; i++) {
+ final View view = target.getChildAt(i);
+ mRecycleListener.onMovedToScrapHeap(view);
+ }
+ }
+
+ @Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
@@ -224,6 +240,10 @@ public class DirectoryFragment extends Fragment {
mHideGridTitles = (doc != null) && doc.isGridTitlesHidden();
}
+ final ActivityManager am = (ActivityManager) context.getSystemService(
+ Context.ACTIVITY_SERVICE);
+ mSvelteRecents = am.isLowRamDevice() && (mType == TYPE_RECENT_OPEN);
+
mCallbacks = new LoaderCallbacks<DirectoryResult>() {
@Override
public Loader<DirectoryResult> onCreateLoader(int id, Bundle args) {
@@ -259,7 +279,7 @@ public class DirectoryFragment extends Fragment {
public void onLoadFinished(Loader<DirectoryResult> loader, DirectoryResult result) {
if (!isAdded()) return;
- mAdapter.swapCursor(result.cursor);
+ mAdapter.swapResult(result);
// Push latest state up to UI
// TODO: if mode change was racing with us, don't overwrite it
@@ -285,7 +305,7 @@ public class DirectoryFragment extends Fragment {
@Override
public void onLoaderReset(Loader<DirectoryResult> loader) {
- mAdapter.swapCursor(null);
+ mAdapter.swapResult(null);
}
};
@@ -552,9 +572,16 @@ public class DirectoryFragment extends Fragment {
continue;
}
- if (!DocumentsContract.deleteDocument(resolver, doc.derivedUri)) {
+ ContentProviderClient client = null;
+ try {
+ client = DocumentsApplication.acquireUnstableProviderOrThrow(
+ resolver, doc.derivedUri.getAuthority());
+ DocumentsContract.deleteDocument(client, doc.derivedUri);
+ } catch (Exception e) {
Log.w(TAG, "Failed to delete " + doc);
hadTrouble = true;
+ } finally {
+ ContentProviderClient.releaseQuietly(client);
}
}
@@ -646,13 +673,13 @@ public class DirectoryFragment extends Fragment {
private List<Footer> mFooters = Lists.newArrayList();
- public void swapCursor(Cursor cursor) {
- mCursor = cursor;
- mCursorCount = cursor != null ? cursor.getCount() : 0;
+ public void swapResult(DirectoryResult result) {
+ mCursor = result != null ? result.cursor : null;
+ mCursorCount = mCursor != null ? mCursor.getCount() : 0;
mFooters.clear();
- final Bundle extras = cursor != null ? cursor.getExtras() : null;
+ final Bundle extras = mCursor != null ? mCursor.getExtras() : null;
if (extras != null) {
final String info = extras.getString(DocumentsContract.EXTRA_INFO);
if (info != null) {
@@ -667,6 +694,11 @@ public class DirectoryFragment extends Fragment {
}
}
+ if (result != null && result.exception != null) {
+ mFooters.add(new MessageFooter(
+ 3, R.drawable.ic_dialog_alert, getString(R.string.query_error)));
+ }
+
if (isEmpty()) {
mEmptyView.setVisibility(View.VISIBLE);
} else {
@@ -763,7 +795,7 @@ public class DirectoryFragment extends Fragment {
final boolean supportsThumbnail = (docFlags & Document.FLAG_SUPPORTS_THUMBNAIL) != 0;
final boolean allowThumbnail = (state.derivedMode == MODE_GRID)
|| MimePredicate.mimeMatches(MimePredicate.VISUAL_MIMES, docMimeType);
- final boolean showThumbnail = supportsThumbnail && allowThumbnail;
+ final boolean showThumbnail = supportsThumbnail && allowThumbnail && !mSvelteRecents;
boolean cacheHit = false;
if (showThumbnail) {
@@ -777,7 +809,7 @@ public class DirectoryFragment extends Fragment {
final ThumbnailAsyncTask task = new ThumbnailAsyncTask(
uri, iconMime, iconThumb, mThumbSize);
iconThumb.setTag(task);
- task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ task.executeOnExecutor(ProviderExecutor.forAuthority(docAuthority));
}
}
@@ -970,20 +1002,26 @@ public class DirectoryFragment extends Fragment {
@Override
protected Bitmap doInBackground(Uri... params) {
+ if (isCancelled()) return null;
+
final Context context = mIconThumb.getContext();
+ final ContentResolver resolver = context.getContentResolver();
+ ContentProviderClient client = null;
Bitmap result = null;
try {
- // TODO: switch to using unstable provider
- result = DocumentsContract.getDocumentThumbnail(
- context.getContentResolver(), mUri, mThumbSize, mSignal);
+ client = DocumentsApplication.acquireUnstableProviderOrThrow(
+ resolver, mUri.getAuthority());
+ result = DocumentsContract.getDocumentThumbnail(client, mUri, mThumbSize, mSignal);
if (result != null) {
final ThumbnailCache thumbs = DocumentsApplication.getThumbnailsCache(
context, mThumbSize);
thumbs.put(mUri, result);
}
} catch (Exception e) {
- Log.w(TAG, "Failed to load thumbnail: " + e);
+ Log.w(TAG, "Failed to load thumbnail for " + mUri + ": " + e);
+ } finally {
+ ContentProviderClient.releaseQuietly(client);
}
return result;
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java
index 0b3ecf84900e..163615d4b677 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java
@@ -56,7 +56,7 @@ class DirectoryResult implements AutoCloseable {
@Override
public void close() {
IoUtils.closeQuietly(cursor);
- ContentProviderClient.closeQuietly(client);
+ ContentProviderClient.releaseQuietly(client);
cursor = null;
client = null;
}
@@ -79,7 +79,7 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> {
public DirectoryLoader(Context context, int type, RootInfo root, DocumentInfo doc, Uri uri,
int userSortOrder) {
- super(context);
+ super(context, ProviderExecutor.forAuthority(root.authority));
mType = type;
mRoot = root;
mDoc = doc;
@@ -157,9 +157,11 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> {
Log.d(TAG, "userMode=" + userMode + ", userSortOrder=" + mUserSortOrder + " --> mode="
+ result.mode + ", sortOrder=" + result.sortOrder);
+ ContentProviderClient client = null;
try {
- result.client = resolver.acquireUnstableContentProviderClient(authority);
- cursor = result.client.query(
+ client = DocumentsApplication.acquireUnstableProviderOrThrow(resolver, authority);
+
+ cursor = client.query(
mUri, null, null, null, getQuerySortOrder(result.sortOrder), mSignal);
cursor.registerContentObserver(mObserver);
@@ -173,11 +175,12 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> {
cursor = new SortingCursorWrapper(cursor, result.sortOrder);
}
+ result.client = client;
result.cursor = cursor;
} catch (Exception e) {
Log.w(TAG, "Failed to query", e);
result.exception = e;
- ContentProviderClient.closeQuietly(result.client);
+ ContentProviderClient.releaseQuietly(client);
} finally {
synchronized (this) {
mSignal = null;
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryView.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryView.java
index 28e2bd90a155..b552e5aa838c 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryView.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryView.java
@@ -40,7 +40,7 @@ public class DirectoryView extends FrameLayout {
public void setBackground(Drawable background) {
final Rect rect = new Rect();
background.getPadding(rect);
- final InsetDrawable inset = new InsetDrawable(background, -rect.left, 0, 0, 0);
+ final InsetDrawable inset = new InsetDrawable(background, -rect.left, 0, -rect.right, 0);
super.setBackground(inset);
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
index 4caec8fb0ad2..76607796d60d 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
@@ -35,6 +35,7 @@ import android.app.FragmentManager;
import android.content.ActivityNotFoundException;
import android.content.ClipData;
import android.content.ComponentName;
+import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Intent;
@@ -90,6 +91,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
+import java.util.concurrent.Executor;
public class DocumentsActivity extends Activity {
public static final String TAG = "Documents";
@@ -214,7 +216,7 @@ public class DocumentsActivity extends Activity {
if (!mState.restored) {
if (mState.action == ACTION_MANAGE) {
final Uri rootUri = getIntent().getData();
- new RestoreRootTask(rootUri).execute();
+ new RestoreRootTask(rootUri).executeOnExecutor(getCurrentExecutor());
} else {
new RestoreStackTask().execute();
}
@@ -781,6 +783,15 @@ public class DocumentsActivity extends Activity {
return mState.stack.peek();
}
+ public Executor getCurrentExecutor() {
+ final DocumentInfo cwd = getCurrentDirectory();
+ if (cwd != null && cwd.authority != null) {
+ return ProviderExecutor.forAuthority(cwd.authority);
+ } else {
+ return AsyncTask.THREAD_POOL_EXECUTOR;
+ }
+ }
+
public State getDisplayState() {
return mState;
}
@@ -854,7 +865,7 @@ public class DocumentsActivity extends Activity {
mState.stackTouched = true;
if (!mRoots.isRecentsRoot(root)) {
- new PickRootTask(root).execute();
+ new PickRootTask(root).executeOnExecutor(getCurrentExecutor());
} else {
onCurrentDirectoryChanged(ANIM_SIDE);
}
@@ -878,6 +889,7 @@ public class DocumentsActivity extends Activity {
mRoot.authority, mRoot.documentId);
return DocumentInfo.fromUri(getContentResolver(), uri);
} catch (FileNotFoundException e) {
+ Log.w(TAG, "Failed to find root", e);
return null;
}
}
@@ -930,7 +942,7 @@ public class DocumentsActivity extends Activity {
onCurrentDirectoryChanged(ANIM_DOWN);
} else if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) {
// Explicit file picked, return
- new ExistingFinishTask(doc.derivedUri).execute();
+ new ExistingFinishTask(doc.derivedUri).executeOnExecutor(getCurrentExecutor());
} else if (mState.action == ACTION_CREATE) {
// Replace selected file
SaveFragment.get(fm).setReplaceTarget(doc);
@@ -964,16 +976,16 @@ public class DocumentsActivity extends Activity {
for (int i = 0; i < size; i++) {
uris[i] = docs.get(i).derivedUri;
}
- new ExistingFinishTask(uris).execute();
+ new ExistingFinishTask(uris).executeOnExecutor(getCurrentExecutor());
}
}
public void onSaveRequested(DocumentInfo replaceTarget) {
- new ExistingFinishTask(replaceTarget.derivedUri).execute();
+ new ExistingFinishTask(replaceTarget.derivedUri).executeOnExecutor(getCurrentExecutor());
}
public void onSaveRequested(String mimeType, String displayName) {
- new CreateFinishTask(mimeType, displayName).execute();
+ new CreateFinishTask(mimeType, displayName).executeOnExecutor(getCurrentExecutor());
}
private void saveStackBlocking() {
@@ -1035,12 +1047,26 @@ public class DocumentsActivity extends Activity {
@Override
protected Uri doInBackground(Void... params) {
+ final ContentResolver resolver = getContentResolver();
final DocumentInfo cwd = getCurrentDirectory();
- final Uri childUri = DocumentsContract.createDocument(
- getContentResolver(), cwd.derivedUri, mMimeType, mDisplayName);
+
+ ContentProviderClient client = null;
+ Uri childUri = null;
+ try {
+ client = DocumentsApplication.acquireUnstableProviderOrThrow(
+ resolver, cwd.derivedUri.getAuthority());
+ childUri = DocumentsContract.createDocument(
+ client, cwd.derivedUri, mMimeType, mDisplayName);
+ } catch (Exception e) {
+ Log.w(TAG, "Failed to create document", e);
+ } finally {
+ ContentProviderClient.releaseQuietly(client);
+ }
+
if (childUri != null) {
saveStackBlocking();
}
+
return childUri;
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.java
index 960181afcb95..6b46e3a0d0ec 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.java
@@ -19,13 +19,19 @@ package com.android.documentsui;
import android.app.ActivityManager;
import android.app.Application;
import android.content.BroadcastReceiver;
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Point;
import android.net.Uri;
+import android.os.RemoteException;
+import android.text.format.DateUtils;
public class DocumentsApplication extends Application {
+ private static final long PROVIDER_ANR_TIMEOUT = 20 * DateUtils.SECOND_IN_MILLIS;
+
private RootsCache mRoots;
private Point mThumbnailsSize;
private ThumbnailCache mThumbnails;
@@ -44,6 +50,17 @@ public class DocumentsApplication extends Application {
return thumbnails;
}
+ public static ContentProviderClient acquireUnstableProviderOrThrow(
+ ContentResolver resolver, String authority) throws RemoteException {
+ final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
+ authority);
+ if (client == null) {
+ throw new RemoteException("Failed to acquire provider for " + authority);
+ }
+ client.setDetectNotResponding(PROVIDER_ANR_TIMEOUT);
+ return client;
+ }
+
@Override
public void onCreate() {
final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
diff --git a/packages/DocumentsUI/src/com/android/documentsui/ProviderExecutor.java b/packages/DocumentsUI/src/com/android/documentsui/ProviderExecutor.java
new file mode 100644
index 000000000000..2105cb41fc9a
--- /dev/null
+++ b/packages/DocumentsUI/src/com/android/documentsui/ProviderExecutor.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.documentsui;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.Preconditions;
+import com.google.android.collect.Maps;
+
+import java.util.HashMap;
+import java.util.concurrent.Executor;
+import java.util.concurrent.LinkedBlockingQueue;
+
+public class ProviderExecutor extends Thread implements Executor {
+
+ @GuardedBy("sExecutors")
+ private static HashMap<String, ProviderExecutor> sExecutors = Maps.newHashMap();
+
+ public static Executor forAuthority(String authority) {
+ synchronized (sExecutors) {
+ ProviderExecutor executor = sExecutors.get(authority);
+ if (executor == null) {
+ executor = new ProviderExecutor();
+ executor.setName("ProviderExecutor: " + authority);
+ executor.start();
+ sExecutors.put(authority, executor);
+ }
+ return executor;
+ }
+ }
+
+ private final LinkedBlockingQueue<Runnable> mQueue = new LinkedBlockingQueue<Runnable>();
+
+ @Override
+ public void execute(Runnable command) {
+ Preconditions.checkNotNull(command);
+ mQueue.add(command);
+ }
+
+ @Override
+ public void run() {
+ while (true) {
+ try {
+ final Runnable command = mQueue.take();
+ command.run();
+ } catch (InterruptedException e) {
+ // That was weird; let's go look for more tasks.
+ }
+ }
+ }
+}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java
index 9a4fb7da725f..3a8a3fbdd103 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java
@@ -19,11 +19,12 @@ package com.android.documentsui;
import static com.android.documentsui.DocumentsActivity.TAG;
import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_LAST_MODIFIED;
+import android.app.ActivityManager;
import android.content.AsyncTaskLoader;
import android.content.ContentProviderClient;
-import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
+import android.database.MatrixCursor;
import android.database.MergeCursor;
import android.net.Uri;
import android.os.Bundle;
@@ -48,17 +49,14 @@ import java.util.HashMap;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
public class RecentLoader extends AsyncTaskLoader<DirectoryResult> {
private static final boolean LOGD = true;
- // TODO: adjust for svelte devices
- // TODO: add support for oneway queries to avoid wedging loader
- private static final int MAX_OUTSTANDING_RECENTS = 2;
+ private static final int MAX_OUTSTANDING_RECENTS = 4;
+ private static final int MAX_OUTSTANDING_RECENTS_SVELTE = 2;
/**
* Time to wait for first pass to complete before returning partial results.
@@ -74,21 +72,7 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> {
/** MIME types that should always be excluded from recents. */
private static final String[] RECENT_REJECT_MIMES = new String[] { Document.MIME_TYPE_DIR };
- private static final ExecutorService sExecutor = buildExecutor();
-
- /**
- * Create a bounded thread pool for fetching recents; it creates threads as
- * needed (up to maximum) and reclaims them when finished.
- */
- private static ExecutorService buildExecutor() {
- // Create a bounded thread pool for fetching recents; it creates
- // threads as needed (up to maximum) and reclaims them when finished.
- final ThreadPoolExecutor executor = new ThreadPoolExecutor(
- MAX_OUTSTANDING_RECENTS, MAX_OUTSTANDING_RECENTS, 10, TimeUnit.SECONDS,
- new LinkedBlockingQueue<Runnable>());
- executor.allowCoreThreadTimeOut(true);
- return executor;
- }
+ private final Semaphore mQueryPermits;
private final RootsCache mRoots;
private final State mState;
@@ -120,25 +104,41 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> {
public void run() {
if (isCancelled()) return;
- final ContentResolver resolver = getContext().getContentResolver();
- final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
- authority);
try {
+ mQueryPermits.acquire();
+ } catch (InterruptedException e) {
+ return;
+ }
+
+ try {
+ runInternal();
+ } finally {
+ mQueryPermits.release();
+ }
+ }
+
+ public void runInternal() {
+ ContentProviderClient client = null;
+ try {
+ client = DocumentsApplication.acquireUnstableProviderOrThrow(
+ getContext().getContentResolver(), authority);
+
final Uri uri = DocumentsContract.buildRecentDocumentsUri(authority, rootId);
final Cursor cursor = client.query(
uri, null, null, null, DirectoryLoader.getQuerySortOrder(mSortOrder));
mWithRoot = new RootCursorWrapper(authority, rootId, cursor, MAX_DOCS_FROM_ROOT);
- set(mWithRoot);
-
- mFirstPassLatch.countDown();
- if (mFirstPassDone) {
- onContentChanged();
- }
} catch (Exception e) {
- setException(e);
+ Log.w(TAG, "Failed to load " + authority + ", " + rootId, e);
} finally {
- ContentProviderClient.closeQuietly(client);
+ ContentProviderClient.releaseQuietly(client);
+ }
+
+ set(mWithRoot);
+
+ mFirstPassLatch.countDown();
+ if (mFirstPassDone) {
+ onContentChanged();
}
}
@@ -152,6 +152,13 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> {
super(context);
mRoots = roots;
mState = state;
+
+ // Keep clients around on high-RAM devices, since we'd be spinning them
+ // up moments later to fetch thumbnails anyway.
+ final ActivityManager am = (ActivityManager) getContext().getSystemService(
+ Context.ACTIVITY_SERVICE);
+ mQueryPermits = new Semaphore(
+ am.isLowRamDevice() ? MAX_OUTSTANDING_RECENTS_SVELTE : MAX_OUTSTANDING_RECENTS);
}
@Override
@@ -170,7 +177,7 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> {
mFirstPassLatch = new CountDownLatch(mTasks.size());
for (RecentTask task : mTasks.values()) {
- sExecutor.execute(task);
+ ProviderExecutor.forAuthority(task.authority).execute(task);
}
try {
@@ -184,11 +191,14 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> {
final long rejectBefore = System.currentTimeMillis() - REJECT_OLDER_THAN;
// Collect all finished tasks
+ boolean allDone = true;
List<Cursor> cursors = Lists.newArrayList();
for (RecentTask task : mTasks.values()) {
if (task.isDone()) {
try {
final Cursor cursor = task.get();
+ if (cursor == null) continue;
+
final FilteringCursorWrapper filtered = new FilteringCursorWrapper(
cursor, mState.acceptMimes, RECENT_REJECT_MIMES, rejectBefore) {
@Override
@@ -200,14 +210,15 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> {
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (ExecutionException e) {
- Log.w(TAG, "Failed to load " + task.authority + ", " + task.rootId, e);
+ // We already logged on other side
}
+ } else {
+ allDone = false;
}
}
if (LOGD) {
Log.d(TAG, "Found " + cursors.size() + " of " + mTasks.size() + " recent queries done");
- Log.d(TAG, sExecutor.toString());
}
final DirectoryResult result = new DirectoryResult();
@@ -215,11 +226,18 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> {
// Hint to UI if we're still loading
final Bundle extras = new Bundle();
- if (cursors.size() != mTasks.size()) {
+ if (!allDone) {
extras.putBoolean(DocumentsContract.EXTRA_LOADING, true);
}
- final MergeCursor merged = new MergeCursor(cursors.toArray(new Cursor[cursors.size()]));
+ final Cursor merged;
+ if (cursors.size() > 0) {
+ merged = new MergeCursor(cursors.toArray(new Cursor[cursors.size()]));
+ } else {
+ // Return something when nobody is ready
+ merged = new MatrixCursor(new String[0]);
+ }
+
final SortingCursorWrapper sorted = new SortingCursorWrapper(merged, result.sortOrder) {
@Override
public Bundle getExtras() {
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
index e3908e9ad515..bad0a9605a1b 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
@@ -243,10 +243,11 @@ public class RootsCache {
final List<RootInfo> roots = Lists.newArrayList();
final Uri rootsUri = DocumentsContract.buildRootsUri(authority);
- final ContentProviderClient client = resolver
- .acquireUnstableContentProviderClient(authority);
+
+ ContentProviderClient client = null;
Cursor cursor = null;
try {
+ client = DocumentsApplication.acquireUnstableProviderOrThrow(resolver, authority);
cursor = client.query(rootsUri, null, null, null, null);
while (cursor.moveToNext()) {
final RootInfo root = RootInfo.fromRootsCursor(authority, cursor);
@@ -256,7 +257,7 @@ public class RootsCache {
Log.w(TAG, "Failed to load some roots from " + authority + ": " + e);
} finally {
IoUtils.closeQuietly(cursor);
- ContentProviderClient.closeQuietly(client);
+ ContentProviderClient.releaseQuietly(client);
}
return roots;
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java
index 5091a612365a..91d912415592 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java
@@ -23,9 +23,10 @@ import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
import android.provider.DocumentsContract;
-import android.provider.DocumentsProvider;
import android.provider.DocumentsContract.Document;
+import android.provider.DocumentsProvider;
+import com.android.documentsui.DocumentsApplication;
import com.android.documentsui.RootCursorWrapper;
import libcore.io.IoUtils;
@@ -178,10 +179,11 @@ public class DocumentInfo implements Durable, Parcelable {
}
public void updateFromUri(ContentResolver resolver, Uri uri) throws FileNotFoundException {
- final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
- uri.getAuthority());
+ ContentProviderClient client = null;
Cursor cursor = null;
try {
+ client = DocumentsApplication.acquireUnstableProviderOrThrow(
+ resolver, uri.getAuthority());
cursor = client.query(uri, null, null, null, null);
if (!cursor.moveToFirst()) {
throw new FileNotFoundException("Missing details for " + uri);
@@ -191,7 +193,7 @@ public class DocumentInfo implements Durable, Parcelable {
throw asFileNotFoundException(t);
} finally {
IoUtils.closeQuietly(cursor);
- ContentProviderClient.closeQuietly(client);
+ ContentProviderClient.releaseQuietly(client);
}
}
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java
index 5a15cd2dacdc..0caddcc0c155 100644
--- a/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java
+++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java
@@ -54,11 +54,21 @@ import java.lang.ref.WeakReference;
public class TestDocumentsProvider extends DocumentsProvider {
private static final String TAG = "TestDocuments";
- private static final boolean LAG_ROOTS = false;
- private static final boolean CRASH_ROOTS = false;
- private static final boolean REFRESH_ROOTS = false;
+ private static final boolean ROOTS_WEDGE = false;
+ private static final boolean ROOTS_LAG = false;
+ private static final boolean ROOTS_CRASH = false;
+ private static final boolean ROOTS_REFRESH = false;
- private static final boolean CRASH_DOCUMENT = false;
+ private static final boolean DOCUMENT_CRASH = false;
+
+ private static final boolean RECENT_WEDGE = false;
+
+ private static final boolean CHILD_WEDGE = false;
+ private static final boolean CHILD_CRASH = false;
+
+ private static final boolean THUMB_HUNDREDS = false;
+ private static final boolean THUMB_WEDGE = false;
+ private static final boolean THUMB_CRASH = false;
private static final String MY_ROOT_ID = "myRoot";
private static final String MY_DOC_ID = "myDoc";
@@ -95,10 +105,11 @@ public class TestDocumentsProvider extends DocumentsProvider {
public Cursor queryRoots(String[] projection) throws FileNotFoundException {
Log.d(TAG, "Someone asked for our roots!");
- if (LAG_ROOTS) SystemClock.sleep(3000);
- if (CRASH_ROOTS) System.exit(12);
+ if (ROOTS_WEDGE) SystemClock.sleep(Integer.MAX_VALUE);
+ if (ROOTS_LAG) SystemClock.sleep(3000);
+ if (ROOTS_CRASH) System.exit(12);
- if (REFRESH_ROOTS) {
+ if (ROOTS_REFRESH) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
@@ -126,7 +137,7 @@ public class TestDocumentsProvider extends DocumentsProvider {
@Override
public Cursor queryDocument(String documentId, String[] projection)
throws FileNotFoundException {
- if (CRASH_DOCUMENT) System.exit(12);
+ if (DOCUMENT_CRASH) System.exit(12);
final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection));
includeFile(result, documentId, 0);
@@ -198,6 +209,9 @@ public class TestDocumentsProvider extends DocumentsProvider {
String parentDocumentId, String[] projection, String sortOrder)
throws FileNotFoundException {
+ if (CHILD_WEDGE) SystemClock.sleep(Integer.MAX_VALUE);
+ if (CHILD_CRASH) System.exit(12);
+
final ContentResolver resolver = getContext().getContentResolver();
final Uri notifyUri = DocumentsContract.buildDocumentUri(
"com.example.documents", parentDocumentId);
@@ -212,6 +226,12 @@ public class TestDocumentsProvider extends DocumentsProvider {
includeFile(result, "localfile3", 0);
includeFile(result, "localfile4", 0);
+ if (THUMB_HUNDREDS) {
+ for (int i = 0; i < 256; i++) {
+ includeFile(result, "i maded u an picshure", Document.FLAG_SUPPORTS_THUMBNAIL);
+ }
+ }
+
synchronized (this) {
// Try picking up an existing network fetch
CloudTask task = mTask != null ? mTask.get() : null;
@@ -257,6 +277,9 @@ public class TestDocumentsProvider extends DocumentsProvider {
@Override
public Cursor queryRecentDocuments(String rootId, String[] projection)
throws FileNotFoundException {
+
+ if (RECENT_WEDGE) SystemClock.sleep(Integer.MAX_VALUE);
+
// Pretend to take a super long time to respond
SystemClock.sleep(3000);
@@ -275,6 +298,10 @@ public class TestDocumentsProvider extends DocumentsProvider {
@Override
public AssetFileDescriptor openDocumentThumbnail(
String docId, Point sizeHint, CancellationSignal signal) throws FileNotFoundException {
+
+ if (THUMB_WEDGE) wedgeUntilCanceled(signal);
+ if (THUMB_CRASH) System.exit(12);
+
final Bitmap bitmap = Bitmap.createBitmap(32, 32, Bitmap.Config.ARGB_8888);
final Canvas canvas = new Canvas(bitmap);
final Paint paint = new Paint();
@@ -312,6 +339,18 @@ public class TestDocumentsProvider extends DocumentsProvider {
return true;
}
+ private static void wedgeUntilCanceled(CancellationSignal signal) {
+ if (signal != null) {
+ while (true) {
+ signal.throwIfCanceled();
+ SystemClock.sleep(500);
+ }
+ } else {
+ Log.w(TAG, "WEDGING WITHOUT A CANCELLATIONSIGNAL");
+ SystemClock.sleep(Integer.MAX_VALUE);
+ }
+ }
+
private static void includeFile(MatrixCursor result, String docId, int flags) {
final RowBuilder row = result.newRow();
row.add(Document.COLUMN_DOCUMENT_ID, docId);
diff --git a/packages/Keyguard/res/anim/keyguard_security_animate_in.xml b/packages/Keyguard/res/anim/keyguard_security_animate_in.xml
deleted file mode 100644
index 4ee30c363599..000000000000
--- a/packages/Keyguard/res/anim/keyguard_security_animate_in.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false">
-
- <scale
- android:interpolator="@android:anim/decelerate_interpolator"
- android:fromXScale="0.0"
- android:toXScale="1.0"
- android:fromYScale="1.0"
- android:toYScale="1.0"
- android:pivotX="50%"
- android:pivotY="50%"
- android:fillEnabled="true"
- android:fillAfter="true"
- android:duration="@integer/kg_security_flip_duration"
- android:startOffset="@integer/kg_security_flip_duration" />
-
-</set>
-
diff --git a/packages/Keyguard/res/anim/keyguard_security_animate_out.xml b/packages/Keyguard/res/anim/keyguard_security_animate_out.xml
deleted file mode 100644
index 76d065c74f66..000000000000
--- a/packages/Keyguard/res/anim/keyguard_security_animate_out.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false">
-
- <scale
- android:interpolator="@android:anim/accelerate_interpolator"
- android:fromXScale="1.0"
- android:toXScale="0.0"
- android:fromYScale="1.0"
- android:toYScale="1.0"
- android:pivotX="50%"
- android:pivotY="50%"
- android:fillEnabled="true"
- android:fillAfter="true"
- android:duration="@integer/kg_security_flip_duration" />
-
-</set>
-
diff --git a/packages/Keyguard/res/layout/keyguard_glow_pad_container.xml b/packages/Keyguard/res/layout/keyguard_glow_pad_container.xml
index 376d0e935368..07953b46e621 100644
--- a/packages/Keyguard/res/layout/keyguard_glow_pad_container.xml
+++ b/packages/Keyguard/res/layout/keyguard_glow_pad_container.xml
@@ -22,5 +22,5 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
- android:layout_marginBottom="-80dp"/>
-</merge> \ No newline at end of file
+ android:layout_marginBottom="@dimen/glowpadcontainer_bottom_margin"/>
+</merge>
diff --git a/packages/Keyguard/res/values-ca/strings.xml b/packages/Keyguard/res/values-ca/strings.xml
index 77c44ea1e3bc..cf750ab6902a 100644
--- a/packages/Keyguard/res/values-ca/strings.xml
+++ b/packages/Keyguard/res/values-ca/strings.xml
@@ -73,7 +73,7 @@
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Botó de parada"</string>
<string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Desbloqueja per continuar"</string>
<string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"S\'ha cancel·lat l\'inici"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Deixa anar <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> perquè se suprimeixi."</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Deixa anar <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> per suprimir-lo."</string>
<string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"No se suprimirà <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
diff --git a/packages/Keyguard/res/values-sl/strings.xml b/packages/Keyguard/res/values-sl/strings.xml
index b893422b18fb..7c791dbc65e6 100644
--- a/packages/Keyguard/res/values-sl/strings.xml
+++ b/packages/Keyguard/res/values-sl/strings.xml
@@ -73,7 +73,7 @@
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Gumb za ustavitev"</string>
<string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Za nadaljevanje odklenite"</string>
<string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Zagon je preklican"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Povlecite pripomoček <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, da ga izbrišete."</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Izpustite pripomoček <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, da ga izbrišete."</string>
<string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Pripomoček <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ne bo izbrisan."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
diff --git a/packages/Keyguard/res/values-sw360dp/dimens.xml b/packages/Keyguard/res/values-sw360dp/dimens.xml
index 41d6ac0ca550..6e39a429be53 100644
--- a/packages/Keyguard/res/values-sw360dp/dimens.xml
+++ b/packages/Keyguard/res/values-sw360dp/dimens.xml
@@ -19,7 +19,11 @@
-->
<resources>
- <!-- Height of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) -->
+ <!-- Height of the sliding KeyguardSecurityContainer (includes 2x
+ keyguard_security_view_margin) -->
<dimen name="keyguard_security_height">400dp</dimen>
+ <!-- The bottom margin for the GlowPadView container -->
+ <dimen name="glowpadcontainer_bottom_margin">-48dp</dimen>
+
</resources>
diff --git a/packages/Keyguard/res/values-zh-rTW/strings.xml b/packages/Keyguard/res/values-zh-rTW/strings.xml
index 2c24c526a5e2..42fffe6c52d0 100644
--- a/packages/Keyguard/res/values-zh-rTW/strings.xml
+++ b/packages/Keyguard/res/values-zh-rTW/strings.xml
@@ -73,7 +73,7 @@
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"[停止] 按鈕"</string>
<string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"先解鎖才能繼續操作"</string>
<string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"已取消啟動"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"將「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>」拖放到刪除選單中。"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"拖放「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>」即可將其刪除。"</string>
<string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>」將不會遭到刪除。"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
diff --git a/packages/Keyguard/res/values/dimens.xml b/packages/Keyguard/res/values/dimens.xml
index fde63c4d7e5f..ce72f43cd710 100644
--- a/packages/Keyguard/res/values/dimens.xml
+++ b/packages/Keyguard/res/values/dimens.xml
@@ -32,6 +32,9 @@
<!-- Size of lockscreen outerring on unsecure unlock LockScreen -->
<dimen name="keyguard_lockscreen_outerring_diameter">270dp</dimen>
+ <!-- The bottom margin for the GlowPadView container -->
+ <dimen name="glowpadcontainer_bottom_margin">-80dp</dimen>
+
<!-- Default target placement radius for GlowPadView. Should be 1/2 of outerring diameter. -->
<dimen name="glowpadview_target_placement_radius">135dip</dimen>
diff --git a/packages/Keyguard/res/values/integers.xml b/packages/Keyguard/res/values/integers.xml
index 053fc851ca31..dc90bbff1aae 100644
--- a/packages/Keyguard/res/values/integers.xml
+++ b/packages/Keyguard/res/values/integers.xml
@@ -18,7 +18,5 @@
-->
<resources>
<integer name="kg_carousel_angle">75</integer>
- <integer name="kg_security_flip_duration">100</integer>
- <integer name="kg_security_fade_duration">100</integer>
<integer name="kg_glowpad_rotation_offset">0</integer>
</resources>
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
index 4da6171cb43c..bc8c866a5f5e 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
@@ -54,10 +54,10 @@ import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
-import android.view.animation.AnimationUtils;
import android.widget.RemoteViews.OnClickHandler;
import java.io.File;
+import java.lang.ref.WeakReference;
import java.util.List;
public class KeyguardHostView extends KeyguardViewBase {
@@ -125,6 +125,8 @@ public class KeyguardHostView extends KeyguardViewBase {
private final Rect mInsets = new Rect();
+ private MyOnClickHandler mOnClickHandler = new MyOnClickHandler(this);
+
/*package*/ interface UserSwitcherCallback {
void hideSecurityView(int duration);
void showSecurityView();
@@ -813,24 +815,39 @@ public class KeyguardHostView extends KeyguardViewBase {
}
}
- private OnClickHandler mOnClickHandler = new OnClickHandler() {
+ private static class MyOnClickHandler extends OnClickHandler {
+
+ // weak reference to the hostView to avoid keeping a live reference
+ // due to Binder GC linkages to AppWidgetHost. By the same token,
+ // this click handler should not keep references to any large
+ // objects.
+ WeakReference<KeyguardHostView> mThis;
+
+ MyOnClickHandler(KeyguardHostView hostView) {
+ mThis = new WeakReference<KeyguardHostView>(hostView);
+ }
+
@Override
public boolean onClickHandler(final View view,
final android.app.PendingIntent pendingIntent,
final Intent fillInIntent) {
+ KeyguardHostView hostView = mThis.get();
+ if (hostView == null) {
+ return false;
+ }
if (pendingIntent.isActivity()) {
- setOnDismissAction(new OnDismissAction() {
+ hostView.setOnDismissAction(new OnDismissAction() {
public boolean onDismiss() {
try {
- // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT?
- Context context = view.getContext();
- ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(view,
- 0, 0,
- view.getMeasuredWidth(), view.getMeasuredHeight());
- context.startIntentSender(
- pendingIntent.getIntentSender(), fillInIntent,
- Intent.FLAG_ACTIVITY_NEW_TASK,
- Intent.FLAG_ACTIVITY_NEW_TASK, 0, opts.toBundle());
+ // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT?
+ Context context = view.getContext();
+ ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(view,
+ 0, 0,
+ view.getMeasuredWidth(), view.getMeasuredHeight());
+ context.startIntentSender(
+ pendingIntent.getIntentSender(), fillInIntent,
+ Intent.FLAG_ACTIVITY_NEW_TASK,
+ Intent.FLAG_ACTIVITY_NEW_TASK, 0, opts.toBundle());
} catch (IntentSender.SendIntentException e) {
android.util.Log.e(TAG, "Cannot send pending intent: ", e);
} catch (Exception e) {
@@ -841,10 +858,10 @@ public class KeyguardHostView extends KeyguardViewBase {
}
});
- if (mViewStateManager.isChallengeShowing()) {
- mViewStateManager.showBouncer(true);
+ if (hostView.mViewStateManager.isChallengeShowing()) {
+ hostView.mViewStateManager.showBouncer(true);
} else {
- mCallback.dismiss(false);
+ hostView.mCallback.dismiss(false);
}
return true;
} else {
@@ -971,10 +988,6 @@ public class KeyguardHostView extends KeyguardViewBase {
// Find and show this child.
final int childCount = mSecurityViewContainer.getChildCount();
- mSecurityViewContainer.setInAnimation(
- AnimationUtils.loadAnimation(mContext, R.anim.keyguard_security_fade_in));
- mSecurityViewContainer.setOutAnimation(
- AnimationUtils.loadAnimation(mContext, R.anim.keyguard_security_fade_out));
final int securityViewIdForMode = getSecurityViewIdForMode(securityMode);
for (int i = 0; i < childCount; i++) {
if (mSecurityViewContainer.getChildAt(i).getId() == securityViewIdForMode) {
diff --git a/packages/PrintSpooler/res/layout/select_printer_activity.xml b/packages/PrintSpooler/res/layout/select_printer_activity.xml
index f4e18537c7a7..e86e9aaea352 100644
--- a/packages/PrintSpooler/res/layout/select_printer_activity.xml
+++ b/packages/PrintSpooler/res/layout/select_printer_activity.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
android:layout_width="fill_parent"
- android:layout_height="wrap_content">
+ android:layout_height="fill_parent">
<fragment
android:name="com.android.printspooler.SelectPrinterFragment"
@@ -26,4 +26,39 @@
android:layout_height="wrap_content">
</fragment>
-</FrameLayout> \ No newline at end of file
+ <FrameLayout
+ android:id="@+id/empty_print_state"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:visibility="gone">
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:gravity="center"
+ android:orientation="vertical">
+
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="12dip"
+ android:src="@*android:drawable/ic_grayedout_printer"
+ android:contentDescription="@string/print_no_printers_found">
+ </ImageView>
+
+ <TextView
+ android:id="@+id/message"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textColor="?android:attr/textColorSecondary"
+ android:text="@string/print_no_printers_found">
+ </TextView>
+
+ </LinearLayout>
+
+ </FrameLayout>
+
+</LinearLayout>
diff --git a/packages/PrintSpooler/res/values-af/strings.xml b/packages/PrintSpooler/res/values-af/strings.xml
index 608df733b1f5..7e150807a687 100644
--- a/packages/PrintSpooler/res/values-af/strings.xml
+++ b/packages/PrintSpooler/res/values-af/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Herbegin"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Geen verbinding met drukker nie"</string>
<string name="reason_unknown" msgid="5507940196503246139">"onbekend"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – nie beskikbaar nie"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Swart en wit"</item>
<item msgid="2762241247228983754">"Kleur"</item>
diff --git a/packages/PrintSpooler/res/values-am/strings.xml b/packages/PrintSpooler/res/values-am/strings.xml
index 111d7d1526ef..bac05270cfa5 100644
--- a/packages/PrintSpooler/res/values-am/strings.xml
+++ b/packages/PrintSpooler/res/values-am/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"እንደገና ጀምር"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"ከአታሚ ጋር ምንም ግንኙነት የለም"</string>
<string name="reason_unknown" msgid="5507940196503246139">"አይታወቅም"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – አይገኝም"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"ጥቁር እና ነጭ"</item>
<item msgid="2762241247228983754">"ቀለም"</item>
diff --git a/packages/PrintSpooler/res/values-ar/strings.xml b/packages/PrintSpooler/res/values-ar/strings.xml
index eb9c06eabbea..4cca804be906 100644
--- a/packages/PrintSpooler/res/values-ar/strings.xml
+++ b/packages/PrintSpooler/res/values-ar/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"إعادة تشغيل"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"لا يوجد اتصال بالطابعة"</string>
<string name="reason_unknown" msgid="5507940196503246139">"غير معروف"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – غير متاحة"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"أبيض وأسود"</item>
<item msgid="2762241247228983754">"اللون"</item>
diff --git a/packages/PrintSpooler/res/values-bg/strings.xml b/packages/PrintSpooler/res/values-bg/strings.xml
index 5207e42318c8..dc5c4f9380c6 100644
--- a/packages/PrintSpooler/res/values-bg/strings.xml
+++ b/packages/PrintSpooler/res/values-bg/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Рестартиране"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Няма връзка с принтера"</string>
<string name="reason_unknown" msgid="5507940196503246139">"няма данни"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – не е налице"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Черно-бяло"</item>
<item msgid="2762241247228983754">"Цветно"</item>
diff --git a/packages/PrintSpooler/res/values-ca/strings.xml b/packages/PrintSpooler/res/values-ca/strings.xml
index 3ef42ac6acc4..9bc03f967eb2 100644
--- a/packages/PrintSpooler/res/values-ca/strings.xml
+++ b/packages/PrintSpooler/res/values-ca/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Reinicia"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"No hi ha connexió amb la impressora"</string>
<string name="reason_unknown" msgid="5507940196503246139">"desconegut"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>: no disponible"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Blanc i negre"</item>
<item msgid="2762241247228983754">"Color"</item>
diff --git a/packages/PrintSpooler/res/values-cs/strings.xml b/packages/PrintSpooler/res/values-cs/strings.xml
index 354f1d52dc33..f402eb39aa53 100644
--- a/packages/PrintSpooler/res/values-cs/strings.xml
+++ b/packages/PrintSpooler/res/values-cs/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Restartovat"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Nelze se připojit k tiskárně"</string>
<string name="reason_unknown" msgid="5507940196503246139">"neznámé"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – není k dispozici"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Černobíle"</item>
<item msgid="2762241247228983754">"Barevně"</item>
diff --git a/packages/PrintSpooler/res/values-da/strings.xml b/packages/PrintSpooler/res/values-da/strings.xml
index c749fd984574..26457b6c7ecb 100644
--- a/packages/PrintSpooler/res/values-da/strings.xml
+++ b/packages/PrintSpooler/res/values-da/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Genstart"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Ingen forbindelse til printer"</string>
<string name="reason_unknown" msgid="5507940196503246139">"ukendt"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – ikke tilgængelig"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Sort/hvid"</item>
<item msgid="2762241247228983754">"Farve"</item>
diff --git a/packages/PrintSpooler/res/values-de/strings.xml b/packages/PrintSpooler/res/values-de/strings.xml
index 13dac373d4ba..ceffeda5d227 100644
--- a/packages/PrintSpooler/res/values-de/strings.xml
+++ b/packages/PrintSpooler/res/values-de/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Neu starten"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Keine Verbindung zum Drucker"</string>
<string name="reason_unknown" msgid="5507940196503246139">"unbekannt"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – nicht verfügbar"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Schwarz-weiß"</item>
<item msgid="2762241247228983754">"Farbe"</item>
diff --git a/packages/PrintSpooler/res/values-el/strings.xml b/packages/PrintSpooler/res/values-el/strings.xml
index d792d86eebc8..44ba5d4f2ab7 100644
--- a/packages/PrintSpooler/res/values-el/strings.xml
+++ b/packages/PrintSpooler/res/values-el/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Επανεκκίνηση"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Δεν υπάρχει σύνδεση με εκτυπωτή"</string>
<string name="reason_unknown" msgid="5507940196503246139">"άγνωστο"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – μη διαθέσιμο"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Ασπρόμαυρο"</item>
<item msgid="2762241247228983754">"Χρώμα"</item>
diff --git a/packages/PrintSpooler/res/values-en-rGB/strings.xml b/packages/PrintSpooler/res/values-en-rGB/strings.xml
index f04a298b3d31..7b7748323c73 100644
--- a/packages/PrintSpooler/res/values-en-rGB/strings.xml
+++ b/packages/PrintSpooler/res/values-en-rGB/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Restart"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"No connection to printer"</string>
<string name="reason_unknown" msgid="5507940196503246139">"unknown"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – unavailable"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Black &amp; White"</item>
<item msgid="2762241247228983754">"Colour"</item>
diff --git a/packages/PrintSpooler/res/values-en-rIN/strings.xml b/packages/PrintSpooler/res/values-en-rIN/strings.xml
index f04a298b3d31..7b7748323c73 100644
--- a/packages/PrintSpooler/res/values-en-rIN/strings.xml
+++ b/packages/PrintSpooler/res/values-en-rIN/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Restart"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"No connection to printer"</string>
<string name="reason_unknown" msgid="5507940196503246139">"unknown"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – unavailable"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Black &amp; White"</item>
<item msgid="2762241247228983754">"Colour"</item>
diff --git a/packages/PrintSpooler/res/values-es-rUS/strings.xml b/packages/PrintSpooler/res/values-es-rUS/strings.xml
index 13fe4ec7c421..8f76e9d48fd4 100644
--- a/packages/PrintSpooler/res/values-es-rUS/strings.xml
+++ b/packages/PrintSpooler/res/values-es-rUS/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Reiniciar"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"No hay conexión con la impresora."</string>
<string name="reason_unknown" msgid="5507940196503246139">"desconocido"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>: no disponible"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Blanco y negro"</item>
<item msgid="2762241247228983754">"Color"</item>
diff --git a/packages/PrintSpooler/res/values-es/strings.xml b/packages/PrintSpooler/res/values-es/strings.xml
index 2c9f51b136b4..f7c57903d23d 100644
--- a/packages/PrintSpooler/res/values-es/strings.xml
+++ b/packages/PrintSpooler/res/values-es/strings.xml
@@ -45,13 +45,14 @@
<string name="restart" msgid="2472034227037808749">"Volver a empezar"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"No hay conexión con la impresora"</string>
<string name="reason_unknown" msgid="5507940196503246139">"desconocido"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – no disponible"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Blanco y negro"</item>
<item msgid="2762241247228983754">"Color"</item>
</string-array>
<string-array name="orientation_labels">
- <item msgid="4061931020926489228">"Retrato"</item>
- <item msgid="3199660090246166812">"Paisaje"</item>
+ <item msgid="4061931020926489228">"Vertical"</item>
+ <item msgid="3199660090246166812">"Horizontal"</item>
</string-array>
<string-array name="page_options_labels">
<item msgid="7421377442011699994">"Todo"</item>
diff --git a/packages/PrintSpooler/res/values-et-rEE/strings.xml b/packages/PrintSpooler/res/values-et-rEE/strings.xml
index 5630aa43ea52..0d281708084a 100644
--- a/packages/PrintSpooler/res/values-et-rEE/strings.xml
+++ b/packages/PrintSpooler/res/values-et-rEE/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Taaskäivita"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Printeriühendus puudub"</string>
<string name="reason_unknown" msgid="5507940196503246139">"teadmata"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – pole saadaval"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Mustvalge"</item>
<item msgid="2762241247228983754">"Värv"</item>
diff --git a/packages/PrintSpooler/res/values-fa/strings.xml b/packages/PrintSpooler/res/values-fa/strings.xml
index b0e84b7849cd..b5435c611379 100644
--- a/packages/PrintSpooler/res/values-fa/strings.xml
+++ b/packages/PrintSpooler/res/values-fa/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"راه‌اندازی مجدد"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"اتصال با چاپگر برقرار نیست"</string>
<string name="reason_unknown" msgid="5507940196503246139">"نامعلوم"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - در دسترس نیست"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"سیاه و سفید"</item>
<item msgid="2762241247228983754">"رنگی"</item>
diff --git a/packages/PrintSpooler/res/values-fi/strings.xml b/packages/PrintSpooler/res/values-fi/strings.xml
index d90f1e0329aa..cbf9931a2522 100644
--- a/packages/PrintSpooler/res/values-fi/strings.xml
+++ b/packages/PrintSpooler/res/values-fi/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Käynnistä uudelleen"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Ei yhteyttä tulostimeen"</string>
<string name="reason_unknown" msgid="5507940196503246139">"tuntematon"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – ei käytettävissä"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Mustavalkoinen"</item>
<item msgid="2762241247228983754">"Väri"</item>
diff --git a/packages/PrintSpooler/res/values-fr-rCA/strings.xml b/packages/PrintSpooler/res/values-fr-rCA/strings.xml
index c6400a099d27..f5c504ffecb1 100644
--- a/packages/PrintSpooler/res/values-fr-rCA/strings.xml
+++ b/packages/PrintSpooler/res/values-fr-rCA/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Recommencer"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Aucune connexion à l\'imprimante"</string>
<string name="reason_unknown" msgid="5507940196503246139">"inconnu"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> — indisponible"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Noir et blanc"</item>
<item msgid="2762241247228983754">"Couleur"</item>
diff --git a/packages/PrintSpooler/res/values-fr/strings.xml b/packages/PrintSpooler/res/values-fr/strings.xml
index 193763445a5c..2d6a7a1420bc 100644
--- a/packages/PrintSpooler/res/values-fr/strings.xml
+++ b/packages/PrintSpooler/res/values-fr/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Redémarrer"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Aucune connexion à l\'imprimante."</string>
<string name="reason_unknown" msgid="5507940196503246139">"inconnue"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – indisponible"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Noir et blanc"</item>
<item msgid="2762241247228983754">"Couleur"</item>
diff --git a/packages/PrintSpooler/res/values-hi/strings.xml b/packages/PrintSpooler/res/values-hi/strings.xml
index e759205479df..59a88a88425e 100644
--- a/packages/PrintSpooler/res/values-hi/strings.xml
+++ b/packages/PrintSpooler/res/values-hi/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"पुन: आरंभ करें"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"प्रिंटर के लिए कोई कनेक्शन नहीं"</string>
<string name="reason_unknown" msgid="5507940196503246139">"अज्ञात"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – अनुपलब्ध"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"श्याम और श्वेत"</item>
<item msgid="2762241247228983754">"रंग"</item>
diff --git a/packages/PrintSpooler/res/values-hr/strings.xml b/packages/PrintSpooler/res/values-hr/strings.xml
index 978993836503..399e14e9bed7 100644
--- a/packages/PrintSpooler/res/values-hr/strings.xml
+++ b/packages/PrintSpooler/res/values-hr/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Ponovo pokreni"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Nema veze s pisačem"</string>
<string name="reason_unknown" msgid="5507940196503246139">"nepoznato"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – zadatak nije dostupan"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Crno-bijelo"</item>
<item msgid="2762241247228983754">"U boji"</item>
diff --git a/packages/PrintSpooler/res/values-hu/strings.xml b/packages/PrintSpooler/res/values-hu/strings.xml
index 685a77105fc2..ea997c546cc0 100644
--- a/packages/PrintSpooler/res/values-hu/strings.xml
+++ b/packages/PrintSpooler/res/values-hu/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Újraindítás"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Nincs kapcsolat a nyomtatóval"</string>
<string name="reason_unknown" msgid="5507940196503246139">"ismeretlen"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – nem érhető el"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Fekete-fehér"</item>
<item msgid="2762241247228983754">"Szín"</item>
diff --git a/packages/PrintSpooler/res/values-hy-rAM/strings.xml b/packages/PrintSpooler/res/values-hy-rAM/strings.xml
index b3499b32bfad..47d862774131 100644
--- a/packages/PrintSpooler/res/values-hy-rAM/strings.xml
+++ b/packages/PrintSpooler/res/values-hy-rAM/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Վերագործարկել"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Տպիչի հետ կապ չկա"</string>
<string name="reason_unknown" msgid="5507940196503246139">"անհայտ"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> տպիչն անհասանելի է"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Սև ու սպիտակ"</item>
<item msgid="2762241247228983754">"Գույնը"</item>
diff --git a/packages/PrintSpooler/res/values-in/strings.xml b/packages/PrintSpooler/res/values-in/strings.xml
index cb2132caf06e..d4878cd0725c 100644
--- a/packages/PrintSpooler/res/values-in/strings.xml
+++ b/packages/PrintSpooler/res/values-in/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Mulai Ulang"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Tidak ada sambungan ke printer"</string>
<string name="reason_unknown" msgid="5507940196503246139">"tak diketahui"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – tidak tersedia"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Hitam &amp; Putih"</item>
<item msgid="2762241247228983754">"Warna"</item>
diff --git a/packages/PrintSpooler/res/values-it/strings.xml b/packages/PrintSpooler/res/values-it/strings.xml
index 8483047e50c4..a623bb668cd2 100644
--- a/packages/PrintSpooler/res/values-it/strings.xml
+++ b/packages/PrintSpooler/res/values-it/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Riavvia"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Nessun collegamento alla stampante"</string>
<string name="reason_unknown" msgid="5507940196503246139">"sconosciuto"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - non disponibile"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Bianco e nero"</item>
<item msgid="2762241247228983754">"A colori"</item>
diff --git a/packages/PrintSpooler/res/values-iw/strings.xml b/packages/PrintSpooler/res/values-iw/strings.xml
index ebef89f7ad47..15b097cb6310 100644
--- a/packages/PrintSpooler/res/values-iw/strings.xml
+++ b/packages/PrintSpooler/res/values-iw/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"הפעל מחדש"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"אין חיבור למדפסת"</string>
<string name="reason_unknown" msgid="5507940196503246139">"לא ידוע"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – לא זמינה"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"שחור ולבן"</item>
<item msgid="2762241247228983754">"צבע"</item>
diff --git a/packages/PrintSpooler/res/values-ja/strings.xml b/packages/PrintSpooler/res/values-ja/strings.xml
index 60820cb27f4e..116c7fe11c9c 100644
--- a/packages/PrintSpooler/res/values-ja/strings.xml
+++ b/packages/PrintSpooler/res/values-ja/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"再起動"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"プリンタに接続されていません"</string>
<string name="reason_unknown" msgid="5507940196503246139">"不明"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>–使用不可"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"モノクロ"</item>
<item msgid="2762241247228983754">"色"</item>
diff --git a/packages/PrintSpooler/res/values-ka-rGE/strings.xml b/packages/PrintSpooler/res/values-ka-rGE/strings.xml
index e1c4e5218e20..320d57c8176b 100644
--- a/packages/PrintSpooler/res/values-ka-rGE/strings.xml
+++ b/packages/PrintSpooler/res/values-ka-rGE/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"გადატვირთვა"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"პრინტერთან კავშირი არ არის"</string>
<string name="reason_unknown" msgid="5507940196503246139">"უცნობი"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – მიუწვდომელია"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"შავ-თეთრი"</item>
<item msgid="2762241247228983754">"ფერი"</item>
diff --git a/packages/PrintSpooler/res/values-km-rKH/strings.xml b/packages/PrintSpooler/res/values-km-rKH/strings.xml
index 2177a0430f56..b9a52f1ec324 100644
--- a/packages/PrintSpooler/res/values-km-rKH/strings.xml
+++ b/packages/PrintSpooler/res/values-km-rKH/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"ចាប់ផ្ដើម​ឡើងវិញ"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"គ្មាន​​​ការ​ភ្ជាប់​ទៅ​ម៉ាស៊ីន​បោះពុម្ព"</string>
<string name="reason_unknown" msgid="5507940196503246139">"មិន​ស្គាល់"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – មិន​អាច​ប្រើ​បាន"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"ស &amp; ខ្មៅ"</item>
<item msgid="2762241247228983754">"ពណ៌"</item>
diff --git a/packages/PrintSpooler/res/values-ko/strings.xml b/packages/PrintSpooler/res/values-ko/strings.xml
index b561fd164981..c09b5c3b099a 100644
--- a/packages/PrintSpooler/res/values-ko/strings.xml
+++ b/packages/PrintSpooler/res/values-ko/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"다시 시작"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"프린터와 연결되지 않음"</string>
<string name="reason_unknown" msgid="5507940196503246139">"알 수 없음"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – 사용할 수 없음"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"흑백"</item>
<item msgid="2762241247228983754">"컬러"</item>
diff --git a/packages/PrintSpooler/res/values-lo-rLA/strings.xml b/packages/PrintSpooler/res/values-lo-rLA/strings.xml
index aed4817ec507..f6d5fcdb748c 100644
--- a/packages/PrintSpooler/res/values-lo-rLA/strings.xml
+++ b/packages/PrintSpooler/res/values-lo-rLA/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"ປິດເປີດໃໝ່"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"ບໍ່ມີການເຊື່ອມຕໍ່ຫາເຄື່ອງພິມ"</string>
<string name="reason_unknown" msgid="5507940196503246139">"ບໍ່ຮູ້ຈັກ"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - ບໍ່ມີຢູ່"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"ຂາວດຳ"</item>
<item msgid="2762241247228983754">"ສີ"</item>
diff --git a/packages/PrintSpooler/res/values-lt/strings.xml b/packages/PrintSpooler/res/values-lt/strings.xml
index 75484c705ec6..6778b75fdd86 100644
--- a/packages/PrintSpooler/res/values-lt/strings.xml
+++ b/packages/PrintSpooler/res/values-lt/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Paleisti iš naujo"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Nėra ryšio su spausdintuvu"</string>
<string name="reason_unknown" msgid="5507940196503246139">"nežinoma"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"„<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>“ – nepasiekiama"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Nespalvotas"</item>
<item msgid="2762241247228983754">"Spalva"</item>
diff --git a/packages/PrintSpooler/res/values-lv/strings.xml b/packages/PrintSpooler/res/values-lv/strings.xml
index 454ae0b9ee9f..a255001d1643 100644
--- a/packages/PrintSpooler/res/values-lv/strings.xml
+++ b/packages/PrintSpooler/res/values-lv/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Restartēt"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Nav savienojuma ar printeri"</string>
<string name="reason_unknown" msgid="5507940196503246139">"nezināms"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> — nav pieejams"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Melnbalts"</item>
<item msgid="2762241247228983754">"Krāsa"</item>
diff --git a/packages/PrintSpooler/res/values-mn-rMN/strings.xml b/packages/PrintSpooler/res/values-mn-rMN/strings.xml
index d32acd75887d..3ab1baac3939 100644
--- a/packages/PrintSpooler/res/values-mn-rMN/strings.xml
+++ b/packages/PrintSpooler/res/values-mn-rMN/strings.xml
@@ -24,7 +24,7 @@
<string name="label_paper_size" msgid="8681895607876809323">"Цаасны хэмжээ"</string>
<string name="label_color" msgid="1108690305218188969">"Өнгө"</string>
<string name="label_orientation" msgid="2853142581990496477">"Чиглэл"</string>
- <string name="label_pages" msgid="6300874667546617333">"ХУУДСУУД (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="label_pages" msgid="6300874667546617333">"(<xliff:g id="PAGE_COUNT">%1$s</xliff:g>) хуудас"</string>
<string name="pages_range_example" msgid="4069269138547562081">"жнь. 1–5, 8, 11–13"</string>
<string name="print_preview" msgid="8010217796057763343">"Хэвлэхээр урьдчилан харах"</string>
<string name="install_for_print_preview" msgid="6366303997385509332">"Урьдчилан харахын тулд PDF харагчийг суулгах"</string>
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Дахин эхлүүлэх"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Принтер холбогдоогүй байна"</string>
<string name="reason_unknown" msgid="5507940196503246139">"тодорхойгүй"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – ашиглах боломжгүй"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Хар &amp; Цагаан"</item>
<item msgid="2762241247228983754">"Өнгө"</item>
diff --git a/packages/PrintSpooler/res/values-ms-rMY/strings.xml b/packages/PrintSpooler/res/values-ms-rMY/strings.xml
index 98a62e508032..bfbe51eeb816 100644
--- a/packages/PrintSpooler/res/values-ms-rMY/strings.xml
+++ b/packages/PrintSpooler/res/values-ms-rMY/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Mulakan semula"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Tiada sambungan ke pencetak"</string>
<string name="reason_unknown" msgid="5507940196503246139">"tidak diketahui"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – tidak tersedia"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Hitam &amp; Putih"</item>
<item msgid="2762241247228983754">"Warna"</item>
diff --git a/packages/PrintSpooler/res/values-nb/strings.xml b/packages/PrintSpooler/res/values-nb/strings.xml
index 318af3811400..d5dc3004ba24 100644
--- a/packages/PrintSpooler/res/values-nb/strings.xml
+++ b/packages/PrintSpooler/res/values-nb/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Start på nytt"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Ingen forbindelse med skriveren"</string>
<string name="reason_unknown" msgid="5507940196503246139">"ukjent"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – utilgjengelig"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Svart og hvitt"</item>
<item msgid="2762241247228983754">"Farge"</item>
diff --git a/packages/PrintSpooler/res/values-nl/strings.xml b/packages/PrintSpooler/res/values-nl/strings.xml
index 7227e06a929c..2d27eed21653 100644
--- a/packages/PrintSpooler/res/values-nl/strings.xml
+++ b/packages/PrintSpooler/res/values-nl/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Opnieuw starten"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Geen verbinding met printer"</string>
<string name="reason_unknown" msgid="5507940196503246139">"onbekend"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – niet beschikbaar"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Zwart-wit"</item>
<item msgid="2762241247228983754">"Kleur"</item>
diff --git a/packages/PrintSpooler/res/values-pl/strings.xml b/packages/PrintSpooler/res/values-pl/strings.xml
index 3705373a43cd..6f8aab2791fa 100644
--- a/packages/PrintSpooler/res/values-pl/strings.xml
+++ b/packages/PrintSpooler/res/values-pl/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Od nowa"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Brak połączenia z drukarką"</string>
<string name="reason_unknown" msgid="5507940196503246139">"brak informacji"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – niedostępne"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Czarno-białe"</item>
<item msgid="2762241247228983754">"Kolor"</item>
diff --git a/packages/PrintSpooler/res/values-pt-rPT/strings.xml b/packages/PrintSpooler/res/values-pt-rPT/strings.xml
index e2bab7d2fbad..db37f906c147 100644
--- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml
+++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Reiniciar"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Sem ligação à impressora"</string>
<string name="reason_unknown" msgid="5507940196503246139">"desconhecido"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – indisponível"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Preto e branco:"</item>
<item msgid="2762241247228983754">"Cor"</item>
diff --git a/packages/PrintSpooler/res/values-pt/strings.xml b/packages/PrintSpooler/res/values-pt/strings.xml
index 0915236b9c87..1a7a7376bfaa 100644
--- a/packages/PrintSpooler/res/values-pt/strings.xml
+++ b/packages/PrintSpooler/res/values-pt/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Reiniciar"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Sem conexão com a impressora"</string>
<string name="reason_unknown" msgid="5507940196503246139">"desconhecido"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – não disponível"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Preto e branco"</item>
<item msgid="2762241247228983754">"Cor"</item>
diff --git a/packages/PrintSpooler/res/values-ro/strings.xml b/packages/PrintSpooler/res/values-ro/strings.xml
index 4cd2432eabf5..588717db91fd 100644
--- a/packages/PrintSpooler/res/values-ro/strings.xml
+++ b/packages/PrintSpooler/res/values-ro/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Reporniți"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Nu există conexiune la o imprimantă"</string>
<string name="reason_unknown" msgid="5507940196503246139">"necunoscut"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - indisponibil"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Alb-negru"</item>
<item msgid="2762241247228983754">"Color"</item>
diff --git a/packages/PrintSpooler/res/values-ru/strings.xml b/packages/PrintSpooler/res/values-ru/strings.xml
index cc33bd146c20..cbb5f1b4c2c1 100644
--- a/packages/PrintSpooler/res/values-ru/strings.xml
+++ b/packages/PrintSpooler/res/values-ru/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Повторить"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Нет связи с принтером"</string>
<string name="reason_unknown" msgid="5507940196503246139">"неизвестно"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – недоступен"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Черно-белое"</item>
<item msgid="2762241247228983754">"Цветное"</item>
diff --git a/packages/PrintSpooler/res/values-sk/strings.xml b/packages/PrintSpooler/res/values-sk/strings.xml
index 4a7801fd7f9a..993ee53f7a2c 100644
--- a/packages/PrintSpooler/res/values-sk/strings.xml
+++ b/packages/PrintSpooler/res/values-sk/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Spustiť znova"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Žiadne pripojenie k tlačiarni"</string>
<string name="reason_unknown" msgid="5507940196503246139">"neznáme"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – nie je k dispozícii"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Čiernobiele"</item>
<item msgid="2762241247228983754">"Farba"</item>
diff --git a/packages/PrintSpooler/res/values-sl/strings.xml b/packages/PrintSpooler/res/values-sl/strings.xml
index f43ed4118aa6..a6dd0e2e9c08 100644
--- a/packages/PrintSpooler/res/values-sl/strings.xml
+++ b/packages/PrintSpooler/res/values-sl/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Začni znova"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Ni povezave s tiskalnikom"</string>
<string name="reason_unknown" msgid="5507940196503246139">"neznano"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – ni na voljo"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Črno-belo"</item>
<item msgid="2762241247228983754">"Barvno"</item>
diff --git a/packages/PrintSpooler/res/values-sr/strings.xml b/packages/PrintSpooler/res/values-sr/strings.xml
index 4839d0ca27f3..3b03e107d4c9 100644
--- a/packages/PrintSpooler/res/values-sr/strings.xml
+++ b/packages/PrintSpooler/res/values-sr/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Поново покрени"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Нема везе са штампачем"</string>
<string name="reason_unknown" msgid="5507940196503246139">"непознато"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – недоступан"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Црно-бело"</item>
<item msgid="2762241247228983754">"Боја"</item>
diff --git a/packages/PrintSpooler/res/values-sv/strings.xml b/packages/PrintSpooler/res/values-sv/strings.xml
index d6068bab5b6c..0faa851af7e5 100644
--- a/packages/PrintSpooler/res/values-sv/strings.xml
+++ b/packages/PrintSpooler/res/values-sv/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Starta om"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Ingen anslutning till skrivaren"</string>
<string name="reason_unknown" msgid="5507940196503246139">"okänt"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – inte tillgänglig"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Svartvit"</item>
<item msgid="2762241247228983754">"Färg"</item>
diff --git a/packages/PrintSpooler/res/values-sw/strings.xml b/packages/PrintSpooler/res/values-sw/strings.xml
index ed8df7763a8e..b97c6a3e14db 100644
--- a/packages/PrintSpooler/res/values-sw/strings.xml
+++ b/packages/PrintSpooler/res/values-sw/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Anzisha upya"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Hakuna muunganisho kwa printa"</string>
<string name="reason_unknown" msgid="5507940196503246139">"haijulikani"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - haipatikani"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Nyeusi na Nyeupe"</item>
<item msgid="2762241247228983754">"Rangi"</item>
diff --git a/packages/PrintSpooler/res/values-th/strings.xml b/packages/PrintSpooler/res/values-th/strings.xml
index 586f1bb993ff..ba20aaf4dd1f 100644
--- a/packages/PrintSpooler/res/values-th/strings.xml
+++ b/packages/PrintSpooler/res/values-th/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"เริ่มต้นใหม่"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"ไม่มีการเชื่อมต่อไปยังเครื่องพิมพ์"</string>
<string name="reason_unknown" msgid="5507940196503246139">"ไม่ทราบ"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ไม่พร้อมใช้งาน"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"ขาวดำ"</item>
<item msgid="2762241247228983754">"สี"</item>
diff --git a/packages/PrintSpooler/res/values-tl/strings.xml b/packages/PrintSpooler/res/values-tl/strings.xml
index 1100c0be0672..a0fd8ad6ca82 100644
--- a/packages/PrintSpooler/res/values-tl/strings.xml
+++ b/packages/PrintSpooler/res/values-tl/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"I-restart"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Hindi nakakonekta sa printer"</string>
<string name="reason_unknown" msgid="5507940196503246139">"hindi alam"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – hindi available"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Black &amp; White"</item>
<item msgid="2762241247228983754">"Kulay"</item>
diff --git a/packages/PrintSpooler/res/values-tr/strings.xml b/packages/PrintSpooler/res/values-tr/strings.xml
index 34fc1fe403d3..4b45829cc699 100644
--- a/packages/PrintSpooler/res/values-tr/strings.xml
+++ b/packages/PrintSpooler/res/values-tr/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Yeniden başlat"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Yazıcı bağlantısı yok"</string>
<string name="reason_unknown" msgid="5507940196503246139">"bilinmiyor"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – kullanılamıyor"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Siyah Beyaz"</item>
<item msgid="2762241247228983754">"Renkli"</item>
diff --git a/packages/PrintSpooler/res/values-uk/strings.xml b/packages/PrintSpooler/res/values-uk/strings.xml
index 52f0e9f89f38..0aa514fd5faf 100644
--- a/packages/PrintSpooler/res/values-uk/strings.xml
+++ b/packages/PrintSpooler/res/values-uk/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Перезапустити"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Немає з’єднання з принтером"</string>
<string name="reason_unknown" msgid="5507940196503246139">"невідомо"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"Завдання \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" не доступне"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Чорно-білий"</item>
<item msgid="2762241247228983754">"Колір"</item>
diff --git a/packages/PrintSpooler/res/values-vi/strings.xml b/packages/PrintSpooler/res/values-vi/strings.xml
index b0d9105eeaa2..bb06d8b0e90c 100644
--- a/packages/PrintSpooler/res/values-vi/strings.xml
+++ b/packages/PrintSpooler/res/values-vi/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Bắt đầu lại"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Không có kết nối nào với máy in"</string>
<string name="reason_unknown" msgid="5507940196503246139">"không xác định"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – không khả dụng"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Đen trắng"</item>
<item msgid="2762241247228983754">"Màu"</item>
diff --git a/packages/PrintSpooler/res/values-zh-rCN/strings.xml b/packages/PrintSpooler/res/values-zh-rCN/strings.xml
index dda0d4dbab06..564b47eccf49 100644
--- a/packages/PrintSpooler/res/values-zh-rCN/strings.xml
+++ b/packages/PrintSpooler/res/values-zh-rCN/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"重新开始"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"未与打印机建立连接"</string>
<string name="reason_unknown" msgid="5507940196503246139">"未知"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - 无法使用"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"黑白"</item>
<item msgid="2762241247228983754">"彩色"</item>
diff --git a/packages/PrintSpooler/res/values-zh-rHK/strings.xml b/packages/PrintSpooler/res/values-zh-rHK/strings.xml
index 844bdb49d187..99eb30a01851 100644
--- a/packages/PrintSpooler/res/values-zh-rHK/strings.xml
+++ b/packages/PrintSpooler/res/values-zh-rHK/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"重新開始"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"尚未與打印機連線"</string>
<string name="reason_unknown" msgid="5507940196503246139">"不明"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – 無法使用"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"黑白"</item>
<item msgid="2762241247228983754">"彩色"</item>
diff --git a/packages/PrintSpooler/res/values-zh-rTW/strings.xml b/packages/PrintSpooler/res/values-zh-rTW/strings.xml
index fa9185638150..4f2016112012 100644
--- a/packages/PrintSpooler/res/values-zh-rTW/strings.xml
+++ b/packages/PrintSpooler/res/values-zh-rTW/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"重新開始"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"尚未與印表機建立連線"</string>
<string name="reason_unknown" msgid="5507940196503246139">"不明"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – 無法使用"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"黑白"</item>
<item msgid="2762241247228983754">"彩色"</item>
diff --git a/packages/PrintSpooler/res/values-zu/strings.xml b/packages/PrintSpooler/res/values-zu/strings.xml
index c5d1de42c210..7ad8ce29222d 100644
--- a/packages/PrintSpooler/res/values-zu/strings.xml
+++ b/packages/PrintSpooler/res/values-zu/strings.xml
@@ -45,6 +45,7 @@
<string name="restart" msgid="2472034227037808749">"Qala kabusha"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Akukho ukuxhumana kuphrinta"</string>
<string name="reason_unknown" msgid="5507940196503246139">"akwaziwa"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"I-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – ayitholakali"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Okumnyama nokumhlophe"</item>
<item msgid="2762241247228983754">"Umbala"</item>
diff --git a/packages/PrintSpooler/res/values/strings.xml b/packages/PrintSpooler/res/values/strings.xml
index 5ee8d8cb67c8..41775a11271b 100644
--- a/packages/PrintSpooler/res/values/strings.xml
+++ b/packages/PrintSpooler/res/values/strings.xml
@@ -75,13 +75,16 @@
<!-- Title for the select printer activity. [CHAR LIMIT=30] -->
<string name="all_printers_label">All printers</string>
+ <!-- Title of the button to install a print service. [CHAR LIMIT=25] -->
+ <string name="add_print_service_label">Add service</string>
+
<!-- Add printer dialog -->
<!-- Title for the alert dialog for selecting a print service. [CHAR LIMIT=50] -->
<string name="choose_print_service">Choose print service</string>
- <!-- Title for the button to search the play store for print services. [CHAR LIMIT=50] -->
- <string name="search_play_store">Search in play store</string>
+ <!-- Title for the prompt shown as a placeholder if no printers are found while searching. [CHAR LIMIT=50] -->
+ <string name="print_no_printers_found">No printers found</string>
<!-- Notifications -->
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
index 44362d4ab85f..847411527615 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
@@ -56,6 +56,7 @@ import android.text.Editable;
import android.text.TextUtils;
import android.text.TextUtils.SimpleStringSplitter;
import android.text.TextWatcher;
+import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AttributeSet;
import android.util.Log;
@@ -735,8 +736,12 @@ public class PrintJobConfigActivity extends Activity {
if (resultCode == RESULT_OK) {
PrinterId printerId = (PrinterId) data.getParcelableExtra(
INTENT_EXTRA_PRINTER_ID);
- mEditor.selectPrinter(printerId);
+ if (printerId != null) {
+ mEditor.ensurePrinterSelected(printerId);
+ break;
+ }
}
+ mEditor.ensureCurrentPrinterSelected();
} break;
}
}
@@ -817,6 +822,8 @@ public class PrintJobConfigActivity extends Activity {
private Button mPrintButton;
+ private PrinterId mNextPrinterId;
+
private PrinterInfo mCurrentPrinter;
private final OnItemSelectedListener mOnItemSelectedListener =
@@ -830,10 +837,6 @@ public class PrintJobConfigActivity extends Activity {
}
if (id == DEST_ADAPTER_ITEM_ID_ALL_PRINTERS) {
- // The selection changed to the all printers item. We
- // want to select back the last selected printer.
- mIgnoreNextDestinationChange = true;
- mEditor.selectPrinter(mCurrentPrinter.getId());
startSelectPrinterActivity();
return;
}
@@ -1157,6 +1160,13 @@ public class PrintJobConfigActivity extends Activity {
mDestinationSpinner.setSelection(0);
}
+ // If there is a next printer to select and we succeed selecting
+ // it - done. Let the selection handling code make everything right.
+ if (mNextPrinterId != null && selectPrinter(mNextPrinterId)) {
+ mNextPrinterId = null;
+ return;
+ }
+
// If the current printer properties changed, we update the UI.
if (mCurrentPrinter != null) {
final int printerCount = mDestinationSpinnerAdapter.getCount();
@@ -1299,10 +1309,32 @@ public class PrintJobConfigActivity extends Activity {
}
}
- public void selectPrinter(PrinterId printerId) {
- mDestinationSpinnerAdapter.ensurePrinterShownPrinterShown(printerId);
+ public void ensurePrinterSelected(PrinterId printerId) {
+ // If the printer is not present maybe the loader is not
+ // updated yet. In this case make a note and as soon as
+ // the printer appears will will select it.
+ if (!selectPrinter(printerId)) {
+ mNextPrinterId = printerId;
+ }
+ }
+
+ public boolean selectPrinter(PrinterId printerId) {
+ mDestinationSpinnerAdapter.ensurePrinterInVisibleAdapterPosition(printerId);
final int position = mDestinationSpinnerAdapter.getPrinterIndex(printerId);
- mDestinationSpinner.setSelection(position);
+ if (position != AdapterView.INVALID_POSITION
+ && position != mDestinationSpinner.getSelectedItemPosition()) {
+ Object item = mDestinationSpinnerAdapter.getItem(position);
+ mCurrentPrinter = (PrinterInfo) item;
+ mDestinationSpinner.setSelection(position);
+ return true;
+ }
+ return false;
+ }
+
+ public void ensureCurrentPrinterSelected() {
+ if (mCurrentPrinter != null) {
+ selectPrinter(mCurrentPrinter.getId());
+ }
}
public boolean isPrintingToPdf() {
@@ -2015,8 +2047,6 @@ public class PrintJobConfigActivity extends Activity {
private final PrinterInfo mFakePdfPrinter;
- private PrinterId mLastShownPrinterId;
-
public DestinationAdapter() {
getLoaderManager().initLoader(LOADER_ID_PRINTERS_LOADER, null, this);
mFakePdfPrinter = createFakePdfPrinter();
@@ -2032,9 +2062,23 @@ public class PrintJobConfigActivity extends Activity {
return AdapterView.INVALID_POSITION;
}
- public void ensurePrinterShownPrinterShown(PrinterId printerId) {
- mLastShownPrinterId = printerId;
- ensureLastShownPrinterInPosition();
+ public void ensurePrinterInVisibleAdapterPosition(PrinterId printerId) {
+ final int printerCount = mPrinters.size();
+ for (int i = 0; i < printerCount; i++) {
+ PrinterInfo printer = (PrinterInfo) mPrinters.get(i);
+ if (printer.getId().equals(printerId)) {
+ // If already in the list - do nothing.
+ if (i < getCount() - 2) {
+ return;
+ }
+ // Else replace the last one (two items are not printers).
+ final int lastPrinterIndex = getCount() - 3;
+ mPrinters.set(i, mPrinters.get(lastPrinterIndex));
+ mPrinters.set(lastPrinterIndex, printer);
+ notifyDataSetChanged();
+ return;
+ }
+ }
}
@Override
@@ -2172,9 +2216,46 @@ public class PrintJobConfigActivity extends Activity {
@Override
public void onLoadFinished(Loader<List<PrinterInfo>> loader,
List<PrinterInfo> printers) {
+ // We rearrange the printers if the user selects a printer
+ // not shown in the initial short list. Therefore, we have
+ // to keep the printer order.
+
+ // No old printers - do not bother keeping their position.
+ if (mPrinters.isEmpty()) {
+ mPrinters.addAll(printers);
+ mEditor.ensureCurrentPrinterSelected();
+ notifyDataSetChanged();
+ return;
+ }
+
+ // Add the new printers to a map.
+ ArrayMap<PrinterId, PrinterInfo> newPrintersMap =
+ new ArrayMap<PrinterId, PrinterInfo>();
+ final int printerCount = printers.size();
+ for (int i = 0; i < printerCount; i++) {
+ PrinterInfo printer = printers.get(i);
+ newPrintersMap.put(printer.getId(), printer);
+ }
+
+ List<PrinterInfo> newPrinters = new ArrayList<PrinterInfo>();
+
+ // Update printers we already have.
+ final int oldPrinterCount = mPrinters.size();
+ for (int i = 0; i < oldPrinterCount; i++) {
+ PrinterId oldPrinterId = mPrinters.get(i).getId();
+ PrinterInfo updatedPrinter = newPrintersMap.remove(oldPrinterId);
+ if (updatedPrinter != null) {
+ newPrinters.add(updatedPrinter);
+ }
+ }
+
+ // Add the rest of the new printers, i.e. what is left.
+ newPrinters.addAll(newPrintersMap.values());
+
mPrinters.clear();
- mPrinters.addAll(printers);
- ensureLastShownPrinterInPosition();
+ mPrinters.addAll(newPrinters);
+
+ mEditor.ensureCurrentPrinterSelected();
notifyDataSetChanged();
}
@@ -2184,27 +2265,6 @@ public class PrintJobConfigActivity extends Activity {
notifyDataSetInvalidated();
}
- private void ensureLastShownPrinterInPosition() {
- if (mLastShownPrinterId == null) {
- return;
- }
- final int printerCount = mPrinters.size();
- for (int i = 0; i < printerCount; i++) {
- PrinterInfo printer = (PrinterInfo) mPrinters.get(i);
- if (printer.getId().equals(mLastShownPrinterId)) {
- // If already in the list - do nothing.
- if (i < getCount() - 2) {
- return;
- }
- // Else replace the last one.
- final int lastPrinter = getCount() - 2;
- mPrinters.set(i, mPrinters.get(lastPrinter - 1));
- mPrinters.set(lastPrinter - 1, printer);
- return;
- }
- }
- }
-
private PrinterInfo createFakePdfPrinter() {
final MediaSize defaultMediaSize;
String currentCountry = getResources().getConfiguration().locale.getCountry();
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
index 87181f74ed0e..d1d71cd03176 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
@@ -236,7 +236,7 @@ public final class PrintSpoolerService extends Service {
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
synchronized (mLock) {
- String prefix = args[0];
+ String prefix = (args.length > 0) ? args[0] : "";
String tab = " ";
pw.append(prefix).append("print jobs:").println();
diff --git a/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java b/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java
index c397c4065530..c888e2c37dc5 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java
@@ -92,6 +92,8 @@ public final class SelectPrinterFragment extends ListFragment {
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setListAdapter(new DestinationAdapter());
+ View emptyView = getActivity().findViewById(R.id.empty_print_state);
+ getListView().setEmptyView(emptyView);
}
@Override
@@ -252,7 +254,7 @@ public final class SelectPrinterFragment extends ListFragment {
Uri marketUri = Uri.parse(DEFAULT_MARKET_QUERY_STRING);
final Intent marketIntent = new Intent(Intent.ACTION_VIEW, marketUri);
if (getActivity().getPackageManager().resolveActivity(marketIntent, 0) != null) {
- builder.setPositiveButton(R.string.search_play_store,
+ builder.setPositiveButton(R.string.add_print_service_label,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
try {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java
index 277501dfd5be..16e2e079d2ab 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java
@@ -21,6 +21,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.View;
import android.view.ViewParent;
import android.widget.TextView;
@@ -39,10 +40,7 @@ public class DateView extends TextView {
private final Date mCurrentTime = new Date();
private SimpleDateFormat mDateFormat;
- private boolean mChangedLocale;
- private boolean mAttachedToWindow;
- private boolean mWindowVisible;
- private boolean mUpdating;
+ private String mLastText;
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
@@ -53,7 +51,8 @@ public class DateView extends TextView {
|| Intent.ACTION_TIMEZONE_CHANGED.equals(action)
|| Intent.ACTION_LOCALE_CHANGED.equals(action)) {
if (Intent.ACTION_LOCALE_CHANGED.equals(action)) {
- mChangedLocale = true;
+ // need to get a fresh date format
+ mDateFormat = null;
}
updateClock();
}
@@ -67,80 +66,39 @@ public class DateView extends TextView {
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
- mAttachedToWindow = true;
- setUpdates();
- }
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- mAttachedToWindow = false;
- setUpdates();
- }
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_TIME_TICK);
+ filter.addAction(Intent.ACTION_TIME_CHANGED);
+ filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
+ filter.addAction(Intent.ACTION_LOCALE_CHANGED);
+ mContext.registerReceiver(mIntentReceiver, filter, null, null);
- @Override
- protected void onWindowVisibilityChanged(int visibility) {
- super.onWindowVisibilityChanged(visibility);
- mWindowVisible = visibility == VISIBLE;
- setUpdates();
+ updateClock();
}
@Override
- protected void onVisibilityChanged(View changedView, int visibility) {
- super.onVisibilityChanged(changedView, visibility);
- setUpdates();
- }
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
- @Override
- protected int getSuggestedMinimumWidth() {
- // makes the large background bitmap not force us to full width
- return 0;
+ mDateFormat = null; // reload the locale next time
+ mContext.unregisterReceiver(mIntentReceiver);
}
protected void updateClock() {
- if (mDateFormat == null || mChangedLocale) {
+ if (mDateFormat == null) {
final String dateFormat = getContext().getString(R.string.system_ui_date_pattern);
final Locale l = Locale.getDefault();
final String fmt = ICU.getBestDateTimePattern(dateFormat, l.toString());
mDateFormat = new SimpleDateFormat(fmt, l);
- mChangedLocale = false;
}
mCurrentTime.setTime(System.currentTimeMillis());
- setText(mDateFormat.format(mCurrentTime));
- }
- private boolean isVisible() {
- View v = this;
- while (true) {
- if (v.getVisibility() != VISIBLE) {
- return false;
- }
- final ViewParent parent = v.getParent();
- if (parent instanceof View) {
- v = (View)parent;
- } else {
- return true;
- }
- }
- }
-
- private void setUpdates() {
- boolean update = mAttachedToWindow && mWindowVisible && isVisible();
- if (update != mUpdating) {
- mUpdating = update;
- if (update) {
- // Register for Intent broadcasts for the clock and battery
- IntentFilter filter = new IntentFilter();
- filter.addAction(Intent.ACTION_TIME_TICK);
- filter.addAction(Intent.ACTION_TIME_CHANGED);
- filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
- filter.addAction(Intent.ACTION_LOCALE_CHANGED);
- mContext.registerReceiver(mIntentReceiver, filter, null, null);
- updateClock();
- } else {
- mContext.unregisterReceiver(mIntentReceiver);
- }
+ final String text = mDateFormat.format(mCurrentTime);
+ if (!text.equals(mLastText)) {
+ setText(text);
+ mLastText = text;
}
}
}
diff --git a/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java b/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
index 42b8cce05d6a..3d5654a56b9e 100644
--- a/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
+++ b/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
@@ -147,7 +147,7 @@ public class ManageDialog extends AlertActivity implements
mHandler.removeMessages(0);
if (!isFinishing()) {
- if (mConfig.startTime != 0) {
+ if (mConfig.startTime != -1) {
long seconds = (SystemClock.elapsedRealtime() - mConfig.startTime) / 1000;
mDuration.setText(String.format("%02d:%02d:%02d",
seconds / 3600, seconds / 60 % 60, seconds % 60));
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 2bd32384ad4b..f08584a365c1 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -1626,7 +1626,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
if (!compatInfo.supportsScreen()) {
- win.addFlags(WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW);
+ win.addFlags(WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW);
}
win.setDefaultIcon(icon);
diff --git a/services/java/com/android/server/ClipboardService.java b/services/java/com/android/server/ClipboardService.java
index 0bf03b5ff453..069ae23f5596 100644
--- a/services/java/com/android/server/ClipboardService.java
+++ b/services/java/com/android/server/ClipboardService.java
@@ -122,7 +122,9 @@ public class ClipboardService extends IClipboard.Stub {
try {
return super.onTransact(code, data, reply, flags);
} catch (RuntimeException e) {
- Slog.w("clipboard", "Exception: ", e);
+ if (!(e instanceof SecurityException)) {
+ Slog.wtf("clipboard", "Exception: ", e);
+ }
throw e;
}
diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java
index 45c614f37af5..794d274da5fa 100644
--- a/services/java/com/android/server/InputMethodManagerService.java
+++ b/services/java/com/android/server/InputMethodManagerService.java
@@ -817,7 +817,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
// The input method manager only throws security exceptions, so let's
// log all others.
if (!(e instanceof SecurityException)) {
- Slog.e(TAG, "Input Method Manager Crash", e);
+ Slog.wtf(TAG, "Input Method Manager Crash", e);
}
throw e;
}
diff --git a/services/java/com/android/server/accounts/AccountManagerService.java b/services/java/com/android/server/accounts/AccountManagerService.java
index 3a3dfd5f1c04..dd9ae4c9397e 100644
--- a/services/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/java/com/android/server/accounts/AccountManagerService.java
@@ -60,6 +60,7 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
+import android.os.Parcel;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
@@ -267,6 +268,21 @@ public class AccountManagerService
}, UserHandle.ALL, userFilter, null, null);
}
+ @Override
+ public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
+ throws RemoteException {
+ try {
+ return super.onTransact(code, data, reply, flags);
+ } catch (RuntimeException e) {
+ // The account manager only throws security exceptions, so let's
+ // log all others.
+ if (!(e instanceof SecurityException)) {
+ Slog.wtf(TAG, "Account Manager Crash", e);
+ }
+ throw e;
+ }
+ }
+
public void systemReady() {
}
diff --git a/services/java/com/android/server/am/ActiveServices.java b/services/java/com/android/server/am/ActiveServices.java
index fa1769f69ded..27ca7a05d9c4 100644
--- a/services/java/com/android/server/am/ActiveServices.java
+++ b/services/java/com/android/server/am/ActiveServices.java
@@ -130,9 +130,9 @@ public final class ActiveServices {
= new ArrayList<ServiceRecord>();
/**
- * List of services that are in the process of being stopped.
+ * List of services that are in the process of being destroyed.
*/
- final ArrayList<ServiceRecord> mStoppingServices
+ final ArrayList<ServiceRecord> mDestroyingServices
= new ArrayList<ServiceRecord>();
static final class DelayingProcess extends ArrayList<ServiceRecord> {
@@ -788,7 +788,7 @@ public final class ActiveServices {
}
}
- serviceDoneExecutingLocked(r, mStoppingServices.contains(r));
+ serviceDoneExecutingLocked(r, mDestroyingServices.contains(r), false);
}
} finally {
Binder.restoreCallingIdentity(origId);
@@ -834,9 +834,9 @@ public final class ActiveServices {
+ " at " + b + ": apps="
+ (b != null ? b.apps.size() : 0));
- boolean inStopping = mStoppingServices.contains(r);
+ boolean inDestroying = mDestroyingServices.contains(r);
if (b != null) {
- if (b.apps.size() > 0 && !inStopping) {
+ if (b.apps.size() > 0 && !inDestroying) {
// Applications have already bound since the last
// unbind, so just rebind right here.
boolean inFg = false;
@@ -856,7 +856,7 @@ public final class ActiveServices {
}
}
- serviceDoneExecutingLocked(r, inStopping);
+ serviceDoneExecutingLocked(r, inDestroying, false);
}
} finally {
Binder.restoreCallingIdentity(origId);
@@ -1419,14 +1419,10 @@ public final class ActiveServices {
}
}
- private final void bringDownServiceIfNeededLocked(ServiceRecord r, boolean knowConn,
- boolean hasConn) {
- //Slog.i(TAG, "Bring down service:");
- //r.dump(" ");
-
+ private final boolean isServiceNeeded(ServiceRecord r, boolean knowConn, boolean hasConn) {
// Are we still explicitly being asked to run?
if (r.startRequested) {
- return;
+ return true;
}
// Is someone still bound to us keepign us running?
@@ -1434,6 +1430,18 @@ public final class ActiveServices {
hasConn = r.hasAutoCreateConnections();
}
if (hasConn) {
+ return true;
+ }
+
+ return false;
+ }
+
+ private final void bringDownServiceIfNeededLocked(ServiceRecord r, boolean knowConn,
+ boolean hasConn) {
+ //Slog.i(TAG, "Bring down service:");
+ //r.dump(" ");
+
+ if (isServiceNeeded(r, knowConn, hasConn)) {
return;
}
@@ -1484,7 +1492,7 @@ public final class ActiveServices {
} catch (Exception e) {
Slog.w(TAG, "Exception when unbinding service "
+ r.shortName, e);
- serviceDoneExecutingLocked(r, true);
+ serviceDoneExecutingLocked(r, true, true);
}
}
}
@@ -1527,14 +1535,14 @@ public final class ActiveServices {
r.app.services.remove(r);
if (r.app.thread != null) {
try {
- bumpServiceExecutingLocked(r, false, "stop");
- mStoppingServices.add(r);
+ bumpServiceExecutingLocked(r, false, "destroy");
+ mDestroyingServices.add(r);
mAm.updateOomAdjLocked(r.app);
r.app.thread.scheduleStopService(r);
} catch (Exception e) {
- Slog.w(TAG, "Exception when stopping service "
+ Slog.w(TAG, "Exception when destroying service "
+ r.shortName, e);
- serviceDoneExecutingLocked(r, true);
+ serviceDoneExecutingLocked(r, true, true);
}
updateServiceForegroundLocked(r.app, false);
} else {
@@ -1560,7 +1568,7 @@ public final class ActiveServices {
r.tracker.setStarted(false, memFactor, now);
r.tracker.setBound(false, memFactor, now);
if (r.executeNesting == 0) {
- r.tracker.makeInactive();
+ r.tracker.clearCurrentOwner(r);
r.tracker = null;
}
}
@@ -1619,7 +1627,7 @@ public final class ActiveServices {
s.app.thread.scheduleUnbindService(s, b.intent.intent.getIntent());
} catch (Exception e) {
Slog.w(TAG, "Exception when unbinding service " + s.shortName, e);
- serviceDoneExecutingLocked(s, true);
+ serviceDoneExecutingLocked(s, true, true);
}
}
@@ -1637,7 +1645,7 @@ public final class ActiveServices {
}
void serviceDoneExecutingLocked(ServiceRecord r, int type, int startId, int res) {
- boolean inStopping = mStoppingServices.contains(r);
+ boolean inDestroying = mDestroyingServices.contains(r);
if (r != null) {
if (type == 1) {
// This is a call from a service start... take care of
@@ -1690,7 +1698,7 @@ public final class ActiveServices {
}
}
final long origId = Binder.clearCallingIdentity();
- serviceDoneExecutingLocked(r, inStopping);
+ serviceDoneExecutingLocked(r, inDestroying, inDestroying);
Binder.restoreCallingIdentity(origId);
} else {
Slog.w(TAG, "Done executing unknown service from pid "
@@ -1698,10 +1706,11 @@ public final class ActiveServices {
}
}
- private void serviceDoneExecutingLocked(ServiceRecord r, boolean inStopping) {
+ private void serviceDoneExecutingLocked(ServiceRecord r, boolean inDestroying,
+ boolean finishing) {
if (DEBUG_SERVICE) Slog.v(TAG, "<<< DONE EXECUTING " + r
+ ": nesting=" + r.executeNesting
- + ", inStopping=" + inStopping + ", app=" + r.app);
+ + ", inDestroying=" + inDestroying + ", app=" + r.app);
else if (DEBUG_SERVICE_EXECUTING) Slog.v(TAG, "<<< DONE EXECUTING " + r.shortName);
r.executeNesting--;
if (r.executeNesting <= 0) {
@@ -1723,10 +1732,10 @@ public final class ActiveServices {
}
}
}
- if (inStopping) {
+ if (inDestroying) {
if (DEBUG_SERVICE) Slog.v(TAG,
- "doneExecuting remove stopping " + r);
- mStoppingServices.remove(r);
+ "doneExecuting remove destroying " + r);
+ mDestroyingServices.remove(r);
r.bindings.clear();
}
mAm.updateOomAdjLocked(r.app);
@@ -1735,8 +1744,8 @@ public final class ActiveServices {
if (r.tracker != null) {
r.tracker.setExecuting(false, mAm.mProcessStats.getMemFactorLocked(),
SystemClock.uptimeMillis());
- if (inStopping) {
- r.tracker.makeInactive();
+ if (finishing) {
+ r.tracker.clearCurrentOwner(r);
r.tracker = null;
}
}
@@ -1839,7 +1848,7 @@ public final class ActiveServices {
}
}
} else {
- ServiceMap smap = mServiceMap.valueAt(userId);
+ ServiceMap smap = mServiceMap.get(userId);
if (smap != null) {
ArrayMap<ComponentName, ServiceRecord> items = smap.mServicesByName;
didSomething = collectForceStopServicesLocked(name, userId, evenPersistent,
@@ -1931,12 +1940,9 @@ public final class ActiveServices {
sr.app = null;
sr.isolatedProc = null;
sr.executeNesting = 0;
- if (sr.tracker != null) {
- sr.tracker.setExecuting(false, mAm.mProcessStats.getMemFactorLocked(),
- SystemClock.uptimeMillis());
- }
- if (mStoppingServices.remove(sr)) {
- if (DEBUG_SERVICE) Slog.v(TAG, "killServices remove stopping " + sr);
+ sr.forceClearTracker();
+ if (mDestroyingServices.remove(sr)) {
+ if (DEBUG_SERVICE) Slog.v(TAG, "killServices remove destroying " + sr);
}
final int numClients = sr.bindings.size();
@@ -1984,13 +1990,14 @@ public final class ActiveServices {
}
// Make sure we have no more records on the stopping list.
- int i = mStoppingServices.size();
+ int i = mDestroyingServices.size();
while (i > 0) {
i--;
- ServiceRecord sr = mStoppingServices.get(i);
+ ServiceRecord sr = mDestroyingServices.get(i);
if (sr.app == app) {
- mStoppingServices.remove(i);
- if (DEBUG_SERVICE) Slog.v(TAG, "killServices remove stopping " + sr);
+ sr.forceClearTracker();
+ mDestroyingServices.remove(i);
+ if (DEBUG_SERVICE) Slog.v(TAG, "killServices remove destroying " + sr);
}
}
@@ -2340,10 +2347,10 @@ public final class ActiveServices {
needSep = true;
}
- if (mStoppingServices.size() > 0) {
+ if (mDestroyingServices.size() > 0) {
boolean printed = false;
- for (int i=0; i<mStoppingServices.size(); i++) {
- ServiceRecord r = mStoppingServices.get(i);
+ for (int i=0; i< mDestroyingServices.size(); i++) {
+ ServiceRecord r = mDestroyingServices.get(i);
if (!matcher.match(r, r.name)) {
continue;
}
@@ -2354,10 +2361,10 @@ public final class ActiveServices {
if (!printed) {
if (needSep) pw.println();
needSep = true;
- pw.println(" Stopping services:");
+ pw.println(" Destroying services:");
printed = true;
}
- pw.print(" * Stopping "); pw.println(r);
+ pw.print(" * Destroy "); pw.println(r);
r.dump(pw, " ");
}
needSep = true;
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 759ec7612f80..4e7060be443c 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -235,7 +235,7 @@ public final class ActivityManagerService extends ActivityManagerNative
static final boolean DEBUG_USER_LEAVING = localLOGV || false;
static final boolean DEBUG_VISBILITY = localLOGV || false;
static final boolean DEBUG_PSS = localLOGV || false;
- static final boolean DEBUG_LOCKSCREEN = localLOGV || true;
+ static final boolean DEBUG_LOCKSCREEN = localLOGV || false;
static final boolean VALIDATE_TOKENS = true;
static final boolean SHOW_ACTIVITY_START_TIME = true;
@@ -2051,7 +2051,7 @@ public final class ActivityManagerService extends ActivityManagerNative
// The activity manager only throws security exceptions, so let's
// log all others.
if (!(e instanceof SecurityException)) {
- Slog.e(TAG, "Activity Manager Crash", e);
+ Slog.wtf(TAG, "Activity Manager Crash", e);
}
throw e;
}
@@ -7827,6 +7827,31 @@ public final class ActivityManagerService extends ActivityManagerNative
}
}
+ @Override
+ public void appNotRespondingViaProvider(IBinder connection) {
+ enforceCallingPermission(
+ android.Manifest.permission.REMOVE_TASKS, "appNotRespondingViaProvider()");
+
+ final ContentProviderConnection conn = (ContentProviderConnection) connection;
+ if (conn == null) {
+ Slog.w(TAG, "ContentProviderConnection is null");
+ return;
+ }
+
+ final ProcessRecord host = conn.provider.proc;
+ if (host == null) {
+ Slog.w(TAG, "Failed to find hosting ProcessRecord");
+ return;
+ }
+
+ final long token = Binder.clearCallingIdentity();
+ try {
+ appNotResponding(host, null, null, false, "ContentProvider not responding");
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
public static final void installSystemProviders() {
List<ProviderInfo> providers;
synchronized (mSelf) {
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 4d669461d35d..28c87d1e5ea6 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -978,7 +978,7 @@ final class ActivityStack {
*/
final boolean ensureActivitiesVisibleLocked(ActivityRecord top, ActivityRecord starting,
String onlyThisProcess, int configChanges, boolean forceHomeShown) {
- if (DEBUG_VISBILITY) Slog.v(
+ if (true || DEBUG_VISBILITY) Slog.v(
TAG, "ensureActivitiesVisible behind " + top
+ " configChanges=0x" + Integer.toHexString(configChanges));
@@ -1034,7 +1034,7 @@ final class ActivityStack {
r.startFreezingScreenLocked(r.app, configChanges);
}
if (!r.visible) {
- if (DEBUG_VISBILITY) Slog.v(
+ if (true || DEBUG_VISBILITY) Slog.v(
TAG, "Starting and making visible: " + r);
mWindowManager.setAppVisibility(r.appToken, true);
}
@@ -1056,7 +1056,7 @@ final class ActivityStack {
if (r.state != ActivityState.RESUMED && r != starting) {
// If this activity is paused, tell it
// to now show its window.
- if (DEBUG_VISBILITY) Slog.v(
+ if (true || DEBUG_VISBILITY) Slog.v(
TAG, "Making visible and scheduling visibility: " + r);
try {
if (mTranslucentActivityWaiting != null) {
@@ -1110,7 +1110,7 @@ final class ActivityStack {
// Now for any activities that aren't visible to the user, make
// sure they no longer are keeping the screen frozen.
if (r.visible) {
- if (DEBUG_VISBILITY) Slog.v(TAG, "Making invisible: " + r);
+ if (true || DEBUG_VISBILITY) Slog.v(TAG, "Making invisible: " + r);
r.visible = false;
try {
mWindowManager.setAppVisibility(r.appToken, false);
@@ -2367,7 +2367,7 @@ final class ActivityStack {
if (mResumedActivity == r) {
boolean endTask = index <= 0;
- if (DEBUG_TRANSITION) Slog.v(TAG,
+ if (DEBUG_VISBILITY || DEBUG_TRANSITION) Slog.v(TAG,
"Prepare close transition: finishing " + r);
mWindowManager.prepareAppTransition(endTask
? AppTransition.TRANSIT_TASK_CLOSE
@@ -3438,23 +3438,22 @@ final class ActivityStack {
// Determine if the top task is exiting and should return to home. Do this before it gets
// removed in removeHistoryRecordsForAppsLocked.
boolean launchHomeNext = false;
- int top = mTaskHistory.size() - 1;
- while (top >= 0) {
- final TaskRecord topTask = mTaskHistory.get(top);
- if (topTask.mActivities.isEmpty()) {
- // Not possible, but just in case.
- --top;
+ TaskRecord topTask = mTaskHistory.get(mTaskHistory.size() - 1);
+ ArrayList<ActivityRecord> activities = topTask.mActivities;
+ int activityNdx;
+ for (activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
+ ActivityRecord r = activities.get(activityNdx);
+ if (r.finishing) {
continue;
}
- ActivityRecord r = topTask.topRunningActivityLocked(null);
- if (r != null) {
- // r will be launched next.
+ if (r.app != app) {
+ // This is the dying activity.
break;
}
- // There is an activity in topTask that is finishing. If topTask belongs to the app
- // return to home depending on the task flag.
+ }
+ if (activityNdx < 0) {
+ // All activities in task belong to app. Set launchHomeNext to task's value.
launchHomeNext = topTask.mOnTopOfHome;
- break;
}
removeHistoryRecordsForAppLocked(app);
diff --git a/services/java/com/android/server/am/ActivityStackSupervisor.java b/services/java/com/android/server/am/ActivityStackSupervisor.java
index f71870633fdc..2b69a4e16978 100644
--- a/services/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/java/com/android/server/am/ActivityStackSupervisor.java
@@ -884,6 +884,7 @@ public final class ActivityStackSupervisor {
throws RemoteException {
r.startFreezingScreenLocked(app, 0);
+ if (true) Slog.d(TAG, "realStartActivity: setting app visibility true");
mWindowManager.setAppVisibility(r.appToken, true);
// schedule launch ticks to collect information about slow apps.
@@ -1932,7 +1933,7 @@ public final class ActivityStackSupervisor {
for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
final ActivityStack stack = mStacks.get(stackNdx);
// Only update launchHomeTaskNext for the focused stack.
- launchHomeTaskNext |= (stack == focusedStack && stack.handleAppDiedLocked(app));
+ launchHomeTaskNext |= (stack.handleAppDiedLocked(app) && stack == focusedStack);
}
if (!restarting) {
@@ -2299,7 +2300,7 @@ public final class ActivityStackSupervisor {
final boolean nowVisible = allResumedActivitiesVisible();
for (int i=0; i<N; i++) {
ActivityRecord s = mStoppingActivities.get(i);
- if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible="
+ if (true || localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible="
+ nowVisible + " waitingVisible=" + s.waitingVisible
+ " finishing=" + s.finishing);
if (s.waitingVisible && nowVisible) {
diff --git a/services/java/com/android/server/am/AppErrorDialog.java b/services/java/com/android/server/am/AppErrorDialog.java
index bfc86b070250..fffa75e7069e 100644
--- a/services/java/com/android/server/am/AppErrorDialog.java
+++ b/services/java/com/android/server/am/AppErrorDialog.java
@@ -16,7 +16,7 @@
package com.android.server.am;
-import static android.view.WindowManager.LayoutParams.FLAG_SYSTEM_ERROR;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR;
import android.content.Context;
import android.content.DialogInterface;
@@ -72,7 +72,7 @@ final class AppErrorDialog extends BaseErrorDialog {
}
setTitle(res.getText(com.android.internal.R.string.aerr_title));
- getWindow().addFlags(FLAG_SYSTEM_ERROR);
+ getWindow().addFlags(PRIVATE_FLAG_SYSTEM_ERROR);
WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.setTitle("Application Error: " + app.info.processName);
attrs.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
diff --git a/services/java/com/android/server/am/AppNotRespondingDialog.java b/services/java/com/android/server/am/AppNotRespondingDialog.java
index d0a044179f0e..4de272dcd632 100644
--- a/services/java/com/android/server/am/AppNotRespondingDialog.java
+++ b/services/java/com/android/server/am/AppNotRespondingDialog.java
@@ -16,7 +16,7 @@
package com.android.server.am;
-import static android.view.WindowManager.LayoutParams.FLAG_SYSTEM_ERROR;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR;
import android.content.ActivityNotFoundException;
import android.content.Context;
@@ -94,7 +94,7 @@ final class AppNotRespondingDialog extends BaseErrorDialog {
if (aboveSystem) {
getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
}
- getWindow().addFlags(FLAG_SYSTEM_ERROR);
+ getWindow().addFlags(PRIVATE_FLAG_SYSTEM_ERROR);
WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.setTitle("Application Not Responding: " + app.info.processName);
attrs.privateFlags = WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
diff --git a/services/java/com/android/server/am/ProcessStatsService.java b/services/java/com/android/server/am/ProcessStatsService.java
index 2c49bb991d9e..7dc006c467a1 100644
--- a/services/java/com/android/server/am/ProcessStatsService.java
+++ b/services/java/com/android/server/am/ProcessStatsService.java
@@ -357,7 +357,7 @@ public final class ProcessStatsService extends IProcessStats.Stub {
boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates,
boolean sepProcStates, int[] procStates, long now, String reqPackage) {
ArrayList<ProcessStats.ProcessState> procs = mProcessStats.collectProcessesLocked(
- screenStates, memStates, procStates, procStates, now, reqPackage);
+ screenStates, memStates, procStates, procStates, now, reqPackage, false);
if (procs.size() > 0) {
if (header != null) {
pw.println(header);
@@ -519,7 +519,7 @@ public final class ProcessStatsService extends IProcessStats.Stub {
static private void dumpHelp(PrintWriter pw) {
pw.println("Process stats (procstats) dump options:");
pw.println(" [--checkin|-c|--csv] [--csv-screen] [--csv-proc] [--csv-mem]");
- pw.println(" [--details] [--full-details] [--current] [--hours]");
+ pw.println(" [--details] [--full-details] [--current] [--hours] [--active]");
pw.println(" [--commit] [--reset] [--clear] [--write] [-h] [<package.name>]");
pw.println(" --checkin: perform a checkin: print and delete old committed states.");
pw.println(" --c: print only state in checkin format.");
@@ -528,10 +528,11 @@ public final class ProcessStatsService extends IProcessStats.Stub {
pw.println(" --csv-mem: norm, mod, low, crit.");
pw.println(" --csv-proc: pers, top, fore, vis, precept, backup,");
pw.println(" service, home, prev, cached");
- pw.println(" --details: dump all execution details, not just summary.");
- pw.println(" --full-details: dump only detail information, for all saved state.");
+ pw.println(" --details: dump per-package details, not just summary.");
+ pw.println(" --full-details: dump all timing and active state details.");
pw.println(" --current: only dump current state.");
pw.println(" --hours: aggregate over about N last hours.");
+ pw.println(" --active: only show currently active processes/services.");
pw.println(" --commit: commit current stats to disk and reset to start new stats.");
pw.println(" --reset: reset current stats, without committing.");
pw.println(" --clear: clear all stats; does both --reset and deletes old stats.");
@@ -562,6 +563,7 @@ public final class ProcessStatsService extends IProcessStats.Stub {
boolean dumpFullDetails = false;
boolean dumpAll = false;
int aggregateHours = 0;
+ boolean activeOnly = false;
String reqPackage = null;
boolean csvSepScreenStats = false;
int[] csvScreenStats = new int[] { ProcessStats.ADJ_SCREEN_OFF, ProcessStats.ADJ_SCREEN_ON};
@@ -645,6 +647,9 @@ public final class ProcessStatsService extends IProcessStats.Stub {
dumpHelp(pw);
return;
}
+ } else if ("--active".equals(arg)) {
+ activeOnly = true;
+ currentOnly = true;
} else if ("--current".equals(arg)) {
currentOnly = true;
} else if ("--commit".equals(arg)) {
@@ -779,9 +784,9 @@ public final class ProcessStatsService extends IProcessStats.Stub {
stats.dumpCheckinLocked(pw, reqPackage);
} else {
if (dumpDetails || dumpFullDetails) {
- stats.dumpLocked(pw, reqPackage, now, !dumpFullDetails, dumpAll);
+ stats.dumpLocked(pw, reqPackage, now, !dumpFullDetails, dumpAll, activeOnly);
} else {
- stats.dumpSummaryLocked(pw, reqPackage, now);
+ stats.dumpSummaryLocked(pw, reqPackage, now, activeOnly);
}
}
return;
@@ -826,9 +831,10 @@ public final class ProcessStatsService extends IProcessStats.Stub {
// Always dump summary here, dumping all details is just too
// much crud.
if (dumpFullDetails) {
- mProcessStats.dumpLocked(pw, reqPackage, now, false, false);
+ mProcessStats.dumpLocked(pw, reqPackage, now, false, false,
+ activeOnly);
} else {
- processStats.dumpSummaryLocked(pw, reqPackage, now);
+ processStats.dumpSummaryLocked(pw, reqPackage, now, activeOnly);
}
}
if (isCheckin) {
@@ -856,12 +862,13 @@ public final class ProcessStatsService extends IProcessStats.Stub {
pw.println("CURRENT STATS:");
}
if (dumpDetails || dumpFullDetails) {
- mProcessStats.dumpLocked(pw, reqPackage, now, !dumpFullDetails, dumpAll);
+ mProcessStats.dumpLocked(pw, reqPackage, now, !dumpFullDetails, dumpAll,
+ activeOnly);
if (dumpAll) {
pw.print(" mFile="); pw.println(mFile.getBaseFile());
}
} else {
- mProcessStats.dumpSummaryLocked(pw, reqPackage, now);
+ mProcessStats.dumpSummaryLocked(pw, reqPackage, now, activeOnly);
}
}
}
diff --git a/services/java/com/android/server/am/ServiceRecord.java b/services/java/com/android/server/am/ServiceRecord.java
index ac14da982367..c47c1ac8da20 100644
--- a/services/java/com/android/server/am/ServiceRecord.java
+++ b/services/java/com/android/server/am/ServiceRecord.java
@@ -328,11 +328,23 @@ final class ServiceRecord extends Binder {
if ((serviceInfo.applicationInfo.flags&ApplicationInfo.FLAG_PERSISTENT) == 0) {
tracker = ams.mProcessStats.getServiceStateLocked(serviceInfo.packageName,
serviceInfo.applicationInfo.uid, serviceInfo.processName, serviceInfo.name);
- tracker.makeActive();
+ tracker.applyNewOwner(this);
}
return tracker;
}
+ public void forceClearTracker() {
+ if (tracker != null) {
+ int memFactor = ams.mProcessStats.getMemFactorLocked();
+ long now = SystemClock.uptimeMillis();
+ tracker.setStarted(false, memFactor, now);
+ tracker.setBound(false, memFactor, now);
+ tracker.setExecuting(false, memFactor, now);
+ tracker.clearCurrentOwner(this);
+ tracker = null;
+ }
+ }
+
public AppBindRecord retrieveAppBindingLocked(Intent intent,
ProcessRecord app) {
Intent.FilterComparison filter = new Intent.FilterComparison(intent);
diff --git a/services/java/com/android/server/am/StrictModeViolationDialog.java b/services/java/com/android/server/am/StrictModeViolationDialog.java
index b6d0daad2753..5fee0d32b0a4 100644
--- a/services/java/com/android/server/am/StrictModeViolationDialog.java
+++ b/services/java/com/android/server/am/StrictModeViolationDialog.java
@@ -16,14 +16,13 @@
package com.android.server.am;
-import static android.view.WindowManager.LayoutParams.FLAG_SYSTEM_ERROR;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.os.Handler;
import android.os.Message;
-import android.util.Slog;
final class StrictModeViolationDialog extends BaseErrorDialog {
private final static String TAG = "StrictModeViolationDialog";
@@ -75,7 +74,7 @@ final class StrictModeViolationDialog extends BaseErrorDialog {
}
setTitle(res.getText(com.android.internal.R.string.aerr_title));
- getWindow().addFlags(FLAG_SYSTEM_ERROR);
+ getWindow().addFlags(PRIVATE_FLAG_SYSTEM_ERROR);
getWindow().setTitle("Strict Mode Violation: " + app.info.processName);
// After the timeout, pretend the user clicked the quit button
diff --git a/services/java/com/android/server/connectivity/Vpn.java b/services/java/com/android/server/connectivity/Vpn.java
index 8cc5b4f69cd9..45797b2e4d96 100644
--- a/services/java/com/android/server/connectivity/Vpn.java
+++ b/services/java/com/android/server/connectivity/Vpn.java
@@ -1096,6 +1096,9 @@ public class Vpn extends BaseNetworkStateTracker {
// Here is the last step and it must be done synchronously.
synchronized (Vpn.this) {
+ // Set the start time
+ mConfig.startTime = SystemClock.elapsedRealtime();
+
// Check if the thread is interrupted while we are waiting.
checkpoint(false);
diff --git a/services/java/com/android/server/content/ContentService.java b/services/java/com/android/server/content/ContentService.java
index a3db457b4fbf..48b3259bfee1 100644
--- a/services/java/com/android/server/content/ContentService.java
+++ b/services/java/com/android/server/content/ContentService.java
@@ -144,7 +144,7 @@ public final class ContentService extends IContentService.Stub {
// The content service only throws security exceptions, so let's
// log all others.
if (!(e instanceof SecurityException)) {
- Log.e(TAG, "Content Service Crash", e);
+ Slog.wtf(TAG, "Content Service Crash", e);
}
throw e;
}
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index 8becbd518364..41a122b66a24 100755
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -1501,7 +1501,7 @@ public class PackageManagerService extends IPackageManager.Stub {
return super.onTransact(code, data, reply, flags);
} catch (RuntimeException e) {
if (!(e instanceof SecurityException) && !(e instanceof IllegalArgumentException)) {
- Slog.e(TAG, "Package Manager Crash", e);
+ Slog.wtf(TAG, "Package Manager Crash", e);
}
throw e;
}
diff --git a/services/java/com/android/server/power/PowerManagerService.java b/services/java/com/android/server/power/PowerManagerService.java
index fe09a33b3d3b..2ccd21c54859 100644
--- a/services/java/com/android/server/power/PowerManagerService.java
+++ b/services/java/com/android/server/power/PowerManagerService.java
@@ -453,7 +453,8 @@ public final class PowerManagerService extends IPowerManager.Stub
mDisplayPowerControllerCallbacks, mHandler);
mWirelessChargerDetector = new WirelessChargerDetector(sensorManager,
- createSuspendBlockerLocked("PowerManagerService.WirelessChargerDetector"));
+ createSuspendBlockerLocked("PowerManagerService.WirelessChargerDetector"),
+ mHandler);
mSettingsObserver = new SettingsObserver(mHandler);
mAttentionLight = mLightsService.getLight(LightsService.LIGHT_ID_ATTENTION);
diff --git a/services/java/com/android/server/power/WirelessChargerDetector.java b/services/java/com/android/server/power/WirelessChargerDetector.java
index 35920f79a0c4..38f5d7740842 100644
--- a/services/java/com/android/server/power/WirelessChargerDetector.java
+++ b/services/java/com/android/server/power/WirelessChargerDetector.java
@@ -21,8 +21,11 @@ import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.BatteryManager;
+import android.os.Handler;
+import android.os.Message;
import android.os.SystemClock;
import android.util.Slog;
+import android.util.TimeUtils;
import java.io.PrintWriter;
@@ -70,12 +73,12 @@ final class WirelessChargerDetector {
private static final String TAG = "WirelessChargerDetector";
private static final boolean DEBUG = false;
- // Number of nanoseconds per millisecond.
- private static final long NANOS_PER_MS = 1000000;
-
// The minimum amount of time to spend watching the sensor before making
// a determination of whether movement occurred.
- private static final long SETTLE_TIME_NANOS = 500 * NANOS_PER_MS;
+ private static final long SETTLE_TIME_MILLIS = 800;
+
+ // The sensor sampling interval.
+ private static final int SAMPLING_INTERVAL_MILLIS = 50;
// The minimum number of samples that must be collected.
private static final int MIN_SAMPLES = 3;
@@ -97,6 +100,7 @@ final class WirelessChargerDetector {
private final SensorManager mSensorManager;
private final SuspendBlocker mSuspendBlocker;
+ private final Handler mHandler;
// The gravity sensor, or null if none.
private Sensor mGravitySensor;
@@ -116,6 +120,9 @@ final class WirelessChargerDetector {
// The suspend blocker is held while this is the case.
private boolean mDetectionInProgress;
+ // The time when detection was last performed.
+ private long mDetectionStartTime;
+
// True if the rest position should be updated if at rest.
// Otherwise, the current rest position is simply checked and cleared if movement
// is detected but no new rest position is stored.
@@ -127,18 +134,17 @@ final class WirelessChargerDetector {
// The number of samples collected that showed evidence of not being at rest.
private int mMovingSamples;
- // The time and value of the first sample that was collected.
- private long mFirstSampleTime;
+ // The value of the first sample that was collected.
private float mFirstSampleX, mFirstSampleY, mFirstSampleZ;
- // The time and value of the last sample that was collected (for debugging only).
- private long mLastSampleTime;
+ // The value of the last sample that was collected.
private float mLastSampleX, mLastSampleY, mLastSampleZ;
public WirelessChargerDetector(SensorManager sensorManager,
- SuspendBlocker suspendBlocker) {
+ SuspendBlocker suspendBlocker, Handler handler) {
mSensorManager = sensorManager;
mSuspendBlocker = suspendBlocker;
+ mHandler = handler;
mGravitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
}
@@ -152,13 +158,13 @@ final class WirelessChargerDetector {
pw.println(" mAtRest=" + mAtRest);
pw.println(" mRestX=" + mRestX + ", mRestY=" + mRestY + ", mRestZ=" + mRestZ);
pw.println(" mDetectionInProgress=" + mDetectionInProgress);
+ pw.println(" mDetectionStartTime=" + (mDetectionStartTime == 0 ? "0 (never)"
+ : TimeUtils.formatUptime(mDetectionStartTime)));
pw.println(" mMustUpdateRestPosition=" + mMustUpdateRestPosition);
pw.println(" mTotalSamples=" + mTotalSamples);
pw.println(" mMovingSamples=" + mMovingSamples);
- pw.println(" mFirstSampleTime=" + mFirstSampleTime);
pw.println(" mFirstSampleX=" + mFirstSampleX
+ ", mFirstSampleY=" + mFirstSampleY + ", mFirstSampleZ=" + mFirstSampleZ);
- pw.println(" mLastSampleTime=" + mLastSampleTime);
pw.println(" mLastSampleX=" + mLastSampleX
+ ", mLastSampleY=" + mLastSampleY + ", mLastSampleZ=" + mLastSampleZ);
}
@@ -217,22 +223,56 @@ final class WirelessChargerDetector {
private void startDetectionLocked() {
if (!mDetectionInProgress && mGravitySensor != null) {
if (mSensorManager.registerListener(mListener, mGravitySensor,
- SensorManager.SENSOR_DELAY_UI)) {
+ SAMPLING_INTERVAL_MILLIS * 1000)) {
mSuspendBlocker.acquire();
mDetectionInProgress = true;
+ mDetectionStartTime = SystemClock.uptimeMillis();
mTotalSamples = 0;
mMovingSamples = 0;
+
+ Message msg = Message.obtain(mHandler, mSensorTimeout);
+ msg.setAsynchronous(true);
+ mHandler.sendMessageDelayed(msg, SETTLE_TIME_MILLIS);
}
}
}
- private void processSample(long timeNanos, float x, float y, float z) {
- synchronized (mLock) {
- if (!mDetectionInProgress) {
- return;
+ private void finishDetectionLocked() {
+ if (mDetectionInProgress) {
+ mSensorManager.unregisterListener(mListener);
+ mHandler.removeCallbacks(mSensorTimeout);
+
+ if (mMustUpdateRestPosition) {
+ clearAtRestLocked();
+ if (mTotalSamples < MIN_SAMPLES) {
+ Slog.w(TAG, "Wireless charger detector is broken. Only received "
+ + mTotalSamples + " samples from the gravity sensor but we "
+ + "need at least " + MIN_SAMPLES + " and we expect to see "
+ + "about " + SETTLE_TIME_MILLIS / SAMPLING_INTERVAL_MILLIS
+ + " on average.");
+ } else if (mMovingSamples == 0) {
+ mAtRest = true;
+ mRestX = mLastSampleX;
+ mRestY = mLastSampleY;
+ mRestZ = mLastSampleZ;
+ }
+ mMustUpdateRestPosition = false;
}
- mLastSampleTime = timeNanos;
+ if (DEBUG) {
+ Slog.d(TAG, "New state: mAtRest=" + mAtRest
+ + ", mRestX=" + mRestX + ", mRestY=" + mRestY + ", mRestZ=" + mRestZ
+ + ", mTotalSamples=" + mTotalSamples
+ + ", mMovingSamples=" + mMovingSamples);
+ }
+
+ mDetectionInProgress = false;
+ mSuspendBlocker.release();
+ }
+ }
+
+ private void processSampleLocked(float x, float y, float z) {
+ if (mDetectionInProgress) {
mLastSampleX = x;
mLastSampleY = y;
mLastSampleZ = z;
@@ -240,7 +280,6 @@ final class WirelessChargerDetector {
mTotalSamples += 1;
if (mTotalSamples == 1) {
// Save information about the first sample collected.
- mFirstSampleTime = timeNanos;
mFirstSampleX = x;
mFirstSampleY = y;
mFirstSampleZ = z;
@@ -260,32 +299,6 @@ final class WirelessChargerDetector {
}
clearAtRestLocked();
}
-
- // Save the result when done.
- if (timeNanos - mFirstSampleTime >= SETTLE_TIME_NANOS
- && mTotalSamples >= MIN_SAMPLES) {
- mSensorManager.unregisterListener(mListener);
- if (mMustUpdateRestPosition) {
- if (mMovingSamples == 0) {
- mAtRest = true;
- mRestX = x;
- mRestY = y;
- mRestZ = z;
- } else {
- clearAtRestLocked();
- }
- mMustUpdateRestPosition = false;
- }
- mDetectionInProgress = false;
- mSuspendBlocker.release();
-
- if (DEBUG) {
- Slog.d(TAG, "New state: mAtRest=" + mAtRest
- + ", mRestX=" + mRestX + ", mRestY=" + mRestY + ", mRestZ=" + mRestZ
- + ", mTotalSamples=" + mTotalSamples
- + ", mMovingSamples=" + mMovingSamples);
- }
- }
}
}
@@ -323,14 +336,22 @@ final class WirelessChargerDetector {
private final SensorEventListener mListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
- // We use SystemClock.elapsedRealtimeNanos() instead of event.timestamp because
- // on some devices the sensor HAL may produce timestamps that are not monotonic.
- processSample(SystemClock.elapsedRealtimeNanos(),
- event.values[0], event.values[1], event.values[2]);
+ synchronized (mLock) {
+ processSampleLocked(event.values[0], event.values[1], event.values[2]);
+ }
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
+
+ private final Runnable mSensorTimeout = new Runnable() {
+ @Override
+ public void run() {
+ synchronized (mLock) {
+ finishDetectionLocked();
+ }
+ }
+ };
}
diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java
index bc70fe30c554..3b0ee24faa43 100644
--- a/services/java/com/android/server/print/UserState.java
+++ b/services/java/com/android/server/print/UserState.java
@@ -134,6 +134,11 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks {
}
if (service != null) {
service.onPrintJobQueued(printJob);
+ } else {
+ // The service for the job is no longer enabled, so just
+ // fail the job with the appropriate message.
+ mSpooler.setPrintJobState(printJob.getId(), PrintJobInfo.STATE_FAILED,
+ mContext.getString(R.string.reason_service_unavailable));
}
}
@@ -779,7 +784,7 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks {
for (int i = 0; i < printJobCount; i++) {
PrintJobInfo printJob = printJobs.get(i);
mSpooler.setPrintJobState(printJob.getId(), PrintJobInfo.STATE_FAILED,
- mContext.getString(R.string.reason_unknown));
+ mContext.getString(R.string.reason_service_unavailable));
}
} finally {
Binder.restoreCallingIdentity(identity);
diff --git a/services/java/com/android/server/wm/Session.java b/services/java/com/android/server/wm/Session.java
index 1d95c44c8b15..87cabc9a510b 100644
--- a/services/java/com/android/server/wm/Session.java
+++ b/services/java/com/android/server/wm/Session.java
@@ -126,7 +126,7 @@ final class Session extends IWindowSession.Stub
} catch (RuntimeException e) {
// Log all 'real' exceptions thrown to the caller
if (!(e instanceof SecurityException)) {
- Slog.e(WindowManagerService.TAG, "Window Session Crash", e);
+ Slog.wtf(WindowManagerService.TAG, "Window Session Crash", e);
}
throw e;
}
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 80c50cc2b2ff..e625caea25e5 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -255,6 +255,9 @@ public class WindowManagerService extends IWindowManager.Stub
/** Amount of time (in milliseconds) to delay before declaring a window freeze timeout. */
static final int WINDOW_FREEZE_TIMEOUT_DURATION = 2000;
+ /** Amount of time (in milliseconds) to delay before declaring a starting window leaked. */
+ static final int STARTING_WINDOW_TIMEOUT_DURATION = 10000;
+
/**
* If true, the window manager will do its own custom freezing and general
* management of the screen during rotation.
@@ -810,7 +813,7 @@ public class WindowManagerService extends IWindowManager.Stub
// The window manager only throws security exceptions, so let's
// log all others.
if (!(e instanceof SecurityException)) {
- Log.wtf(TAG, "Window Manager Crash", e);
+ Slog.wtf(TAG, "Window Manager Crash", e);
}
throw e;
}
@@ -2256,6 +2259,8 @@ public class WindowManagerService extends IWindowManager.Stub
token.appWindowToken.startingWindow = win;
if (DEBUG_STARTING_WINDOW) Slog.v (TAG, "addWindow: " + token.appWindowToken
+ " startingWindow=" + win);
+ Message m = mH.obtainMessage(H.REMOVE_STARTING_TIMEOUT, token.appWindowToken);
+ mH.sendMessageDelayed(m, STARTING_WINDOW_TIMEOUT_DURATION);
}
boolean imMayMove = true;
@@ -2356,6 +2361,10 @@ public class WindowManagerService extends IWindowManager.Stub
}
public void removeWindowLocked(Session session, WindowState win) {
+ if (win.mAttrs.type == TYPE_APPLICATION_STARTING) {
+ if (DEBUG_STARTING_WINDOW) Slog.d(TAG, "Starting window removed " + win);
+ removeStartingWindowTimeout(win.mAppToken);
+ }
if (localLOGV || DEBUG_FOCUS || DEBUG_FOCUS_LIGHT && win==mCurrentFocus) Slog.v(
TAG, "Remove " + win + " client="
@@ -2498,6 +2507,7 @@ public class WindowManagerService extends IWindowManager.Stub
if (atoken != null) {
if (atoken.startingWindow == win) {
if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Nulling startingWindow " + win);
+ removeStartingWindowTimeout(atoken);
atoken.startingWindow = null;
} else if (atoken.allAppWindows.size() == 0 && atoken.startingData != null) {
// If this is the last window and we had requested a starting
@@ -2507,12 +2517,7 @@ public class WindowManagerService extends IWindowManager.Stub
} else if (atoken.allAppWindows.size() == 1 && atoken.startingView != null) {
// If this is the last window except for a starting transition
// window, we need to get rid of the starting transition.
- if (DEBUG_STARTING_WINDOW) {
- Slog.v(TAG, "Schedule remove starting " + token
- + ": no more real windows");
- }
- Message m = mH.obtainMessage(H.REMOVE_STARTING, atoken);
- mH.sendMessage(m);
+ scheduleRemoveStartingWindow(atoken);
}
}
@@ -2788,7 +2793,7 @@ public class WindowManagerService extends IWindowManager.Stub
if (DEBUG_LAYOUT) Slog.v(TAG, "Relayout " + win + ": viewVisibility=" + viewVisibility
+ " req=" + requestedWidth + "x" + requestedHeight + " " + win.mAttrs);
- win.mEnforceSizeCompat = (win.mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0;
+ win.mEnforceSizeCompat = (win.mAttrs.flags & PRIVATE_FLAG_COMPATIBLE_WINDOW) != 0;
if ((attrChanges & WindowManager.LayoutParams.ALPHA_CHANGED) != 0) {
winAnimator.mAlpha = attrs.alpha;
@@ -3374,6 +3379,18 @@ public class WindowManagerService extends IWindowManager.Stub
Binder.restoreCallingIdentity(origId);
}
+ private Task createTask(int taskId, int stackId, int userId, AppWindowToken atoken) {
+ final TaskStack stack = mStackIdToStack.get(stackId);
+ if (stack == null) {
+ throw new IllegalArgumentException("addAppToken: invalid stackId=" + stackId);
+ }
+ Task task = new Task(atoken, stack, userId);
+ stack.addTask(task, true);
+ stack.getDisplayContent().moveStack(stack, true);
+ mTaskIdToTask.put(taskId, task);
+ return task;
+ }
+
@Override
public void addAppToken(int addPos, IApplicationToken token, int taskId, int stackId,
int requestedOrientation, boolean fullscreen, boolean showWhenLocked, int userId) {
@@ -3413,14 +3430,7 @@ public class WindowManagerService extends IWindowManager.Stub
Task task = mTaskIdToTask.get(taskId);
if (task == null) {
- TaskStack stack = mStackIdToStack.get(stackId);
- if (stack == null) {
- throw new IllegalArgumentException("addAppToken: invalid stackId=" + stackId);
- }
- task = new Task(atoken, stack, userId);
- stack.addTask(task, true);
- stack.getDisplayContent().moveStack(stack, true);
- mTaskIdToTask.put(taskId, task);
+ task = createTask(taskId, stackId, userId, atoken);
} else {
task.addAppToken(addPos, atoken);
}
@@ -3454,8 +3464,7 @@ public class WindowManagerService extends IWindowManager.Stub
atoken.groupId = groupId;
Task newTask = mTaskIdToTask.get(groupId);
if (newTask == null) {
- throw new IllegalStateException("setAppGroupId: groupId=" + groupId
- + " does not exist");
+ newTask = createTask(groupId, oldTask.mStack.mStackId, oldTask.mUserId, atoken);
}
newTask.mAppTokens.add(atoken);
}
@@ -3964,6 +3973,7 @@ public class WindowManagerService extends IWindowManager.Stub
if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE || DEBUG_STARTING_WINDOW) {
Slog.v(TAG, "Removing starting window: " + startingWindow);
}
+ removeStartingWindowTimeout(ttoken);
startingWindow.getWindowList().remove(startingWindow);
mWindowsChanged = true;
if (DEBUG_ADD_REMOVE) Slog.v(TAG,
@@ -4527,14 +4537,29 @@ public class WindowManagerService extends IWindowManager.Stub
}
Binder.restoreCallingIdentity(origId);
- if (startingToken != null) {
- if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Schedule remove starting "
- + startingToken + ": app token removed");
- Message m = mH.obtainMessage(H.REMOVE_STARTING, startingToken);
- mH.sendMessage(m);
+ // Will only remove if startingToken non null.
+ scheduleRemoveStartingWindow(startingToken);
+ }
+
+ void removeStartingWindowTimeout(AppWindowToken wtoken) {
+ if (wtoken != null) {
+ if (DEBUG_STARTING_WINDOW) Slog.v(TAG, Debug.getCallers(1) +
+ ": Remove starting window timeout " + wtoken + (wtoken != null ?
+ " startingWindow=" + wtoken.startingWindow : ""));
+ mH.removeMessages(H.REMOVE_STARTING_TIMEOUT, wtoken);
}
}
+ void scheduleRemoveStartingWindow(AppWindowToken wtoken) {
+ if (wtoken != null && wtoken.startingWindow != null) {
+ if (DEBUG_STARTING_WINDOW) Slog.v(TAG, Debug.getCallers(1) +
+ ": Schedule remove starting " + wtoken + (wtoken != null ?
+ " startingWindow=" + wtoken.startingWindow : ""));
+ removeStartingWindowTimeout(wtoken);
+ Message m = mH.obtainMessage(H.REMOVE_STARTING, wtoken);
+ mH.sendMessage(m);
+ }
+ }
private boolean tmpRemoveAppWindowsLocked(WindowToken token) {
final int NW = token.windows.size();
if (NW > 0) {
@@ -4765,6 +4790,7 @@ public class WindowManagerService extends IWindowManager.Stub
synchronized(mWindowMap) {
Task task = mTaskIdToTask.get(taskId);
if (task == null) {
+ // Normal behavior, addAppToken will be called next and task will be created.
return;
}
final TaskStack stack = task.mStack;
@@ -7053,6 +7079,8 @@ public class WindowManagerService extends IWindowManager.Stub
public static final int TAP_OUTSIDE_STACK = 31;
public static final int NOTIFY_ACTIVITY_DRAWN = 32;
+ public static final int REMOVE_STARTING_TIMEOUT = 33;
+
@Override
public void handleMessage(Message msg) {
if (DEBUG_WINDOW_TRACE) {
@@ -7151,6 +7179,7 @@ public class WindowManagerService extends IWindowManager.Stub
"Aborted starting " + wtoken
+ ": removed=" + wtoken.removed
+ " startingData=" + wtoken.startingData);
+ removeStartingWindowTimeout(wtoken);
wtoken.startingWindow = null;
wtoken.startingData = null;
abort = true;
@@ -7175,6 +7204,11 @@ public class WindowManagerService extends IWindowManager.Stub
}
} break;
+ case REMOVE_STARTING_TIMEOUT: {
+ final AppWindowToken wtoken = (AppWindowToken)msg.obj;
+ Slog.e(TAG, "Starting window " + wtoken + " timed out");
+ // Fall through.
+ }
case REMOVE_STARTING: {
final AppWindowToken wtoken = (AppWindowToken)msg.obj;
IBinder token = null;
@@ -7889,11 +7923,8 @@ public class WindowManagerService extends IWindowManager.Stub
}
final void rebuildAppWindowListLocked() {
- final int numDisplays = mDisplayContents.size();
- for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
- final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx);
- rebuildAppWindowListLocked(displayContent);
- }
+ // TODO: Multidisplay, when ActivityStacks and tasks exist on more than one display.
+ rebuildAppWindowListLocked(getDefaultDisplayContentLocked());
}
private void rebuildAppWindowListLocked(final DisplayContent displayContent) {
@@ -9676,6 +9707,7 @@ public class WindowManagerService extends IWindowManager.Stub
winAnimator.mSurfaceShown = false;
winAnimator.mSurfaceControl = null;
winAnimator.mWin.mHasSurface = false;
+ scheduleRemoveStartingWindow(winAnimator.mWin.mAppToken);
}
try {
diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java
index 64b5a09c5ea7..d56e2254d724 100644
--- a/services/java/com/android/server/wm/WindowState.java
+++ b/services/java/com/android/server/wm/WindowState.java
@@ -20,7 +20,7 @@ import static com.android.server.wm.WindowManagerService.DEBUG_VISIBILITY;
import static com.android.server.wm.WindowManagerService.DEBUG_LAYOUT;
import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
-import static android.view.WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
@@ -332,7 +332,7 @@ final class WindowState implements WindowManagerPolicy.WindowState {
mContext = mService.mContext;
DeathRecipient deathRecipient = new DeathRecipient();
mSeq = seq;
- mEnforceSizeCompat = (mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0;
+ mEnforceSizeCompat = (mAttrs.flags & PRIVATE_FLAG_COMPATIBLE_WINDOW) != 0;
if (WindowManagerService.localLOGV) Slog.v(
TAG, "Window " + this + " client=" + c.asBinder()
+ " token=" + token + " (" + mAttrs.token + ")" + " params=" + a);