summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/Notification.java2
-rw-r--r--core/java/android/app/SearchManager.java3
-rw-r--r--core/java/android/hardware/Camera.java36
-rw-r--r--core/java/android/inputmethodservice/InputMethodService.java15
-rw-r--r--core/java/android/net/DhcpStateMachine.java2
-rw-r--r--core/java/android/os/Trace.java10
-rw-r--r--core/java/android/provider/Settings.java7
-rw-r--r--core/java/android/view/IWindowManager.aidl71
-rw-r--r--core/java/android/view/WindowManagerPolicy.java6
-rw-r--r--core/java/android/widget/Editor.java27
-rw-r--r--core/java/android/widget/RemoteViews.java4
-rw-r--r--core/java/android/widget/TextClock.java18
-rw-r--r--core/java/com/android/internal/widget/LockPatternUtils.java60
-rw-r--r--core/java/com/android/internal/widget/TransportControlView.java3
-rw-r--r--core/java/com/android/internal/widget/multiwaveview/GlowPadView.java135
-rw-r--r--core/jni/android_net_wifi_Wifi.cpp6
-rw-r--r--core/res/res/anim/keyguard_action_assist_enter.xml32
-rw-r--r--core/res/res/anim/keyguard_action_assist_exit.xml23
-rw-r--r--core/res/res/drawable-hdpi/ic_coins_l.pngbin0 -> 2279 bytes
-rw-r--r--core/res/res/drawable-hdpi/kg_add_widget.pngbin1648 -> 971 bytes
-rw-r--r--core/res/res/drawable-hdpi/kg_security_lock_focused.pngbin2377 -> 2007 bytes
-rw-r--r--core/res/res/drawable-hdpi/kg_security_lock_normal.pngbin2688 -> 1385 bytes
-rw-r--r--core/res/res/drawable-hdpi/kg_security_lock_pressed.pngbin1760 -> 1511 bytes
-rw-r--r--core/res/res/drawable-hdpi/kg_widget_bg_padded.9.pngbin0 -> 3272 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_coins_l.pngbin0 -> 1451 bytes
-rw-r--r--core/res/res/drawable-mdpi/kg_add_widget.pngbin1185 -> 776 bytes
-rw-r--r--core/res/res/drawable-mdpi/kg_security_lock_focused.pngbin1567 -> 1391 bytes
-rw-r--r--core/res/res/drawable-mdpi/kg_security_lock_normal.pngbin1899 -> 1060 bytes
-rw-r--r--core/res/res/drawable-mdpi/kg_security_lock_pressed.pngbin1347 -> 1149 bytes
-rw-r--r--core/res/res/drawable-mdpi/kg_widget_bg_padded.9.pngbin0 -> 3149 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_coins_l.pngbin0 -> 3233 bytes
-rw-r--r--core/res/res/drawable-xhdpi/kg_add_widget.pngbin2220 -> 1214 bytes
-rw-r--r--core/res/res/drawable-xhdpi/kg_security_lock_focused.pngbin3277 -> 2744 bytes
-rw-r--r--core/res/res/drawable-xhdpi/kg_security_lock_normal.pngbin3517 -> 1843 bytes
-rw-r--r--core/res/res/drawable-xhdpi/kg_security_lock_pressed.pngbin2173 -> 2021 bytes
-rw-r--r--core/res/res/drawable-xhdpi/kg_widget_bg_padded.9.pngbin0 -> 3474 bytes
-rw-r--r--core/res/res/layout-land/keyguard_host_view.xml7
-rw-r--r--core/res/res/layout-land/keyguard_status_area.xml39
-rw-r--r--core/res/res/layout-port/keyguard_host_view.xml6
-rw-r--r--core/res/res/layout-port/keyguard_status_area.xml39
-rw-r--r--core/res/res/layout-sw600dp-port/keyguard_host_view.xml9
-rw-r--r--core/res/res/layout-sw600dp-port/keyguard_status_area.xml25
-rw-r--r--core/res/res/layout/keyguard_account_view.xml9
-rw-r--r--core/res/res/layout/keyguard_emergency_carrier_area_empty.xml31
-rw-r--r--core/res/res/layout/keyguard_face_unlock_view.xml5
-rw-r--r--core/res/res/layout/keyguard_glow_pad_container.xml2
-rw-r--r--core/res/res/layout/keyguard_glow_pad_view.xml3
-rw-r--r--core/res/res/layout/keyguard_password_view.xml11
-rw-r--r--core/res/res/layout/keyguard_pattern_view.xml13
-rw-r--r--core/res/res/layout/keyguard_pin_view.xml4
-rw-r--r--core/res/res/layout/keyguard_selector_view.xml12
-rw-r--r--core/res/res/layout/keyguard_sim_pin_view.xml4
-rw-r--r--core/res/res/layout/keyguard_sim_puk_view.xml4
-rw-r--r--core/res/res/layout/keyguard_status_view.xml2
-rw-r--r--core/res/res/layout/keyguard_widget_remove_drop_target.xml6
-rw-r--r--core/res/res/layout/sms_short_code_confirmation_dialog.xml20
-rw-r--r--core/res/res/values-af/strings.xml16
-rw-r--r--core/res/res/values-am/strings.xml6
-rw-r--r--core/res/res/values-ar/strings.xml22
-rw-r--r--core/res/res/values-be/strings.xml6
-rw-r--r--core/res/res/values-bg/strings.xml6
-rw-r--r--core/res/res/values-ca/strings.xml22
-rw-r--r--core/res/res/values-cs/strings.xml6
-rw-r--r--core/res/res/values-da/strings.xml6
-rw-r--r--core/res/res/values-de/strings.xml39
-rw-r--r--core/res/res/values-el/strings.xml6
-rw-r--r--core/res/res/values-en-rGB/strings.xml6
-rw-r--r--core/res/res/values-es-rUS/strings.xml22
-rw-r--r--core/res/res/values-es/strings.xml14
-rw-r--r--core/res/res/values-et/strings.xml10
-rw-r--r--core/res/res/values-fa/strings.xml6
-rw-r--r--core/res/res/values-fi/strings.xml6
-rw-r--r--core/res/res/values-fr/strings.xml33
-rw-r--r--core/res/res/values-hi/strings.xml6
-rw-r--r--core/res/res/values-hr/strings.xml10
-rw-r--r--core/res/res/values-hu/strings.xml6
-rw-r--r--core/res/res/values-in/strings.xml18
-rw-r--r--core/res/res/values-it/strings.xml6
-rw-r--r--core/res/res/values-iw/strings.xml8
-rw-r--r--core/res/res/values-ja/strings.xml6
-rw-r--r--core/res/res/values-ko/strings.xml14
-rw-r--r--core/res/res/values-land/alias.xml23
-rw-r--r--core/res/res/values-lt/strings.xml6
-rw-r--r--core/res/res/values-lv/strings.xml18
-rw-r--r--core/res/res/values-ms/strings.xml6
-rw-r--r--core/res/res/values-nb/strings.xml6
-rw-r--r--core/res/res/values-nl/strings.xml6
-rw-r--r--core/res/res/values-pl/strings.xml57
-rw-r--r--core/res/res/values-port/alias.xml23
-rw-r--r--core/res/res/values-pt-rPT/strings.xml12
-rw-r--r--core/res/res/values-pt/strings.xml6
-rw-r--r--core/res/res/values-rm/strings.xml7
-rw-r--r--core/res/res/values-ro/strings.xml6
-rw-r--r--core/res/res/values-ru/strings.xml6
-rw-r--r--core/res/res/values-sk/strings.xml6
-rw-r--r--core/res/res/values-sl/strings.xml6
-rw-r--r--core/res/res/values-sr/strings.xml6
-rw-r--r--core/res/res/values-sv/strings.xml6
-rw-r--r--core/res/res/values-sw/strings.xml16
-rw-r--r--core/res/res/values-sw600dp/alias.xml23
-rw-r--r--core/res/res/values-sw600dp/bools.xml1
-rw-r--r--core/res/res/values-th/strings.xml6
-rw-r--r--core/res/res/values-tl/strings.xml6
-rw-r--r--core/res/res/values-tr/strings.xml6
-rw-r--r--core/res/res/values-uk/strings.xml10
-rw-r--r--core/res/res/values-vi/strings.xml6
-rw-r--r--core/res/res/values-zh-rCN/strings.xml8
-rw-r--r--core/res/res/values-zh-rTW/strings.xml8
-rw-r--r--core/res/res/values-zu/strings.xml10
-rwxr-xr-xcore/res/res/values/attrs.xml13
-rw-r--r--core/res/res/values/bools.xml1
-rw-r--r--core/res/res/values/dimens.xml2
-rw-r--r--core/res/res/values/symbols.xml8
-rw-r--r--docs/html/distribute/promote/device-art-resources/nexus_10/land_back.pngbin481923 -> 265276 bytes
-rw-r--r--docs/html/images/tools/dev-options-inmilk.pngbin0 -> 105845 bytes
-rw-r--r--docs/html/tools/index.jd70
-rw-r--r--media/java/android/media/AudioService.java27
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_notify_open_normal.pngbin1719 -> 1269 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_notify_open_pressed.pngbin1912 -> 1405 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/search_light.pngbin0 -> 1614 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_notify_open_normal.pngbin1208 -> 935 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_notify_open_pressed.pngbin1213 -> 962 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/search_light.pngbin0 -> 1110 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_notify_open_normal.pngbin2204 -> 1641 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_notify_open_pressed.pngbin2716 -> 1918 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/search_light.pngbin0 -> 2294 bytes
-rw-r--r--packages/SystemUI/res/drawable/ic_notifications.xml4
-rw-r--r--packages/SystemUI/res/layout-sw600dp/navigation_bar.xml4
-rw-r--r--packages/SystemUI/res/layout/navigation_bar.xml4
-rw-r--r--packages/SystemUI/res/values-de/strings.xml2
-rw-r--r--packages/SystemUI/res/values-fi/strings.xml2
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml2
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml2
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml2
-rw-r--r--packages/SystemUI/src/com/android/systemui/SearchPanelView.java53
-rw-r--r--packages/SystemUI/src/com/android/systemui/power/PowerUI.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java12
-rwxr-xr-xpolicy/src/com/android/internal/policy/impl/PhoneWindowManager.java65
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/CameraWidgetFrame.java10
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/CarrierText.java13
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/ChallengeLayout.java5
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/EmergencyButton.java12
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardAbsKeyInputView.java2
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardAccountView.java2
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java31
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardFaceUnlockView.java3
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java560
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardPasswordView.java15
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardPatternView.java19
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityCallback.java8
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityView.java6
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityViewFlipper.java141
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityViewHelper.java22
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java20
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java115
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java341
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitor.java34
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitorCallback.java8
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewBase.java1
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewManager.java15
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java110
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewStateManager.java41
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java78
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetPager.java122
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/MultiPaneChallengeLayout.java125
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/PagedView.java62
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/SlidingChallengeLayout.java166
-rw-r--r--services/java/com/android/server/BackupManagerService.java2
-rw-r--r--services/java/com/android/server/ConnectivityService.java18
-rw-r--r--services/java/com/android/server/EventLogTags.logtags8
-rw-r--r--services/java/com/android/server/LocationManagerService.java11
-rwxr-xr-xservices/java/com/android/server/NotificationManagerService.java15
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java1
-rw-r--r--services/java/com/android/server/am/EventLogTags.logtags3
-rw-r--r--services/java/com/android/server/location/GeofenceManager.java281
-rw-r--r--services/java/com/android/server/location/GeofenceState.java38
-rw-r--r--services/java/com/android/server/usb/UsbDeviceManager.java6
-rwxr-xr-xservices/java/com/android/server/wm/WindowManagerService.java22
-rw-r--r--tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java10
-rw-r--r--wifi/java/android/net/wifi/WifiManager.java21
-rw-r--r--wifi/java/android/net/wifi/WifiNative.java2
-rw-r--r--wifi/java/android/net/wifi/WifiStateMachine.java16
182 files changed, 2550 insertions, 1590 deletions
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index ee9264629881..e79b214a91fb 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -1808,7 +1808,7 @@ public class Notification implements Parcelable
*
* This class is a "rebuilder": It consumes a Builder object and modifies its behavior, like so:
* <pre class="prettyprint">
- * Notification noti = new Notification.BigPictureStyle(
+ * Notification noti = new Notification.BigTextStyle(
* new Notification.Builder()
* .setContentTitle(&quot;New mail from &quot; + sender.toString())
* .setContentText(subject)
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index 43a163dcf067..6382ceefdd68 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -858,6 +858,9 @@ public class SearchManager
*/
public Intent getAssistIntent(Context context, int userHandle) {
try {
+ if (mService == null) {
+ return null;
+ }
ComponentName comp = mService.getAssistIntent(userHandle);
if (comp == null) {
return null;
diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java
index 6624eb85f1db..a30077641f2c 100644
--- a/core/java/android/hardware/Camera.java
+++ b/core/java/android/hardware/Camera.java
@@ -3495,25 +3495,29 @@ public class Camera {
}
/**
- * Returns true if video snapshot is supported. That is, applications
+ * <p>Returns true if video snapshot is supported. That is, applications
* can call {@link #takePicture(Camera.ShutterCallback,
- * Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)}
- * during recording. Applications do not need to call {@link
- * #startPreview()} after taking a picture. The preview will be still
- * active. Other than that, taking a picture during recording is
- * identical to taking a picture normally. All settings and methods
- * related to takePicture work identically. Ex: {@link
- * #getPictureSize()}, {@link #getSupportedPictureSizes()}, {@link
- * #setJpegQuality(int)}, {@link #setRotation(int)}, and etc. The
- * picture will have an EXIF header. {@link #FLASH_MODE_AUTO} and {@link
- * #FLASH_MODE_ON} also still work, but the video will record the flash.
- *
- * Applications can set shutter callback as null to avoid the shutter
+ * Camera.PictureCallback, Camera.PictureCallback,
+ * Camera.PictureCallback)} during recording. Applications do not need
+ * to call {@link #startPreview()} after taking a picture. The preview
+ * will be still active. Other than that, taking a picture during
+ * recording is identical to taking a picture normally. All settings and
+ * methods related to takePicture work identically. Ex:
+ * {@link #getPictureSize()}, {@link #getSupportedPictureSizes()},
+ * {@link #setJpegQuality(int)}, {@link #setRotation(int)}, and etc. The
+ * picture will have an EXIF header. {@link #FLASH_MODE_AUTO} and
+ * {@link #FLASH_MODE_ON} also still work, but the video will record the
+ * flash.</p>
+ *
+ * <p>Applications can set shutter callback as null to avoid the shutter
* sound. It is also recommended to set raw picture and post view
- * callbacks to null to avoid the interrupt of preview display.
+ * callbacks to null to avoid the interrupt of preview display.</p>
*
- * Field-of-view of the recorded video may be different from that of the
- * captured pictures.
+ * <p>Field-of-view of the recorded video may be different from that of the
+ * captured pictures. The maximum size of a video snapshot may be
+ * smaller than that for regular still captures. If the current picture
+ * size is set higher than can be supported by video snapshot, the
+ * picture will be captured at the maximum supported size instead.</p>
*
* @return true if video snapshot is supported.
*/
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index f07002e88bbe..6f1cc942c965 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -930,11 +930,13 @@ public class InputMethodService extends AbstractInputMethodService {
*/
public void onConfigureWindow(Window win, boolean isFullscreen,
boolean isCandidatesOnly) {
- if (isFullscreen) {
- mWindow.getWindow().setLayout(MATCH_PARENT, MATCH_PARENT);
- } else {
- mWindow.getWindow().setLayout(MATCH_PARENT, WRAP_CONTENT);
+ final int currentHeight = mWindow.getWindow().getAttributes().height;
+ final int newHeight = isFullscreen ? MATCH_PARENT : WRAP_CONTENT;
+ if (mIsInputViewShown && currentHeight != newHeight) {
+ Log.w(TAG, "Window size has been changed. This may cause jankiness of resizing window: "
+ + currentHeight + " -> " + newHeight);
}
+ mWindow.getWindow().setLayout(MATCH_PARENT, newHeight);
}
/**
@@ -997,10 +999,11 @@ public class InputMethodService extends AbstractInputMethodService {
}
void updateExtractFrameVisibility() {
- int vis;
+ final int vis;
if (isFullscreenMode()) {
vis = mExtractViewHidden ? View.INVISIBLE : View.VISIBLE;
- mExtractFrame.setVisibility(View.VISIBLE);
+ // "vis" should be applied for the extract frame as well in the fullscreen mode.
+ mExtractFrame.setVisibility(vis);
} else {
vis = View.VISIBLE;
mExtractFrame.setVisibility(View.GONE);
diff --git a/core/java/android/net/DhcpStateMachine.java b/core/java/android/net/DhcpStateMachine.java
index 874e80ab2084..8dc900e9c8b5 100644
--- a/core/java/android/net/DhcpStateMachine.java
+++ b/core/java/android/net/DhcpStateMachine.java
@@ -351,6 +351,8 @@ public class DhcpStateMachine extends StateMachine {
DhcpInfoInternal dhcpInfoInternal = new DhcpInfoInternal();
if (dhcpAction == DhcpAction.START) {
+ /* Stop any existing DHCP daemon before starting new */
+ NetworkUtils.stopDhcp(mInterfaceName);
if (DBG) Log.d(TAG, "DHCP request on " + mInterfaceName);
success = NetworkUtils.runDhcp(mInterfaceName, dhcpInfoInternal);
mDhcpInfo = dhcpInfoInternal;
diff --git a/core/java/android/os/Trace.java b/core/java/android/os/Trace.java
index ed518187a319..0ca9183f6562 100644
--- a/core/java/android/os/Trace.java
+++ b/core/java/android/os/Trace.java
@@ -44,6 +44,7 @@ public final class Trace {
public static final long TRACE_TAG_AUDIO = 1L << 8;
public static final long TRACE_TAG_VIDEO = 1L << 9;
public static final long TRACE_TAG_CAMERA = 1L << 10;
+ private static final long TRACE_TAG_NOT_READY = 1L << 63;
public static final int TRACE_FLAGS_START_BIT = 1;
public static final String[] TRACE_TAGS = {
@@ -53,11 +54,8 @@ public final class Trace {
public static final String PROPERTY_TRACE_TAG_ENABLEFLAGS = "debug.atrace.tags.enableflags";
- // This works as a "not ready" flag because TRACE_TAG_ALWAYS is always set.
- private static final long TRACE_FLAGS_NOT_READY = 0;
-
// Must be volatile to avoid word tearing.
- private static volatile long sEnabledTags = TRACE_FLAGS_NOT_READY;
+ private static volatile long sEnabledTags = TRACE_TAG_NOT_READY;
private static native long nativeGetEnabledTags();
private static native void nativeTraceCounter(long tag, String name, int value);
@@ -99,7 +97,7 @@ public final class Trace {
*/
private static long cacheEnabledTags() {
long tags = nativeGetEnabledTags();
- if (tags == TRACE_FLAGS_NOT_READY) {
+ if (tags == TRACE_TAG_NOT_READY) {
Log.w(TAG, "Unexpected value from nativeGetEnabledTags: " + tags);
// keep going
}
@@ -115,7 +113,7 @@ public final class Trace {
*/
public static boolean isTagEnabled(long traceTag) {
long tags = sEnabledTags;
- if (tags == TRACE_FLAGS_NOT_READY) {
+ if (tags == TRACE_TAG_NOT_READY) {
tags = cacheEnabledTags();
}
return (tags & traceTag) != 0;
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index f482335721ff..b94f0b91b5e5 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -3229,6 +3229,13 @@ public final class Settings {
"lock_screen_appwidget_ids";
/**
+ * Id of the appwidget shown on the lock screen when appwidgets are disabled.
+ * @hide
+ */
+ public static final String LOCK_SCREEN_FALLBACK_APPWIDGET_ID =
+ "lock_screen_fallback_appwidget_id";
+
+ /**
* Index of the lockscreen appwidget to restore, -1 if none.
* @hide
*/
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 5f598b1cfbef..0fe2a8e3f830 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -1,16 +1,16 @@
/*
** Copyright 2006, The Android Open Source Project
**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
+** 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
+** 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
+** 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.
*/
@@ -107,7 +107,7 @@ interface IWindowManager
Configuration updateOrientationFromAppTokens(in Configuration currentConfig,
IBinder freezeThisOneIfNeeded);
void setNewConfiguration(in Configuration config);
-
+
void startFreezingScreen(int exitAnim, int enterAnim);
void stopFreezingScreen();
@@ -121,13 +121,13 @@ interface IWindowManager
void dismissKeyguard();
void closeSystemDialogs(String reason);
-
+
// These can only be called with the SET_ANIMATON_SCALE permission.
float getAnimationScale(int which);
float[] getAnimationScales();
void setAnimationScale(int which, float scale);
void setAnimationScales(in float[] scales);
-
+
// For testing
void setInTouchMode(boolean showFocus);
@@ -161,7 +161,7 @@ interface IWindowManager
* {@link android.view.Surface}.
*/
int getRotation();
-
+
/**
* Watch the rotation of the screen. Returns the current rotation,
* calls back when it changes.
@@ -175,24 +175,24 @@ interface IWindowManager
*/
int getPreferredOptionsPanelGravity();
- /**
- * Lock the device orientation to the specified rotation, or to the
- * current rotation if -1. Sensor input will be ignored until
- * thawRotation() is called.
- * @hide
- */
- void freezeRotation(int rotation);
-
- /**
- * Release the orientation lock imposed by freezeRotation().
- * @hide
- */
- void thawRotation();
-
- /**
- * Create a screenshot of the applications currently displayed.
- */
- Bitmap screenshotApplications(IBinder appToken, int displayId, int maxWidth, int maxHeight);
+ /**
+ * Lock the device orientation to the specified rotation, or to the
+ * current rotation if -1. Sensor input will be ignored until
+ * thawRotation() is called.
+ * @hide
+ */
+ void freezeRotation(int rotation);
+
+ /**
+ * Release the orientation lock imposed by freezeRotation().
+ * @hide
+ */
+ void thawRotation();
+
+ /**
+ * Create a screenshot of the applications currently displayed.
+ */
+ Bitmap screenshotApplications(IBinder appToken, int displayId, int maxWidth, int maxHeight);
/**
* Called by the status bar to notify Views of changes to System UI visiblity.
@@ -254,4 +254,15 @@ interface IWindowManager
* Gets the infos for all visible windows.
*/
void getVisibleWindowsForDisplay(int displayId, out List<WindowInfo> outInfos);
+
+ /**
+ * Device is in safe mode.
+ */
+ boolean isSafeModeEnabled();
+
+ /**
+ * Tell keyguard to show the assistant (Intent.ACTION_ASSIST) after asking for the user's
+ * credentials.
+ */
+ void showAssistant();
}
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index 4ccb5020a3d6..26739b3d5026 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -1136,4 +1136,10 @@ public interface WindowManagerPolicy {
* @param args additional arguments to the dump request.
*/
public void dump(String prefix, PrintWriter writer, String[] args);
+
+ /**
+ * Ask keyguard to invoke the assist intent after dismissing keyguard
+ * {@link android.content.Intent#ACTION_ASSIST}
+ */
+ public void showAssistant();
}
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 5397eb6634fa..b1a44c5a89bc 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -289,13 +289,7 @@ public class Editor {
public void setError(CharSequence error, Drawable icon) {
mError = TextUtils.stringOrSpannedString(error);
mErrorWasChanged = true;
- final Drawables dr = mTextView.mDrawables;
- if (dr != null) {
- mTextView.setCompoundDrawables(dr.mDrawableLeft, dr.mDrawableTop, icon,
- dr.mDrawableBottom);
- } else {
- mTextView.setCompoundDrawables(null, null, icon, null);
- }
+
if (mError == null) {
if (mErrorPopup != null) {
if (mErrorPopup.isShowing()) {
@@ -304,10 +298,21 @@ public class Editor {
mErrorPopup = null;
}
+
+ setErrorIcon(null);
+ } else if (mTextView.isFocused()) {
+ showError();
+ setErrorIcon(icon);
+ }
+ }
+
+ private void setErrorIcon(Drawable icon) {
+ final Drawables dr = mTextView.mDrawables;
+ if (dr != null) {
+ mTextView.setCompoundDrawables(dr.mDrawableLeft, dr.mDrawableTop, icon,
+ dr.mDrawableBottom);
} else {
- if (mTextView.isFocused()) {
- showError();
- }
+ mTextView.setCompoundDrawables(null, null, icon, null);
}
}
@@ -316,6 +321,8 @@ public class Editor {
if (mErrorPopup.isShowing()) {
mErrorPopup.dismiss();
}
+
+ setErrorIcon(null);
}
mShowErrorAfterAttach = false;
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 8d837743fb29..8d1be5367981 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -351,12 +351,12 @@ public class RemoteViews implements Parcelable, Filter {
public void onClick(View v) {
// Insure that this view is a child of an AdapterView
View parent = (View) v.getParent();
- while (!(parent instanceof AdapterView<?>)
+ while (parent != null && !(parent instanceof AdapterView<?>)
&& !(parent instanceof AppWidgetHostView)) {
parent = (View) parent.getParent();
}
- if (parent instanceof AppWidgetHostView) {
+ if (parent instanceof AppWidgetHostView || parent == null) {
// Somehow they've managed to get this far without having
// and AdapterView as a parent.
Log.e("RemoteViews", "Collection item doesn't have AdapterView parent");
diff --git a/core/java/android/widget/TextClock.java b/core/java/android/widget/TextClock.java
index 908eb0a8fe51..290d9b5b4a52 100644
--- a/core/java/android/widget/TextClock.java
+++ b/core/java/android/widget/TextClock.java
@@ -135,13 +135,11 @@ public class TextClock extends TextView {
private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- if (mTimeZone == null) {
- if (intent.getAction().equals(Intent.ACTION_TIMEZONE_CHANGED)) {
- final String timeZone = intent.getStringExtra("time-zone");
- createTime(timeZone);
- }
- onTimeChanged();
+ if (mTimeZone == null && Intent.ACTION_TIMEZONE_CHANGED.equals(intent.getAction())) {
+ final String timeZone = intent.getStringExtra("time-zone");
+ createTime(timeZone);
}
+ onTimeChanged();
}
};
@@ -406,11 +404,9 @@ public class TextClock extends TextView {
boolean hadSeconds = mHasSeconds;
mHasSeconds = DateFormat.hasSeconds(mFormat);
- if (handleTicker) {
- if (hadSeconds != mHasSeconds) {
- if (hadSeconds) getHandler().removeCallbacks(mTicker);
- else mTicker.run();
- }
+ if (handleTicker && mAttached && hadSeconds != mHasSeconds) {
+ if (hadSeconds) getHandler().removeCallbacks(mTicker);
+ else mTicker.run();
}
}
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index e5e1a2b6b930..75fef2413806 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -18,6 +18,7 @@ package com.android.internal.widget;
import android.app.ActivityManagerNative;
import android.app.admin.DevicePolicyManager;
+import android.appwidget.AppWidgetManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
@@ -35,6 +36,7 @@ import android.security.KeyStore;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
+import android.view.IWindowManager;
import android.view.View;
import android.widget.Button;
@@ -109,6 +111,11 @@ public class LockPatternUtils {
public static final String KEYGUARD_SHOW_SECURITY_CHALLENGE = "showsecuritychallenge";
/**
+ * Tells the keyguard to show the widget with the specified id when the keyguard is created.
+ */
+ public static final String KEYGUARD_SHOW_APPWIDGET = "showappwidget";
+
+ /**
* Options used to lock the device upon user switch.
*/
public static final Bundle USER_SWITCH_LOCK_OPTIONS = new Bundle();
@@ -129,11 +136,6 @@ public class LockPatternUtils {
*/
public static final int ID_DEFAULT_STATUS_WIDGET = -2;
- /**
- * Intent extra that's used to tag the default widget when using the picker
- */
- public static final String EXTRA_DEFAULT_WIDGET = "com.android.settings.DEFAULT_WIDGET";
-
protected final static String LOCKOUT_PERMANENT_KEY = "lockscreen.lockedoutpermanently";
protected final static String LOCKOUT_ATTEMPT_DEADLINE = "lockscreen.lockoutattemptdeadline";
protected final static String PATTERN_EVER_CHOSEN_KEY = "lockscreen.patterneverchosen";
@@ -1112,6 +1114,25 @@ public class LockPatternUtils {
return sb.toString();
}
+ // appwidget used when appwidgets are disabled (we make an exception for
+ // default clock widget)
+ public void writeFallbackAppWidgetId(int appWidgetId) {
+ Settings.Secure.putIntForUser(mContentResolver,
+ Settings.Secure.LOCK_SCREEN_FALLBACK_APPWIDGET_ID,
+ appWidgetId,
+ UserHandle.USER_CURRENT);
+ }
+
+ // appwidget used when appwidgets are disabled (we make an exception for
+ // default clock widget)
+ public int getFallbackAppWidgetId() {
+ return Settings.Secure.getIntForUser(
+ mContentResolver,
+ Settings.Secure.LOCK_SCREEN_FALLBACK_APPWIDGET_ID,
+ AppWidgetManager.INVALID_APPWIDGET_ID,
+ UserHandle.USER_CURRENT);
+ }
+
private void writeAppWidgets(int[] appWidgetIds) {
Settings.Secure.putStringForUser(mContentResolver,
Settings.Secure.LOCK_SCREEN_APPWIDGET_IDS,
@@ -1146,6 +1167,10 @@ public class LockPatternUtils {
public boolean removeAppWidget(int widgetId) {
int[] widgets = getAppWidgets();
+ if (widgets.length == 0) {
+ return false;
+ }
+
int[] newWidgets = new int[widgets.length - 1];
for (int i = 0, j = 0; i < widgets.length; i++) {
if (widgets[i] == widgetId) {
@@ -1162,21 +1187,6 @@ public class LockPatternUtils {
return true;
}
- public int getStickyAppWidgetIndex() {
- return Settings.Secure.getIntForUser(
- mContentResolver,
- Settings.Secure.LOCK_SCREEN_STICKY_APPWIDGET,
- -1,
- UserHandle.USER_CURRENT);
- }
-
- public void setStickyAppWidgetIndex(int value) {
- Settings.Secure.putIntForUser(mContentResolver,
- Settings.Secure.LOCK_SCREEN_STICKY_APPWIDGET,
- value,
- UserHandle.USER_CURRENT);
- }
-
private long getLong(String secureSettingKey, long defaultValue) {
try {
return getLockSettings().getLong(secureSettingKey, defaultValue,
@@ -1326,4 +1336,14 @@ public class LockPatternUtils {
return getBoolean(LOCKSCREEN_POWER_BUTTON_INSTANTLY_LOCKS, true);
}
+ public static boolean isSafeModeEnabled() {
+ try {
+ return IWindowManager.Stub.asInterface(
+ ServiceManager.getService("window")).isSafeModeEnabled();
+ } catch (RemoteException e) {
+ // Shouldn't happen!
+ }
+ return false;
+ }
+
}
diff --git a/core/java/com/android/internal/widget/TransportControlView.java b/core/java/com/android/internal/widget/TransportControlView.java
index 2f525858c6f8..c33f0388bd4c 100644
--- a/core/java/com/android/internal/widget/TransportControlView.java
+++ b/core/java/com/android/internal/widget/TransportControlView.java
@@ -23,7 +23,6 @@ import com.android.internal.widget.LockScreenWidgetInterface;
import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException;
-import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
@@ -193,7 +192,7 @@ public class TransportControlView extends FrameLayout implements OnClickListener
public TransportControlView(Context context, AttributeSet attrs) {
super(context, attrs);
- Log.v(TAG, "Create TCV " + this);
+ if (DEBUG) Log.v(TAG, "Create TCV " + this);
mAudioManager = new AudioManager(mContext);
mCurrentPlayState = RemoteControlClient.PLAYSTATE_NONE; // until we get a callback
mIRCD = new IRemoteControlDisplayWeak(mHandler);
diff --git a/core/java/com/android/internal/widget/multiwaveview/GlowPadView.java b/core/java/com/android/internal/widget/multiwaveview/GlowPadView.java
index 209bd3cb1424..aad285ac2f8e 100644
--- a/core/java/com/android/internal/widget/multiwaveview/GlowPadView.java
+++ b/core/java/com/android/internal/widget/multiwaveview/GlowPadView.java
@@ -113,6 +113,8 @@ public class GlowPadView extends View {
private float mWaveCenterY;
private int mMaxTargetHeight;
private int mMaxTargetWidth;
+ private float mRingScaleFactor = 1f;
+ private boolean mAllowScaling;
private float mOuterRadius = 0.0f;
private float mSnapMargin = 0.0f;
@@ -221,6 +223,7 @@ public class GlowPadView extends View {
mVibrationDuration);
mFeedbackCount = a.getInt(R.styleable.GlowPadView_feedbackCount,
mFeedbackCount);
+ mAllowScaling = a.getBoolean(R.styleable.GlowPadView_allowScaling, false);
TypedValue handle = a.peekValue(R.styleable.GlowPadView_handleDrawable);
mHandleDrawable = new TargetDrawable(res, handle != null ? handle.resourceId : 0);
mHandleDrawable.setState(TargetDrawable.STATE_INACTIVE);
@@ -319,6 +322,22 @@ public class GlowPadView extends View {
return (int) (Math.max(mOuterRing.getHeight(), 2 * mOuterRadius) + mMaxTargetHeight);
}
+ /**
+ * This gets the suggested width accounting for the ring's scale factor.
+ */
+ protected int getScaledSuggestedMinimumWidth() {
+ return (int) (mRingScaleFactor * Math.max(mOuterRing.getWidth(), 2 * mOuterRadius)
+ + mMaxTargetWidth);
+ }
+
+ /**
+ * This gets the suggested height accounting for the ring's scale factor.
+ */
+ protected int getScaledSuggestedMinimumHeight() {
+ return (int) (mRingScaleFactor * Math.max(mOuterRing.getHeight(), 2 * mOuterRadius)
+ + mMaxTargetHeight);
+ }
+
private int resolveMeasured(int measureSpec, int desired)
{
int result = 0;
@@ -337,16 +356,6 @@ public class GlowPadView extends View {
return result;
}
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- final int minimumWidth = getSuggestedMinimumWidth();
- final int minimumHeight = getSuggestedMinimumHeight();
- int computedWidth = resolveMeasured(widthMeasureSpec, minimumWidth);
- int computedHeight = resolveMeasured(heightMeasureSpec, minimumHeight);
- computeInsets((computedWidth - minimumWidth), (computedHeight - minimumHeight));
- setMeasuredDimension(computedWidth, computedHeight);
- }
-
private void switchToState(int state, float x, float y) {
switch (state) {
case STATE_IDLE:
@@ -504,8 +513,9 @@ public class GlowPadView extends View {
"onUpdate", mUpdateListener));
}
- final float ringScaleTarget = expanded ?
+ float ringScaleTarget = expanded ?
RING_SCALE_EXPANDED : RING_SCALE_COLLAPSED;
+ ringScaleTarget *= mRingScaleFactor;
mTargetAnimations.add(Tweener.to(mOuterRing, duration,
"ease", interpolator,
"alpha", 0.0f,
@@ -535,11 +545,13 @@ public class GlowPadView extends View {
"delay", delay,
"onUpdate", mUpdateListener));
}
+
+ float ringScale = mRingScaleFactor * RING_SCALE_EXPANDED;
mTargetAnimations.add(Tweener.to(mOuterRing, duration,
"ease", Ease.Cubic.easeOut,
"alpha", 1.0f,
- "scaleX", 1.0f,
- "scaleY", 1.0f,
+ "scaleX", ringScale,
+ "scaleY", ringScale,
"delay", delay,
"onUpdate", mUpdateListener,
"onComplete", mTargetUpdateListener));
@@ -783,8 +795,12 @@ public class GlowPadView extends View {
}
private void updateGlowPosition(float x, float y) {
- mPointCloud.glowManager.setX(x);
- mPointCloud.glowManager.setY(y);
+ float dx = x - mOuterRing.getX();
+ float dy = y - mOuterRing.getY();
+ dx *= 1f / mRingScaleFactor;
+ dy *= 1f / mRingScaleFactor;
+ mPointCloud.glowManager.setX(mOuterRing.getX() + dx);
+ mPointCloud.glowManager.setY(mOuterRing.getY() + dy);
}
private void handleDown(MotionEvent event) {
@@ -853,7 +869,7 @@ public class GlowPadView extends View {
if (mDragging) {
// For multiple targets, snap to the one that matches
- final float snapRadius = mOuterRadius - mSnapMargin;
+ final float snapRadius = mRingScaleFactor * mOuterRadius - mSnapMargin;
final float snapDistance2 = snapRadius * snapRadius;
// Find first target in range
for (int i = 0; i < ntargets; i++) {
@@ -938,7 +954,8 @@ public class GlowPadView extends View {
onTouchEvent(event);
event.setAction(action);
}
- return super.onHoverEvent(event);
+ super.onHoverEvent(event);
+ return true;
}
/**
@@ -1018,6 +1035,78 @@ public class GlowPadView extends View {
}
}
+ /**
+ * Given the desired width and height of the ring and the allocated width and height, compute
+ * how much we need to scale the ring.
+ */
+ private float computeScaleFactor(int desiredWidth, int desiredHeight,
+ int actualWidth, int actualHeight) {
+
+ // Return unity if scaling is not allowed.
+ if (!mAllowScaling) return 1f;
+
+ final int layoutDirection = getLayoutDirection();
+ final int absoluteGravity = Gravity.getAbsoluteGravity(mGravity, layoutDirection);
+
+ float scaleX = 1f;
+ float scaleY = 1f;
+
+ // We use the gravity as a cue for whether we want to scale on a particular axis.
+ // We only scale to fit horizontally if we're not pinned to the left or right. Likewise,
+ // we only scale to fit vertically if we're not pinned to the top or bottom. In these
+ // cases, we want the ring to hang off the side or top/bottom, respectively.
+ switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
+ case Gravity.LEFT:
+ case Gravity.RIGHT:
+ break;
+ case Gravity.CENTER_HORIZONTAL:
+ default:
+ if (desiredWidth > actualWidth) {
+ scaleX = (1f * actualWidth - mMaxTargetWidth) /
+ (desiredWidth - mMaxTargetWidth);
+ }
+ break;
+ }
+ switch (absoluteGravity & Gravity.VERTICAL_GRAVITY_MASK) {
+ case Gravity.TOP:
+ case Gravity.BOTTOM:
+ break;
+ case Gravity.CENTER_VERTICAL:
+ default:
+ if (desiredHeight > actualHeight) {
+ scaleY = (1f * actualHeight - mMaxTargetHeight) /
+ (desiredHeight - mMaxTargetHeight);
+ }
+ break;
+ }
+ return Math.min(scaleX, scaleY);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ final int minimumWidth = getSuggestedMinimumWidth();
+ final int minimumHeight = getSuggestedMinimumHeight();
+ int computedWidth = resolveMeasured(widthMeasureSpec, minimumWidth);
+ int computedHeight = resolveMeasured(heightMeasureSpec, minimumHeight);
+
+ mRingScaleFactor = computeScaleFactor(minimumWidth, minimumHeight,
+ computedWidth, computedHeight);
+
+ int scaledWidth = getScaledSuggestedMinimumWidth();
+ int scaledHeight = getScaledSuggestedMinimumHeight();
+
+ computeInsets(computedWidth - scaledWidth, computedHeight - scaledHeight);
+ setMeasuredDimension(computedWidth, computedHeight);
+ }
+
+ private float getRingWidth() {
+ return mRingScaleFactor * Math.max(mOuterRing.getWidth(), 2 * mOuterRadius);
+ }
+
+ private float getRingHeight() {
+ return mRingScaleFactor * Math.max(mOuterRing.getHeight(), 2 * mOuterRadius);
+ }
+
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
@@ -1026,8 +1115,8 @@ public class GlowPadView extends View {
// Target placement width/height. This puts the targets on the greater of the ring
// width or the specified outer radius.
- final float placementWidth = Math.max(mOuterRing.getWidth(), 2 * mOuterRadius);
- final float placementHeight = Math.max(mOuterRing.getHeight(), 2 * mOuterRadius);
+ final float placementWidth = getRingWidth();
+ final float placementHeight = getRingHeight();
float newWaveCenterX = mHorizontalInset
+ Math.max(width, mMaxTargetWidth + placementWidth) / 2;
float newWaveCenterY = mVerticalInset
@@ -1042,6 +1131,8 @@ public class GlowPadView extends View {
mOuterRing.setPositionX(newWaveCenterX);
mOuterRing.setPositionY(newWaveCenterY);
+ mPointCloud.setScale(mRingScaleFactor);
+
mHandleDrawable.setPositionX(newWaveCenterX);
mHandleDrawable.setPositionY(newWaveCenterY);
@@ -1061,13 +1152,15 @@ public class GlowPadView extends View {
}
private void updateTargetPosition(int i, float centerX, float centerY, float angle) {
+ final float placementRadiusX = getRingWidth() / 2;
+ final float placementRadiusY = getRingHeight() / 2;
if (i >= 0) {
ArrayList<TargetDrawable> targets = mTargetDrawables;
final TargetDrawable targetIcon = targets.get(i);
targetIcon.setPositionX(centerX);
targetIcon.setPositionY(centerY);
- targetIcon.setX(mOuterRadius * (float) Math.cos(angle));
- targetIcon.setY(mOuterRadius * (float) Math.sin(angle));
+ targetIcon.setX(placementRadiusX * (float) Math.cos(angle));
+ targetIcon.setY(placementRadiusY * (float) Math.sin(angle));
}
}
diff --git a/core/jni/android_net_wifi_Wifi.cpp b/core/jni/android_net_wifi_Wifi.cpp
index e7c4c23ec026..9537ac478656 100644
--- a/core/jni/android_net_wifi_Wifi.cpp
+++ b/core/jni/android_net_wifi_Wifi.cpp
@@ -122,9 +122,9 @@ static jboolean android_net_wifi_startSupplicant(JNIEnv* env, jobject, jboolean
return (jboolean)(::wifi_start_supplicant(p2pSupported) == 0);
}
-static jboolean android_net_wifi_killSupplicant(JNIEnv* env, jobject)
+static jboolean android_net_wifi_killSupplicant(JNIEnv* env, jobject, jboolean p2pSupported)
{
- return (jboolean)(::wifi_stop_supplicant() == 0);
+ return (jboolean)(::wifi_stop_supplicant(p2pSupported) == 0);
}
static jboolean android_net_wifi_connectToSupplicant(JNIEnv* env, jobject, jstring jIface)
@@ -204,7 +204,7 @@ static JNINativeMethod gWifiMethods[] = {
{ "isDriverLoaded", "()Z", (void *)android_net_wifi_isDriverLoaded },
{ "unloadDriver", "()Z", (void *)android_net_wifi_unloadDriver },
{ "startSupplicant", "(Z)Z", (void *)android_net_wifi_startSupplicant },
- { "killSupplicant", "()Z", (void *)android_net_wifi_killSupplicant },
+ { "killSupplicant", "(Z)Z", (void *)android_net_wifi_killSupplicant },
{ "connectToSupplicant", "(Ljava/lang/String;)Z",
(void *)android_net_wifi_connectToSupplicant },
{ "closeSupplicantConnection", "(Ljava/lang/String;)V",
diff --git a/core/res/res/anim/keyguard_action_assist_enter.xml b/core/res/res/anim/keyguard_action_assist_enter.xml
new file mode 100644
index 000000000000..f3333b7cd816
--- /dev/null
+++ b/core/res/res/anim/keyguard_action_assist_enter.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 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" android:zAdjustment="top">
+
+ <alpha android:fromAlpha="0" android:toAlpha="1.0"
+ android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
+ android:interpolator="@android:interpolator/decelerate_cubic"
+ android:duration="300"/>
+
+ <translate android:fromYDelta="100%" android:toYDelta="0"
+ android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
+ android:interpolator="@android:interpolator/decelerate_cubic"
+ android:duration="300" />
+</set>
diff --git a/core/res/res/anim/keyguard_action_assist_exit.xml b/core/res/res/anim/keyguard_action_assist_exit.xml
new file mode 100644
index 000000000000..b4ed2789930e
--- /dev/null
+++ b/core/res/res/anim/keyguard_action_assist_exit.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 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.
+*/
+-->
+
+<translate xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/accelerate_interpolator"
+ android:fromXDelta="0" android:toXDelta="0"
+ android:duration="300" />
diff --git a/core/res/res/drawable-hdpi/ic_coins_l.png b/core/res/res/drawable-hdpi/ic_coins_l.png
new file mode 100644
index 000000000000..e1e3e2a184cb
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_coins_l.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/kg_add_widget.png b/core/res/res/drawable-hdpi/kg_add_widget.png
index 7456705b402f..723d97a3a981 100644
--- a/core/res/res/drawable-hdpi/kg_add_widget.png
+++ b/core/res/res/drawable-hdpi/kg_add_widget.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/kg_security_lock_focused.png b/core/res/res/drawable-hdpi/kg_security_lock_focused.png
index 9a827997a482..abcf6837a722 100644
--- a/core/res/res/drawable-hdpi/kg_security_lock_focused.png
+++ b/core/res/res/drawable-hdpi/kg_security_lock_focused.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/kg_security_lock_normal.png b/core/res/res/drawable-hdpi/kg_security_lock_normal.png
index d608707e38e4..e8cff24a4255 100644
--- a/core/res/res/drawable-hdpi/kg_security_lock_normal.png
+++ b/core/res/res/drawable-hdpi/kg_security_lock_normal.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/kg_security_lock_pressed.png b/core/res/res/drawable-hdpi/kg_security_lock_pressed.png
index 7ca995dfdf07..3214dcbcdbfc 100644
--- a/core/res/res/drawable-hdpi/kg_security_lock_pressed.png
+++ b/core/res/res/drawable-hdpi/kg_security_lock_pressed.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/kg_widget_bg_padded.9.png b/core/res/res/drawable-hdpi/kg_widget_bg_padded.9.png
new file mode 100644
index 000000000000..dff1dfaf9d27
--- /dev/null
+++ b/core/res/res/drawable-hdpi/kg_widget_bg_padded.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_coins_l.png b/core/res/res/drawable-mdpi/ic_coins_l.png
new file mode 100644
index 000000000000..a6d7abb372d9
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_coins_l.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/kg_add_widget.png b/core/res/res/drawable-mdpi/kg_add_widget.png
index 1cab0d9328fb..5b0a5a485450 100644
--- a/core/res/res/drawable-mdpi/kg_add_widget.png
+++ b/core/res/res/drawable-mdpi/kg_add_widget.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/kg_security_lock_focused.png b/core/res/res/drawable-mdpi/kg_security_lock_focused.png
index c3608f940169..c567a82396a1 100644
--- a/core/res/res/drawable-mdpi/kg_security_lock_focused.png
+++ b/core/res/res/drawable-mdpi/kg_security_lock_focused.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/kg_security_lock_normal.png b/core/res/res/drawable-mdpi/kg_security_lock_normal.png
index 7957c79dccab..6fbecc187d3a 100644
--- a/core/res/res/drawable-mdpi/kg_security_lock_normal.png
+++ b/core/res/res/drawable-mdpi/kg_security_lock_normal.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/kg_security_lock_pressed.png b/core/res/res/drawable-mdpi/kg_security_lock_pressed.png
index 41715f5be419..a88325897837 100644
--- a/core/res/res/drawable-mdpi/kg_security_lock_pressed.png
+++ b/core/res/res/drawable-mdpi/kg_security_lock_pressed.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/kg_widget_bg_padded.9.png b/core/res/res/drawable-mdpi/kg_widget_bg_padded.9.png
new file mode 100644
index 000000000000..c313df12f4aa
--- /dev/null
+++ b/core/res/res/drawable-mdpi/kg_widget_bg_padded.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_coins_l.png b/core/res/res/drawable-xhdpi/ic_coins_l.png
new file mode 100644
index 000000000000..84e7e7239d03
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_coins_l.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/kg_add_widget.png b/core/res/res/drawable-xhdpi/kg_add_widget.png
index d71905f8ff78..9c84de2e1d40 100644
--- a/core/res/res/drawable-xhdpi/kg_add_widget.png
+++ b/core/res/res/drawable-xhdpi/kg_add_widget.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/kg_security_lock_focused.png b/core/res/res/drawable-xhdpi/kg_security_lock_focused.png
index db220162444d..ee21647399e2 100644
--- a/core/res/res/drawable-xhdpi/kg_security_lock_focused.png
+++ b/core/res/res/drawable-xhdpi/kg_security_lock_focused.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/kg_security_lock_normal.png b/core/res/res/drawable-xhdpi/kg_security_lock_normal.png
index 17ebb5f8dc99..eae7d8c55e3d 100644
--- a/core/res/res/drawable-xhdpi/kg_security_lock_normal.png
+++ b/core/res/res/drawable-xhdpi/kg_security_lock_normal.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/kg_security_lock_pressed.png b/core/res/res/drawable-xhdpi/kg_security_lock_pressed.png
index 186b6ffec111..5e9a52b6b504 100644
--- a/core/res/res/drawable-xhdpi/kg_security_lock_pressed.png
+++ b/core/res/res/drawable-xhdpi/kg_security_lock_pressed.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/kg_widget_bg_padded.9.png b/core/res/res/drawable-xhdpi/kg_widget_bg_padded.9.png
new file mode 100644
index 000000000000..a84bfa39ce6c
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/kg_widget_bg_padded.9.png
Binary files differ
diff --git a/core/res/res/layout-land/keyguard_host_view.xml b/core/res/res/layout-land/keyguard_host_view.xml
index be1d5b6c5ce6..6b3623569526 100644
--- a/core/res/res/layout-land/keyguard_host_view.xml
+++ b/core/res/res/layout-land/keyguard_host_view.xml
@@ -37,7 +37,8 @@
android:id="@+id/keyguard_widget_pager_delete_target"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="top|center_horizontal" />
+ android:layout_gravity="top|center_horizontal"
+ androidprv:layout_childType="pageDeleteDropTarget" />
<include layout="@layout/keyguard_widget_pager"
android:id="@+id/app_widget_container"
@@ -56,8 +57,8 @@
<com.android.internal.policy.impl.keyguard.KeyguardSecurityContainer
android:id="@+id/keyguard_security_container"
- android:layout_width="@dimen/keyguard_security_width"
- android:layout_height="@dimen/keyguard_security_height"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
androidprv:layout_childType="challenge"
androidprv:layout_centerWithinArea="0.55">
<com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper
diff --git a/core/res/res/layout-land/keyguard_status_area.xml b/core/res/res/layout-land/keyguard_status_area.xml
index f562d9f671fd..51ee740befa1 100644
--- a/core/res/res/layout-land/keyguard_status_area.xml
+++ b/core/res/res/layout-land/keyguard_status_area.xml
@@ -53,43 +53,4 @@
android:drawablePadding="4dip"
/>
- <TextView
- android:id="@+id/owner_info"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="end"
- android:layout_marginTop="4dp"
- android:layout_marginEnd="@dimen/kg_status_line_font_right_margin"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:textAppearance="?android:attr/textAppearance"
- android:textSize="@dimen/kg_status_line_font_size"
- />
-
- <TextView
- android:id="@+id/status1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="end"
- android:layout_marginTop="4dp"
- android:layout_marginEnd="@dimen/kg_status_line_font_right_margin"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:textAppearance="?android:attr/textAppearance"
- android:textSize="@dimen/kg_status_line_font_size"
- />
-
- <TextView
- android:id="@+id/status_security_message"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:gravity="right"
- android:layout_marginTop="12dp"
- android:singleLine="false"
- android:maxLines="3"
- android:ellipsize="marquee"
- android:textAppearance="?android:attr/textAppearance"
- android:textSize="16dp"
- />
</LinearLayout> \ No newline at end of file
diff --git a/core/res/res/layout-port/keyguard_host_view.xml b/core/res/res/layout-port/keyguard_host_view.xml
index b2bf3f147e41..fb25f9c12802 100644
--- a/core/res/res/layout-port/keyguard_host_view.xml
+++ b/core/res/res/layout-port/keyguard_host_view.xml
@@ -35,7 +35,8 @@
<FrameLayout
android:layout_width="match_parent"
- android:layout_height="wrap_content">
+ android:layout_height="wrap_content"
+ androidprv:layout_childType="pageDeleteDropTarget">
<include layout="@layout/keyguard_widget_remove_drop_target"
android:id="@+id/keyguard_widget_pager_delete_target"
android:layout_width="wrap_content"
@@ -62,7 +63,8 @@
<com.android.internal.policy.impl.keyguard.KeyguardSecurityContainer
android:id="@+id/keyguard_security_container"
android:layout_width="wrap_content"
- android:layout_height="@dimen/keyguard_security_height"
+ android:layout_height="wrap_content"
+ android:layout_maxHeight="@dimen/keyguard_security_height"
androidprv:layout_childType="challenge"
android:padding="0dp"
android:gravity="bottom|center_horizontal">
diff --git a/core/res/res/layout-port/keyguard_status_area.xml b/core/res/res/layout-port/keyguard_status_area.xml
index c1f6aab1f0ac..d274457ce227 100644
--- a/core/res/res/layout-port/keyguard_status_area.xml
+++ b/core/res/res/layout-port/keyguard_status_area.xml
@@ -56,43 +56,4 @@
/>
</LinearLayout>
- <TextView
- android:id="@+id/owner_info"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="right"
- android:layout_marginTop="4dp"
- android:layout_marginEnd="@dimen/kg_status_line_font_right_margin"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:textAppearance="?android:attr/textAppearance"
- android:textSize="@dimen/kg_status_line_font_size"
- />
-
- <TextView
- android:id="@+id/status1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="right"
- android:layout_marginTop="4dp"
- android:layout_marginEnd="@dimen/kg_status_line_font_right_margin"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:textAppearance="?android:attr/textAppearance"
- android:textSize="@dimen/kg_status_line_font_size"
- />
-
- <TextView
- android:id="@+id/status_security_message"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="right"
- android:layout_marginTop="4dp"
- android:layout_marginEnd="@dimen/kg_status_line_font_right_margin"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:textAppearance="?android:attr/textAppearance"
- android:textSize="@dimen/kg_status_line_font_size"
- />
-
</LinearLayout>
diff --git a/core/res/res/layout-sw600dp-port/keyguard_host_view.xml b/core/res/res/layout-sw600dp-port/keyguard_host_view.xml
index 809104d6e0f2..e3d577dc38a7 100644
--- a/core/res/res/layout-sw600dp-port/keyguard_host_view.xml
+++ b/core/res/res/layout-sw600dp-port/keyguard_host_view.xml
@@ -38,7 +38,8 @@
android:id="@+id/keyguard_widget_pager_delete_target"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="top|center_horizontal" />
+ android:layout_gravity="top|center_horizontal"
+ androidprv:layout_childType="pageDeleteDropTarget" />
<include layout="@layout/keyguard_widget_pager"
android:id="@+id/app_widget_container"
@@ -58,10 +59,8 @@
<com.android.internal.policy.impl.keyguard.KeyguardSecurityContainer
android:id="@+id/keyguard_security_container"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- androidprv:layout_maxWidth="@dimen/keyguard_security_width"
- androidprv:layout_maxHeight="@dimen/keyguard_security_height"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
androidprv:layout_centerWithinArea="0.5"
androidprv:layout_childType="challenge"
android:layout_gravity="center_horizontal|bottom">
diff --git a/core/res/res/layout-sw600dp-port/keyguard_status_area.xml b/core/res/res/layout-sw600dp-port/keyguard_status_area.xml
index 405ac141f2db..88dd760146a9 100644
--- a/core/res/res/layout-sw600dp-port/keyguard_status_area.xml
+++ b/core/res/res/layout-sw600dp-port/keyguard_status_area.xml
@@ -53,29 +53,4 @@
android:drawablePadding="4dip"
/>
- <TextView
- android:id="@+id/owner_info"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="end"
- android:layout_marginTop="4dp"
- android:layout_marginEnd="@dimen/kg_status_line_font_right_margin"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:textAppearance="?android:attr/textAppearance"
- android:textSize="@dimen/kg_status_line_font_size"
- />
-
- <TextView
- android:id="@+id/status1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="end"
- android:layout_marginTop="4dp"
- android:layout_marginEnd="@dimen/kg_status_line_font_right_margin"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:textAppearance="?android:attr/textAppearance"
- android:textSize="@dimen/kg_status_line_font_size"
- />
</LinearLayout>
diff --git a/core/res/res/layout/keyguard_account_view.xml b/core/res/res/layout/keyguard_account_view.xml
index 78adfe754917..fa36371a44d8 100644
--- a/core/res/res/layout/keyguard_account_view.xml
+++ b/core/res/res/layout/keyguard_account_view.xml
@@ -21,6 +21,8 @@
android:id="@+id/keyguard_account_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:layout_maxWidth="@dimen/keyguard_security_width"
+ android:layout_maxHeight="@dimen/keyguard_security_height"
android:orientation="vertical">
<include layout="@layout/keyguard_message_area"
@@ -49,6 +51,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/login"
+ android:layout_toLeftOf="@+id/ok"
android:layout_marginTop="15dip"
android:layout_marginStart="7dip"
android:layout_marginEnd="7dip"
@@ -65,18 +68,20 @@
android:layout_height="wrap_content"
android:layout_margin="7dip"
android:layout_alignParentEnd="true"
- android:layout_alignParentBottom="true"
+ android:layout_below="@id/login"
android:text="@string/kg_login_submit_button"
/>
</RelativeLayout>
- <include layout="@layout/keyguard_emergency_carrier_area"
+ <!-- no room for ECA on this screen right now
+ <include layout="@layout/keyguard_eca"
android:id="@+id/keyguard_selector_fade_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="bottom|center_horizontal"
android:gravity="center_horizontal" />
+ -->
</com.android.internal.policy.impl.keyguard.KeyguardAccountView>
diff --git a/core/res/res/layout/keyguard_emergency_carrier_area_empty.xml b/core/res/res/layout/keyguard_emergency_carrier_area_empty.xml
new file mode 100644
index 000000000000..2f4adae00cf7
--- /dev/null
+++ b/core/res/res/layout/keyguard_emergency_carrier_area_empty.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 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.
+*/
+-->
+
+<!-- This is a blank layout to simplify implementation on landscape on phones
+ it is referenced indirectly by keyguard_eca -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="0dip"
+ android:layout_height="0dip"
+ android:orientation="vertical"
+ android:gravity="center"
+ android:layout_gravity="center_horizontal"
+ android:layout_alignParentBottom="true">
+
+</LinearLayout>
diff --git a/core/res/res/layout/keyguard_face_unlock_view.xml b/core/res/res/layout/keyguard_face_unlock_view.xml
index c1e35cf780d8..c9f11761c3e3 100644
--- a/core/res/res/layout/keyguard_face_unlock_view.xml
+++ b/core/res/res/layout/keyguard_face_unlock_view.xml
@@ -24,6 +24,8 @@
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:layout_maxWidth="@dimen/keyguard_security_width"
+ android:layout_maxHeight="@dimen/keyguard_security_height"
android:contentDescription="@string/keyguard_accessibility_face_unlock">
<include layout="@layout/keyguard_message_area"
@@ -42,6 +44,7 @@
android:id="@+id/face_unlock_area_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:layout_gravity="center_horizontal"
android:background="@*android:drawable/intro_bg"
android:gravity="center">
@@ -65,7 +68,7 @@
</com.android.internal.widget.FaceUnlockView>
</FrameLayout>
- <include layout="@layout/keyguard_emergency_carrier_area"
+ <include layout="@layout/keyguard_eca"
android:id="@+id/keyguard_selector_fade_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/core/res/res/layout/keyguard_glow_pad_container.xml b/core/res/res/layout/keyguard_glow_pad_container.xml
index 376d0e935368..d86707fb1411 100644
--- a/core/res/res/layout/keyguard_glow_pad_container.xml
+++ b/core/res/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"/>
+ android:layout_marginBottom="-60dp"/>
</merge> \ No newline at end of file
diff --git a/core/res/res/layout/keyguard_glow_pad_view.xml b/core/res/res/layout/keyguard_glow_pad_view.xml
index ef1c133bc95b..cfd8160582c4 100644
--- a/core/res/res/layout/keyguard_glow_pad_view.xml
+++ b/core/res/res/layout/keyguard_glow_pad_view.xml
@@ -42,4 +42,5 @@
prvandroid:feedbackCount="1"
prvandroid:vibrationDuration="20"
prvandroid:glowRadius="@*android:dimen/glowpadview_glow_radius"
- prvandroid:pointDrawable="@*android:drawable/ic_lockscreen_glowdot" />
+ prvandroid:pointDrawable="@*android:drawable/ic_lockscreen_glowdot"
+ prvandroid:allowScaling="true" />
diff --git a/core/res/res/layout/keyguard_password_view.xml b/core/res/res/layout/keyguard_password_view.xml
index 2e2ada8eab1f..aab54c3f23cb 100644
--- a/core/res/res/layout/keyguard_password_view.xml
+++ b/core/res/res/layout/keyguard_password_view.xml
@@ -22,6 +22,8 @@
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:layout_maxWidth="@dimen/keyguard_security_width"
+ android:layout_maxHeight="@dimen/keyguard_security_height"
android:gravity="bottom"
android:contentDescription="@string/keyguard_accessibility_password_unlock"
>
@@ -84,7 +86,14 @@
</LinearLayout>
</FrameLayout>
- <include layout="@layout/keyguard_emergency_carrier_area"
+
+ <Space
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ />
+
+ <include layout="@layout/keyguard_eca"
android:id="@+id/keyguard_selector_fade_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/core/res/res/layout/keyguard_pattern_view.xml b/core/res/res/layout/keyguard_pattern_view.xml
index 1c11fdd335ec..1bd3e4ebdd9e 100644
--- a/core/res/res/layout/keyguard_pattern_view.xml
+++ b/core/res/res/layout/keyguard_pattern_view.xml
@@ -26,6 +26,8 @@
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:layout_maxWidth="@dimen/keyguard_security_width"
+ android:layout_maxHeight="@dimen/keyguard_security_height"
android:gravity="center_horizontal"
android:contentDescription="@string/keyguard_accessibility_pattern_unlock">
@@ -33,16 +35,17 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
- <include layout="@layout/keyguard_message_area"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
-
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="vertical"
android:layout_gravity="center">
+ <include layout="@layout/keyguard_message_area"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ />
+
<FrameLayout
android:id="@+id/keyguard_bouncer_frame"
android:background="@*android:drawable/kg_bouncer_bg_white"
@@ -62,7 +65,7 @@
android:gravity="center"
android:contentDescription="@string/keyguard_accessibility_pattern_area" />
</FrameLayout>
- <include layout="@layout/keyguard_emergency_carrier_area"
+ <include layout="@layout/keyguard_eca"
android:id="@+id/keyguard_selector_fade_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/core/res/res/layout/keyguard_pin_view.xml b/core/res/res/layout/keyguard_pin_view.xml
index d486d5ec13f2..e494b6997d38 100644
--- a/core/res/res/layout/keyguard_pin_view.xml
+++ b/core/res/res/layout/keyguard_pin_view.xml
@@ -23,6 +23,8 @@
android:id="@+id/keyguard_pin_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:layout_maxWidth="@dimen/keyguard_security_width"
+ android:layout_maxHeight="@dimen/keyguard_security_height"
android:orientation="vertical"
android:contentDescription="@string/keyguard_accessibility_pin_unlock"
>
@@ -210,7 +212,7 @@
/>
</LinearLayout>
</LinearLayout>
- <include layout="@layout/keyguard_emergency_carrier_area"
+ <include layout="@layout/keyguard_eca"
android:id="@+id/keyguard_selector_fade_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/core/res/res/layout/keyguard_selector_view.xml b/core/res/res/layout/keyguard_selector_view.xml
index 941e78eb51dd..dfacb6a15103 100644
--- a/core/res/res/layout/keyguard_selector_view.xml
+++ b/core/res/res/layout/keyguard_selector_view.xml
@@ -24,6 +24,8 @@
android:id="@+id/keyguard_selector_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:layout_maxWidth="420dp"
+ android:layout_maxHeight="@dimen/keyguard_security_height"
android:clipChildren="false"
android:clipToPadding="false"
android:orientation="vertical"
@@ -41,9 +43,17 @@
android:layout_width="match_parent"
android:layout_height="wrap_content" />
+ <View
+ android:id="@+id/keyguard_selector_view_frame"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="16dp"
+ android:layout_marginRight="16dp"
+ android:background="@*android:drawable/kg_bouncer_bg_white"/>
+
<include layout="@layout/keyguard_glow_pad_container" />
- <include layout="@layout/keyguard_emergency_carrier_area"
+ <include layout="@layout/keyguard_eca"
android:id="@+id/keyguard_selector_fade_container"
android:layout_width="match_parent"
android:layout_height="48dp"
diff --git a/core/res/res/layout/keyguard_sim_pin_view.xml b/core/res/res/layout/keyguard_sim_pin_view.xml
index 67af6f9e7ad6..026b025091cd 100644
--- a/core/res/res/layout/keyguard_sim_pin_view.xml
+++ b/core/res/res/layout/keyguard_sim_pin_view.xml
@@ -24,6 +24,8 @@
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:layout_maxWidth="@dimen/keyguard_security_width"
+ android:layout_maxHeight="@dimen/keyguard_security_height"
android:gravity="center_horizontal">
<ImageView
@@ -216,7 +218,7 @@
</LinearLayout>
</LinearLayout>
- <include layout="@layout/keyguard_emergency_carrier_area"
+ <include layout="@layout/keyguard_eca"
android:id="@+id/keyguard_selector_fade_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/core/res/res/layout/keyguard_sim_puk_view.xml b/core/res/res/layout/keyguard_sim_puk_view.xml
index b5731ecb1916..28a9f9a3594d 100644
--- a/core/res/res/layout/keyguard_sim_puk_view.xml
+++ b/core/res/res/layout/keyguard_sim_puk_view.xml
@@ -25,6 +25,8 @@
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:layout_maxWidth="@dimen/keyguard_security_width"
+ android:layout_maxHeight="@dimen/keyguard_security_height"
android:gravity="center_horizontal">
<ImageView
@@ -217,7 +219,7 @@
</LinearLayout>
</LinearLayout>
- <include layout="@layout/keyguard_emergency_carrier_area"
+ <include layout="@layout/keyguard_eca"
android:id="@+id/keyguard_selector_fade_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/core/res/res/layout/keyguard_status_view.xml b/core/res/res/layout/keyguard_status_view.xml
index 7467928f37d8..9e36df378f5c 100644
--- a/core/res/res/layout/keyguard_status_view.xml
+++ b/core/res/res/layout/keyguard_status_view.xml
@@ -23,6 +23,8 @@
android:id="@+id/keyguard_status_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:layout_maxWidth="@dimen/keyguard_security_width"
+ android:layout_maxHeight="@dimen/keyguard_security_height"
android:gravity="center_horizontal">
<com.android.internal.policy.impl.keyguard.KeyguardStatusView
diff --git a/core/res/res/layout/keyguard_widget_remove_drop_target.xml b/core/res/res/layout/keyguard_widget_remove_drop_target.xml
index f9f40abdc27a..294c3862612d 100644
--- a/core/res/res/layout/keyguard_widget_remove_drop_target.xml
+++ b/core/res/res/layout/keyguard_widget_remove_drop_target.xml
@@ -19,9 +19,9 @@
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:gravity="center"
- android:padding="20dp"
- android:paddingLeft="40dp"
- android:paddingRight="40dp"
+ android:padding="30dp"
+ android:paddingLeft="60dp"
+ android:paddingRight="60dp"
android:drawableLeft="@drawable/kg_widget_delete_drop_target"
android:drawablePadding="4dp"
android:text="@string/kg_reordering_delete_drop_target_text"
diff --git a/core/res/res/layout/sms_short_code_confirmation_dialog.xml b/core/res/res/layout/sms_short_code_confirmation_dialog.xml
index ec39d97910e7..d82f560fc3d0 100644
--- a/core/res/res/layout/sms_short_code_confirmation_dialog.xml
+++ b/core/res/res/layout/sms_short_code_confirmation_dialog.xml
@@ -30,9 +30,9 @@
style="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingLeft="16dip"
- android:paddingRight="16dip"
- android:paddingTop="8dip"
+ android:paddingLeft="20dip"
+ android:paddingRight="20dip"
+ android:paddingTop="16dip"
android:paddingBottom="16dip" />
<TableLayout android:id="@+id/sms_short_code_detail_layout"
@@ -51,7 +51,7 @@
android:layout_height="wrap_content"
android:paddingLeft="8dip"
android:paddingRight="8dip"
- android:src="@null" />
+ android:src="@drawable/ic_coins_l" />
<TextView android:id="@+id/sms_short_code_detail_message"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
@@ -60,14 +60,19 @@
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
-
+ <RelativeLayout android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingTop="12dip"
+ android:paddingLeft="8dip" >
<CheckBox android:id="@+id/sms_short_code_remember_choice_checkbox"
+ android:paddingTop="11dip"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingRight="8dip" />
+ android:layout_height="wrap_content" />
+ </RelativeLayout>
<TextView android:id="@+id/sms_short_code_remember_choice_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:paddingTop="18dip"
android:text="@string/sms_short_code_remember_choice" />
</TableRow>
@@ -77,6 +82,7 @@
<Space android:layout_gravity="fill" />
<TextView android:id="@+id/sms_short_code_remember_undo_instruction"
+ android:paddingTop="10dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</TableRow>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index b00495b19a86..51d23e8abec4 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Probeer weer"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Maksimum gesigontsluit-pogings oorskry"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Laai, (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Gehef."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Gelaai"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Koppel jou herlaaier."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Geen SIM-kaart nie"</string>
@@ -813,23 +813,23 @@
<string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Voeg legstuk by."</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Leeg"</string>
<string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Ontsluitruimte uitgevou."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Ontsluitruimte het in duie gestort."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> legstuk."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Ontsluitruimte ingevou."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>-legstuk."</string>
<string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Gebruikerkieser"</string>
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"Status"</string>
<string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
<string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Media-kontroles"</string>
<string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Herordening van legstuk begin."</string>
<string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Herordening van legstuk beëindig."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Legstuk <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> verwyder."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Legstuk <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> uitgevee."</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Vou ontsluitruimte uit."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Skyfie ontsluit."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Sleep-ontsluit."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Patroon ontsluit."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Gesigslot."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN ontsluit."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Wagwoord ontsluit."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Patroonarea."</string>
- <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Skyfie-area."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Sleep-area."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Jy het <xliff:g id="NUMBER">%d</xliff:g> keer verkeerdelik gepoog om die foon te ontsluit. Die foon sal nou na fabrieksverstek teruggestel word."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Jy het jou ontsluitpatroon <xliff:g id="NUMBER_0">%d</xliff:g> keer verkeerdelik geteken. Na nog <xliff:g id="NUMBER_1">%d</xliff:g> onsuksesvolle pogings, sal jy gevra word om jou tablet te ontsluit deur middel van \'n e-posrekening."\n\n" Probeer weer oor <xliff:g id="NUMBER_2">%d</xliff:g> sekondes."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Jy het jou ontsluitpatroon <xliff:g id="NUMBER_0">%d</xliff:g> keer verkeerdelik geteken. Na nog <xliff:g id="NUMBER_1">%d</xliff:g> onsuksesvolle pogings, sal jy gevra word om jou foon te ontsluit deur middel van \'n e-posrekening."\n\n" Probeer weer oor <xliff:g id="NUMBER_2">%d</xliff:g> sekondes."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Verwyder"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Moet volume bo veilige vlak verhoog word?"\n"Deur vir lang tydperke op hoë volume te luister, kan jou gehoor beskadig."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Hou aan met twee vingers inhou om toeganklikheid te aktiveer."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Toeganklikheid geaktiveer."</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index debb0b3a3be9..f846ffd0c044 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"እንደገና ሞክር"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"የመጨረሻውን የገጽ ክፈት ሙከራዎችን አልፏል"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"ኃይል በመሙላት ላይ፣ <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"ኃይል ሞልቷል።"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"ባትሪ ሞልቷል።"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"ኃይል መሙያዎን ያያይዙ"</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"ምንም ሲም ካርድ የለም"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"ስልኩን <xliff:g id="NUMBER">%d</xliff:g> ጊዜ ትክክል ባልሆነ መንገድ ለመክፈት ሞክረዋል። ስልኩ አሁን በፋብሪካ ነባሪ ቅንብር ዳግም ይጀመራል።"</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"የመክፈቻ ስርዓተ ጥለቱን <xliff:g id="NUMBER_0">%d</xliff:g> ጊዜ በትክክል አልሳሉትም። ከ<xliff:g id="NUMBER_1">%d</xliff:g> ተጨማሪ ያልተሳኩ ሙከራዎች በኋላ የኢሜይል መለያ ተጠቅመው ጡባዊ ቱኮዎን እንዲከፍቱ ይጠየቃሉ።"\n\n" ከ<xliff:g id="NUMBER_2">%d</xliff:g> ከሰከንዶች በኋላ እንደገና ይሞክሩ።"</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"የመክፈቻ ስርዓተ ጥለቱን <xliff:g id="NUMBER_0">%d</xliff:g> ጊዜ በትክክል አልሳሉትም። ከ<xliff:g id="NUMBER_1">%d</xliff:g> ተጨማሪ ያልተሳኩ ሙከራዎች በኋላ የኢሜይል መለያ ተጠቅመው ስልክዎን እንዲከፍቱ ይጠየቃሉ።"\n\n"እባክዎ ከ<xliff:g id="NUMBER_2">%d</xliff:g> ሰከንዶች በኋላ እንደገና ይሞክሩ።"</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"አስወግድ"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"ድምጽ አደጋ ከሌለው መጠን በላይ ይጨመር??"\n"ለረጅም ጊዜ በከፍተኛ ድምጽ መስማት የመስማት ችሎታዎን ሊጎዳይ ይችላል።"</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"ተደራሽነትን ለማንቃት ሁለት ጣቶችዎን ባሉበት ያቆዩዋቸው።"</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"ተደራሽነት ነቅቷል።"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index b10ce53722e1..a7c0c5084e4e 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -628,7 +628,7 @@
<string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"تعطيل الميزات في وضع حماية المفاتيح"</string>
<string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"يمكنك منع استخدام بعض الميزات في وضع حماية المفاتيح."</string>
<string-array name="phoneTypes">
- <item msgid="8901098336658710359">"الرئيسية"</item>
+ <item msgid="8901098336658710359">"المنزل"</item>
<item msgid="869923650527136615">"الجوال"</item>
<item msgid="7897544654242874543">"عمل"</item>
<item msgid="1103601433382158155">"فاكس العمل"</item>
@@ -638,19 +638,19 @@
<item msgid="9192514806975898961">"مخصص"</item>
</string-array>
<string-array name="emailAddressTypes">
- <item msgid="8073994352956129127">"الرئيسية"</item>
+ <item msgid="8073994352956129127">"المنزل"</item>
<item msgid="7084237356602625604">"عمل"</item>
<item msgid="1112044410659011023">"آخر"</item>
<item msgid="2374913952870110618">"مخصص"</item>
</string-array>
<string-array name="postalAddressTypes">
- <item msgid="6880257626740047286">"الرئيسية"</item>
+ <item msgid="6880257626740047286">"المنزل"</item>
<item msgid="5629153956045109251">"عمل"</item>
<item msgid="4966604264500343469">"آخر"</item>
<item msgid="4932682847595299369">"مخصص"</item>
</string-array>
<string-array name="imAddressTypes">
- <item msgid="1738585194601476694">"الرئيسية"</item>
+ <item msgid="1738585194601476694">"المنزل"</item>
<item msgid="1359644565647383708">"عمل"</item>
<item msgid="7868549401053615677">"آخر"</item>
<item msgid="3145118944639869809">"مخصص"</item>
@@ -671,7 +671,7 @@
<item msgid="1648797903785279353">"Jabber"</item>
</string-array>
<string name="phoneTypeCustom" msgid="1644738059053355820">"مخصص"</string>
- <string name="phoneTypeHome" msgid="2570923463033985887">"الرئيسية"</string>
+ <string name="phoneTypeHome" msgid="2570923463033985887">"المنزل"</string>
<string name="phoneTypeMobile" msgid="6501463557754751037">"الجوال"</string>
<string name="phoneTypeWork" msgid="8863939667059911633">"عمل"</string>
<string name="phoneTypeFaxWork" msgid="3517792160008890912">"فاكس العمل"</string>
@@ -696,16 +696,16 @@
<string name="eventTypeAnniversary" msgid="3876779744518284000">"الذكرى السنوية"</string>
<string name="eventTypeOther" msgid="7388178939010143077">"غير ذلك"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"مخصص"</string>
- <string name="emailTypeHome" msgid="449227236140433919">"الرئيسية"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"المنزل"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"عمل"</string>
<string name="emailTypeOther" msgid="2923008695272639549">"آخر"</string>
<string name="emailTypeMobile" msgid="119919005321166205">"الجوال"</string>
<string name="postalTypeCustom" msgid="8903206903060479902">"مخصص"</string>
- <string name="postalTypeHome" msgid="8165756977184483097">"الرئيسية"</string>
+ <string name="postalTypeHome" msgid="8165756977184483097">"المنزل"</string>
<string name="postalTypeWork" msgid="5268172772387694495">"عمل"</string>
<string name="postalTypeOther" msgid="2726111966623584341">"آخر"</string>
<string name="imTypeCustom" msgid="2074028755527826046">"مخصص"</string>
- <string name="imTypeHome" msgid="6241181032954263892">"الرئيسية"</string>
+ <string name="imTypeHome" msgid="6241181032954263892">"المنزل"</string>
<string name="imTypeWork" msgid="1371489290242433090">"عمل"</string>
<string name="imTypeOther" msgid="5377007495735915478">"آخر"</string>
<string name="imProtocolCustom" msgid="6919453836618749992">"مخصص"</string>
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"أعد المحاولة"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"تم تجاوز الحد الأقصى لعدد محاولات تأمين الجهاز بالوجه"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"جارٍ الشحن، <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"تم الشحن."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"تم الشحن"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"توصيل جهاز الشحن."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"ليست هناك بطاقة SIM"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"لقد حاولت إلغاء تأمين الهاتف بشكل غير صحيح <xliff:g id="NUMBER">%d</xliff:g> مرة. سيتم الآن إعادة تعيين الهاتف على الإعدادات الافتراضية للمصنع."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"لقد رسمت نقش إلغاء التأمين بشكل غير صحيح <xliff:g id="NUMBER_0">%d</xliff:g> مرة. بعد إجراء <xliff:g id="NUMBER_1">%d</xliff:g> من المحاولات غير الناجحة الأخرى، ستطالَب بإلغاء تأمين الجهاز اللوحي باستخدام معلومات حساب بريد إلكتروني."\n\n" أعد المحاولة خلال <xliff:g id="NUMBER_2">%d</xliff:g> ثانية."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"لقد رسمت نقش إلغاء التأمين بشكل غير صحيح <xliff:g id="NUMBER_0">%d</xliff:g> مرة. بعد إجراء <xliff:g id="NUMBER_1">%d</xliff:g> من المحاولات غير الناجحة الأخرى، ستُطالب بإلغاء تأمين الهاتف باستخدام حساب بريد إلكتروني لإلغاء تأمين الهاتف."\n\n" أعد المحاولة خلال <xliff:g id="NUMBER_2">%d</xliff:g> ثانية."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"إزالة"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"هل تريد رفع مستوى الصوت فوق المستوى الآمن؟"\n"قد يضر سماع صوت عالٍ لفترات طويلة بسمعك."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"اضغط بإصبعين لأسفل مع الاستمرار لتمكين تسهيل الدخول."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"تم تمكين إمكانية الدخول."</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index f0c3725743e9..6ae68f9316e6 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Паўтарыце спробу"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Перавышана максімальная колькасць спроб разблакоўкі праз Фэйскантроль"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Зарадка, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Зараджаны."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Зараджаны"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Падлучыце зарадную прыладу."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Няма SIM-карты"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Вы няправільна спрабавалі разблакiраваць тэлефон некалькi разоў (<xliff:g id="NUMBER">%d</xliff:g>). Цяпер ён будзе скінуты да завадскіх налад."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Вы няправільна ўвялі графічны ключ разблакiроўкi пэўную колькасць разоў: <xliff:g id="NUMBER_0">%d</xliff:g>. Пасля яшчэ некалькiх няўдалых спроб (<xliff:g id="NUMBER_1">%d</xliff:g>) вам будзе прапанавана разблакiраваць тэлефон, увайшоўшы ў Google."\n\n" Паўтарыце спробу праз <xliff:g id="NUMBER_2">%d</xliff:g> с."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Вы няправільна ўвялі графічны ключ разблакiроўкi пэўную колькасць разоў: <xliff:g id="NUMBER_0">%d</xliff:g>. Пасля яшчэ некалькiх няўдалых спроб (<xliff:g id="NUMBER_1">%d</xliff:g>) вам будзе прапанавана разблакiраваць тэлефон, увайшоўшы ў Google."\n\n" Паўтарыце спробу праз <xliff:g id="NUMBER_2">%d</xliff:g> с."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Выдаліць"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Павялiчыць гук больш за рэкамендаваны ўзровень?"\n"Доўгае слуханне музыкi на вялiкай гучнасцi можа пашкодзiць ваш слых."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Утрымлiвайце два пальцы, каб уключыць доступ."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Даступнасць уключана."</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 13b5fe87ffaf..838f0cfd1a45 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Опитайте отново"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Максималният брой опити за отключване с лице е надвишен"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Зарежда се, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Зареден."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Заредена"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Свържете зарядното си устройство."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Няма SIM карта"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Направихте опит да отключите неправилно телефона <xliff:g id="NUMBER">%d</xliff:g> пъти. Сега ще бъдат възстановени стандартните му фабрични настройки."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Начертахте неправилно фигурата си за отключване <xliff:g id="NUMBER_0">%d</xliff:g> пъти. След още <xliff:g id="NUMBER_1">%d</xliff:g> неуспешни опита ще бъдете помолени да отключите таблета посредством имейл адрес."\n\n" Опитайте отново след <xliff:g id="NUMBER_2">%d</xliff:g> секунди."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Начертахте неправилно фигурата си за отключване <xliff:g id="NUMBER_0">%d</xliff:g> пъти. След още <xliff:g id="NUMBER_1">%d</xliff:g> неуспешни опита ще бъдете помолени да отключите телефона посредством имейл адрес."\n\n" Опитайте отново след <xliff:g id="NUMBER_2">%d</xliff:g> секунди."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Премахване"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Да се увеличи ли силата на звука над безопасното ниво?"\n"Продължителното слушане при висока сила на звука може да увреди слуха ви."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Продължете да натискате с два пръста, за да активирате функцията за достъпност."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Достъпността е активирана."</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index e56522363b88..fdc95067b738 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Torna-ho a provar"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"S\'ha superat el nombre màxim d\'intents de desbloqueig facial"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"S\'està carregant, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Carregada."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Carregada"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Connecteu el carregador."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"No hi ha cap targeta SIM."</string>
@@ -813,7 +813,7 @@
<string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Afegeix un widget"</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Buit"</string>
<string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"S\'ha ampliat l\'àrea de desbloqueig."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"L\'àrea de desbloqueig està col·lapsada."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"L\'àrea de desbloqueig està replegada."</string>
<string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget de <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
<string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Selector d\'usuaris"</string>
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"Estat"</string>
@@ -823,13 +823,13 @@
<string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Ha finalitzat la reorganització del widget."</string>
<string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"S\'ha suprimit el widget de <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Amplia l\'àrea de desbloqueig."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Desbloqueig per control lliscant."</string>
- <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueig per patró."</string>
- <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueig facial."</string>
- <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueig per PIN."</string>
- <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueig per contrasenya."</string>
- <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Zona de patró."</string>
- <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Àrea de control lliscant."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Desbloqueig lliscant el dit"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueig mitjançant patró"</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueig facial"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueig mitjançant PIN"</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueig mitjançant contrasenya"</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Àrea de patró"</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Àrea per lliscar el dit"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Has provat de desbloquejar el telèfon <xliff:g id="NUMBER">%d</xliff:g> vegades de manera incorrecta. Ara el telèfon es restablirà a la configuració predeterminada de fàbrica."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Has dibuixat el patró de desbloqueig <xliff:g id="NUMBER_0">%d</xliff:g> vegades de manera incorrecta. Després de <xliff:g id="NUMBER_1">%d</xliff:g> intents incorrectes més, se\'t demanarà que desbloquegis la tauleta amb un compte de correu electrònic."\n\n" Torna-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%d</xliff:g> segons."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Has dibuixat el patró de desbloqueig <xliff:g id="NUMBER_0">%d</xliff:g> vegades de manera incorrecta. Després de <xliff:g id="NUMBER_1">%d</xliff:g> intents incorrectes més, se\'t demanarà que desbloquegis el telèfon amb un compte de correu electrònic."\n\n" Torna-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%d</xliff:g> segons."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Elimina"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Vols augmentar el volum per sobre del nivell de seguretat?"\n"Escoltar música a un volum alt durant períodes llargs pot perjudicar l\'oïda."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Mantén premuts els dos dits per activar l\'accessibilitat."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"S\'ha activat l\'accessibilitat."</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 4a409d369dc3..374a6d5544d9 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Zkusit znovu"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Překročili jste maximální povolený počet pokusů o odemknutí obličejem."</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Nabíjení - <xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"nabito"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Nabito"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Připojte dobíjecí zařízení."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Není vložena SIM karta"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Již jste se <xliff:g id="NUMBER">%d</xliff:g>krát pokusili odemknout telefon nesprávným způsobem. V telefonu se nyní obnoví výchozí tovární nastavení."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Již <xliff:g id="NUMBER_0">%d</xliff:g>krát jste nesprávně nakreslili své heslo odemknutí. Po <xliff:g id="NUMBER_1">%d</xliff:g>dalších neúspěšných pokusech budete požádáni o odemčení tabletu pomocí e-mailového účtu."\n\n" Zkuste to znovu za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Již <xliff:g id="NUMBER_0">%d</xliff:g>krát jste nesprávně nakreslili své heslo odemknutí. Po <xliff:g id="NUMBER_1">%d</xliff:g> dalších neúspěšných pokusech budete požádáni o odemčení telefonu pomocí e-mailového účtu."\n\n" Zkuste to znovu za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Odebrat"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Chcete hlasitost zvýšit nad bezpečnou úroveň?"\n"Dlouhodobý poslech hlasitého zvuku může poškodit sluch."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Usnadnění zapnete dlouhým stisknutím dvěma prsty."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Usnadnění přístupu je aktivováno."</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 6c64c694b218..b0fcf8b75b2b 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Prøv igen"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Det maksimale antal forsøg på at bruge Ansigtslås er overskredet"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Oplader, <xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Opladt."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Opladet"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Tilslut din oplader."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Intet SIM-kort"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Du har forsøgt at låse telefonen op forkert <xliff:g id="NUMBER">%d</xliff:g> gange. Telefonen nulstilles til fabriksindstillingerne."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Du har tegnet dit oplåsningsmønster forkert <xliff:g id="NUMBER_0">%d</xliff:g> gange. Efter <xliff:g id="NUMBER_1">%d</xliff:g> yderligere mislykkede forsøg vil du blive bedt om at låse din tablet op ved hjælp af en e-mailkonto"\n\n" Prøv igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Du har tegnet dit oplåsningsmønster forkert <xliff:g id="NUMBER_0">%d</xliff:g> gange. Efter <xliff:g id="NUMBER_1">%d</xliff:g> yderligere mislykkede forsøg til vil du blive bedt om at låse din telefon op ved hjælp af en e-mailkonto."\n\n" Prøv igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Fjern"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Skal lydstyrken være over det sikre niveau?"\n"Du kan skade din hørelse ved at lytte ved høj lydstyrke i længere tid."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Hold fortsat to fingre nede for at aktivere tilgængelighed."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Tilgængelighed aktiveret."</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index fc12d90462d3..b4f87efba63f 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -591,7 +591,7 @@
<string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD-Karteninhalte ändern oder löschen"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Ermöglicht der App, in den USB-Speicher zu schreiben"</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Ermöglicht der App, auf die SD-Karte zu schreiben"</string>
- <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"Intern. Mediensp. änd./löschen"</string>
+ <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"Internen Medienspeicher ändern/löschen"</string>
<string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"Ermöglicht der App, den Inhalt des internen Medienspeichers zu ändern"</string>
<string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"Auf externen Speicher aller Nutzer zugreifen"</string>
<string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"Ermöglicht der App, auf externen Speicher aller Nutzer zuzugreifen."</string>
@@ -762,9 +762,9 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Erneut versuchen"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Die maximal zulässige Anzahl an Face Unlock-Versuchen wurde überschritten."</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Wird geladen... (<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>)"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Aufgeladen"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Aufgeladen"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_low_battery" msgid="1482873981919249740">"Bitte Ladegerät anschließen"</string>
+ <string name="lockscreen_low_battery" msgid="1482873981919249740">"Ladegerät anschließen"</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Keine SIM-Karte"</string>
<string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"Keine SIM-Karte im Tablet"</string>
<string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"Keine SIM-Karte im Telefon"</string>
@@ -812,8 +812,8 @@
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Muster abgeschlossen"</string>
<string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget hinzufügen"</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Leer"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Entsperrter Bereich maximiert"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Entsperrten Bereich minimieren"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Entsperr-Bereich maximiert"</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Entsperr-Bereich mminimiert"</string>
<string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>"</string>
<string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Nutzerauswahl"</string>
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"Status"</string>
@@ -822,21 +822,14 @@
<string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Neuordnung der Widgets gestartet"</string>
<string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Neuordnung der Widgets abgeschlossen"</string>
<string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> gelöscht"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Entsperrten Bereich maximieren"</string>
- <!-- no translation found for keyguard_accessibility_slide_unlock (2959928478764697254) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pattern_unlock (1490840706075246612) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_face_unlock (4817282543351718535) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_unlock (2469687111784035046) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_password_unlock (7675777623912155089) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pattern_area (7679891324509597904) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_slide_area (6736064494019979544) -->
- <skip />
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Entsperr-Bereich maximieren"</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Entsperrung mit Fingerbewegung"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Entsperrung mit Muster"</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face Unlock"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Entsperrung mit PIN"</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Entsperrung mit Passwort"</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Bereich für Muster"</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Bereich für Fingerbewegung"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -1353,7 +1346,7 @@
<string name="data_usage_warning_body" msgid="2814673551471969954">"Für Verbrauch/Einstell. berühren"</string>
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-/3G-Daten deaktiviert"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G-Daten deaktiviert"</string>
- <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobile Daten deaktiviert"</string>
+ <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobilfunk deaktiviert"</string>
<string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"WLAN-Daten deaktiviert"</string>
<string name="data_usage_limit_body" msgid="3317964706973601386">"Zum Aktivieren berühren"</string>
<string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-/3G-Datenlimit überschritten"</string>
@@ -1443,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Sie haben <xliff:g id="NUMBER">%d</xliff:g>-mal erfolglos versucht, das Telefon zu entsperren. Das Telefon wird nun auf die Werkseinstellungen zurückgesetzt."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Sie haben Ihr Entsperrungsmuster <xliff:g id="NUMBER_0">%d</xliff:g>-mal falsch gezeichnet. Nach <xliff:g id="NUMBER_1">%d</xliff:g> weiteren erfolglosen Versuchen werden Sie aufgefordert, Ihr Tablet mithilfe eines E-Mail-Kontos zu entsperren."\n\n" Versuchen Sie es in <xliff:g id="NUMBER_2">%d</xliff:g> Sekunden erneut."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Sie haben Ihr Entsperrungsmuster <xliff:g id="NUMBER_0">%d</xliff:g>-mal falsch gezeichnet. Nach <xliff:g id="NUMBER_1">%d</xliff:g> weiteren erfolglosen Versuchen werden Sie aufgefordert, Ihr Telefon mithilfe eines E-Mail-Kontos zu entsperren."\n\n" Versuchen Sie es in <xliff:g id="NUMBER_2">%d</xliff:g> Sekunden erneut."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Entfernen"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Lautstärke höher als Schwellenwert stellen?"\n"Wenn Sie über längere Zeiträume hinweg Musik in hoher Lautstärke hören, kann dies Ihr Gehör schädigen."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Drücken Sie mit zwei Fingern, um die Bedienungshilfen zu aktivieren."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Bedienungshilfen aktiviert"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index b2a2bbde1bdc..32d6d3d0ca09 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Προσπαθήστε ξανά"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Έγινε υπέρβαση του μέγιστου αριθμού προσπαθειών Face Unlock"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Φόρτιση, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Φορτίστηκε."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Χρεώθηκε"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Συνδέστε τον φορτιστή."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Δεν υπάρχει κάρτα SIM"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Προσπαθήσατε να ξεκλειδώσετε εσφαλμένα το τηλέφωνο <xliff:g id="NUMBER">%d</xliff:g> φορές. Το τηλέφωνο θα επαναφερθεί στις εργοστασιακές ρυθμίσεις."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Σχεδιάσατε το μοτίβο ξεκλειδώματος εσφαλμένα <xliff:g id="NUMBER_0">%d</xliff:g> φορές. Μετά από <xliff:g id="NUMBER_1">%d</xliff:g> ανεπιτυχείς προσπάθειες ακόμη, θα σας ζητηθεί να ξεκλειδώσετε το tablet σας με τη χρήση ενός λογαριασμού ηλεκτρονικού ταχυδρομείου."\n\n" Δοκιμάστε να συνδεθείτε ξανά σε <xliff:g id="NUMBER_2">%d</xliff:g> δευτερόλεπτα."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Σχεδιάσατε το μοτίβο ξεκλειδώματος εσφαλμένα <xliff:g id="NUMBER_0">%d</xliff:g> φορές. Μετά από <xliff:g id="NUMBER_1">%d</xliff:g> ανεπιτυχείς προσπάθειες ακόμη, θα σας ζητηθεί να ξεκλειδώσετε το τηλέφωνό σας με τη χρήση ενός λογαριασμού ηλεκτρονικού ταχυδρομείου."\n\n" Δοκιμάστε ξανά σε <xliff:g id="NUMBER_2">%d</xliff:g> δευτερόλεπτα."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Κατάργηση"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Αύξηση έντασης ήχου πάνω από το επίπεδο ασφαλείας;"\n"Αν ακούτε μουσική σε υψηλή ένταση για μεγάλο χρονικό διάστημα ενδέχεται να προκληθεί βλάβη στην ακοή σας."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Αγγίξτε παρατεταμένα με δύο δάχτυλα για να ενεργοποιήσετε τη λειτουργία προσβασιμότητας."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Ενεργοποιήθηκε η προσβασιμότητα."</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 260e93188c72..888e42e995d2 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Try again"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Maximum Face Unlock attempts exceeded"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Charging, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Charged."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Charged"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Connect your charger."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"No SIM card"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. The phone will now be reset to factory default."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%d</xliff:g> times. After <xliff:g id="NUMBER_1">%d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account."\n\n" Try again in <xliff:g id="NUMBER_2">%d</xliff:g> seconds."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%d</xliff:g> times. After <xliff:g id="NUMBER_1">%d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account."\n\n" Try again in <xliff:g id="NUMBER_2">%d</xliff:g> seconds."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Remove"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Raise volume above safe level?"\n"Listening at high volume for long periods may damage your hearing."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Keep holding down two fingers to enable accessibility."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Accessibility enabled."</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index a4c72c0e8fe5..47d436d53644 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Volver a intentarlo"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Se superó el máximo de intentos permitido para el desbloqueo facial del dispositivo."</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Cargando <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Cargado."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Cargado"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Conecta tu cargador."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"No hay tarjeta SIM."</string>
@@ -810,26 +810,26 @@
<string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Se eliminó el patrón"</string>
<string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Se agregó una celda."</string>
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Se completó el patrón"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Agrega un widget."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Agregar widget"</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vacío"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Se expandió el área desbloqueada."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"El área desbloqueada colapsó."</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Área desbloqueada expandida."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"El área desbloqueada se contrajo."</string>
<string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget"</string>
<string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Selector de usuarios"</string>
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"Estado"</string>
<string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Cámara"</string>
<string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Controles de medios"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"El reordenamiento de widget ha empezado."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"El reordenamiento de widget ha finalizado."</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Se comenzaron a reordenar los widgets."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Se terminaron de reordenar los widgets."</string>
<string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> eliminado"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Expandir el área desbloqueada."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Desbloqueo por desliz"</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Expandir el área desbloqueada"</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Desbloqueo por deslizamiento"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueo por patrón"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueo facial"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueo por PIN"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueo por contraseña"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Área de patrón"</string>
- <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Área de desliz"</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Área de deslizamiento"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Intentaste desbloquear el dispositivo <xliff:g id="NUMBER">%d</xliff:g> veces, pero no lo lograste. Se restablecerán los valores predeterminados de fábrica del dispositivo."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Dibujaste incorrectamente tu patrón de desbloqueo <xliff:g id="NUMBER_0">%d</xliff:g> veces. Luego de <xliff:g id="NUMBER_1">%d</xliff:g> intentos incorrectos más, se te solicitará que desbloquees tu tableta mediante el uso de una cuenta de correo."\n\n" Vuelve a intentarlo en <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Dibujaste incorrectamente tu patrón de desbloqueo <xliff:g id="NUMBER_0">%d</xliff:g> veces. Luego de <xliff:g id="NUMBER_1">%d</xliff:g> intentos incorrectos más, se te solicitará que desbloquees tu dispositivo mediante el uso de una cuenta de correo."\n\n" Vuelve a intentarlo en <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Eliminar"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"¿Aumentar el volumen por encima del nivel seguro?"\n"Si escuchas con el volumen alto durante períodos prolongados, puedes dañar tu audición."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Mantén presionado con dos dedos para activar la accesibilidad."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Se activó la accesibilidad."</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 2172c003e8d1..c129483569f2 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Vuelve a intentarlo"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Se ha superado el número máximo de intentos de desbloqueo facial."</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Cargando (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Cargado"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Cargado"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Conecta el cargador"</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Falta la tarjeta SIM."</string>
@@ -822,12 +822,12 @@
<string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Se ha empezado a cambiar el orden de los widgets."</string>
<string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Se ha terminado de cambiar el orden de los widgets."</string>
<string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> eliminado"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Ampliar área desbloqueada"</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Ampliar área de desbloqueo"</string>
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Desbloqueo deslizando el dedo"</string>
- <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueo mediante patrón"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueo por patrón"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueo facial"</string>
- <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueo mediante PIN"</string>
- <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueo mediante contraseña"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueo por PIN"</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueo por contraseña"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Área de patrón"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Área para deslizar"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Has intentado desbloquear el teléfono <xliff:g id="NUMBER">%d</xliff:g> veces, pero no lo has conseguido. Se restablecerán los datos de fábrica del dispositivo."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Has fallado <xliff:g id="NUMBER_0">%d</xliff:g> veces al dibujar el patrón de desbloqueo. Si fallas otras <xliff:g id="NUMBER_1">%d</xliff:g> veces, deberás usar una cuenta de correo electrónico para desbloquear el tablet."\n\n" Inténtalo de nuevo en <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Has fallado <xliff:g id="NUMBER_0">%d</xliff:g> veces al dibujar el patrón de desbloqueo. Si fallas otras <xliff:g id="NUMBER_1">%d</xliff:g> veces, deberás usar una cuenta de correo electrónico para desbloquear el teléfono."\n\n" Inténtalo de nuevo en <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Eliminar"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"¿Subir el volumen por encima del nivel de seguridad?"\n"Escuchar sonidos a alto volumen durante largos períodos de tiempo puede dañar tus oídos."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Mantén la pantalla pulsada con dos dedos para habilitar las funciones de accesibilidad."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Accesibilidad habilitada"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index ac154203c8e6..5fb21d41c4c3 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Proovige uuesti"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Maksimaalne teenusega Face Unlock avamise katsete arv on ületatud"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Laadimine, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Laetud."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Laetud"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Ühendage laadija."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM-kaarti pole"</string>
@@ -819,8 +819,8 @@
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"Olek"</string>
<string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kaamera"</string>
<string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Meedia juhtnupud"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Vidina ümberkorraldamine on alanud."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Vidina ümberkorraldamine on lõppenud."</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Vidina ümberkorraldamine algas."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Vidina ümberkorraldamine lõppes."</string>
<string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Vidin <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> on kustutatud."</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Avamisala laiendamine."</string>
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Lohistamisega avamine."</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Olete püüdnud telefoni <xliff:g id="NUMBER">%d</xliff:g> korda valesti avada. Telefon lähtestatakse nüüd tehase vaikeseadetele."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Joonistasite oma avamismustri <xliff:g id="NUMBER_0">%d</xliff:g> korda valesti. Pärast veel <xliff:g id="NUMBER_1">%d</xliff:g> ebaõnnestunud katset palutakse teil tahvelarvuti avada meilikontoga."\n\n" Proovige uuesti <xliff:g id="NUMBER_2">%d</xliff:g> sekundi pärast."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Joonistasite oma avamismustri <xliff:g id="NUMBER_0">%d</xliff:g> korda valesti. Pärast veel <xliff:g id="NUMBER_1">%d</xliff:g> ebaõnnestunud katset palutakse teil telefon avada meilikontoga."\n\n" Proovige uuesti <xliff:g id="NUMBER_2">%d</xliff:g> sekundi pärast."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Eemalda"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Kas suurendada helitugevust üle ohutu piiri?"\n"Pikaajaline suure helitugevusega muusika kuulamine võib kahjustada kuulmist."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Hõlbustuse lubamiseks hoidke kaht sõrme all."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Hõlbustus on lubatud."</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 76fd591ab4d7..50d62b9b3d7c 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"دوباره امتحان کنید"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"دفعات تلاش برای Face Unlock از حداکثر مجاز بیشتر شد"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"در حال شارژ، <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"شارژ شد."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"شارژ شد"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"شارژر خود را متصل کنید."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"سیم کارت موجود نیست"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"شما به اشتباه <xliff:g id="NUMBER">%d</xliff:g> بار اقدام به باز کردن قفل تلفن کرده‌اید. این تلفن اکنون به پیش‌فرض کارخانه بازنشانی می‌شود."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"شما الگوی بازگشایی قفل خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه کشیده‎اید. بعد از <xliff:g id="NUMBER_1">%d</xliff:g> تلاش ناموفق، از شما خواسته می‎شود که با استفاده از یک حساب ایمیل قفل رایانه لوحی خود را باز کنید."\n\n" لطفاً پس از <xliff:g id="NUMBER_2">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"شما الگوی بازگشایی قفل خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه کشیده‌اید. پس از <xliff:g id="NUMBER_1">%d</xliff:g> تلاش ناموفق، از شما خواسته می‎شود که با استفاده از یک حساب ایمیل قفل تلفن خود را باز کنید."\n\n" لطفاً پس از <xliff:g id="NUMBER_2">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"برداشتن"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"صدا به بالاتر از سطح ایمن افزایش یابد؟"\n"گوش دادن به صدای بلند برای زمان‌های طولانی می‌تواند به شنوایی شما آسیب برساند."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"برای فعال کردن قابلیت دسترسی، با دو انگشت خود همچنان به طرف پایین فشار دهید."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"قابلیت دسترسی فعال شد."</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 9da7d3d5fbb5..2b08bea2ffcb 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Yritä uudelleen"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Face Unlock -yrityksiä tehty suurin sallittu määrä."</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Ladataan (<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>)"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Ladattu."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Täynnä"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Kytke laturi."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Ei SIM-korttia"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Puhelimen lukituksen poisto epäonnistui <xliff:g id="NUMBER">%d</xliff:g> kertaa. Puhelimeen palautetaan nyt tehdasasetukset."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Piirsit lukituksenpoistokuvion väärin <xliff:g id="NUMBER_0">%d</xliff:g> kertaa. Jos piirrät kuvion väärin vielä <xliff:g id="NUMBER_1">%d</xliff:g> kertaa, sinua pyydetään poistamaan tablet-laitteesi lukitus sähköpostitilin avulla."\n\n" Yritä uudelleen <xliff:g id="NUMBER_2">%d</xliff:g> sekunnin kuluttua."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Piirsit lukituksenpoistokuvion väärin <xliff:g id="NUMBER_0">%d</xliff:g> kertaa. Jos piirrät kuvion väärin vielä <xliff:g id="NUMBER_1">%d</xliff:g> kertaa, sinua pyydetään poistamaan puhelimesi lukitus sähköpostitilin avulla."\n\n" Yritä uudelleen <xliff:g id="NUMBER_2">%d</xliff:g> sekunnin kuluttua."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Poista"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Nostetaanko äänenvoimakkuus turvallista tasoa voimakkaammaksi?"\n"Jos kuuntelet suurella äänenvoimakkuudella pitkiä aikoja, kuulosi voi vahingoittua."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Ota esteettömyystila käyttöön koskettamalla pitkään kahdella sormella."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Esteettömyystila käytössä."</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index b92d4bf25f3c..479fe1822ec5 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Veuillez réessayer."</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Nombre maximal autorisé de tentatives Face Unlock atteint."</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"En charge (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Chargé"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Chargé"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Branchez votre chargeur."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Aucune carte SIM"</string>
@@ -812,31 +812,24 @@
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Schéma terminé."</string>
<string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ajouter un widget"</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vide"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Développement de la zone de déverrouillage"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Réduction de la zone de déverrouillage"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Zone de déverrouillage développée."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Zone de déverrouillage réduite."</string>
<string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>"</string>
<string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Sélecteur d\'utilisateur"</string>
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"État"</string>
<string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Caméra"</string>
<string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Commandes multimédias"</string>
<string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Début de la réorganisation des widgets"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Fin de la réorganisation des widgets"</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Réorganisation des widgets terminée."</string>
<string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Le widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> a été supprimé."</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Développer la zone de déverrouillage"</string>
- <!-- no translation found for keyguard_accessibility_slide_unlock (2959928478764697254) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pattern_unlock (1490840706075246612) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_face_unlock (4817282543351718535) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_unlock (2469687111784035046) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_password_unlock (7675777623912155089) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pattern_area (7679891324509597904) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_slide_area (6736064494019979544) -->
- <skip />
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Déverrouillage en faisant glisser votre doigt sur l\'écran"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Déverrouillage par schéma"</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Déverrouillage par reconnaissance faciale"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Déverrouillage par code PIN"</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Déverrouillage par mot de passe"</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Zone du schéma"</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Zone où faire glisser votre doigt sur l\'écran"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -1443,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Sa configuration d\'usine va être rétablie."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%d</xliff:g> fois, vous devrez déverrouiller votre tablette à l\'aide d\'un compte de messagerie électronique."\n\n" Veuillez réessayer dans <xliff:g id="NUMBER_2">%d</xliff:g> secondes."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%d</xliff:g> fois, vous devrez déverrouiller votre téléphone à l\'aide d\'un compte de messagerie électronique."\n\n" Veuillez réessayer dans <xliff:g id="NUMBER_2">%d</xliff:g> secondes."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Supprimer"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Augmenter le volume au-dessus du niveau de sécurité ?"\n"L\'écoute à un volume élevé pendant des périodes prolongées peut endommager votre audition."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Pour activer l\'accessibilité, appuyez de manière prolongée avec deux doigts."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"L\'accessibilité a bien été activée."</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 57d3ed64e632..65aa56357484 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"पुनः प्रयास करें"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"फेस अनलॉक के अधिकतम प्रयासों की सीमा पार हो गई"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"चार्ज हो रही है, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"चार्ज हो चुकी है."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"चार्ज हो गया"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"अपना चार्जर कनेक्‍ट करें."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"कोई सिम कार्ड नहीं है"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"आप फ़ोन को अनलॉक करने के लिए <xliff:g id="NUMBER">%d</xliff:g> बार गलत तरीके से प्रयास कर चुके हैं. फ़ोन अब फ़ैक्टरी डिफ़ॉल्ट पर रीसेट हो जाएगा."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"आपने अपने अनलॉक प्रतिमान को <xliff:g id="NUMBER_0">%d</xliff:g> बार गलत तरीके से आरेखित किया है. <xliff:g id="NUMBER_1">%d</xliff:g> और असफल प्रयासों के बाद, आपसे अपने टेबलेट को किसी ईमेल खाते के उपयोग से अनलॉक करने के लिए कहा जाएगा."\n\n" <xliff:g id="NUMBER_2">%d</xliff:g> सेकंड में पुन: प्रयास करें."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"आपने अपने अनलॉक प्रतिमान को <xliff:g id="NUMBER_0">%d</xliff:g> बार गलत तरीके से आरेखित किया है. <xliff:g id="NUMBER_1">%d</xliff:g> और असफल प्रयासों के बाद, आपसे अपने फ़ोन को किसी ईमेल खाते का उपयोग करके अनलॉक करने के लिए कहा जाएगा."\n\n" <xliff:g id="NUMBER_2">%d</xliff:g> सेकंड में पुन: प्रयास करें."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"निकालें"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"वॉल्यूम को सुरक्षित स्तर से अधिक करें?"\n"अधिक देर तक उच्च वॉल्यूम पर सुनने से आपकी सुनने की क्षमता को नुकसान हो सकता है."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"पहुंच-योग्यता को सक्षम करने के लिए दो अंगुलियों से नीचे दबाए रखें."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"पहुंच-योग्यता सक्षम कर दी है."</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 245aefb82665..e279216c8b4a 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Pokušajte ponovo"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Premašen je maksimalni broj Otključavanja licem"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Punjenje, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Napunjeno."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Napunjeno"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Priključite punjač."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Nema SIM kartice"</string>
@@ -823,13 +823,13 @@
<string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Završena je promjena redoslijeda widgeta."</string>
<string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> izbrisan je."</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Proširivanje područja za otključavanje."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Otključavanje kliženjem."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Otključavanje klizanjem."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Uzorak za otključavanje."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Otključavanje licem."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Otključavanje PIN-om."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Otključavanje zaporkom."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Područje uzorka."</string>
- <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Područje kliženja."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Područje klizanja."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Netočno ste pokušali otključati telefon <xliff:g id="NUMBER">%d</xliff:g> puta. Sada će se vratiti na tvorničke postavke."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Netočno ste iscrtali obrazac za otključavanje <xliff:g id="NUMBER_0">%d</xliff:g> puta. Nakon još ovoliko neuspješnih pokušaja: <xliff:g id="NUMBER_1">%d</xliff:g> morat ćete otključati tabletno računalo pomoću računa e-pošte."\n\n" Pokušajte ponovo za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Netočno ste iscrtali obrazac za otključavanje <xliff:g id="NUMBER_0">%d</xliff:g> puta. Nakon još ovoliko neuspješnih pokušaja: <xliff:g id="NUMBER_1">%d</xliff:g> morat ćete otključati telefon pomoću računa e-pošte."\n\n" Pokušajte ponovo za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Ukloni"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Pojačati iznad sigurne razine?"\n"Dulje slušanje preglasne glazbe može vam oštetiti sluh."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Nastavite držati s dva prsta kako biste omogućili pristupačnost."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Dostupnost je omogućena."</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index a97b93ec9925..88f4046fedc1 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Újra"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Elérte az arcalapú feloldási kísérletek maximális számát"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Töltés (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Feltöltve."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Feltöltve"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Csatlakoztassa a töltőt."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Nincs SIM kártya."</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"A telefont <xliff:g id="NUMBER">%d</xliff:g> alkalommal próbálta meg sikertelenül feloldani. A rendszer visszaállítja a telefon gyári alapértelmezett beállításait."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"<xliff:g id="NUMBER_0">%d</xliff:g> alkalommal helytelenül rajzolta le a feloldási mintát. További <xliff:g id="NUMBER_1">%d</xliff:g> sikertelen kísérlet után egy e-mail fiók használatával kell feloldania a táblagépét."\n\n" Kérjük, próbálja újra <xliff:g id="NUMBER_2">%d</xliff:g> másodperc múlva."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"<xliff:g id="NUMBER_0">%d</xliff:g> alkalommal helytelenül rajzolta le a feloldási mintát. További <xliff:g id="NUMBER_1">%d</xliff:g> sikertelen kísérlet után egy e-mail fiók használatával kell feloldania a telefonját."\n\n" Kérjük, próbálja újra <xliff:g id="NUMBER_2">%d</xliff:g> másodperc múlva."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Eltávolítás"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"A biztonságos szint fölé emeli a hangerőt?"\n"Ha hosszú ideig hangosan hallgatja a zenét, az károsíthatja a hallását."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Továbbra is tartsa lenyomva két ujját a hozzáférés engedélyezéséhez."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Hozzáférés engedélyezve"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 69ac54f1acae..b5dfcd51170a 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Coba lagi"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Percobaan Face Unlock melebihi batas maksimum"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Mengisi daya, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Terisi."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Terisi"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Hubungkan pengisi daya."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Tidak ada kartu SIM"</string>
@@ -813,7 +813,7 @@
<string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Tambahkan widget."</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Kosong"</string>
<string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Area buka kunci diluaskan."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Area buka kunci dihapus."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Area buka kunci diciutkan."</string>
<string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
<string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Pemilih pengguna"</string>
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"Status"</string>
@@ -823,11 +823,11 @@
<string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Pengurutan ulang widget berakhir."</string>
<string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> dihapus."</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Luaskan area buka kunci."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Buka kunci geser."</string>
- <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Buka kunci pola."</string>
- <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Buka kunci wajah."</string>
- <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Buka kunci pin."</string>
- <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Buka kunci sandi."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Buka kunci dengan menggeser."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Buka kunci dengan pola."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Buka kunci dengan face unlock."</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Buka kunci dengan PIN."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Buka kunci dengan sandi."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Area pola."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Area geser."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Anda telah <xliff:g id="NUMBER">%d</xliff:g> kali gagal saat berusaha untuk membuka kunci ponsel. Kini ponsel akan disetel ulang ke setelan default pabrik."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Anda telah <xliff:g id="NUMBER_0">%d</xliff:g> kali salah menggambar pola pembuka kunci. Setelah <xliff:g id="NUMBER_1">%d</xliff:g> lagi upaya gagal, Anda akan diminta membuka kunci tablet menggunakan akun email."\n\n"Coba lagi dalam <xliff:g id="NUMBER_2">%d</xliff:g> detik."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Anda telah <xliff:g id="NUMBER_0">%d</xliff:g> kali salah menggambar pola pembuka kunci. Setelah <xliff:g id="NUMBER_1">%d</xliff:g> lagi upaya gagal, Anda akan diminta membuka kunci ponsel menggunakan akun email."\n\n"Coba lagi dalam <xliff:g id="NUMBER_2">%d</xliff:g> detik."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Hapus"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Naikkan volume di atas tingkat aman?"\n"Mendengarkan volume tinggi dalam jangka waktu yang lama dapat merusak pendengaran Anda."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Tahan terus dua jari untuk mengaktifkan aksesibilitas."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Aksesibilitas diaktifkan."</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 2e4dfe41d9b6..0edb0c1348f9 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Riprova"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Numero massimo di tentativi di Sblocco col sorriso superato"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"In carica (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Carico."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Carica"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Collegare il caricabatterie."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Nessuna scheda SIM"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"<xliff:g id="NUMBER">%d</xliff:g> tentativi errati di sblocco del telefono. Il telefono verrà sottoposto a un ripristino dei dati di fabbrica."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"<xliff:g id="NUMBER_0">%d</xliff:g> tentativi errati di inserimento della sequenza di sblocco. Dopo altri <xliff:g id="NUMBER_1">%d</xliff:g> tentativi falliti, ti verrà chiesto di sbloccare il tablet con un account email."\n\n" Riprova tra <xliff:g id="NUMBER_2">%d</xliff:g> secondi."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"<xliff:g id="NUMBER_0">%d</xliff:g> tentativi errati di inserimento della sequenza di sblocco. Dopo altri <xliff:g id="NUMBER_1">%d</xliff:g> tentativi falliti, ti verrà chiesto di sbloccare il telefono con un account email."\n\n" Riprova tra <xliff:g id="NUMBER_2">%d</xliff:g> secondi."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Rimuovi"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Aumentare il volume oltre il livello di sicurezza?"\n"Ascoltare musica ad alto volume per lunghi periodi potrebbe danneggiare l\'udito."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Continua a tenere premuto con due dita per attivare l\'accessibilità."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Accessibilità attivata."</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 58e1d255e93c..bb6a3ac17c7c 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"נסה שוב"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"חרגת ממספר הניסיונות המרבי של זיהוי פרצוף"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"טוען (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"נטען."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"טעון"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"חבר את המטען."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"אין כרטיס SIM"</string>
@@ -825,7 +825,7 @@
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"הרחב את אזור ביטול הנעילה."</string>
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"ביטול נעילה באמצעות הסטה."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ביטול נעילה באמצעות ציור קו."</string>
- <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"זיהוי פרצוף."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ביטול נעילה באמצעות זיהוי פרצוף."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ביטול נעילה באמצעות מספר PIN."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ביטול נעילה באמצעות סיסמה."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"אזור ציור קו."</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"ביצעת <xliff:g id="NUMBER">%d</xliff:g> ניסיונות שגויים לביטול נעילת הטלפון. הטלפון יעבור כעת איפוס לברירת המחדל של היצרן."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"שרטטת את קו ביטול הנעילה באופן שגוי <xliff:g id="NUMBER_0">%d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטאבלט באמצעות חשבון דוא\"ל‏."\n\n"נסה שוב בעוד <xliff:g id="NUMBER_2">%d</xliff:g> שניות."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"שרטטת את קו ביטול הנעילה באופן שגוי <xliff:g id="NUMBER_0">%d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטלפון באמצעות חשבון דוא\"ל‏."\n\n"נסה שוב בעוד <xliff:g id="NUMBER_2">%d</xliff:g> שניות."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"הסר"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"האם להעלות את עוצמת הקול מעל לרמה הבטוחה?"\n"האזנה בעוצמת קול גבוהה למשך זמן ארוך עלולה לפגוע בשמיעה."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"המשך לגעת בשתי אצבעות כדי להפעיל נגישות."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"נגישות הופעלה."</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 8abee85b8def..8af0fed182c3 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"もう一度お試しください"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"フェイスアンロックの最大試行回数を超えました"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"充電しています: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"充電完了"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"充電完了"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"充電してください"</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIMカードが挿入されていません"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"携帯端末のロック解除を<xliff:g id="NUMBER">%d</xliff:g>回失敗しました。端末は出荷時設定にリセットされます。"</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、タブレットのロック解除にメールアカウントが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒以内にもう一度お試しください。"</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、携帯端末のロック解除にメールアカウントが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒以内にもう一度お試しください。"</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" - "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"削除"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"安全レベルを超えるまで音量を上げますか?"\n"大音量で長時間聞き続けると、聴力を損なう恐れがあります。"</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"ユーザー補助機能を有効にするには2本の指で押し続けてください。"</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"ユーザー補助が有効になりました。"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index d640481f749e..37c6b01fb53e 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"다시 시도"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"얼굴 인식 잠금해제 최대 시도 횟수를 초과했습니다."</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"충전 중(<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"충전되었습니다."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"충전됨"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"충전기를 연결하세요."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM 카드가 없습니다."</string>
@@ -812,8 +812,8 @@
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"패턴 완료"</string>
<string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"위젯 추가"</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"비어 있음"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"잠금 해제 지역 확장됨"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"잠금 해제 지역 축소됨"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"잠금 해제 영역 확장됨"</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"잠금 해제 영역 축소됨"</string>
<string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> 위젯"</string>
<string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"사용자 선택기"</string>
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"상태"</string>
@@ -821,8 +821,8 @@
<string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"미디어 조정"</string>
<string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"위젯 재정렬 시작됨"</string>
<string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"위젯 재정렬 완료됨"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"위젯 <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>이(가) 삭제됨"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"잠금 해제 지역 확장"</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> 위젯이 삭제됨"</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"잠금 해제 영역 확장"</string>
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"슬라이드하여 잠금해제합니다."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"패턴을 사용하여 잠금해제합니다."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"얼굴 인식을 사용하여 잠금해제합니다."</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"휴대전화를 잠금해제하려는 시도가 <xliff:g id="NUMBER">%d</xliff:g>회 잘못되었습니다. 휴대전화가 초기화됩니다."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"잠금해제 패턴을 <xliff:g id="NUMBER_0">%d</xliff:g>회 잘못 그렸습니다. <xliff:g id="NUMBER_1">%d</xliff:g>회 더 실패하면 이메일 계정을 사용하여 태블릿을 잠금해제해야 합니다."\n\n" <xliff:g id="NUMBER_2">%d</xliff:g>초 후에 다시 시도해 주세요."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"잠금해제 패턴을 <xliff:g id="NUMBER_0">%d</xliff:g>회 잘못 그렸습니다. <xliff:g id="NUMBER_1">%d</xliff:g>회 더 실패하면 이메일 계정을 사용하여 휴대전화를 잠금해제해야 합니다."\n\n" <xliff:g id="NUMBER_2">%d</xliff:g>초 후에 다시 시도해 주세요."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"삭제"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"안전한 수준 이상으로 볼륨을 높이시겠습니까?"\n"높은 볼륨으로 장시간 청취하면 청력에 손상이 올 수 있습니다."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"두 손가락으로 길게 누르면 접근성을 사용하도록 설정됩니다."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"접근성을 사용 설정했습니다."</string>
diff --git a/core/res/res/values-land/alias.xml b/core/res/res/values-land/alias.xml
new file mode 100644
index 000000000000..eac5ece14521
--- /dev/null
+++ b/core/res/res/values-land/alias.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/common/assets/res/any/colors.xml
+**
+** Copyright 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.
+*/
+-->
+<resources>
+ <!-- Alias used to reference one of two possible layouts in keyguard. -->
+ <item type="layout" name="keyguard_eca">@android:layout/keyguard_emergency_carrier_area_empty</item>
+</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 1dc3f54cc2fa..f2ad50441937 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Bandykite dar kartą"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Viršijote maksimalų atrakinimo pagal veidą bandymų skaičių"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Įkraunama, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Įkrauta."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Įkrauta"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Prijunkite kroviklį."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Nėra SIM kortelės"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"<xliff:g id="NUMBER">%d</xliff:g> k. bandėte netinkamai atrakinti telefoną. Telefone bus iš naujo nustatyti numatytieji gamyklos nustatymai."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Netinkamai nupiešėte atrakinimo piešinį <xliff:g id="NUMBER_0">%d</xliff:g> k. Po dar <xliff:g id="NUMBER_1">%d</xliff:g> nesėkm. band. būsite paprašyti atrakinti planšetinį kompiuterį naudodami „Google“ prisijungimo duomenis."\n\n" Bandykite dar kartą po <xliff:g id="NUMBER_2">%d</xliff:g> sek."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Netinkamai nupiešėte atrakinimo piešinį <xliff:g id="NUMBER_0">%d</xliff:g> k. Po dar <xliff:g id="NUMBER_1">%d</xliff:g> nesėkm. band. būsite paprašyti atrakinti telefoną naudodami „Google“ prisijungimo duomenis."\n\n" Bandykite dar kartą po <xliff:g id="NUMBER_2">%d</xliff:g> sek."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Pašalinti"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Padidinti garsumą viršijant saugų lygį?"\n"Ilgai klausantis dideliu garsumu gali sutrikti klausa."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Laikykite palietę dviem pirštais, kad įgalintumėte pritaikymo neįgaliesiems režimą."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Pritaikymas neįgaliesiems įgalintas."</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index d126477aa497..ee0b023a9e68 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Mēģināt vēlreiz"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Ir pārsniegts maksimālais Autorizācijas pēc sejas mēģinājumu skaits."</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Notiek uzlāde (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Uzlādēts."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Uzlādēts"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Pievienojiet uzlādes ierīci."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Nav SIM kartes"</string>
@@ -812,23 +812,23 @@
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Kombinācija pabeigta"</string>
<string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Pievienot logrīku."</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tukšs"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Atbloķēšanas apgabal ir izvērsts."</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Atbloķēšanas apgabals ir izvērsts."</string>
<string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Atbloķēšanas apgabals ir sakļauts."</string>
<string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Logrīks <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
<string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Lietotāju atlasītājs"</string>
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"Statuss"</string>
<string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
<string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Multivides vadīklas"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Logrīku pārkārtošana ir sākusies."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Logrīku pārkārtošana ir beigusies."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Logrīks <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ir dzēsts."</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Logrīku pārkārtošana ir sākta."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Logrīku pārkārtošana ir pabeigta."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Logrīks <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ir izdzēsts."</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Izvērst atbloķēšanas apgabalu."</string>
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Autorizācija, velkot ar pirkstu."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Autorizācija ar kombināciju."</string>
- <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Autorizācija pēc sejas"</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Autorizācija pēc sejas."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Autorizācija ar PIN kodu."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Autorizācija ar paroli."</string>
- <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Kombinācijas apgabals."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Kombinācijas ievades apgabals."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Apgabals, kur vilkt ar pirkstu."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Jūs nepareizi veicāt tālruņa atbloķēšanu <xliff:g id="NUMBER">%d</xliff:g> reizes. Tālrunī tiks atiestatīti rūpnīcas noklusējuma iestatījumi."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Jūs nepareizi norādījāt atbloķēšanas kombināciju <xliff:g id="NUMBER_0">%d</xliff:g> reizes. Pēc vēl <xliff:g id="NUMBER_1">%d</xliff:g> neveiksmīgiem mēģinājumiem planšetdators būs jāatbloķē, izmantojot e-pasta kontu."\n\n"Mēģiniet vēlreiz pēc <xliff:g id="NUMBER_2">%d</xliff:g> sekundēm."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Jūs nepareizi norādījāt atbloķēšanas kombināciju <xliff:g id="NUMBER_0">%d</xliff:g> reizes. Pēc vēl <xliff:g id="NUMBER_1">%d</xliff:g> neveiksmīgiem mēģinājumiem tālrunis būs jāatbloķē, izmantojot e-pasta kontu."\n\n"Mēģiniet vēlreiz pēc <xliff:g id="NUMBER_2">%d</xliff:g> sekundēm."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">"  — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Noņemt"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Vai palielināt skaļumu virs drošības līmeņa?"\n"Ilgstoši klausoties skaņu lielā skaļumā, var tikt bojāta dzirde."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Lai iespējotu pieejamību, turiet nospiestus divus pirkstus."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Pieejamības režīms ir iespējots."</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 6eb3afc3cc38..e89f70f4590d 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Cuba lagi"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Telah melepasi had cubaan Buka Kunci Wajah"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Mengecas, (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Sudah dicas."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Sudah dicas"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Sambungkan pengecas anda."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Tiada kad SIM"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Anda telah mencuba untuk membuka kunci telefon secara salah sebanyak <xliff:g id="NUMBER">%d</xliff:g> kali. Telefon kini akan ditetapkan semula ke tetapan lalai kilang."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Anda telah tersilap melukis corak buka kunci sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%d</xliff:g> lagi percubaan yang tidak berjaya, anda akan diminta membuka kunci tablet anda menggunakan log masuk Google anda."\n\n" Cuba lagi dalam <xliff:g id="NUMBER_2">%d</xliff:g> saat."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Anda telah tersilap lukis corak buka kunci sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%d</xliff:g> lagi percubaan yang tidak berjaya, anda akan diminta membuka kunci telefon anda menggunakan log masuk Google anda."\n\n" Cuba lagi dalam <xliff:g id="NUMBER_2">%d</xliff:g> saat."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Alih keluar"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Tingkatkan kelantangan di atas tahap selamat?"\n"Mendengar pada kelantangan tinggi untuk tempoh yang panjang boleh merosakkan pendengaran anda."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Teruskan menahan dengan dua jari untuk mendayakan kebolehcapaian."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Kebolehcapaian didayakan."</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index ed8af78fef9a..65014d350f38 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Prøv på nytt"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Du har overskredet grensen for opplåsingsforsøk med Ansiktslås"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Lader, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Fullt ladet"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Oppladet"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Koble til en batterilader."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM-kortet mangler"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Du har oppgitt feil opplåsningspassord for telefonen <xliff:g id="NUMBER">%d</xliff:g> ganger. Telefonen tilbakestilles nå til fabrikkstandard."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Du har tegnet opplåsningsmønsteret feil <xliff:g id="NUMBER_0">%d</xliff:g> ganger. Etter ytterligere <xliff:g id="NUMBER_1">%d</xliff:g> gale forsøk, blir du bedt om å låse opp nettbrettet via en e-postkonto."\n\n" Prøv på nytt om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Du har tegnet opplåsningsmønsteret feil <xliff:g id="NUMBER_0">%d</xliff:g> ganger. Etter ytterligere <xliff:g id="NUMBER_1">%d</xliff:g> gale forsøk, blir du bedt om å låse opp telefonen via en e-postkonto."\n\n" Prøv på nytt om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Fjern"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Vil du øke lydnivået over trygt nivå?"\n"Lytting på høyt lydnivå i lange perioder kan skade hørselen din."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Fortsett å holde nede to fingre for å aktivere tilgjengelighet."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Tilgjengelighet er aktivert."</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 068011430836..21fe1cc1061c 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Nogmaals proberen"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Maximaal aantal pogingen voor Face Unlock overschreden"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Opladen, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Opgeladen."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Opgeladen"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Sluit de oplader aan."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Geen simkaart"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"U heeft <xliff:g id="NUMBER">%d</xliff:g> keer geprobeerd de telefoon op een onjuiste manier te ontgrendelen. De fabrieksinstellingen worden nu hersteld op de telefoon."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"U heeft uw ontgrendelingspatroon <xliff:g id="NUMBER_0">%d</xliff:g> keer onjuist getekend. Na nog eens <xliff:g id="NUMBER_1">%d</xliff:g> mislukte pogingen wordt u gevraagd uw tablet te ontgrendelen via een e-mailaccount."\n\n" Probeer het over <xliff:g id="NUMBER_2">%d</xliff:g> seconden opnieuw."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"U heeft uw ontgrendelingspatroon <xliff:g id="NUMBER_0">%d</xliff:g> keer onjuist getekend. Na nog eens <xliff:g id="NUMBER_1">%d</xliff:g> mislukte pogingen wordt u gevraagd uw telefoon te ontgrendelen via een e-mailaccount."\n\n" Probeer het over <xliff:g id="NUMBER_2">%d</xliff:g> seconden opnieuw."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Verwijderen"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Wilt u het volume verhogen tot boven het aanbevolen geluidsniveau?"\n"Te lang luisteren op een te hoog volume kan leiden tot gehoorbeschadiging."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Blijf het scherm met twee vingers aanraken om toegankelijkheid in te schakelen."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Toegankelijkheid ingeschakeld."</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index d4c5a6a0310b..6f7c072f72ed 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Spróbuj ponownie."</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Przekroczono maksymalną liczbę prób rozpoznania twarzy."</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Ładowanie (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Naładowany."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Naładowana"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Podłącz ładowarkę."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Brak karty SIM"</string>
@@ -810,43 +810,26 @@
<string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Wzór wyczyszczony"</string>
<string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Dodano komórkę."</string>
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Wzór ukończony"</string>
- <!-- no translation found for keyguard_accessibility_add_widget (8273277058724924654) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_widget_empty_slot (1281505703307930757) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_unlock_area_expanded (2278106022311170299) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_unlock_area_collapsed (6366992066936076396) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_widget (6527131039741808240) -->
- <skip />
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Dodaj widżet."</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Puste"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Rozwinięto obszar odblokowania."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Zwinięto obszar odblokowania."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widżet <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
<string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Wybór użytkownika"</string>
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"Stan"</string>
- <!-- no translation found for keyguard_accessibility_camera (8904231194181114603) -->
- <skip />
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Aparat"</string>
<string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Elementy sterujące multimediów"</string>
- <!-- no translation found for keyguard_accessibility_widget_reorder_start (8736853615588828197) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_widget_reorder_end (7170190950870468320) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_widget_deleted (4426204263929224434) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_expand_lock_area (519859720934178024) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_slide_unlock (2959928478764697254) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pattern_unlock (1490840706075246612) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_face_unlock (4817282543351718535) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_unlock (2469687111784035046) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_password_unlock (7675777623912155089) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pattern_area (7679891324509597904) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_slide_area (6736064494019979544) -->
- <skip />
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Rozpoczęto zmienianie kolejności widżetów."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Zakończono zmienianie kolejności widżetów."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Usunięto widżet <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Rozwiń obszar odblokowania."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Odblokowanie przesunięciem."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odblokowanie wzorem."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Rozpoznanie twarzy"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odblokowanie kodem PIN."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Odblokowanie hasłem."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Obszar wzoru."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Obszar przesuwania."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -1453,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Telefon zostanie teraz zresetowany do ustawień fabrycznych."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Po raz <xliff:g id="NUMBER_0">%d</xliff:g> nieprawidłowo narysowałeś wzór odblokowania. Po kolejnych <xliff:g id="NUMBER_1">%d</xliff:g> nieudanych próbach konieczne będzie odblokowanie tabletu przy użyciu danych logowania na konto Google."\n\n" Spróbuj ponownie za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Po raz <xliff:g id="NUMBER_0">%d</xliff:g> nieprawidłowo narysowałeś wzór odblokowania. Po kolejnych <xliff:g id="NUMBER_1">%d</xliff:g> nieudanych próbach konieczne będzie odblokowanie telefonu przy użyciu danych logowania na konto Google."\n\n" Spróbuj ponownie za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Usuń"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Chcesz ustawić głośność powyżej bezpiecznego poziomu?"\n"Słuchanie przy dużym poziomie głośności przez dłuższy czas może doprowadzić do uszkodzenia słuchu."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Aby włączyć ułatwienia dostępu, przytrzymaj dwa palce."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Włączono ułatwienia dostępu."</string>
diff --git a/core/res/res/values-port/alias.xml b/core/res/res/values-port/alias.xml
new file mode 100644
index 000000000000..bf3eecb992ba
--- /dev/null
+++ b/core/res/res/values-port/alias.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/common/assets/res/any/colors.xml
+**
+** Copyright 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.
+*/
+-->
+<resources>
+ <!-- Alias used to reference one of two possible layouts in keyguard. -->
+ <item type="layout" name="keyguard_eca">@android:layout/keyguard_emergency_carrier_area</item>
+</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index e4a2778ce4b2..fd7211ea6e6f 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Tentar novamente"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Excedido o n.º máximo de tentativas de Desbloqueio Através do Rosto"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"A carregar, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Carregado."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Cobrado"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Ligue o carregador."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Nenhum cartão SIM"</string>
@@ -813,14 +813,14 @@
<string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Adicionar widget."</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vazio"</string>
<string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Área de desbloqueio expandida."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Área de desbloqueio comprimida."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Área de desbloqueio minimizada."</string>
<string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget."</string>
<string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Seletor de utilizadores"</string>
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"Estado"</string>
<string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Câmara"</string>
<string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Controlos de multimédia"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Reordenação de widget iniciada."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Reordenação de widget concluída."</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Reordenação de widgets iniciada."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Reordenação de widgets concluída."</string>
<string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> eliminado."</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Expandir área de desbloqueio."</string>
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Desbloqueio através de deslize."</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Tentou desbloquear o telemóvel <xliff:g id="NUMBER">%d</xliff:g> vezes de forma incorreta, pelo que será reposta a predefinição de fábrica."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Depois de mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas sem sucesso, ser-lhe-á pedido para desbloquear o tablet através de uma conta de email."\n\n" Tente novamente dentro de <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Depois de mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email."\n\n" Tente novamente dentro de <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" - "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Remover"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Aumentar o volume acima do nível de segurança?"\n"Ouvir em volume alto durante longos períodos de tempo poderá prejudicar a sua audição."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Mantenha os dois dedos para ativar a acessibilidade."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Acessibilidade ativada."</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 0bb96eebe4fc..ed656fe4e3fe 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Tente novamente"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"O número máximo de tentativas de Desbloqueio por reconhecimento facial foi excedido"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Carregando, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Carregado."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Carregado"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Conecte o seu carregador."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Sem cartão SIM"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Você tentou desbloquear incorretamente o telefone <xliff:g id="NUMBER">%d</xliff:g> vezes. O telefone será redefinido para o padrão de fábrica."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Você desenhou sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas incorretas, será solicitado que você use o login do Google para desbloquear seu tablet."\n\n" Tente novamente em <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Você desenhou sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas incorretas, será solicitado que você use o login do Google para desbloquear."\n\n" Tente novamente em <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Remover"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Aumentar o volume acima do nível seguro?"\n"A audição em volume elevado por períodos longos pode prejudicar sua audição."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Mantenha pressionado com dois dedos para ativar a acessibilidade."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Acessibilidade ativada."</string>
diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml
index 71dadfdae685..0e7aaec5db2c 100644
--- a/core/res/res/values-rm/strings.xml
+++ b/core/res/res/values-rm/strings.xml
@@ -1218,7 +1218,8 @@
<skip />
<!-- no translation found for lockscreen_plugged_in (8057762828355572315) -->
<skip />
- <string name="lockscreen_charged" msgid="4938930459620989972">"Chargià"</string>
+ <!-- no translation found for lockscreen_charged (321635745684060624) -->
+ <skip />
<!-- no translation found for lockscreen_battery_short (4477264849386850266) -->
<skip />
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Connectai Voss chargiader."</string>
@@ -2326,7 +2327,9 @@
<skip />
<!-- no translation found for kg_failed_attempts_almost_at_login (1437638152015574839) -->
<skip />
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
+ <!-- no translation found for kg_text_message_separator (4160700433287233771) -->
+ <skip />
+ <!-- no translation found for kg_reordering_delete_drop_target_text (7899202978204438708) -->
<skip />
<!-- no translation found for safe_media_volume_warning (7382971871993371648) -->
<skip />
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index f3d91932040b..f274acd0a9a3 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Încercaţi din nou"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"S-a depăşit numărul maxim de încercări pentru Deblocare facială"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Se încarcă, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Încărcată."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Încărcată"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Conectaţi încărcătorul."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Niciun card SIM"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Aţi efectuat <xliff:g id="NUMBER">%d</xliff:g> încercări incorecte de deblocare a telefonului. Telefonul va fi acum resetat la setările prestabilite din fabrică."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Aţi desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%d</xliff:g> încercări nereuşite, vi se va solicita să deblocaţi tableta cu ajutorul unui cont de e-mail."\n\n" Încercaţi din nou peste <xliff:g id="NUMBER_2">%d</xliff:g> (de) secunde."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Aţi desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%d</xliff:g> încercări nereuşite, vi se va solicita să deblocaţi telefonul cu ajutorul unui cont de e-mail."\n\n" Încercaţi din nou peste <xliff:g id="NUMBER_2">%d</xliff:g> (de) secunde."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Eliminaţi"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Ridicaţi volumul mai sus de nivelul sigur?"\n"Ascultarea la volum ridicat pe perioade lungi de timp vă poate afecta auzul."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Menţineţi două degete pe ecran pentru a activa accesibilitatea."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"S-a activat accesibilitatea."</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index c6770b2f7c58..42e5f86e0716 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Повторить попытку"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Все попытки войти с помощью Фейсконтроля использованы"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Идет зарядка (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Батарея заряжена"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Заряжено"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Подключите зарядное устройство"</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Нет SIM-карты"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Вы <xliff:g id="NUMBER">%d</xliff:g> раз не смогли разблокировать телефон. Будут восстановлены заводские настройки."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Вы <xliff:g id="NUMBER_0">%d</xliff:g> раз неверно указали графический ключ. После <xliff:g id="NUMBER_1">%d</xliff:g> неверных попыток для разблокировки планшетного ПК потребуется войти в аккаунт Google."\n\n"Повтор через <xliff:g id="NUMBER_2">%d</xliff:g> сек."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Вы <xliff:g id="NUMBER_0">%d</xliff:g> раз неверно указали графический ключ. После <xliff:g id="NUMBER_1">%d</xliff:g> неверных попыток для разблокировки телефона потребуется войти в аккаунт Google."\n\n"Повтор через <xliff:g id="NUMBER_2">%d</xliff:g> сек."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Удалить"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Увеличить громкость до небезопасного уровня?"\n"Долговременное прослушивание на такой громкости может повредить слух."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Чтобы включить специальные возможности, удерживайте пальцы на экране."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Специальные возможности включены."</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index da02bb6ea299..c364380689eb 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Skúsiť znova"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Prekročili ste maximálny povolený počet pokusov o odomknutie tvárou"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Prebieha nabíjanie, <xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Nabité."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Nabitá batéria"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Pripojte nabíjačku."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Nie je vložená karta SIM"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Telefón ste sa pokúsili odomknúť nesprávnym spôsobom <xliff:g id="NUMBER">%d</xliff:g>-krát. V telefóne sa teraz obnovia predvolené továrenské nastavenia."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"<xliff:g id="NUMBER_0">%d</xliff:g>-krát ste nesprávne nakreslili svoj bezpečnostný vzor. Po ďalších <xliff:g id="NUMBER_1">%d</xliff:g> neúspešných pokusoch sa zobrazí výzva na odomknutie tabletu pomocou e-mailového účtu."\n\n" Skúste to znova o <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"<xliff:g id="NUMBER_0">%d</xliff:g>-krát ste nesprávne nakreslili svoj bezpečnostný vzor. Po <xliff:g id="NUMBER_1">%d</xliff:g> ďalších neúspešných pokusoch sa zobrazí výzva na odomknutie telefónu pomocou e-mailového účtu."\n\n" Skúste to znova o <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Odstrániť"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Chcete zvýšiť hlasitosť nad bezpečnú úroveň?"\n"Dlhodobé počúvanie pri vysokej hlasitosti môže viesť k poškodeniu vášho sluchu."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Zjednodušenie ovládania povolíte dlhým stlačením dvoma prstami."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Zjednodušenie ovládania je povolené."</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index a7fc8b3fe147..7f94c20440f3 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Poskusite znova"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Presegli ste dovoljeno število poskusov odklepanja z obrazom"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Polnjenje (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Napolnjeno."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Napolnjeno"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Priključite napajalnik."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Ni kartice SIM"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Telefon ste poskusili <xliff:g id="NUMBER">%d</xliff:g>-krat napačno odkleniti, zato bo ponastavljen na privzete tovarniške nastavitve."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Vzorec za odklepanje ste <xliff:g id="NUMBER_0">%d</xliff:g>-krat napačno vnesli. Po nadaljnjih <xliff:g id="NUMBER_1">%d</xliff:g> neuspešnih poskusih boste pozvani, da tablični računalnik odklenete z e-poštnim računom."\n\n"Poskusite znova čez <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Vzorec za odklepanje ste <xliff:g id="NUMBER_0">%d</xliff:g>-krat napačno vnesli. Po nadaljnjih <xliff:g id="NUMBER_1">%d</xliff:g> neuspešnih poskusih boste pozvani, da odklenete telefon z Googlovimi podatki za prijavo."\n\n"Poskusite znova čez <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Odstrani"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Želite povečati glasnost nad varno raven?"\n"Dolgotrajna izpostavljenost glasnim tonom lahko poškoduje sluh."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Če želite omogočiti pripomočke za ljudi s posebnimi potrebami, na zaslonu pridržite z dvema prstoma."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Pripomočki za ljudi s posebnimi potrebami so omogočeni."</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index c31ee7a491e8..5a94aad6f2a8 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Покушајте поново"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Премашен је највећи дозвољени број покушаја Откључавања лицем"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Пуњење, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Батерија је напуњена."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Напуњено"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Повежите пуњач."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Нема SIM картице"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Покушали сте да откључате телефон неисправно <xliff:g id="NUMBER">%d</xliff:g> пута. Телефон ће сада бити враћен на подразумевана фабричка подешавања."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Нацртали сте шаблон за откључавање неисправно <xliff:g id="NUMBER_0">%d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%d</xliff:g> неуспешна(их) покушаја, од вас ће бити затражено да откључате таблет помоћу налога е-поште."\n\n"Покушајте поново за <xliff:g id="NUMBER_2">%d</xliff:g> секунде(и)."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Нацртали сте шаблон за откључавање неисправно <xliff:g id="NUMBER_0">%d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%d</xliff:g> неуспешна(их) покушаја, од вас ће бити затражено да откључате телефон помоћу налога е-поште."\n\n"Покушајте поново за <xliff:g id="NUMBER_2">%d</xliff:g> секунде(и)."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Уклони"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Желите да појачате звук изнад безбедног нивоа?"\n"Ако дуже време слушате гласну музику, може доћи до оштећења слуха."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Држите са два прста да бисте омогућили приступачност."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Приступачност је омогућена."</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index bfed28314f6a..2737d62d9c46 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Försök igen"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Du har försökt låsa upp med Ansiktslås för många gånger"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Laddar (<xliff:g id="PERCENT">%%</xliff:g> <xliff:g id="NUMBER">%d</xliff:g>)"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Laddad."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Batteriet har laddats"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Anslut din laddare."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Inget SIM-kort"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Du har försökt låsa upp mobilen på fel sätt <xliff:g id="NUMBER">%d</xliff:g> gånger. Mobilen återställs nu till fabriksinställningarna."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%d</xliff:g> gånger. Efter ytterligare <xliff:g id="NUMBER_1">%d</xliff:g> försök ombeds du låsa upp surfplattan med ett e-postkonto."\n\n" Försök igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%d</xliff:g> gånger. Efter ytterligare <xliff:g id="NUMBER_1">%d</xliff:g> försök ombeds du låsa upp mobilen med hjälp av ett e-postkonto."\n\n" Försök igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Ta bort"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Vill du höja volymen över den säkra nivån?"\n"Om du lyssnar på hög volym under långa perioder kan din hörsel skadas."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Fortsätt trycka med två fingrar om du vill aktivera tillgänglighetsläget."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Tillgänglighetsläget har aktiverats."</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 2bd4972e89a0..afdb39e6ed72 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Jaribu tena"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Majaribio ya Juu ya Kufungua Uso yamezidishwa"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Inachaji <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Imechajiwa."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Imechajiwa"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Unganisha chaja yako"</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Hakuna SIM kadi"</string>
@@ -810,18 +810,18 @@
<string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Ruwaza imefutwa"</string>
<string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Kiini kimeongezwa"</string>
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Ruwaza imekamilika"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ongeza wijeti."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ongeza wiji"</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tupu"</string>
<string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Eneo la kufungua limepanuliwa."</string>
<string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Eneo la kufungua limekunjwa."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ya wijeti."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ya wiji."</string>
<string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Kiteuzi cha mtumiaji"</string>
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"Hali"</string>
<string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
<string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Vidhibiti vya media"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Upangaji upya wa wijeti umeanza."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Upangaji upya wa wijeti umekamilika."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Wijeti <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> imefutwa."</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Upangaji upya wa wiji umeanza."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Upangaji upya wa wiji umekamilika."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Wiji <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> imefutwa."</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Panua eneo la kufungua."</string>
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Kufungua slaidi."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Kufungua kwa ruwaza."</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Umejaribu kufungua simu kwa njia isiyo sahihi mara <xliff:g id="NUMBER">%d</xliff:g>. Sasa simu itarejeshwa katika mfumo chaguo-msingi ilivyotoka kiwandani."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Umekosea katika kuweka mchoro wako wa kufungua mara <xliff:g id="NUMBER_0">%d</xliff:g>. Baada ya majaribio <xliff:g id="NUMBER_1">%d</xliff:g> bila kufaulu, utaombwa kufungua kompyuta yako ndogo kwa kutumia akaunti yako ya barua pepe."\n\n" Jaribu tena baada ya sekunde <xliff:g id="NUMBER_2">%d</xliff:g>."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Umekosea kuchora mchoro wako wa kufungua mara <xliff:g id="NUMBER_0">%d</xliff:g>. Baada ya majaribio <xliff:g id="NUMBER_1">%d</xliff:g> yasiyofaulu, utaombwa kufungua simu yako kwa kutumia akaunti ya barua pepe."\n\n" Jaribu tena baada ya sekunde <xliff:g id="NUMBER_2">%d</xliff:g>."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Ondoa"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Ongeza sauti zaidi ya kiwango salama? "\n"Kusikiliza kwa sauti ya juu kwa muda mrefu kunaweza kuharibu uwezo wako wa kusikia."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Endelea kushikilia chini kwa vidole vyako viwili ili kuwezesha ufikivu."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Ufikivu umewezeshwa."</string>
diff --git a/core/res/res/values-sw600dp/alias.xml b/core/res/res/values-sw600dp/alias.xml
new file mode 100644
index 000000000000..bf3eecb992ba
--- /dev/null
+++ b/core/res/res/values-sw600dp/alias.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/common/assets/res/any/colors.xml
+**
+** Copyright 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.
+*/
+-->
+<resources>
+ <!-- Alias used to reference one of two possible layouts in keyguard. -->
+ <item type="layout" name="keyguard_eca">@android:layout/keyguard_emergency_carrier_area</item>
+</resources>
diff --git a/core/res/res/values-sw600dp/bools.xml b/core/res/res/values-sw600dp/bools.xml
index 00f45c1512a2..ddc48c575381 100644
--- a/core/res/res/values-sw600dp/bools.xml
+++ b/core/res/res/values-sw600dp/bools.xml
@@ -19,6 +19,7 @@
<bool name="show_ongoing_ime_switcher">true</bool>
<bool name="kg_share_status_area">false</bool>
<bool name="kg_sim_puk_account_full_screen">false</bool>
+ <bool name="kg_show_ime_at_screen_on">false</bool>
<!-- No camera for you, tablet user -->
<bool name="kg_enable_camera_default_widget">false</bool>
<bool name="kg_center_small_widgets_vertically">true</bool>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 59e7c032709f..0a86a866c150 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"ลองอีกครั้ง"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"มีความพยายามที่จะใช้ Face Unlock เกินขีดจำกัด"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"กำลังชาร์จ, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"ชาร์จแล้ว"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"ชาร์จแล้ว"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"เสียบที่ชาร์จของคุณ"</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"ไม่มีซิมการ์ด"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"คุณพยายามปลดล็อกโทรศัพท์อย่างไม่ถูกต้อง <xliff:g id="NUMBER">%d</xliff:g> ครั้งแล้ว ขณะนี้โทรศัพท์จะถูกรีเซ็ตเป็นค่าเริ่มต้นจากโรงงาน"</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"คุณวาดรูปแบบการปลดล็อกไม่ถูกต้อง <xliff:g id="NUMBER_0">%d</xliff:g> ครั้งแล้ว หากทำไม่สำเร็จอีก <xliff:g id="NUMBER_1">%d</xliff:g> ครั้ง ระบบจะขอให้คุณปลดล็อกแท็บเล็ตโดยใช้บัญชีอีเมล"\n\n" โปรดลองอีกครั้งใน <xliff:g id="NUMBER_2">%d</xliff:g> วินาที"</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"คุณวาดรูปแบบการปลดล็อกไม่ถูกต้อง <xliff:g id="NUMBER_0">%d</xliff:g> ครั้งแล้ว หากทำไม่สำเร็จอีก <xliff:g id="NUMBER_1">%d</xliff:g> ครั้ง ระบบจะขอให้คุณปลดล็อกโทรศัพท์โดยใช้ับัญชีอีเมล"\n\n" โปรดลองอีกครั้งในอีก <xliff:g id="NUMBER_2">%d</xliff:g> วินาที"</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"นำออก"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"เพิ่มระดับเสียงจนเกินระดับที่ปลอดภัยหรือไม่"\n"การฟังเสียงดังเป็นเวลานานอาจทำให้การได้ยินของคุณบกพร่องได้"</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"ใช้สองนิ้วแตะค้างไว้เพื่อเปิดใช้งานการเข้าถึง"</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"เปิดใช้งานการเข้าถึงแล้ว"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index acb6834a647e..072f6df653a4 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Subukang muli"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Nalagpasan na ang maximum na mga pagtatangka sa Face Unlock"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Nagcha-charge, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Naka-charge."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Siningil"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Ikonekta ang iyong charger."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Walang SIM card"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Tinangka mo sa hindi tamang paraan na i-unlock ang telepono nang <xliff:g id="NUMBER">%d</xliff:g> (na) beses. Ire-reset na ngayon ang telepono sa factory default."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Naguhit mo nang hindi tama ang iyong pattern sa pag-unlock nang <xliff:g id="NUMBER_0">%d</xliff:g> (na) beses. Pagkatapos ng <xliff:g id="NUMBER_1">%d</xliff:g> pang hindi matagumpay na pagtatangka, hihilingin sa iyong i-unlock ang tablet mo gamit ang isang email account."\n\n" Subukang muli sa loob ng <xliff:g id="NUMBER_2">%d</xliff:g> (na) segundo."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Naguhit mo nang hindi tama ang iyong pattern sa pag-unlock nang <xliff:g id="NUMBER_0">%d</xliff:g> (na) beses. Pagkatapos ng <xliff:g id="NUMBER_1">%d</xliff:g> pang hindi matagumpay na pagtatangka, hihilingin sa iyong i-unlock ang telepono mo gamit ang isang email account."\n\n" Subukang muli sa loob ng <xliff:g id="NUMBER_2">%d</xliff:g> (na) segundo."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Alisin"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Lakasan ang volume nang lagpas sa ligtas na antas?"\n"Maaaring mapinsala ng pakikinig sa malakas na volume sa loob ng mahahabang panahon ang iyong pandinig."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Panatilihing nakapindot nang matagal ang iyong dalawang daliri upang paganahin ang pagiging naa-access."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Pinagana ang accessibility."</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index c0f2537d8bfd..dbb7b0d26ded 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Tekrar deneyin"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Yüz Tanıma Kilidi için maksimum deneme sayısı aşıldı"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Şarj oluyor (<xliff:g id="PERCENT">%%</xliff:g><xliff:g id="NUMBER">%d</xliff:g>)"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Şarj oldu."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Şarj oldu"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="PERCENT">%%</xliff:g><xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Şarj cihazınızı bağlayın."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM kart yok"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Telefon kilidini <xliff:g id="NUMBER">%d</xliff:g> defa yanlış bir şekilde açmaya çalıştınız. Telefon şimdi fabrika varsayılanına sıfırlanacak."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Kilit açma deseninizi <xliff:g id="NUMBER_0">%d</xliff:g> kez yanlış çizdiniz. <xliff:g id="NUMBER_1">%d</xliff:g> başarısız denemeden sonra, tabletinizi bir e-posta hesabı kullanarak açmanız istenir."\n\n" <xliff:g id="NUMBER_2">%d</xliff:g> saniye içinde tekrar deneyin."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Kilit açma deseninizi <xliff:g id="NUMBER_0">%d</xliff:g> kez yanlış çizdiniz. <xliff:g id="NUMBER_1">%d</xliff:g> başarısız denemeden sonra telefonunuzu bir e-posta hesabı kullanarak açmanız istenir."\n\n" <xliff:g id="NUMBER_2">%d</xliff:g> saniye içinde tekrar deneyin."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Kaldır"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Ses düzeyi güvenli seviyenin üzerine çıkarılsın mı?"\n"Yüksek sesle uzun süre dinlemek işitme yetinize zarar verebilir."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Erişilebilirliği etkinleştirmek için iki parmağınızı basılı tutmaya devam edin."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Erişilebilirlik etkinleştirildi."</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 1ca6edf7ac42..65120074afc9 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Повторіть спробу"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Перевищено максимальну кількість спроб розблокування за допомогою функції \"Фейсконтроль\""</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Заряджається, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Заряджено."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Заряджено"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Підкл. заряд. пристрій."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Відсутня SIM-карта"</string>
@@ -823,13 +823,13 @@
<string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Змінення порядку віджетів закінчено."</string>
<string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Віджет <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> видалено."</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Розгорнути область розблокування."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Розблокування жестом."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Розблокування повзунком."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Розблокування ключем."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Фейсконтроль"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Розблокування PIN-кодом."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Розблокування паролем."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Область ключа."</string>
- <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Область жесту."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Область повзунка."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Кількість невдалих спроб розблокувати телефон: <xliff:g id="NUMBER">%d</xliff:g>. Налаштування телефону буде змінено на заводські за умовчанням."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Ключ розблокування неправильно намальовано стільки разів: <xliff:g id="NUMBER_0">%d</xliff:g>. У вас є ще стільки спроб: <xliff:g id="NUMBER_1">%d</xliff:g>. У разі невдачі з’явиться запит розблокувати планшетний ПК за допомогою облікового запису електронної пошти."\n\n" Повторіть спробу через <xliff:g id="NUMBER_2">%d</xliff:g> сек."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Ключ розблокування неправильно намальовано стільки разів: <xliff:g id="NUMBER_0">%d</xliff:g>. У вас є ще стільки спроб: <xliff:g id="NUMBER_1">%d</xliff:g>. У разі невдачі з’явиться запит розблокувати телефон за допомогою облікового запису електронної пошти."\n\n" Повторіть спробу через <xliff:g id="NUMBER_2">%d</xliff:g> сек."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Вилучити"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Збільшити гучність понад безпечний рівень?"\n"Надто гучне прослуховування впродовж тривалого періоду може пошкодити слух."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Утримуйте двома пальцями, щоб увімкнути доступність."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Доступність увімкнено."</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index fb291a2e2657..7fb341296b25 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Thử lại"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Đã vượt quá số lần Mở khóa bằng khuôn mặt tối đa"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Đang sạc, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Đã sạc."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Bị tính phí"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Kết nối bộ sạc của bạn."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Không có thẻ SIM nào"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Bạn đã <xliff:g id="NUMBER">%d</xliff:g> lần mở khóa điện thoại không đúng cách. Bây giờ, điện thoại sẽ được đặt lại về mặc định ban đầu."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Bạn đã <xliff:g id="NUMBER_0">%d</xliff:g> lần vẽ không chính xác hình mở khóa của mình. Sau <xliff:g id="NUMBER_1">%d</xliff:g> lần thử không thành công nữa, bạn sẽ được yêu cầu mở khóa máy tính bảng bằng tài khoản email."\n\n" Vui lòng thử lại sau <xliff:g id="NUMBER_2">%d</xliff:g> giây."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Bạn đã <xliff:g id="NUMBER_0">%d</xliff:g> lần vẽ không chính xác hình mở khóa của mình. Sau <xliff:g id="NUMBER_1">%d</xliff:g> lần thử không thành công nữa, bạn sẽ được yêu cầu mở khóa điện thoại bằng tài khoản email."\n\n" Vui lòng thử lại sau <xliff:g id="NUMBER_2">%d</xliff:g> giây."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Xóa"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Tăng âm lượng trên mức an toàn?"\n"Nghe ở âm lượng cao trong thời gian dài có thể gây hại cho thính giác của bạn."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Tiếp tục giữ hai ngón tay để bật trợ năng."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Trợ năng đã được bật."</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index dfb9d99ea5c5..251389b73a08 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"重试"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"已超过“人脸解锁”尝试次数上限"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"正在充电,<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"已充满。"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"充电完成"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"连接您的充电器。"</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"没有 SIM 卡"</string>
@@ -811,7 +811,7 @@
<string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"已添加单元格"</string>
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"图案绘制完成"</string>
<string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"添加小部件。"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"空"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"空白"</string>
<string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"已展开解锁区域。"</string>
<string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"已折叠解锁区域。"</string>
<string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>小部件。"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"您已经 <xliff:g id="NUMBER">%d</xliff:g> 次错误地尝试解锁手机。手机现在将重置为出厂默认设置。"</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"您已经 <xliff:g id="NUMBER_0">%d</xliff:g> 次错误地绘制了解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次后仍不成功,系统就会要求您使用自己的电子邮件帐户解锁平板电脑。"\n\n"请在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒后重试。"</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"您已经 <xliff:g id="NUMBER_0">%d</xliff:g> 次错误地绘制了解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次后仍不成功,系统就会要求您使用自己的电子邮件帐户解锁手机。"\n\n"请在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒后重试。"</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"删除"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"将音量调高到安全级别以上?"\n"长时间聆听高音量可能会损伤听力。"</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"持续按住双指即可启用辅助功能。"</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"辅助功能已启用。"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index d39df85cb46e..473b9d0b589e 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"再試一次"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"已超過人臉解鎖嘗試次數上限"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"充電中 (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"充電完成。"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"充電完成"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"請連接充電器。"</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"找不到 SIM 卡"</string>
@@ -820,7 +820,7 @@
<string name="keyguard_accessibility_camera" msgid="8904231194181114603">"相機"</string>
<string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"媒體控制項"</string>
<string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"已開始將小工具重新排序。"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"小工具已重新排序完成。"</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"小工具重新排序已完成。"</string>
<string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>小工具已刪除。"</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"展開解鎖區域。"</string>
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"滑動解鎖。"</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"您嘗試解除這支手機的鎖定已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次,手機現在將恢復原廠設定。"</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"您的解鎖圖形已畫錯 <xliff:g id="NUMBER_0">%d</xliff:g> 次,如果再嘗試 <xliff:g id="NUMBER_1">%d</xliff:g> 次仍未成功,系統就會要求您透過電子郵件帳戶解除平板電腦的鎖定狀態。"\n\n"請在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒後再試一次。"</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"您的解鎖圖形已畫錯 <xliff:g id="NUMBER_0">%d</xliff:g> 次,如果再嘗試 <xliff:g id="NUMBER_1">%d</xliff:g> 次仍未成功,系統就會要求您透過電子郵件帳戶解除手機的鎖定狀態。"\n\n"請在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒後再試一次。"</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"移除"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"要將音量調高到安全等級以上嗎?"\n"長時間聆聽偏高音量可能會損害您的聽力。"</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"持續用兩指按住即可啟用協助工具。"</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"協助工具已啟用。"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index fc5007d0af30..eb1cbfb99360 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -762,7 +762,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Zama futhi"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Ukuzama Kokuvula Ubuso Okuningi kudluliwe"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"Iyashaja (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
- <string name="lockscreen_charged" msgid="4938930459620989972">"Kushajiwe."</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Kushajiwe"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Xhuma ishaja yakho."</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Alikho ikhadi le-SIM."</string>
@@ -823,9 +823,9 @@
<string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Ukuhlelwa kabusha kwewijethi kuphelile."</string>
<string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Iwijethi <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> isusiwe."</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Nwebisa indawo yokuvula."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Ukuvula ngokushelelisa."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Ukuvula ngokuslayida."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ukuvula ngephethini."</string>
- <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Ukuvula ngobuso."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Vula ngobuso"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Ukuvula ngephinikhodi."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Ukuvula ngephasiwedi."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Indawo yephethini."</string>
@@ -1436,8 +1436,8 @@
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Uzame ukuvula ngendlela engafanele ifoni izikhathi ezingu-<xliff:g id="NUMBER">%d</xliff:g>. Ifoni manje isizosethwa kabusha ibe yizimiso ezizenzakalelayo."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Udwebe ngokungalungile iphathini yakho yokuvula izikhathi ezingu-<xliff:g id="NUMBER_0">%d</xliff:g>. Emva <xliff:g id="NUMBER_1">%d</xliff:g> kweminye imizamo engaphumelelanga, uzocelwa ukuvula ithebhulethi yakho usebenzisa ukungena ngemvume kwi-Google."\n\n" Sicela uzame futhi kwengu-<xliff:g id="NUMBER_2">%d</xliff:g> imizuzwana."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Ukulayisha ungenisa iphathini yakho yokuvula ngendlela engalungile izikhathi ezi-<xliff:g id="NUMBER_0">%d</xliff:g> Emva kweminye imizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g>, uzocelwa ukuvula ifoni yakho usebenzisa ukungena ngemvume ku-Google"\n\n" Zame futhi emumva kwengu- <xliff:g id="NUMBER_2">%d</xliff:g> imizuzwana."</string>
- <!-- no translation found for kg_text_message_separator (2639217074783293687) -->
- <skip />
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Susa"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Khulisa ivolomu ngaphezu kweleveli yokuphepha?"\n"Ukulalela ngevolomu ephezulu izikhathi ezide kungalimaza ukuzwa kwakho."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Gcina ucindezele iminwe yakho emibili ukuze unike amandla ukufinyelela."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"Ukufinyelela kunikwe amandla."</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 6f307a7a4319..447daab8cece 100755
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -5484,6 +5484,11 @@
<attr name="magneticTargets" format="boolean" />
<attr name="gravity" />
+
+ <!-- Determine whether the glow pad is allowed to scale to fit the bounds indicated
+ by its parent. If this is set to false, no scaling will occur. If this is set to true
+ scaling will occur to fit for any axis in which gravity is set to center. -->
+ <attr name="allowScaling" format="boolean" />
</declare-styleable>
<!-- =============================== -->
@@ -5815,10 +5820,13 @@
<!-- This is a handle that is used for expanding the
security challenge container when it is collapsed. -->
<enum name="expandChallengeHandle" value="6" />
+ <!-- Delete drop target. This will be the drop target to delete pages. -->
+ <enum name="pageDeleteDropTarget" value="7" />
</attr>
<declare-styleable name="SlidingChallengeLayout_Layout">
<attr name="layout_childType" />
+ <attr name="layout_maxHeight" />
</declare-styleable>
<!-- Attributes that can be used with <code>&lt;FragmentBreadCrumbs&gt;</code>
@@ -5843,6 +5851,11 @@
<attr name="layout_maxHeight" />
</declare-styleable>
+ <declare-styleable name="KeyguardSecurityViewFlipper_Layout">
+ <attr name="layout_maxWidth" />
+ <attr name="layout_maxHeight" />
+ </declare-styleable>
+
<declare-styleable name="NumPadKey">
<attr name="digit" format="integer" />
<attr name="textView" format="reference" />
diff --git a/core/res/res/values/bools.xml b/core/res/res/values/bools.xml
index 457131a4f84a..18e4f2f9b3a8 100644
--- a/core/res/res/values/bools.xml
+++ b/core/res/res/values/bools.xml
@@ -18,6 +18,7 @@
<bool name="kg_enable_camera_default_widget">true</bool>
<bool name="kg_center_small_widgets_vertically">false</bool>
<bool name="kg_top_align_page_shrink_on_bouncer_visible">true</bool>
+ <bool name="kg_show_ime_at_screen_on">true</bool>
<bool name="action_bar_embed_tabs">true</bool>
<bool name="action_bar_embed_tabs_pre_jb">false</bool>
<bool name="split_action_bar_is_narrow">true</bool>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index b8ec138d8577..637128a53cae 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -246,7 +246,7 @@
<dimen name="kg_security_panel_height">600dp</dimen>
<!-- Height of security view in keyguard. -->
- <dimen name="kg_security_view_height">0dp</dimen>
+ <dimen name="kg_security_view_height">480dp</dimen>
<!-- Width of widget view in keyguard. -->
<dimen name="kg_widget_view_width">0dp</dimen>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index cd21d80a0baa..68a028975681 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1189,6 +1189,9 @@
<java-symbol type="anim" name="keyguard_security_animate_out" />
<java-symbol type="anim" name="keyguard_security_fade_in" />
<java-symbol type="anim" name="keyguard_security_fade_out" />
+ <java-symbol type="anim" name="keyguard_action_assist_exit" />
+ <java-symbol type="anim" name="keyguard_action_assist_enter" />
+
<java-symbol type="array" name="config_keyboardTapVibePattern" />
<java-symbol type="array" name="config_longPressVibePattern" />
<java-symbol type="array" name="config_safeModeDisabledVibePattern" />
@@ -1218,6 +1221,7 @@
<java-symbol type="bool" name="kg_top_align_page_shrink_on_bouncer_visible" />
<java-symbol type="bool" name="target_honeycomb_needs_options_menu" />
<java-symbol type="bool" name="kg_center_small_widgets_vertically" />
+ <java-symbol type="bool" name="kg_show_ime_at_screen_on" />
<java-symbol type="color" name="kg_multi_user_text_active" />
<java-symbol type="color" name="kg_multi_user_text_inactive" />
<java-symbol type="color" name="kg_widget_pager_gradient" />
@@ -1256,7 +1260,7 @@
<java-symbol type="drawable" name="magnified_region_frame" />
<java-symbol type="drawable" name="menu_background" />
<java-symbol type="drawable" name="stat_sys_secure" />
- <java-symbol type="drawable" name="kg_bouncer_bg_white" />
+ <java-symbol type="drawable" name="kg_widget_bg_padded" />
<java-symbol type="id" name="action_mode_bar_stub" />
<java-symbol type="id" name="alarm_status" />
<java-symbol type="id" name="backspace" />
@@ -1342,7 +1346,6 @@
<java-symbol type="id" name="clock_text" />
<java-symbol type="id" name="clock_view" />
<java-symbol type="id" name="keyguard_multi_user_selector" />
- <java-symbol type="id" name="status_security_message" />
<java-symbol type="id" name="sliding_layout" />
<java-symbol type="id" name="keyguard_add_widget" />
<java-symbol type="id" name="keyguard_add_widget_view" />
@@ -1350,6 +1353,7 @@
<java-symbol type="id" name="multi_pane_challenge" />
<java-symbol type="id" name="keyguard_user_selector" />
<java-symbol type="id" name="key_enter" />
+ <java-symbol type="id" name="keyguard_selector_view_frame" />
<java-symbol type="integer" name="config_carDockRotation" />
<java-symbol type="integer" name="config_defaultUiModeType" />
<java-symbol type="integer" name="config_deskDockRotation" />
diff --git a/docs/html/distribute/promote/device-art-resources/nexus_10/land_back.png b/docs/html/distribute/promote/device-art-resources/nexus_10/land_back.png
index 71bb52d29e26..d082d50879e2 100644
--- a/docs/html/distribute/promote/device-art-resources/nexus_10/land_back.png
+++ b/docs/html/distribute/promote/device-art-resources/nexus_10/land_back.png
Binary files differ
diff --git a/docs/html/images/tools/dev-options-inmilk.png b/docs/html/images/tools/dev-options-inmilk.png
new file mode 100644
index 000000000000..f0e323e50b6d
--- /dev/null
+++ b/docs/html/images/tools/dev-options-inmilk.png
Binary files differ
diff --git a/docs/html/tools/index.jd b/docs/html/tools/index.jd
index 04e0d3b7fd29..7d47a72608e2 100644
--- a/docs/html/tools/index.jd
+++ b/docs/html/tools/index.jd
@@ -17,68 +17,87 @@ page.title=Developer Tools
<div style="margin-top:20px;"></div>
-<div class="col-6">
+<div class="col-7" style="margin-left:0">
<h3>Full Java IDE</h3>
<ul>
- <li>Android-specific refactoring, quick fixes, integrated navigation between Java and Android XML resources.</li>
- <li>Enhanced XML editors for Android XML resources</li>
- <li>Static analysis tools to catch performance, usability, and correctness problems</li>
+ <li>Android-specific refactoring, quick fixes, integrated navigation between Java and XML resources.</li>
+ <li>Enhanced XML editors for Android XML resources.</li>
+ <li>Static analysis tools to catch performance, usability, and correctness problems.</li>
<li>Build support for complex projects, command-line support for CI through Ant. Includes ProGuard and app-signing. </li>
<li>Template-based wizard to create standard Android projects and components.</li>
</ul>
</div>
-<div class="col-6">
+
+<div class="col-6" style="margin-right:0">
+
<h3>Graphical UI Builders</h3>
-
<ul>
<li>Build rich Android UI with drag and drop.
<li>Visualize your UI on tablets, phones, and other devices. Switch themes, locales, even platform versions instantly, without building.</li>
- <li>Visual refactoring lets you extracts layout for inclusion, convert layouts, extract styles</li>
- <li>Editor support for working with custom UI components</li>
+ <li>Visual refactoring lets you extracts layout for inclusion, convert layouts, extract styles.</li>
+ <li>Editor support for working with custom UI components.</li>
</ul>
+
+</div>
+
+
+<div class="col-7" style="clear:both;margin-left:0;">
+
+<h3>On-device Developer Options</h3>
+<ul>
+ <li>Enable debugging over USB.</li>
+ <li>Quickly capture bug reports onto the device.</li>
+ <li>Show CPU usage on screen.</li>
+ <li>Draw debugging information on screen such as layout bounds,
+ updates on GPU views and hardware layers, touch location, and others.</li>
+ <li>Plus many more options to simulate app stresses or enable debugging options.</li>
+</ul>
+<p>To access these on your device, open <em>Developer options</em> in the system Settings.
+If your device is running Android 4.2 or higher, you can access the settings with the
+<a href="http://play.google.com/store/apps/details?id=com.android.development_settings">Developer
+Settings</a> app.</p>
+
</div>
-<div class="col-6" style="clear:both">
+<div class="col-6" style="margin-right:0">
+ <img src="{@docRoot}images/tools/dev-options-inmilk.png" alt="" style="margin:-10px 0 0;">
+</div>
+
+
+<div class="col-7" style="clear:both;margin-left:0;">
<h3>Develop on Hardware Devices</h3>
<ul>
<li>Use any commercial Android hardware device or multiple devices.</li>
- <li>Deploy your app to connected devices directy from the IDE</li>
- <li>Live, on-device debugging, testing, and profiling</li>
+ <li>Deploy your app to connected devices directy from the IDE.</li>
+ <li>Live, on-device debugging, testing, and profiling.</li>
</ul>
</div>
-<div class="col-6">
+<div class="col-6" style="margin-right:0">
<h3>Develop on Virtual Devices</h3>
<ul>
<li>Emulate any device. Use custom screen sizes, keyboards, and other hardware components. </li>
<li>Advanced hardware emulation, including camera, sensors, multitouch, telephony.</li>
- <li>Develop and test for broadest compatibility at lowest cost.</li>
+ <li>Develop and test for broad device compatibility.</li>
</ul>
</div>
<div style="margin-top:20px;"></div>
-<div class="col-5">
+<div class="col-7" style="margin-left:0">
<h3>Powerful Debugging</h3>
<ul>
- <li>Full Java debugger with on-device debugging and Android-specific tools</li>
+ <li>Full Java debugger with on-device debugging and Android-specific tools.</li>
<li>Built-in memory analysis, performance/CPU profiling, OpenGL ES tracing.</li>
<li>Graphical tools for debugging and optimizing UI, runtime inspecton of UI structure and performance.</li>
- <li>Runtime graphical analysis of your app's network bandwidth usage.</li>
+ <li>Runtime graphical analysis of your app's network bandwidth usage.</li>
</ul>
-</div>
-
-<div style="float:right;width:360px;padding-top:1em;">
- <img src="{@docRoot}images/debugging-tall.png" align="left">
-</div>
-
-<div class="col-6">
<h3>Testing</h3>
<ul>
@@ -95,3 +114,8 @@ page.title=Developer Tools
</ul>
</div>
+<div class="col-6" style="margin-right:0">
+ <img src="{@docRoot}images/debugging-tall.png" align="left" style="margin-top:10px">
+</div>
+
+
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 315196e16330..22f699ff0b8f 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -436,6 +436,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
private boolean mDockAudioMediaEnabled = true;
+ private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED;
+
///////////////////////////////////////////////////////////////////////////
// Construction
///////////////////////////////////////////////////////////////////////////
@@ -3324,6 +3326,13 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
mBluetoothA2dpEnabled ?
AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP);
}
+
+ synchronized (mSettingsLock) {
+ AudioSystem.setForceUse(AudioSystem.FOR_DOCK,
+ mDockAudioMediaEnabled ?
+ AudioSystem.FORCE_ANALOG_DOCK : AudioSystem.FORCE_NONE);
+ }
+
// indicate the end of reconfiguration phase to audio HAL
AudioSystem.setParameters("restarting=false");
break;
@@ -3751,13 +3760,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
config = AudioSystem.FORCE_BT_CAR_DOCK;
break;
case Intent.EXTRA_DOCK_STATE_LE_DESK:
- synchronized (mSettingsLock) {
- if (mDockAudioMediaEnabled) {
- config = AudioSystem.FORCE_ANALOG_DOCK;
- } else {
- config = AudioSystem.FORCE_NONE;
- }
- }
+ config = AudioSystem.FORCE_ANALOG_DOCK;
break;
case Intent.EXTRA_DOCK_STATE_HE_DESK:
config = AudioSystem.FORCE_DIGITAL_DOCK;
@@ -3766,8 +3769,14 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
default:
config = AudioSystem.FORCE_NONE;
}
-
- AudioSystem.setForceUse(AudioSystem.FOR_DOCK, config);
+ // Low end docks have a menu to enable or disable audio
+ // (see mDockAudioMediaEnabled)
+ if (!((dockState == Intent.EXTRA_DOCK_STATE_LE_DESK) ||
+ ((dockState == Intent.EXTRA_DOCK_STATE_UNDOCKED) &&
+ (mDockState == Intent.EXTRA_DOCK_STATE_LE_DESK)))) {
+ AudioSystem.setForceUse(AudioSystem.FOR_DOCK, config);
+ }
+ mDockState = dockState;
} else if (action.equals(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED)) {
state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE,
BluetoothProfile.STATE_DISCONNECTED);
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_notify_open_normal.png b/packages/SystemUI/res/drawable-hdpi/ic_notify_open_normal.png
index 2adafeab2a03..ca56ad4f6ba4 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_notify_open_normal.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_notify_open_normal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_notify_open_pressed.png b/packages/SystemUI/res/drawable-hdpi/ic_notify_open_pressed.png
index 8521ffc23cd5..1a1423178b4f 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_notify_open_pressed.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_notify_open_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/search_light.png b/packages/SystemUI/res/drawable-hdpi/search_light.png
new file mode 100644
index 000000000000..c8b5a2ec9295
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/search_light.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_notify_open_normal.png b/packages/SystemUI/res/drawable-mdpi/ic_notify_open_normal.png
index 2ab0cd70aab5..f04aab1d423f 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_notify_open_normal.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_notify_open_normal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_notify_open_pressed.png b/packages/SystemUI/res/drawable-mdpi/ic_notify_open_pressed.png
index 49ac94bd9318..549c5efd2d5a 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_notify_open_pressed.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_notify_open_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/search_light.png b/packages/SystemUI/res/drawable-mdpi/search_light.png
new file mode 100644
index 000000000000..4b5b2a495a14
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/search_light.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_notify_open_normal.png b/packages/SystemUI/res/drawable-xhdpi/ic_notify_open_normal.png
index b0e35a175123..56386f892825 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_notify_open_normal.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_notify_open_normal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_notify_open_pressed.png b/packages/SystemUI/res/drawable-xhdpi/ic_notify_open_pressed.png
index 42bbbbc326f9..501c7770ed57 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_notify_open_pressed.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_notify_open_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/search_light.png b/packages/SystemUI/res/drawable-xhdpi/search_light.png
new file mode 100644
index 000000000000..3aa890fdfa8b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/search_light.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable/ic_notifications.xml b/packages/SystemUI/res/drawable/ic_notifications.xml
index 68c47746928e..97a7623cf343 100644
--- a/packages/SystemUI/res/drawable/ic_notifications.xml
+++ b/packages/SystemUI/res/drawable/ic_notifications.xml
@@ -16,8 +16,8 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
- android:drawable="@drawable/ic_notifications_normal" />
+ android:drawable="@drawable/ic_notify_open_normal" />
<item
- android:drawable="@drawable/ic_notifications_normal" />
+ android:drawable="@drawable/ic_notify_open_normal" />
</selector>
diff --git a/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml b/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml
index afa4cfc60000..2669c7ecff1f 100644
--- a/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml
+++ b/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml
@@ -146,7 +146,7 @@
android:id="@+id/search_light"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
- android:src="@drawable/ic_sysbar_lights_out_dot_large"
+ android:src="@drawable/search_light"
android:scaleType="center"
android:visibility="gone"
/>
@@ -287,7 +287,7 @@
android:id="@+id/search_light"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
- android:src="@drawable/ic_sysbar_lights_out_dot_large"
+ android:src="@drawable/search_light"
android:scaleType="center"
android:visibility="gone"
/>
diff --git a/packages/SystemUI/res/layout/navigation_bar.xml b/packages/SystemUI/res/layout/navigation_bar.xml
index 133f79d1d695..440a4e1f1c86 100644
--- a/packages/SystemUI/res/layout/navigation_bar.xml
+++ b/packages/SystemUI/res/layout/navigation_bar.xml
@@ -150,7 +150,7 @@
android:id="@+id/search_light"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
- android:src="@drawable/ic_sysbar_lights_out_dot_large"
+ android:src="@drawable/search_light"
android:scaleType="center"
android:visibility="gone"
/>
@@ -294,7 +294,7 @@
android:layout_height="80dp"
android:layout_width="match_parent"
android:layout_gravity="center_vertical"
- android:src="@drawable/ic_sysbar_lights_out_dot_large"
+ android:src="@drawable/search_light"
android:scaleType="center"
android:visibility="gone"
/>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index a5a5e36d28ff..2b226b6320a8 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -159,7 +159,7 @@
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Wecker gestellt für <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-/3G-Daten deaktiviert"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G-Daten deaktiviert"</string>
- <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobile Daten deaktiviert"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobilfunk Daten deaktiviert"</string>
<string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"Daten deaktiviert"</string>
<string name="data_usage_disabled_dialog" msgid="3853117269051806280">"Sie haben die angegebenen Grenze für den Datenverbrauch erreicht."\n\n"Wenn Sie die Datennutzung erneut aktivieren, berechnet Ihr Mobilfunkanbieter unter Umständen zusätzliche Gebühren."</string>
<string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"Daten erneut aktivieren"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index d4b82f053431..3bd709c72959 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -174,7 +174,7 @@
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ruutu on lukittu vaakasuuntaan."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ruutu on lukittu pystysuuntaan."</string>
<string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
- <string name="start_dreams" msgid="7219575858348719790">"Unelmoi"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"Unelmat"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Lentokonetila"</string>
<string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Ladataan (<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>)"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 0764aeacf17b..a14ee381338f 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -185,7 +185,7 @@
<string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> dispositivos)"</string>
<string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth desativado"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brilho"</string>
- <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Girar automaticamente"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Girar automat."</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Rotação bloqueada"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"Método de entrada"</string>
<string name="quick_settings_location_label" msgid="3292451598267467545">"Local em uso"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index fc22203dd3c9..6b8f319595f7 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -174,7 +174,7 @@
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Màn hình hiện bị khóa theo hướng ngang."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Màn hình hiện bị khóa theo hướng dọc."</string>
<string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
- <string name="start_dreams" msgid="7219575858348719790">"Mơ màng"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"Chế độ ngủ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Chế độ trên máy bay"</string>
<string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Đang sạc, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 91248da217f2..b96b8bc054d6 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -176,7 +176,7 @@
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"螢幕已鎖定為橫向模式。"</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"螢幕已鎖定為垂直模式。"</string>
<string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
- <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"休眠模式"</string>
<string name="ethernet_label" msgid="7967563676324087464">"乙太網路"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"飛航模式"</string>
<string name="quick_settings_battery_charging_label" msgid="490074774465309209">"充電中 (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
diff --git a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java
index 4b0e8184abcf..daac9ed9a9c4 100644
--- a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java
@@ -26,11 +26,13 @@ import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.os.RemoteException;
+import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.Vibrator;
import android.provider.Settings;
import android.util.AttributeSet;
import android.util.Slog;
+import android.view.IWindowManager;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
@@ -62,6 +64,7 @@ public class SearchPanelView extends FrameLayout implements
private boolean mShowing;
private View mSearchTargetsContainer;
private GlowPadView mGlowPadView;
+ private IWindowManager mWm;
public SearchPanelView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
@@ -70,6 +73,7 @@ public class SearchPanelView extends FrameLayout implements
public SearchPanelView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = context;
+ mWm = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
}
private void startAssistActivity() {
@@ -77,27 +81,44 @@ public class SearchPanelView extends FrameLayout implements
// Close Recent Apps if needed
mBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL);
- // Launch Assist
- Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
- .getAssistIntent(mContext, UserHandle.USER_CURRENT);
- if (intent == null) return;
-
- // Dismiss the keyguard if possible. XXX: TODO: invoke bouncer.
+ boolean isKeyguardShowing = false;
try {
- ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
+ isKeyguardShowing = mWm.isKeyguardLocked();
} catch (RemoteException e) {
+
}
- try {
- ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext,
- R.anim.search_launch_enter, R.anim.search_launch_exit,
- getHandler(), this);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivityAsUser(intent, opts.toBundle(),
- new UserHandle(UserHandle.USER_CURRENT));
- } catch (ActivityNotFoundException e) {
- Slog.w(TAG, "Activity not found for " + intent.getAction());
+ if (isKeyguardShowing) {
+ // Have keyguard show the bouncer and launch the activity if the user succeeds.
+ try {
+ mWm.showAssistant();
+ } catch (RemoteException e) {
+ // too bad, so sad...
+ }
onAnimationStarted();
+ } else {
+ // Otherwise, keyguard isn't showing so launch it from here.
+ Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
+ .getAssistIntent(mContext, UserHandle.USER_CURRENT);
+ if (intent == null) return;
+
+ try {
+ ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
+ } catch (RemoteException e) {
+ // too bad, so sad...
+ }
+
+ try {
+ ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext,
+ R.anim.search_launch_enter, R.anim.search_launch_exit,
+ getHandler(), this);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivityAsUser(intent, opts.toBundle(),
+ new UserHandle(UserHandle.USER_CURRENT));
+ } catch (ActivityNotFoundException e) {
+ Slog.w(TAG, "Activity not found for " + intent.getAction());
+ onAnimationStarted();
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
index 318448eedca5..ccb711adbe2c 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
@@ -30,6 +30,7 @@ import android.content.IntentFilter;
import android.net.Uri;
import android.os.BatteryManager;
import android.os.Handler;
+import android.os.UserHandle;
import android.media.AudioManager;
import android.media.Ringtone;
import android.media.RingtoneManager;
@@ -209,7 +210,7 @@ public class PowerUI extends SystemUI {
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- mContext.startActivity(intent);
+ mContext.startActivityAsUser(intent, UserHandle.CURRENT);
dismissLowBatteryWarning();
}
});
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 45886df71a4a..7371ce29e1d8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -279,7 +279,7 @@ public class PhoneStatusBar extends BaseStatusBar {
public void onAnimationEnd(Animator animation) {
// double-check to avoid races
if (mStatusBarContents.getAlpha() == 0) {
- Slog.d(TAG, "makeIconsInvisible");
+ if (DEBUG) Slog.d(TAG, "makeIconsInvisible");
mStatusBarContents.setVisibility(View.INVISIBLE);
}
}
@@ -518,7 +518,7 @@ public class PhoneStatusBar extends BaseStatusBar {
mCarrierLabel = (TextView)mStatusBarWindow.findViewById(R.id.carrier_label);
mShowCarrierInPanel = (mCarrierLabel != null);
- Slog.v(TAG, "carrierlabel=" + mCarrierLabel + " show=" + mShowCarrierInPanel);
+ if (DEBUG) Slog.v(TAG, "carrierlabel=" + mCarrierLabel + " show=" + mShowCarrierInPanel);
if (mShowCarrierInPanel) {
mCarrierLabel.setVisibility(mCarrierLabelVisible ? View.VISIBLE : View.INVISIBLE);
@@ -680,6 +680,7 @@ public class PhoneStatusBar extends BaseStatusBar {
@Override
public void showSearchPanel() {
super.showSearchPanel();
+ mHandler.removeCallbacks(mShowSearchPanel);
// we want to freeze the sysui state wherever it is
mSearchPanelView.setSystemUiVisibility(mSystemUiVisibility);
@@ -762,6 +763,7 @@ public class PhoneStatusBar extends BaseStatusBar {
mNavigationBarView.getRecentsButton().setOnClickListener(mRecentsClickListener);
mNavigationBarView.getRecentsButton().setOnTouchListener(mRecentsPreloadOnTouchListener);
mNavigationBarView.getHomeButton().setOnTouchListener(mHomeSearchActionListener);
+ mNavigationBarView.getSearchLight().setOnTouchListener(mHomeSearchActionListener);
updateSearchPanel();
}
@@ -852,7 +854,7 @@ public class PhoneStatusBar extends BaseStatusBar {
}
public void addNotification(IBinder key, StatusBarNotification notification) {
- /* if (DEBUG) */ Slog.d(TAG, "addNotification score=" + notification.score);
+ if (DEBUG) Slog.d(TAG, "addNotification score=" + notification.score);
StatusBarIconView iconView = addNotificationViews(key, notification);
if (iconView == null) return;
@@ -907,7 +909,7 @@ public class PhoneStatusBar extends BaseStatusBar {
awakenDreams();
// not immersive & a full-screen alert should be shown
- Slog.d(TAG, "Notification has fullScreenIntent; sending fullScreenIntent");
+ if (DEBUG) Slog.d(TAG, "Notification has fullScreenIntent; sending fullScreenIntent");
try {
notification.notification.fullScreenIntent.send();
} catch (PendingIntent.CanceledException e) {
@@ -2247,7 +2249,7 @@ public class PhoneStatusBar extends BaseStatusBar {
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
- Slog.v(TAG, "onReceive: " + intent);
+ if (DEBUG) Slog.v(TAG, "onReceive: " + intent);
String action = intent.getAction();
if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
int flags = CommandQueue.FLAG_EXCLUDE_NONE;
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 406f644fab95..d9c07f8a7220 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -3168,8 +3168,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (lidOpen) {
if (keyguardIsShowingTq()) {
- mKeyguardMediator.onWakeKeyWhenKeyguardShowingTq(
- KeyEvent.KEYCODE_POWER, mDockMode != Intent.EXTRA_DOCK_STATE_UNDOCKED);
+ mKeyguardMediator.onWakeKeyWhenKeyguardShowingTq(KeyEvent.KEYCODE_POWER);
} else {
mPowerManager.wakeUp(SystemClock.uptimeMillis());
}
@@ -3388,11 +3387,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// When the screen is off and the key is not injected, determine whether
// to wake the device but don't pass the key to the application.
result = 0;
- if (down && isWakeKey) {
+ if (down && isWakeKey && isWakeKeyWhenScreenOff(keyCode)) {
if (keyguardActive) {
- // If the keyguard is showing, let it decide what to do with the wake key.
- mKeyguardMediator.onWakeKeyWhenKeyguardShowingTq(keyCode,
- mDockMode != Intent.EXTRA_DOCK_STATE_UNDOCKED);
+ // If the keyguard is showing, let it wake the device when ready.
+ mKeyguardMediator.onWakeKeyWhenKeyguardShowingTq(keyCode);
} else {
// Otherwise, wake the device ourselves.
result |= ACTION_WAKE_UP;
@@ -3614,6 +3612,40 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return result;
}
+ /**
+ * When the screen is off we ignore some keys that might otherwise typically
+ * be considered wake keys. We filter them out here.
+ *
+ * {@link KeyEvent#KEYCODE_POWER} is notably absent from this list because it
+ * is always considered a wake key.
+ */
+ private boolean isWakeKeyWhenScreenOff(int keyCode) {
+ switch (keyCode) {
+ // ignore volume keys unless docked
+ case KeyEvent.KEYCODE_VOLUME_UP:
+ case KeyEvent.KEYCODE_VOLUME_DOWN:
+ case KeyEvent.KEYCODE_VOLUME_MUTE:
+ return mDockMode != Intent.EXTRA_DOCK_STATE_UNDOCKED;
+
+ // ignore media and camera keys
+ case KeyEvent.KEYCODE_MUTE:
+ case KeyEvent.KEYCODE_HEADSETHOOK:
+ case KeyEvent.KEYCODE_MEDIA_PLAY:
+ case KeyEvent.KEYCODE_MEDIA_PAUSE:
+ case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
+ case KeyEvent.KEYCODE_MEDIA_STOP:
+ case KeyEvent.KEYCODE_MEDIA_NEXT:
+ case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
+ case KeyEvent.KEYCODE_MEDIA_REWIND:
+ case KeyEvent.KEYCODE_MEDIA_RECORD:
+ case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
+ case KeyEvent.KEYCODE_CAMERA:
+ return false;
+ }
+ return true;
+ }
+
+
/** {@inheritDoc} */
@Override
public int interceptMotionBeforeQueueingWhenScreenOff(int policyFlags) {
@@ -3867,14 +3899,18 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
public void dismissKeyguardLw() {
- if (!mKeyguardMediator.isSecure()) {
- if (mKeyguardMediator.isShowing()) {
- mHandler.post(new Runnable() {
- public void run() {
+ if (mKeyguardMediator.isShowing()) {
+ mHandler.post(new Runnable() {
+ public void run() {
+ if (mKeyguardMediator.isDismissable()) {
+ // Can we just finish the keyguard straight away?
mKeyguardMediator.keyguardDone(false, true);
+ } else {
+ // ask the keyguard to prompt the user to authenticate if necessary
+ mKeyguardMediator.dismiss();
}
- });
- }
+ }
+ });
}
}
@@ -4504,6 +4540,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
@Override
+ public void showAssistant() {
+ mKeyguardMediator.showAssistant();
+ }
+
+ @Override
public void dump(String prefix, PrintWriter pw, String[] args) {
pw.print(prefix); pw.print("mSafeMode="); pw.print(mSafeMode);
pw.print(" mSystemReady="); pw.print(mSystemReady);
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/CameraWidgetFrame.java b/policy/src/com/android/internal/policy/impl/keyguard/CameraWidgetFrame.java
index 0f5817a333bc..dbd999913637 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/CameraWidgetFrame.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/CameraWidgetFrame.java
@@ -188,16 +188,6 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame implements View.OnCli
return iv;
}
- @Override
- public void setPivotX(float pivotX) {
- // don't pivot me
- }
-
- @Override
- public void setPivotY(float pivotY) {
- // don't pivot me
- }
-
public void render() {
final Throwable[] thrown = new Throwable[1];
final Bitmap[] offscreen = new Bitmap[1];
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/CarrierText.java b/policy/src/com/android/internal/policy/impl/keyguard/CarrierText.java
index f3ea9925e452..a38e86db39a6 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/CarrierText.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/CarrierText.java
@@ -85,10 +85,21 @@ public class CarrierText extends TextView {
protected void onFinishInflate() {
super.onFinishInflate();
mSeparator = getResources().getString(R.string.kg_text_message_separator);
- KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mCallback);
setSelected(true); // Allow marquee to work.
}
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mCallback);
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mCallback);
+ }
+
/**
* Top-level function for creating carrier text. Makes text based on simState, PLMN
* and SPN as well as device capabilities, such as being emergency call capable.
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/ChallengeLayout.java b/policy/src/com/android/internal/policy/impl/keyguard/ChallengeLayout.java
index 605a7380775c..8ece559f01dc 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/ChallengeLayout.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/ChallengeLayout.java
@@ -59,6 +59,11 @@ public interface ChallengeLayout {
boolean isBouncing();
/**
+ * Returns the duration of the bounce animation.
+ */
+ int getBouncerAnimationDuration();
+
+ /**
* Set a listener that will respond to changes in bouncer state.
*
* @param listener listener to register
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/EmergencyButton.java b/policy/src/com/android/internal/policy/impl/keyguard/EmergencyButton.java
index cab4ed96cf14..cd7324c79cfa 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/EmergencyButton.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/EmergencyButton.java
@@ -64,6 +64,18 @@ public class EmergencyButton extends Button {
}
@Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mInfoCallback);
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mInfoCallback);
+ }
+
+ @Override
protected void onFinishInflate() {
super.onFinishInflate();
mLockPatternUtils = new LockPatternUtils(mContext);
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardAbsKeyInputView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardAbsKeyInputView.java
index 7c769a705b24..cc520dc856b2 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardAbsKeyInputView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardAbsKeyInputView.java
@@ -215,7 +215,7 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout
}
@Override
- public void onResume() {
+ public void onResume(int reason) {
reset();
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardAccountView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardAccountView.java
index d552b35d4191..e0e7128c4c5a 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardAccountView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardAccountView.java
@@ -314,7 +314,7 @@ public class KeyguardAccountView extends LinearLayout implements KeyguardSecurit
}
@Override
- public void onResume() {
+ public void onResume(int reason) {
reset();
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java
index 51407fee1c9b..4c19caacb50e 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java
@@ -35,6 +35,7 @@ import android.provider.MediaStore;
import android.util.Log;
import android.view.WindowManager;
+import com.android.internal.policy.impl.keyguard.KeyguardHostView.OnDismissAction;
import com.android.internal.widget.LockPatternUtils;
import java.util.List;
@@ -150,9 +151,19 @@ public abstract class KeyguardActivityLauncher {
boolean useDefaultAnimations,
final Handler worker,
final Runnable onStarted) {
+
final Context context = getContext();
final Bundle animation = useDefaultAnimations ? null
: ActivityOptions.makeCustomAnimation(context, 0, 0).toBundle();
+ launchActivityWithAnimation(intent, showsWhileLocked, animation, worker, onStarted);
+ }
+
+ public void launchActivityWithAnimation(final Intent intent,
+ boolean showsWhileLocked,
+ final Bundle animation,
+ final Handler worker,
+ final Runnable onStarted) {
+
LockPatternUtils lockPatternUtils = getLockPatternUtils();
intent.addFlags(
Intent.FLAG_ACTIVITY_NEW_TASK
@@ -160,10 +171,8 @@ public abstract class KeyguardActivityLauncher {
| Intent.FLAG_ACTIVITY_CLEAR_TOP);
boolean isSecure = lockPatternUtils.isSecure();
if (!isSecure || showsWhileLocked) {
- if (!isSecure) try {
- ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
- } catch (RemoteException e) {
- Log.w(TAG, "can't dismiss keyguard on launch");
+ if (!isSecure) {
+ dismissKeyguardOnNextActivity();
}
try {
if (DEBUG) Log.d(TAG, String.format("Starting activity for intent %s at %s",
@@ -176,16 +185,26 @@ public abstract class KeyguardActivityLauncher {
// Create a runnable to start the activity and ask the user to enter their
// credentials.
KeyguardSecurityCallback callback = getCallback();
- callback.setOnDismissRunnable(new Runnable() {
+ callback.setOnDismissAction(new OnDismissAction() {
@Override
- public void run() {
+ public boolean onDismiss() {
+ dismissKeyguardOnNextActivity();
startActivityForCurrentUser(intent, animation, worker, onStarted);
+ return true;
}
});
callback.dismiss(false);
}
}
+ private void dismissKeyguardOnNextActivity() {
+ try {
+ ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
+ } catch (RemoteException e) {
+ Log.w(TAG, "can't dismiss keyguard on launch");
+ }
+ }
+
private void startActivityForCurrentUser(final Intent intent, final Bundle options,
Handler worker, final Runnable onStarted) {
final UserHandle user = new UserHandle(UserHandle.USER_CURRENT);
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardFaceUnlockView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardFaceUnlockView.java
index 8ca6d2a5ab24..de3354ad05fd 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardFaceUnlockView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardFaceUnlockView.java
@@ -90,6 +90,7 @@ public class KeyguardFaceUnlockView extends LinearLayout implements KeyguardSecu
if (mBiometricUnlock != null) {
mBiometricUnlock.stop();
}
+ KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateCallback);
}
@Override
@@ -102,7 +103,7 @@ public class KeyguardFaceUnlockView extends LinearLayout implements KeyguardSecu
}
@Override
- public void onResume() {
+ public void onResume(int reason) {
if (DEBUG) Log.d(TAG, "onResume()");
mIsShowing = KeyguardUpdateMonitor.getInstance(mContext).isKeyguardVisible();
maybeStartBiometricUnlock();
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
index b586d94b523f..de19bd57dcf6 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
@@ -20,11 +20,13 @@ import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.app.AlertDialog;
+import android.app.SearchManager;
import android.app.admin.DevicePolicyManager;
import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
+import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -37,6 +39,7 @@ import android.os.Looper;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.os.UserManager;
import android.util.AttributeSet;
import android.util.Log;
@@ -57,13 +60,16 @@ import java.io.File;
import java.util.List;
public class KeyguardHostView extends KeyguardViewBase {
- private static final String TAG = "KeyguardViewHost";
+ private static final String TAG = "KeyguardHostView";
// Use this to debug all of keyguard
public static boolean DEBUG = KeyguardViewMediator.DEBUG;
+ // Found in KeyguardAppWidgetPickActivity.java
static final int APPWIDGET_HOST_ID = 0x4B455947;
+ private final int MAX_WIDGETS = 5;
+
private AppWidgetHost mAppWidgetHost;
private AppWidgetManager mAppWidgetManager;
private KeyguardWidgetPager mAppWidgetContainer;
@@ -73,8 +79,11 @@ public class KeyguardHostView extends KeyguardViewBase {
private boolean mIsVerifyUnlockOnly;
private boolean mEnableFallback; // TODO: This should get the value from KeyguardPatternView
private SecurityMode mCurrentSecuritySelection = SecurityMode.Invalid;
+ private int mAppWidgetToShow;
+
+ private boolean mCheckAppWidgetConsistencyOnBootCompleted = false;
- protected Runnable mLaunchRunnable;
+ protected OnDismissAction mDismissAction;
protected int mFailedAttempts;
private LockPatternUtils mLockPatternUtils;
@@ -82,8 +91,16 @@ public class KeyguardHostView extends KeyguardViewBase {
private KeyguardSecurityModel mSecurityModel;
private KeyguardViewStateManager mViewStateManager;
+ boolean mPersitentStickyWidgetLoaded = false;
+
private Rect mTempRect = new Rect();
+ private int mDisabledFeatures;
+
+ private boolean mCameraDisabled;
+
+ private boolean mSafeModeEnabled;
+
/*package*/ interface TransportCallback {
void onListenerDetached();
void onListenerAttached();
@@ -97,6 +114,11 @@ public class KeyguardHostView extends KeyguardViewBase {
void userActivity();
}
+ /*package*/ interface OnDismissAction {
+ /* returns true if the dismiss should be deferred */
+ boolean onDismiss();
+ }
+
public KeyguardHostView(Context context) {
this(context, null);
}
@@ -109,9 +131,42 @@ public class KeyguardHostView extends KeyguardViewBase {
mAppWidgetManager = AppWidgetManager.getInstance(mContext);
mSecurityModel = new KeyguardSecurityModel(context);
- mViewStateManager = new KeyguardViewStateManager();
+ mViewStateManager = new KeyguardViewStateManager(this);
+
+ DevicePolicyManager dpm =
+ (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
+ if (dpm != null) {
+ mDisabledFeatures = getDisabledFeatures(dpm);
+ mCameraDisabled = dpm.getCameraDisabled(null);
+ }
+
+ mSafeModeEnabled = LockPatternUtils.isSafeModeEnabled();
+
+ if (mSafeModeEnabled) {
+ Log.v(TAG, "Keyguard widgets disabled by safe mode");
+ }
+ if ((mDisabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_WIDGETS_ALL) != 0) {
+ Log.v(TAG, "Keyguard widgets disabled by DPM");
+ }
+ if ((mDisabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0) {
+ Log.v(TAG, "Keyguard secure camera disabled by DPM");
+ }
}
+ private KeyguardUpdateMonitorCallback mUpdateMonitorCallbacks =
+ new KeyguardUpdateMonitorCallback() {
+ @Override
+ public void onBootCompleted() {
+ if (mCheckAppWidgetConsistencyOnBootCompleted) {
+ checkAppWidgetConsistency();
+ mSwitchPageRunnable.run();
+ mCheckAppWidgetConsistencyOnBootCompleted = false;
+ }
+ }
+ };
+
+ private SlidingChallengeLayout mSlidingChallengeLayout;
+
@Override
public boolean onTouchEvent(MotionEvent ev) {
boolean result = super.onTouchEvent(ev);
@@ -152,17 +207,17 @@ public class KeyguardHostView extends KeyguardViewBase {
mAppWidgetContainer.setDeleteDropTarget(deleteDropTarget);
mAppWidgetContainer.setMinScale(0.5f);
- SlidingChallengeLayout slider =
- (SlidingChallengeLayout) findViewById(R.id.sliding_layout);
- if (slider != null) {
- slider.setOnChallengeScrolledListener(mViewStateManager);
+ mSlidingChallengeLayout = (SlidingChallengeLayout) findViewById(R.id.sliding_layout);
+ if (mSlidingChallengeLayout != null) {
+ mSlidingChallengeLayout.setOnChallengeScrolledListener(mViewStateManager);
}
mAppWidgetContainer.setViewStateManager(mViewStateManager);
mAppWidgetContainer.setLockPatternUtils(mLockPatternUtils);
- ChallengeLayout challenge = slider != null ? slider :
+ ChallengeLayout challenge = mSlidingChallengeLayout != null ? mSlidingChallengeLayout :
(ChallengeLayout) findViewById(R.id.multi_pane_challenge);
challenge.setOnBouncerStateChangedListener(mViewStateManager);
+ mAppWidgetContainer.setBouncerAnimationDuration(challenge.getBouncerAnimationDuration());
mViewStateManager.setPagedView(mAppWidgetContainer);
mViewStateManager.setChallengeLayout(challenge);
mSecurityViewContainer = (KeyguardSecurityViewFlipper) findViewById(R.id.view_flipper);
@@ -174,9 +229,13 @@ public class KeyguardHostView extends KeyguardViewBase {
}
addDefaultWidgets();
+
addWidgetsFromSettings();
+ if (numWidgets() >= MAX_WIDGETS) {
+ setAddWidgetEnabled(false);
+ }
+ checkAppWidgetConsistency();
mSwitchPageRunnable.run();
-
// This needs to be called after the pages are all added.
mViewStateManager.showUsabilityHints();
@@ -184,6 +243,24 @@ public class KeyguardHostView extends KeyguardViewBase {
updateSecurityViews();
}
+ private int getDisabledFeatures(DevicePolicyManager dpm) {
+ int disabledFeatures = DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_NONE;
+ if (dpm != null) {
+ final int currentUser = mLockPatternUtils.getCurrentUser();
+ disabledFeatures = dpm.getKeyguardDisabledFeatures(null, currentUser);
+ }
+ return disabledFeatures;
+ }
+
+ private boolean widgetsDisabledByDpm() {
+ return (mDisabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_WIDGETS_ALL) != 0;
+ }
+
+ private boolean cameraDisabledByDpm() {
+ return mCameraDisabled
+ || (mDisabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0;
+ }
+
private void updateSecurityViews() {
int children = mSecurityViewContainer.getChildCount();
for (int i = 0; i < children; i++) {
@@ -216,12 +293,14 @@ public class KeyguardHostView extends KeyguardViewBase {
protected void onAttachedToWindow() {
super.onAttachedToWindow();
mAppWidgetHost.startListening();
+ KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallbacks);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mAppWidgetHost.stopListening();
+ KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallbacks);
}
private AppWidgetHost getAppWidgetHost() {
@@ -236,19 +315,41 @@ public class KeyguardHostView extends KeyguardViewBase {
= new KeyguardWidgetPager.Callbacks() {
@Override
public void userActivity() {
- if (mViewMediatorCallback != null) {
- mViewMediatorCallback.userActivity();
- }
+ KeyguardHostView.this.userActivity();
}
@Override
public void onUserActivityTimeoutChanged() {
- if (mViewMediatorCallback != null) {
- mViewMediatorCallback.onUserActivityTimeoutChanged();
+ KeyguardHostView.this.onUserActivityTimeoutChanged();
+ }
+
+ @Override
+ public void onAddView(View v) {
+ if (numWidgets() >= MAX_WIDGETS) {
+ setAddWidgetEnabled(false);
+ }
+ };
+
+ @Override
+ public void onRemoveView(View v) {
+ if (numWidgets() < MAX_WIDGETS) {
+ setAddWidgetEnabled(true);
}
}
};
+ public void userActivity() {
+ if (mViewMediatorCallback != null) {
+ mViewMediatorCallback.userActivity();
+ }
+ }
+
+ public void onUserActivityTimeoutChanged() {
+ if (mViewMediatorCallback != null) {
+ mViewMediatorCallback.onUserActivityTimeoutChanged();
+ }
+ }
+
@Override
public long getUserActivityTimeout() {
// Currently only considering user activity timeouts needed by widgets.
@@ -298,8 +399,8 @@ public class KeyguardHostView extends KeyguardViewBase {
}
@Override
- public void setOnDismissRunnable(Runnable runnable) {
- KeyguardHostView.this.setOnDismissRunnable(runnable);
+ public void setOnDismissAction(OnDismissAction action) {
+ KeyguardHostView.this.setOnDismissAction(action);
}
};
@@ -503,12 +604,17 @@ public class KeyguardHostView extends KeyguardViewBase {
// If there's a pending runnable because the user interacted with a widget
// and we're leaving keyguard, then run it.
- if (mLaunchRunnable != null) {
- mLaunchRunnable.run();
- mLaunchRunnable = null;
+ boolean deferKeyguardDone = false;
+ if (mDismissAction != null) {
+ deferKeyguardDone = mDismissAction.onDismiss();
+ mDismissAction = null;
}
if (mViewMediatorCallback != null) {
- mViewMediatorCallback.keyguardDone(true);
+ if (deferKeyguardDone) {
+ mViewMediatorCallback.keyguardDonePending();
+ } else {
+ mViewMediatorCallback.keyguardDone(true);
+ }
}
} else {
mViewStateManager.showBouncer(true);
@@ -521,8 +627,8 @@ public class KeyguardHostView extends KeyguardViewBase {
final android.app.PendingIntent pendingIntent,
final Intent fillInIntent) {
if (pendingIntent.isActivity()) {
- setOnDismissRunnable(new Runnable() {
- public void run() {
+ setOnDismissAction(new OnDismissAction() {
+ public boolean onDismiss() {
try {
// TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT?
Context context = view.getContext();
@@ -533,12 +639,13 @@ public class KeyguardHostView extends KeyguardViewBase {
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) {
- android.util.Log.e(TAG, "Cannot send pending intent due to " +
- "unknown exception: ", e);
- }
+ } catch (IntentSender.SendIntentException e) {
+ android.util.Log.e(TAG, "Cannot send pending intent: ", e);
+ } catch (Exception e) {
+ android.util.Log.e(TAG, "Cannot send pending intent due to " +
+ "unknown exception: ", e);
+ }
+ return false;
}
});
@@ -567,7 +674,7 @@ public class KeyguardHostView extends KeyguardViewBase {
}
@Override
- public void setOnDismissRunnable(Runnable runnable) {
+ public void setOnDismissAction(OnDismissAction action) {
}
@Override
@@ -602,11 +709,11 @@ public class KeyguardHostView extends KeyguardViewBase {
}
/**
- * Sets a runnable to run when keyguard is dismissed
- * @param runnable
+ * Sets an action to perform when keyguard is dismissed.
+ * @param action
*/
- protected void setOnDismissRunnable(Runnable runnable) {
- mLaunchRunnable = runnable;
+ protected void setOnDismissAction(OnDismissAction action) {
+ mDismissAction = action;
}
private KeyguardSecurityView getSecurityView(SecurityMode securityMode) {
@@ -623,7 +730,7 @@ public class KeyguardHostView extends KeyguardViewBase {
if (view == null && layoutId != 0) {
final LayoutInflater inflater = LayoutInflater.from(mContext);
if (DEBUG) Log.v(TAG, "inflating id = " + layoutId);
- View v = inflater.inflate(layoutId, this, false);
+ View v = inflater.inflate(layoutId, mSecurityViewContainer, false);
mSecurityViewContainer.addView(v);
updateSecurityView(v);
view = (KeyguardSecurityView)v;
@@ -661,12 +768,16 @@ public class KeyguardHostView extends KeyguardViewBase {
mAppWidgetContainer.setVisibility(
isSimOrAccount && fullScreenEnabled ? View.GONE : View.VISIBLE);
+ if (mSlidingChallengeLayout != null) {
+ mSlidingChallengeLayout.setChallengeInteractive(!fullScreenEnabled);
+ }
+
// Emulate Activity life cycle
if (oldView != null) {
oldView.onPause();
oldView.setKeyguardCallback(mNullCallback); // ignore requests from old view
}
- newView.onResume();
+ newView.onResume(KeyguardSecurityView.VIEW_REVEALED);
newView.setKeyguardCallback(mCallback);
final boolean needsInput = newView.needsInput();
@@ -691,7 +802,7 @@ public class KeyguardHostView extends KeyguardViewBase {
if (securityMode == SecurityMode.None) {
// Discard current runnable if we're switching back to the selector view
- setOnDismissRunnable(null);
+ setOnDismissAction(null);
}
mCurrentSecuritySelection = securityMode;
}
@@ -700,7 +811,7 @@ public class KeyguardHostView extends KeyguardViewBase {
public void onScreenTurnedOn() {
if (DEBUG) Log.d(TAG, "screen on, instance " + Integer.toHexString(hashCode()));
showPrimarySecurityScreen(false);
- getSecurityView(mCurrentSecuritySelection).onResume();
+ getSecurityView(mCurrentSecuritySelection).onResume(KeyguardSecurityView.SCREEN_ON);
// This is a an attempt to fix bug 7137389 where the device comes back on but the entire
// layout is blank but forcing a layout causes it to reappear (e.g. with with
@@ -719,7 +830,9 @@ public class KeyguardHostView extends KeyguardViewBase {
// Once the screen turns off, we no longer consider this to be first boot and we want the
// biometric unlock to start next time keyguard is shown.
KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true);
- saveStickyWidgetIndex();
+ // We use mAppWidgetToShow to show a particular widget after you add it-- once the screen
+ // turns off we reset that behavior
+ clearAppWidgetToShow();
checkAppWidgetConsistency();
showPrimarySecurityScreen(true);
getSecurityView(mCurrentSecuritySelection).onPause();
@@ -729,6 +842,10 @@ public class KeyguardHostView extends KeyguardViewBase {
}
}
+ public void clearAppWidgetToShow() {
+ mAppWidgetToShow = AppWidgetManager.INVALID_APPWIDGET_ID;
+ }
+
@Override
public void show() {
if (DEBUG) Log.d(TAG, "show()");
@@ -818,15 +935,18 @@ public class KeyguardHostView extends KeyguardViewBase {
}
}
- private boolean addWidget(int appId, int pageIndex) {
+ private boolean addWidget(int appId, int pageIndex, boolean updateDbIfFailed) {
AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appId);
if (appWidgetInfo != null) {
AppWidgetHostView view = getAppWidgetHost().createView(mContext, appId, appWidgetInfo);
addWidget(view, pageIndex);
return true;
} else {
- Log.w(TAG, "AppWidgetInfo for app widget id " + appId + " was null, deleting");
- mLockPatternUtils.removeAppWidget(appId);
+ if (updateDbIfFailed) {
+ Log.w(TAG, "AppWidgetInfo for app widget id " + appId + " was null, deleting");
+ mAppWidgetHost.deleteAppWidgetId(appId);
+ mLockPatternUtils.removeAppWidget(appId);
+ }
return false;
}
}
@@ -840,7 +960,7 @@ public class KeyguardHostView extends KeyguardViewBase {
@Override
public void onCameraLaunchedSuccessfully() {
- if (isCameraPage(mAppWidgetContainer.getCurrentPage())) {
+ if (mAppWidgetContainer.isCameraPage(mAppWidgetContainer.getCurrentPage())) {
mAppWidgetContainer.scrollLeft();
}
setSliderHandleAlpha(1);
@@ -878,13 +998,48 @@ public class KeyguardHostView extends KeyguardViewBase {
}
};
+ private int numWidgets() {
+ final int childCount = mAppWidgetContainer.getChildCount();
+ int widgetCount = 0;
+ for (int i = 0; i < childCount; i++) {
+ if (mAppWidgetContainer.isWidgetPage(i)) {
+ widgetCount++;
+ }
+ }
+ return widgetCount;
+ }
+
+
+ private void setAddWidgetEnabled(boolean clickable) {
+ View addWidget = mAppWidgetContainer.findViewById(R.id.keyguard_add_widget);
+ if (addWidget != null) {
+ View addWidgetButton = addWidget.findViewById(R.id.keyguard_add_widget_view);
+ addWidgetButton.setEnabled(clickable);
+ }
+ }
+
private void addDefaultWidgets() {
LayoutInflater inflater = LayoutInflater.from(mContext);
inflater.inflate(R.layout.keyguard_transport_control_view, this, true);
- View addWidget = inflater.inflate(R.layout.keyguard_add_widget, null, true);
- mAppWidgetContainer.addWidget(addWidget);
- if (mContext.getResources().getBoolean(R.bool.kg_enable_camera_default_widget)) {
+ if (!mSafeModeEnabled && !widgetsDisabledByDpm()) {
+ View addWidget = inflater.inflate(R.layout.keyguard_add_widget, this, false);
+ mAppWidgetContainer.addWidget(addWidget, 0);
+ View addWidgetButton = addWidget.findViewById(R.id.keyguard_add_widget_view);
+ addWidgetButton.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // Pass in an invalid widget id... the picker will allocate an ID for us
+ mActivityLauncher.launchWidgetPicker(AppWidgetManager.INVALID_APPWIDGET_ID);
+ }
+ });
+ }
+
+ // We currently disable cameras in safe mode because we support loading 3rd party
+ // cameras we can't trust. TODO: plumb safe mode into camera creation code and only
+ // inflate system-provided camera?
+ if (!mSafeModeEnabled && !cameraDisabledByDpm()
+ && mContext.getResources().getBoolean(R.bool.kg_enable_camera_default_widget)) {
View cameraWidget =
CameraWidgetFrame.create(mContext, mCameraWidgetCallbacks, mActivityLauncher);
if (cameraWidget != null) {
@@ -892,24 +1047,11 @@ public class KeyguardHostView extends KeyguardViewBase {
}
}
- View addWidgetButton = addWidget.findViewById(R.id.keyguard_add_widget_view);
- addWidgetButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- int appWidgetId = mAppWidgetHost.allocateAppWidgetId();
- if (appWidgetId != -1) {
- mActivityLauncher.launchWidgetPicker(appWidgetId);
- } else {
- Log.e(TAG, "Unable to allocate an AppWidget id in lock screen");
- }
- }
- });
-
enableUserSelectorIfNecessary();
initializeTransportControl();
}
- private void removeTransportFromWidgetPager() {
+ private boolean removeTransportFromWidgetPager() {
int page = getWidgetPosition(R.id.keyguard_transport_control);
if (page != -1) {
mAppWidgetContainer.removeWidget(mTransportControl);
@@ -918,8 +1060,9 @@ public class KeyguardHostView extends KeyguardViewBase {
KeyguardHostView.this.addView(mTransportControl);
mTransportControl.setVisibility(View.GONE);
mViewStateManager.setTransportState(KeyguardViewStateManager.TRANSPORT_GONE);
- mTransportControl.post(mSwitchPageRunnable);
+ return true;
}
+ return false;
}
private void addTransportToWidgetPager() {
@@ -929,7 +1072,8 @@ public class KeyguardHostView extends KeyguardViewBase {
int lastWidget = mAppWidgetContainer.getChildCount() - 1;
int position = 0; // handle no widget case
if (lastWidget >= 0) {
- position = isCameraPage(lastWidget) ? lastWidget : lastWidget + 1;
+ position = mAppWidgetContainer.isCameraPage(lastWidget) ?
+ lastWidget : lastWidget + 1;
}
mAppWidgetContainer.addWidget(mTransportControl, position);
mTransportControl.setVisibility(View.VISIBLE);
@@ -947,8 +1091,9 @@ public class KeyguardHostView extends KeyguardViewBase {
mTransportControl.setKeyguardCallback(new TransportCallback() {
@Override
public void onListenerDetached() {
- removeTransportFromWidgetPager();
- mTransportControl.post(mSwitchPageRunnable);
+ if (removeTransportFromWidgetPager()) {
+ mTransportControl.post(mSwitchPageRunnable);
+ }
}
@Override
@@ -965,14 +1110,15 @@ public class KeyguardHostView extends KeyguardViewBase {
}
}
- private int getAddPageIndex() {
+ private int getInsertPageIndex() {
View addWidget = mAppWidgetContainer.findViewById(R.id.keyguard_add_widget);
- int addPageIndex = mAppWidgetContainer.indexOfChild(addWidget);
- // This shouldn't happen, but just to be safe!
- if (addPageIndex < 0) {
- addPageIndex = 0;
+ int insertionIndex = mAppWidgetContainer.indexOfChild(addWidget);
+ if (insertionIndex < 0) {
+ insertionIndex = 0; // no add widget page found
+ } else {
+ insertionIndex++; // place after add widget
}
- return addPageIndex;
+ return insertionIndex;
}
private void addDefaultStatusWidget(int index) {
@@ -982,18 +1128,11 @@ public class KeyguardHostView extends KeyguardViewBase {
}
private void addWidgetsFromSettings() {
- DevicePolicyManager dpm =
- (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
- if (dpm != null) {
- final int currentUser = mLockPatternUtils.getCurrentUser();
- final int disabledFeatures = dpm.getKeyguardDisabledFeatures(null, currentUser);
- if ((disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_WIDGETS_ALL) != 0) {
- Log.v(TAG, "Keyguard widgets disabled because of device policy admin");
- return;
- }
+ if (mSafeModeEnabled || widgetsDisabledByDpm()) {
+ return;
}
- int addPageIndex = getAddPageIndex();
+ int insertionIndex = getInsertPageIndex();
// Add user-selected widget
final int[] widgets = mLockPatternUtils.getAppWidgets();
@@ -1003,50 +1142,95 @@ public class KeyguardHostView extends KeyguardViewBase {
} else {
for (int i = widgets.length -1; i >= 0; i--) {
if (widgets[i] == LockPatternUtils.ID_DEFAULT_STATUS_WIDGET) {
- addDefaultStatusWidget(addPageIndex + 1);
+ addDefaultStatusWidget(insertionIndex);
} else {
// We add the widgets from left to right, starting after the first page after
// the add page. We count down, since the order will be persisted from right
// to left, starting after camera.
- addWidget(widgets[i], addPageIndex + 1);
+ addWidget(widgets[i], insertionIndex, true);
}
}
}
- checkAppWidgetConsistency();
}
+ private int allocateIdForDefaultAppWidget() {
+ int appWidgetId;
+ Resources res = getContext().getResources();
+ ComponentName defaultAppWidget = new ComponentName(
+ res.getString(R.string.widget_default_package_name),
+ res.getString(R.string.widget_default_class_name));
+
+ // Note: we don't support configuring the widget
+ appWidgetId = mAppWidgetHost.allocateAppWidgetId();
+
+ try {
+ mAppWidgetManager.bindAppWidgetId(appWidgetId, defaultAppWidget);
+
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "Error when trying to bind default AppWidget: " + e);
+ mAppWidgetHost.deleteAppWidgetId(appWidgetId);
+ appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
+ }
+ return appWidgetId;
+ }
public void checkAppWidgetConsistency() {
+ // Since this method may bind a widget (which we can't do until boot completed) we
+ // may have to defer it until after boot complete.
+ if (!KeyguardUpdateMonitor.getInstance(mContext).hasBootCompleted()) {
+ mCheckAppWidgetConsistencyOnBootCompleted = true;
+ return;
+ }
final int childCount = mAppWidgetContainer.getChildCount();
boolean widgetPageExists = false;
for (int i = 0; i < childCount; i++) {
- if (isWidgetPage(i)) {
+ if (mAppWidgetContainer.isWidgetPage(i)) {
widgetPageExists = true;
break;
}
}
if (!widgetPageExists) {
- final int addPageIndex = getAddPageIndex();
-
- Resources res = getContext().getResources();
- ComponentName defaultAppWidget = new ComponentName(
- res.getString(R.string.widget_default_package_name),
- res.getString(R.string.widget_default_class_name));
-
- // Note: we don't support configuring the widget
- int appWidgetId = mAppWidgetHost.allocateAppWidgetId();
- boolean bindSuccessful = false;
- try {
- mAppWidgetManager.bindAppWidgetId(appWidgetId, defaultAppWidget);
- bindSuccessful = true;
- } catch (IllegalArgumentException e) {
- Log.e(TAG, "Error when trying to bind default AppWidget: " + e);
+ final int insertPageIndex = getInsertPageIndex();
+
+ final boolean userAddedWidgetsEnabled = !widgetsDisabledByDpm();
+ boolean addedDefaultAppWidget = false;
+
+ if (!mSafeModeEnabled) {
+ if (userAddedWidgetsEnabled) {
+ int appWidgetId = allocateIdForDefaultAppWidget();
+ if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
+ addedDefaultAppWidget = addWidget(appWidgetId, insertPageIndex, true);
+ }
+ } else {
+ // note: even if widgetsDisabledByDpm() returns true, we still bind/create
+ // the default appwidget if possible
+ int appWidgetId = mLockPatternUtils.getFallbackAppWidgetId();
+ if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
+ appWidgetId = allocateIdForDefaultAppWidget();
+ if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
+ mLockPatternUtils.writeFallbackAppWidgetId(appWidgetId);
+ }
+ }
+ if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
+ addedDefaultAppWidget = addWidget(appWidgetId, insertPageIndex, false);
+ if (!addedDefaultAppWidget) {
+ mAppWidgetHost.deleteAppWidgetId(appWidgetId);
+ mLockPatternUtils.writeFallbackAppWidgetId(
+ AppWidgetManager.INVALID_APPWIDGET_ID);
+ }
+ }
+ }
}
+
// Use the built-in status/clock view if we can't inflate the default widget
- if (!(bindSuccessful && addWidget(appWidgetId, addPageIndex + 1))) {
- addDefaultStatusWidget(addPageIndex + 1);
+ if (!addedDefaultAppWidget) {
+ addDefaultStatusWidget(insertPageIndex);
+ }
+
+ // trigger DB updates only if user-added widgets are enabled
+ if (!mSafeModeEnabled && userAddedWidgetsEnabled) {
+ mAppWidgetContainer.onAddView(
+ mAppWidgetContainer.getChildAt(insertPageIndex), insertPageIndex);
}
- mAppWidgetContainer.onAddView(
- mAppWidgetContainer.getChildAt(addPageIndex + 1), addPageIndex + 1);
}
}
@@ -1059,6 +1243,7 @@ public class KeyguardHostView extends KeyguardViewBase {
static class SavedState extends BaseSavedState {
int transportState;
+ int appWidgetToShow = AppWidgetManager.INVALID_APPWIDGET_ID;
SavedState(Parcelable superState) {
super(superState);
@@ -1067,12 +1252,14 @@ public class KeyguardHostView extends KeyguardViewBase {
private SavedState(Parcel in) {
super(in);
this.transportState = in.readInt();
+ this.appWidgetToShow = in.readInt();
}
@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeInt(this.transportState);
+ out.writeInt(this.appWidgetToShow);
}
public static final Parcelable.Creator<SavedState> CREATOR
@@ -1090,10 +1277,10 @@ public class KeyguardHostView extends KeyguardViewBase {
@Override
public Parcelable onSaveInstanceState() {
if (DEBUG) Log.d(TAG, "onSaveInstanceState");
- saveStickyWidgetIndex();
Parcelable superState = super.onSaveInstanceState();
SavedState ss = new SavedState(superState);
ss.transportState = mViewStateManager.getTransportState();
+ ss.appWidgetToShow = mAppWidgetToShow;
return ss;
}
@@ -1107,6 +1294,7 @@ public class KeyguardHostView extends KeyguardViewBase {
SavedState ss = (SavedState) state;
super.onRestoreInstanceState(ss.getSuperState());
mViewStateManager.setTransportState(ss.transportState);
+ mAppWidgetToShow = ss.appWidgetToShow;
post(mSwitchPageRunnable);
}
@@ -1114,9 +1302,7 @@ public class KeyguardHostView extends KeyguardViewBase {
public void onWindowFocusChanged(boolean hasWindowFocus) {
super.onWindowFocusChanged(hasWindowFocus);
if (DEBUG) Log.d(TAG, "Window is " + (hasWindowFocus ? "focused" : "unfocused"));
- if (!hasWindowFocus) {
- saveStickyWidgetIndex();
- } else if (mShowSecurityWhenReturn) {
+ if (hasWindowFocus && mShowSecurityWhenReturn) {
SlidingChallengeLayout slider =
(SlidingChallengeLayout) findViewById(R.id.sliding_layout);
if (slider != null) {
@@ -1143,115 +1329,114 @@ public class KeyguardHostView extends KeyguardViewBase {
private CameraWidgetFrame findCameraPage() {
for (int i = mAppWidgetContainer.getChildCount() - 1; i >= 0; i--) {
- if (isCameraPage(i)) {
+ if (mAppWidgetContainer.isCameraPage(i)) {
return (CameraWidgetFrame) mAppWidgetContainer.getChildAt(i);
}
}
return null;
}
- private boolean isWidgetPage(int pageIndex) {
- View v = mAppWidgetContainer.getChildAt(pageIndex);
- if (v != null && v instanceof KeyguardWidgetFrame) {
- KeyguardWidgetFrame kwf = (KeyguardWidgetFrame) v;
- return kwf.getContentAppWidgetId() != AppWidgetManager.INVALID_APPWIDGET_ID;
- }
- return false;
- }
-
- private boolean isCameraPage(int pageIndex) {
- View v = mAppWidgetContainer.getChildAt(pageIndex);
- return v != null && v instanceof CameraWidgetFrame;
- }
-
- private boolean isAddPage(int pageIndex) {
- View v = mAppWidgetContainer.getChildAt(pageIndex);
- return v != null && v.getId() == R.id.keyguard_add_widget;
+ boolean isMusicPage(int pageIndex) {
+ return pageIndex >= 0 && pageIndex == getWidgetPosition(R.id.keyguard_transport_control);
}
private int getAppropriateWidgetPage(boolean isMusicPlaying) {
// assumes at least one widget (besides camera + add)
-
+ if (mAppWidgetToShow != AppWidgetManager.INVALID_APPWIDGET_ID) {
+ final int childCount = mAppWidgetContainer.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ if (mAppWidgetContainer.getWidgetPageAt(i).getContentAppWidgetId()
+ == mAppWidgetToShow) {
+ return i;
+ }
+ }
+ mAppWidgetToShow = AppWidgetManager.INVALID_APPWIDGET_ID;
+ }
// if music playing, show transport
if (isMusicPlaying) {
if (DEBUG) Log.d(TAG, "Music playing, show transport");
return mAppWidgetContainer.getWidgetPageIndex(mTransportControl);
}
- // if we have a valid sticky widget, show it
- int stickyWidgetIndex = mLockPatternUtils.getStickyAppWidgetIndex();
- if (stickyWidgetIndex > -1
- && stickyWidgetIndex < mAppWidgetContainer.getChildCount()
- && !isAddPage(stickyWidgetIndex)
- && !isCameraPage(stickyWidgetIndex)) {
- if (DEBUG) Log.d(TAG, "Valid sticky widget found, show page " + stickyWidgetIndex);
- return stickyWidgetIndex;
- }
-
// else show the right-most widget (except for camera)
int rightMost = mAppWidgetContainer.getChildCount() - 1;
- if (isCameraPage(rightMost)) {
+ if (mAppWidgetContainer.isCameraPage(rightMost)) {
rightMost--;
}
if (DEBUG) Log.d(TAG, "Show right-most page " + rightMost);
return rightMost;
}
- private void saveStickyWidgetIndex() {
- int stickyWidgetIndex = mAppWidgetContainer.getCurrentPage();
- if (isAddPage(stickyWidgetIndex)) {
- stickyWidgetIndex++;
- }
- if (isCameraPage(stickyWidgetIndex)) {
- stickyWidgetIndex--;
- }
- if (stickyWidgetIndex < 0 || stickyWidgetIndex >= mAppWidgetContainer.getChildCount()) {
- stickyWidgetIndex = -1;
- }
- if (DEBUG) Log.d(TAG, "saveStickyWidgetIndex: " + stickyWidgetIndex);
- mLockPatternUtils.setStickyAppWidgetIndex(stickyWidgetIndex);
- }
-
private void enableUserSelectorIfNecessary() {
if (!UserManager.supportsMultipleUsers()) {
return; // device doesn't support multi-user mode
}
+ final UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+ if (um == null) {
+ Throwable t = new Throwable();
+ t.fillInStackTrace();
+ Log.e(TAG, "user service is null.", t);
+ return;
+ }
// if there are multiple users, we need to enable to multi-user switcher
- UserManager mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
- List<UserInfo> users = mUm.getUsers(true);
+ final List<UserInfo> users = um.getUsers(true);
+ if (users == null) {
+ Throwable t = new Throwable();
+ t.fillInStackTrace();
+ Log.e(TAG, "list of users is null.", t);
+ return;
+ }
+
+ final View multiUserView = findViewById(R.id.keyguard_user_selector);
+ if (multiUserView == null) {
+ Throwable t = new Throwable();
+ t.fillInStackTrace();
+ Log.e(TAG, "can't find user_selector in layout.", t);
+ return;
+ }
if (users.size() > 1) {
- KeyguardMultiUserSelectorView multiUser =
- (KeyguardMultiUserSelectorView) findViewById(R.id.keyguard_user_selector);
- multiUser.setVisibility(View.VISIBLE);
- multiUser.addUsers(mUm.getUsers(true));
- UserSwitcherCallback callback = new UserSwitcherCallback() {
- @Override
- public void hideSecurityView(int duration) {
- mSecurityViewContainer.animate().alpha(0).setDuration(duration);
- }
+ if (multiUserView instanceof KeyguardMultiUserSelectorView) {
+ KeyguardMultiUserSelectorView multiUser =
+ (KeyguardMultiUserSelectorView) multiUserView;
+ multiUser.setVisibility(View.VISIBLE);
+ multiUser.addUsers(users);
+ UserSwitcherCallback callback = new UserSwitcherCallback() {
+ @Override
+ public void hideSecurityView(int duration) {
+ mSecurityViewContainer.animate().alpha(0).setDuration(duration);
+ }
- @Override
- public void showSecurityView() {
- mSecurityViewContainer.setAlpha(1.0f);
- }
+ @Override
+ public void showSecurityView() {
+ mSecurityViewContainer.setAlpha(1.0f);
+ }
- @Override
- public void showUnlockHint() {
- if (mKeyguardSelectorView != null) {
- mKeyguardSelectorView.showUsabilityHint();
+ @Override
+ public void showUnlockHint() {
+ if (mKeyguardSelectorView != null) {
+ mKeyguardSelectorView.showUsabilityHint();
+ }
}
- }
- @Override
- public void userActivity() {
- if (mViewMediatorCallback != null) {
- mViewMediatorCallback.userActivity();
+ @Override
+ public void userActivity() {
+ if (mViewMediatorCallback != null) {
+ mViewMediatorCallback.userActivity();
+ }
}
+ };
+ multiUser.setCallback(callback);
+ } else {
+ Throwable t = new Throwable();
+ t.fillInStackTrace();
+ if (multiUserView == null) {
+ Log.e(TAG, "could not find the user_selector.", t);
+ } else {
+ Log.e(TAG, "user_selector is the wrong type.", t);
}
- };
- multiUser.setCallback(callback);
+ }
}
}
@@ -1283,6 +1468,11 @@ public class KeyguardHostView extends KeyguardViewBase {
mAppWidgetContainer.setCurrentPage(getWidgetPosition(R.id.keyguard_multi_user_selector));
}
+ public void goToWidget(int appWidgetId) {
+ mAppWidgetToShow = appWidgetId;
+ mSwitchPageRunnable.run();
+ }
+
public boolean handleMenuKey() {
// The following enables the MENU key to work for testing automation
if (shouldEnableMenuKey()) {
@@ -1306,4 +1496,20 @@ public class KeyguardHostView extends KeyguardViewBase {
public void dismiss() {
showNextSecurityScreenOrFinish(false);
}
+
+ public void showAssistant() {
+ final Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
+ .getAssistIntent(mContext, UserHandle.USER_CURRENT);
+
+ if (intent == null) return;
+
+ final ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext,
+ R.anim.keyguard_action_assist_enter, R.anim.keyguard_action_assist_exit,
+ getHandler(), null);
+
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ mActivityLauncher.launchActivityWithAnimation(
+ intent, false, opts.toBundle(), null, null);
+ }
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPasswordView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPasswordView.java
index 23ea2e9c1c90..d52c993c82d2 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPasswordView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPasswordView.java
@@ -44,14 +44,18 @@ import java.util.List;
public class KeyguardPasswordView extends KeyguardAbsKeyInputView
implements KeyguardSecurityView, OnEditorActionListener, TextWatcher {
+ private final boolean mShowImeAtScreenOn;
+
InputMethodManager mImm;
public KeyguardPasswordView(Context context) {
- super(context);
+ this(context, null);
}
public KeyguardPasswordView(Context context, AttributeSet attrs) {
super(context, attrs);
+ mShowImeAtScreenOn = context.getResources().
+ getBoolean(R.bool.kg_show_ime_at_screen_on);
}
protected void resetState() {
@@ -70,11 +74,12 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView
}
@Override
- public void onResume() {
- super.onResume();
- // XXX this is still not right because onResume is being called every time the page changes
+ public void onResume(int reason) {
+ super.onResume(reason);
mPasswordEntry.requestFocus();
- mImm.showSoftInput(mPasswordEntry, InputMethodManager.SHOW_IMPLICIT);
+ if (reason != KeyguardSecurityView.SCREEN_ON || mShowImeAtScreenOn) {
+ mImm.showSoftInput(mPasswordEntry, InputMethodManager.SHOW_IMPLICIT);
+ }
}
@Override
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPatternView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPatternView.java
index 186d717347ba..e114b78bac2a 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPatternView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPatternView.java
@@ -129,12 +129,15 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit
mLockPatternView.setTactileFeedbackEnabled(mLockPatternUtils.isTactileFeedbackEnabled());
mForgotPatternButton = (Button) findViewById(R.id.forgot_password_button);
- mForgotPatternButton.setText(R.string.kg_forgot_pattern_button_text);
- mForgotPatternButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- mCallback.showBackupSecurity();
- }
- });
+ // note: some configurations don't have an emergency call area
+ if (mForgotPatternButton != null) {
+ mForgotPatternButton.setText(R.string.kg_forgot_pattern_button_text);
+ mForgotPatternButton.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ mCallback.showBackupSecurity();
+ }
+ });
+ }
setFocusableInTouchMode(true);
@@ -148,6 +151,8 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit
}
private void updateFooter(FooterMode mode) {
+ if (mForgotPatternButton == null) return; // no ECA? no footer
+
switch (mode) {
case Normal:
if (DEBUG) Log.d(TAG, "mode normal");
@@ -384,7 +389,7 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit
}
@Override
- public void onResume() {
+ public void onResume(int reason) {
reset();
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityCallback.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityCallback.java
index 3b8df5db5e2a..7e6c108908ea 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityCallback.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityCallback.java
@@ -15,6 +15,8 @@
*/
package com.android.internal.policy.impl.keyguard;
+import com.android.internal.policy.impl.keyguard.KeyguardHostView.OnDismissAction;
+
public interface KeyguardSecurityCallback {
/**
@@ -58,9 +60,9 @@ public interface KeyguardSecurityCallback {
void showBackupSecurity();
/**
- * Sets a runnable to launch after the user successfully enters their credentials.
- * @param runnable
+ * Sets an action to perform after the user successfully enters their credentials.
+ * @param action
*/
- void setOnDismissRunnable(Runnable runnable);
+ void setOnDismissAction(OnDismissAction action);
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityView.java
index 027b16e5fabc..a3ac39c1b2f0 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityView.java
@@ -18,6 +18,9 @@ package com.android.internal.policy.impl.keyguard;
import com.android.internal.widget.LockPatternUtils;
public interface KeyguardSecurityView {
+ static public final int SCREEN_ON = 1;
+ static public final int VIEW_REVEALED = 2;
+
/**
* Interface back to keyguard to tell it when security
* @param callback
@@ -45,8 +48,9 @@ public interface KeyguardSecurityView {
/**
* Emulate activity life cycle within this view. When called, the view should prepare itself
* to be shown.
+ * @param reason the root cause of the event.
*/
- void onResume();
+ void onResume(int reason);
/**
* Inquire whether this view requires IME (keyboard) interaction.
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityViewFlipper.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityViewFlipper.java
index 3d4cb194bcf3..aa31b0062af4 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityViewFlipper.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityViewFlipper.java
@@ -16,22 +16,31 @@
package com.android.internal.policy.impl.keyguard;
+import com.android.internal.R;
+import com.android.internal.widget.LockPatternUtils;
+
import android.content.Context;
+import android.content.res.TypedArray;
import android.graphics.Rect;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
+import android.view.ViewDebug;
+import android.view.ViewGroup;
import android.view.WindowManager;
+import android.widget.FrameLayout;
import android.widget.ViewFlipper;
-import com.android.internal.widget.LockPatternUtils;
-
/**
* Subclass of the current view flipper that allows us to overload dispatchTouchEvent() so
* we can emulate {@link WindowManager.LayoutParams#FLAG_SLIPPERY} within a view hierarchy.
*
*/
public class KeyguardSecurityViewFlipper extends ViewFlipper implements KeyguardSecurityView {
+ private static final String TAG = "KeyguardSecurityViewFlipper";
+ private static final boolean DEBUG = false;
+
private Rect mTempRect = new Rect();
public KeyguardSecurityViewFlipper(Context context) {
@@ -99,10 +108,10 @@ public class KeyguardSecurityViewFlipper extends ViewFlipper implements Keyguard
}
@Override
- public void onResume() {
+ public void onResume(int reason) {
KeyguardSecurityView ksv = getSecurityView();
if (ksv != null) {
- ksv.onResume();
+ ksv.onResume(reason);
}
}
@@ -128,23 +137,143 @@ public class KeyguardSecurityViewFlipper extends ViewFlipper implements Keyguard
@Override
public void showBouncer(int duration) {
+ KeyguardSecurityView active = getSecurityView();
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
if (child instanceof KeyguardSecurityView) {
KeyguardSecurityView ksv = (KeyguardSecurityView) child;
- ksv.showBouncer(child.getVisibility() == View.VISIBLE ? duration : 0);
+ ksv.showBouncer(ksv == active ? duration : 0);
}
}
}
@Override
public void hideBouncer(int duration) {
+ KeyguardSecurityView active = getSecurityView();
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
if (child instanceof KeyguardSecurityView) {
KeyguardSecurityView ksv = (KeyguardSecurityView) child;
- ksv.hideBouncer(child.getVisibility() == View.VISIBLE ? duration : 0);
+ ksv.hideBouncer(ksv == active ? duration : 0);
+ }
+ }
+ }
+
+ @Override
+ protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
+ return p instanceof LayoutParams;
+ }
+
+ @Override
+ protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
+ return p instanceof LayoutParams ? new LayoutParams((LayoutParams) p) : new LayoutParams(p);
+ }
+
+ @Override
+ public LayoutParams generateLayoutParams(AttributeSet attrs) {
+ return new LayoutParams(getContext(), attrs);
+ }
+
+ @Override
+ protected void onMeasure(int widthSpec, int heightSpec) {
+ final int widthMode = MeasureSpec.getMode(widthSpec);
+ final int heightMode = MeasureSpec.getMode(heightSpec);
+ if (DEBUG && widthMode != MeasureSpec.AT_MOST) {
+ Log.w(TAG, "onMeasure: widthSpec " + MeasureSpec.toString(widthSpec) +
+ " should be AT_MOST");
+ }
+ if (DEBUG && heightMode != MeasureSpec.AT_MOST) {
+ Log.w(TAG, "onMeasure: heightSpec " + MeasureSpec.toString(heightSpec) +
+ " should be AT_MOST");
+ }
+
+ final int widthSize = MeasureSpec.getSize(widthSpec);
+ final int heightSize = MeasureSpec.getSize(heightSpec);
+ int maxWidth = widthSize;
+ int maxHeight = heightSize;
+ final int count = getChildCount();
+ for (int i = 0; i < count; i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+
+ if (lp.maxWidth > 0 && lp.maxWidth < maxWidth) {
+ maxWidth = lp.maxWidth;
+ }
+ if (lp.maxHeight > 0 && lp.maxHeight < maxHeight) {
+ maxHeight = lp.maxHeight;
}
}
+
+ final int wPadding = getPaddingLeft() + getPaddingRight();
+ final int hPadding = getPaddingTop() + getPaddingBottom();
+ maxWidth -= wPadding;
+ maxHeight -= hPadding;
+
+ int width = widthMode == MeasureSpec.EXACTLY ? widthSize : 0;
+ int height = heightMode == MeasureSpec.EXACTLY ? heightSize : 0;
+ for (int i = 0; i < count; i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+
+ final int childWidthSpec = makeChildMeasureSpec(maxWidth, lp.width);
+ final int childHeightSpec = makeChildMeasureSpec(maxHeight, lp.height);
+
+ child.measure(childWidthSpec, childHeightSpec);
+
+ width = Math.max(width, Math.min(child.getMeasuredWidth(), widthSize - wPadding));
+ height = Math.max(height, Math.min(child.getMeasuredHeight(), heightSize - hPadding));
+ }
+ setMeasuredDimension(width + wPadding, height + hPadding);
+ }
+
+ private int makeChildMeasureSpec(int maxSize, int childDimen) {
+ final int mode;
+ final int size;
+ switch (childDimen) {
+ case LayoutParams.WRAP_CONTENT:
+ mode = MeasureSpec.AT_MOST;
+ size = maxSize;
+ break;
+ case LayoutParams.MATCH_PARENT:
+ mode = MeasureSpec.EXACTLY;
+ size = maxSize;
+ break;
+ default:
+ mode = MeasureSpec.EXACTLY;
+ size = Math.min(maxSize, childDimen);
+ break;
+ }
+ return MeasureSpec.makeMeasureSpec(size, mode);
+ }
+
+ public static class LayoutParams extends FrameLayout.LayoutParams {
+ @ViewDebug.ExportedProperty(category = "layout")
+ public int maxWidth;
+
+ @ViewDebug.ExportedProperty(category = "layout")
+ public int maxHeight;
+
+ public LayoutParams(ViewGroup.LayoutParams other) {
+ super(other);
+ }
+
+ public LayoutParams(LayoutParams other) {
+ super(other);
+
+ maxWidth = other.maxWidth;
+ maxHeight = other.maxHeight;
+ }
+
+ public LayoutParams(Context c, AttributeSet attrs) {
+ super(c, attrs);
+
+ final TypedArray a = c.obtainStyledAttributes(attrs,
+ R.styleable.KeyguardSecurityViewFlipper_Layout, 0, 0);
+ maxWidth = a.getDimensionPixelSize(
+ R.styleable.KeyguardSecurityViewFlipper_Layout_layout_maxWidth, 0);
+ maxHeight = a.getDimensionPixelSize(
+ R.styleable.KeyguardSecurityViewFlipper_Layout_layout_maxHeight, 0);
+ a.recycle();
+ }
}
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityViewHelper.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityViewHelper.java
index 2ccdc1d9c5fc..3d59f8d919a4 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityViewHelper.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityViewHelper.java
@@ -17,6 +17,7 @@
package com.android.internal.policy.impl.keyguard;
import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.graphics.drawable.Drawable;
import android.view.View;
@@ -27,7 +28,7 @@ import android.view.View;
public class KeyguardSecurityViewHelper {
public static void showBouncer(SecurityMessageDisplay securityMessageDisplay,
- View ecaView, Drawable bouncerFrame, int duration) {
+ final View ecaView, Drawable bouncerFrame, int duration) {
if (securityMessageDisplay != null) {
securityMessageDisplay.showBouncer(duration);
}
@@ -35,14 +36,28 @@ public class KeyguardSecurityViewHelper {
if (duration > 0) {
Animator anim = ObjectAnimator.ofFloat(ecaView, "alpha", 0f);
anim.setDuration(duration);
+ anim.addListener(new AnimatorListenerAdapter() {
+ private boolean mCanceled;
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ // Fail safe and show the emergency button in onAnimationEnd()
+ mCanceled = true;
+ ecaView.setAlpha(1f);
+ }
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ ecaView.setVisibility(mCanceled ? View.VISIBLE : View.INVISIBLE);
+ }
+ });
anim.start();
} else {
ecaView.setAlpha(0f);
+ ecaView.setVisibility(View.INVISIBLE);
}
}
if (bouncerFrame != null) {
if (duration > 0) {
- Animator anim = ObjectAnimator.ofInt(bouncerFrame, "alpha", 255);
+ Animator anim = ObjectAnimator.ofInt(bouncerFrame, "alpha", 0, 255);
anim.setDuration(duration);
anim.start();
} else {
@@ -57,6 +72,7 @@ public class KeyguardSecurityViewHelper {
securityMessageDisplay.hideBouncer(duration);
}
if (ecaView != null) {
+ ecaView.setVisibility(View.VISIBLE);
if (duration > 0) {
Animator anim = ObjectAnimator.ofFloat(ecaView, "alpha", 1f);
anim.setDuration(duration);
@@ -67,7 +83,7 @@ public class KeyguardSecurityViewHelper {
}
if (bouncerFrame != null) {
if (duration > 0) {
- Animator anim = ObjectAnimator.ofInt(bouncerFrame, "alpha", 0);
+ Animator anim = ObjectAnimator.ofInt(bouncerFrame, "alpha", 255, 0);
anim.setDuration(duration);
anim.start();
} else {
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java
index 916741205a93..76cbbd57274e 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java
@@ -21,6 +21,7 @@ import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.graphics.drawable.Drawable;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.AttributeSet;
@@ -45,9 +46,12 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri
private GlowPadView mGlowPadView;
private ObjectAnimator mAnim;
private View mFadeView;
+ private boolean mIsBouncing;
private boolean mCameraDisabled;
private boolean mSearchDisabled;
private LockPatternUtils mLockPatternUtils;
+ private SecurityMessageDisplay mSecurityMessageDisplay;
+ private Drawable mBouncerFrame;
OnTriggerListener mOnTriggerListener = new OnTriggerListener() {
@@ -80,7 +84,9 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri
}
public void onReleased(View v, int handle) {
- doTransition(mFadeView, 1.0f);
+ if (!mIsBouncing) {
+ doTransition(mFadeView, 1.0f);
+ }
}
public void onGrabbed(View v, int handle) {
@@ -143,6 +149,10 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri
mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view);
mGlowPadView.setOnTriggerListener(mOnTriggerListener);
updateTargets();
+
+ mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this);
+ View bouncerFrameView = findViewById(R.id.keyguard_selector_view_frame);
+ mBouncerFrame = bouncerFrameView.getBackground();
}
public void setCarrierArea(View carrierArea) {
@@ -253,7 +263,7 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri
}
@Override
- public void onResume() {
+ public void onResume(int reason) {
KeyguardUpdateMonitor.getInstance(getContext()).registerCallback(mInfoCallback);
}
@@ -264,9 +274,15 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri
@Override
public void showBouncer(int duration) {
+ mIsBouncing = true;
+ KeyguardSecurityViewHelper.
+ showBouncer(mSecurityMessageDisplay, mFadeView, mBouncerFrame, duration);
}
@Override
public void hideBouncer(int duration) {
+ mIsBouncing = false;
+ KeyguardSecurityViewHelper.
+ hideBouncer(mSecurityMessageDisplay, mFadeView, mBouncerFrame, duration);
}
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java
index f2cb5221d0a8..35b8509f92ef 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java
@@ -17,14 +17,52 @@
package com.android.internal.policy.impl.keyguard;
import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Typeface;
+import android.text.TextUtils;
+import android.text.format.DateFormat;
import android.util.AttributeSet;
+import android.util.Slog;
+import android.view.View;
import android.widget.GridLayout;
+import android.widget.TextView;
+import com.android.internal.R;
import com.android.internal.widget.LockPatternUtils;
+import java.util.Date;
+
public class KeyguardStatusView extends GridLayout {
- @SuppressWarnings("unused")
- private KeyguardStatusViewManager mStatusViewManager;
+ private static final boolean DEBUG = KeyguardViewMediator.DEBUG;
+ private static final String TAG = "KeyguardStatusView";
+
+ public static final int LOCK_ICON = 0; // R.drawable.ic_lock_idle_lock;
+ public static final int ALARM_ICON = com.android.internal.R.drawable.ic_lock_idle_alarm;
+ public static final int CHARGING_ICON = 0; //R.drawable.ic_lock_idle_charging;
+ public static final int BATTERY_LOW_ICON = 0; //R.drawable.ic_lock_idle_low_battery;
+
+ private CharSequence mDateFormatString;
+ private LockPatternUtils mLockPatternUtils;
+
+ private TextView mDateView;
+ private TextView mAlarmStatusView;
+ private ClockView mClockView;
+
+ private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
+
+ @Override
+ public void onTimeChanged() {
+ refresh();
+ }
+
+ @Override
+ void onKeyguardVisibilityChanged(boolean showing) {
+ if (showing) {
+ if (DEBUG) Slog.v(TAG, "refresh statusview showing:" + showing);
+ refresh();
+ }
+ };
+ };
public KeyguardStatusView(Context context) {
this(context, null, 0);
@@ -38,19 +76,76 @@ public class KeyguardStatusView extends GridLayout {
super(context, attrs, defStyle);
}
- public int getAppWidgetId() {
- return LockPatternUtils.ID_DEFAULT_STATUS_WIDGET;
- }
-
@Override
protected void onFinishInflate() {
super.onFinishInflate();
+ Resources res = getContext().getResources();
+ mDateFormatString =
+ res.getText(com.android.internal.R.string.abbrev_wday_month_day_no_year);
+ mDateView = (TextView) findViewById(R.id.date);
+ mAlarmStatusView = (TextView) findViewById(R.id.alarm_status);
+ mClockView = (ClockView) findViewById(R.id.clock_view);
+ mLockPatternUtils = new LockPatternUtils(getContext());
+
+ // Use custom font in mDateView
+ mDateView.setTypeface(Typeface.SANS_SERIF, Typeface.BOLD);
+
+ // Required to get Marquee to work.
+ final View marqueeViews[] = { mDateView, mAlarmStatusView };
+ for (int i = 0; i < marqueeViews.length; i++) {
+ View v = marqueeViews[i];
+ if (v == null) {
+ throw new RuntimeException("Can't find widget at index " + i);
+ }
+ v.setSelected(true);
+ }
+ refresh();
+ }
- // StatusView manages all of the widgets in this view.
- mStatusViewManager = new KeyguardStatusViewManager(this);
+ protected void refresh() {
+ mClockView.updateTime();
+ refreshDate();
+ refreshAlarmStatus(); // might as well
+ }
+
+ void refreshAlarmStatus() {
+ // Update Alarm status
+ String nextAlarm = mLockPatternUtils.getNextAlarm();
+ if (!TextUtils.isEmpty(nextAlarm)) {
+ maybeSetUpperCaseText(mAlarmStatusView, nextAlarm);
+ mAlarmStatusView.setCompoundDrawablesWithIntrinsicBounds(ALARM_ICON, 0, 0, 0);
+ mAlarmStatusView.setVisibility(View.VISIBLE);
+ } else {
+ mAlarmStatusView.setVisibility(View.GONE);
+ }
+ }
+
+ void refreshDate() {
+ maybeSetUpperCaseText(mDateView, DateFormat.format(mDateFormatString, new Date()));
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mInfoCallback);
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mInfoCallback);
+ }
+
+ public int getAppWidgetId() {
+ return LockPatternUtils.ID_DEFAULT_STATUS_WIDGET;
}
- KeyguardStatusViewManager getManager() {
- return mStatusViewManager;
+ private void maybeSetUpperCaseText(TextView textView, CharSequence text) {
+ if (KeyguardViewManager.USE_UPPER_CASE
+ && textView.getId() != R.id.owner_info) { // currently only required for date view
+ textView.setText(text != null ? text.toString().toUpperCase() : null);
+ } else {
+ textView.setText(text);
+ }
}
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java
deleted file mode 100644
index 7100f1c3a690..000000000000
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.policy.impl.keyguard;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Typeface;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.text.format.DateFormat;
-import android.util.Log;
-import android.view.View;
-import android.widget.TextView;
-
-import com.android.internal.R;
-import com.android.internal.telephony.IccCardConstants;
-import com.android.internal.widget.LockPatternUtils;
-
-import java.util.Date;
-
-import libcore.util.MutableInt;
-
-/***
- * Manages a number of views inside of the given layout. See below for a list of widgets.
- */
-class KeyguardStatusViewManager implements SecurityMessageDisplay {
- private static final boolean DEBUG = false;
- private static final String TAG = "KeyguardStatusView";
-
- public static final int LOCK_ICON = 0; // R.drawable.ic_lock_idle_lock;
- public static final int ALARM_ICON = com.android.internal.R.drawable.ic_lock_idle_alarm;
- public static final int CHARGING_ICON = 0; //R.drawable.ic_lock_idle_charging;
- public static final int BATTERY_LOW_ICON = 0; //R.drawable.ic_lock_idle_low_battery;
-
- private CharSequence mDateFormatString;
-
- // Views that this class controls.
- private TextView mDateView;
- private TextView mStatus1View;
- private TextView mOwnerInfoView;
- private TextView mAlarmStatusView;
- private TextView mSecurityMessage;
- private static final int SECURITY_MESSAGE_DURATION = 5000;
- private static final boolean SECURITY_MESSAGE_TIMES_OUT = false;
-
- // Top-level container view for above views
- private View mContainer;
-
- // are we showing battery information?
- private boolean mShowingBatteryInfo = false;
-
- // last known plugged in state
- private boolean mPluggedIn = false;
-
- // Whether to use the last line as a combined line to either display owner info / charging.
- // If false, each item will be given a dedicated space.
- private boolean mShareStatusRegion = false;
-
- // last known battery level
- private int mBatteryLevel = 100;
-
- // last known SIM state
- protected IccCardConstants.State mSimState;
-
- private LockPatternUtils mLockPatternUtils;
- private KeyguardUpdateMonitor mUpdateMonitor;
-
- // Shadowed text values
- private ClockView mClockView;
- protected boolean mBatteryCharged;
- protected boolean mBatteryIsLow;
-
- private Handler mHandler;
- private Runnable mClearSecurityMessageRunnable;
- private CharSequence mSecurityMessageContents = "";
-
- private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
- @Override
- public void onRefreshBatteryInfo(KeyguardUpdateMonitor.BatteryStatus status) {
- mShowingBatteryInfo = status.isPluggedIn() || status.isBatteryLow();
- mPluggedIn = status.isPluggedIn();
- mBatteryLevel = status.level;
- mBatteryCharged = status.isCharged();
- mBatteryIsLow = status.isBatteryLow();
- updateStatusLines();
- }
-
- @Override
- public void onTimeChanged() {
- refreshDate();
- }
- };
-
- /**
- * @param view the containing view of all widgets
- */
- public KeyguardStatusViewManager(View view) {
- if (DEBUG) Log.v(TAG, "KeyguardStatusViewManager()");
- mContainer = view;
- Resources res = getContext().getResources();
- mDateFormatString =
- res.getText(com.android.internal.R.string.abbrev_wday_month_day_no_year);
- mShareStatusRegion = res.getBoolean(com.android.internal.R.bool.kg_share_status_area);
- mLockPatternUtils = new LockPatternUtils(view.getContext());
- mUpdateMonitor = KeyguardUpdateMonitor.getInstance(view.getContext());
-
- mDateView = (TextView) view.findViewById(R.id.date);
- mStatus1View = (TextView) view.findViewById(R.id.status1);
- mAlarmStatusView = (TextView) view.findViewById(R.id.alarm_status);
- mOwnerInfoView = (TextView) view.findViewById(R.id.owner_info);
- mClockView = (ClockView) view.findViewById(R.id.clock_view);
- mSecurityMessage = (TextView) view.findViewById(R.id.status_security_message);
-
- // This is required to ensure marquee works
- if (mSecurityMessage != null) {
- mSecurityMessage.setSelected(true);
- }
-
- // Use custom font in mDateView
- mDateView.setTypeface(Typeface.SANS_SERIF, Typeface.BOLD);
-
- // Required to get Marquee to work.
- final View marqueeViews[] = { mDateView, mStatus1View, mOwnerInfoView, mAlarmStatusView };
- for (int i = 0; i < marqueeViews.length; i++) {
- View v = marqueeViews[i];
- if (v == null) {
- throw new RuntimeException("Can't find widget at index " + i);
- }
- v.setSelected(true);
- }
-
- // Registering this callback immediately updates the battery state, among other things.
- mUpdateMonitor.registerCallback(mInfoCallback);
-
- refreshDate();
- resetStatusInfo();
-
- mHandler = new Handler(Looper.myLooper());
- mClearSecurityMessageRunnable = new Runnable() {
- @Override
- public void run() {
- mSecurityMessageContents = "";
- updateStatusLines();
- }
- };
- }
-
- public void onPause() {
- if (DEBUG) Log.v(TAG, "onPause()");
- mUpdateMonitor.removeCallback(mInfoCallback);
- }
-
- /** {@inheritDoc} */
- public void onResume() {
- if (DEBUG) Log.v(TAG, "onResume()");
-
- // Force-update the time when we show this view.
- mClockView.updateTime();
-
- mUpdateMonitor.registerCallback(mInfoCallback);
- resetStatusInfo();
- }
-
- void resetStatusInfo() {
- updateStatusLines();
- }
-
- public void setMessage(CharSequence msg, boolean important) {
- if (!important) {
- mSecurityMessageContents = "";
- } else {
- mSecurityMessageContents = msg;
- }
- securityMessageChanged();
- }
-
- public void setMessage(int resId, boolean important) {
- if (resId != 0 && important) {
- mSecurityMessageContents = getContext().getResources().getText(resId);
- } else {
- mSecurityMessageContents = "";
- }
- securityMessageChanged();
- }
-
- public void setMessage(int resId, boolean important, Object... formatArgs) {
- if (resId != 0 && important) {
- mSecurityMessageContents = getContext().getString(resId, formatArgs);
- } else {
- mSecurityMessageContents = "";
- }
- securityMessageChanged();
- }
-
- public void securityMessageChanged() {
- updateStatusLines();
- if (SECURITY_MESSAGE_TIMES_OUT) {
- mHandler.removeCallbacks(mClearSecurityMessageRunnable);
- mHandler.postDelayed(mClearSecurityMessageRunnable, SECURITY_MESSAGE_DURATION);
- }
- mSecurityMessage.announceForAccessibility(mSecurityMessage.getText());
- }
-
- /**
- * Update the status lines based on these rules:
- * AlarmStatus: Alarm state always gets it's own line.
- * Status1 is shared between help, battery status and generic unlock instructions,
- * prioritized in that order.
- * @param showStatusLines status lines are shown if true
- */
- void updateStatusLines() {
- updateAlarmInfo();
- boolean statusAreaUsed = updateSecurityMessage();
- statusAreaUsed = updateStatus1(statusAreaUsed) || statusAreaUsed;
- updateOwnerInfo(statusAreaUsed);
- }
-
- private boolean updateSecurityMessage() {
- if (mSecurityMessage == null) return false;
- if (!TextUtils.isEmpty(mSecurityMessageContents)) {
- mSecurityMessage.setText(mSecurityMessageContents);
- mSecurityMessage.setVisibility(View.VISIBLE);
- return true;
- } else {
- mSecurityMessage.setVisibility(View.GONE);
- return false;
- }
- }
-
- private void updateAlarmInfo() {
- String nextAlarm = mLockPatternUtils.getNextAlarm();
- if (!TextUtils.isEmpty(nextAlarm)) {
- maybeSetUpperCaseText(mAlarmStatusView, nextAlarm);
- mAlarmStatusView.setCompoundDrawablesWithIntrinsicBounds(ALARM_ICON, 0, 0, 0);
- mAlarmStatusView.setVisibility(View.VISIBLE);
- } else {
- mAlarmStatusView.setVisibility(View.GONE);
- }
- }
-
- private boolean updateStatus1(boolean statusAreaUsed) {
- MutableInt icon = new MutableInt(0);
- CharSequence string = getPriorityTextMessage(icon);
-
- boolean dontShow = statusAreaUsed && mShareStatusRegion;
- if (!dontShow && !TextUtils.isEmpty(string)) {
- maybeSetUpperCaseText(mStatus1View, string);
- mStatus1View.setCompoundDrawablesWithIntrinsicBounds(icon.value, 0, 0, 0);
- mStatus1View.setVisibility(View.VISIBLE);
- return true;
- } else {
- mStatus1View.setVisibility(View.GONE);
- return false;
- }
- }
-
- private void updateOwnerInfo(boolean statusAreaUsed) {
- final ContentResolver res = getContext().getContentResolver();
- final boolean ownerInfoEnabled = Settings.Secure.getIntForUser(res,
- Settings.Secure.LOCK_SCREEN_OWNER_INFO_ENABLED, 1, UserHandle.USER_CURRENT) != 0;
- String text = Settings.Secure.getStringForUser(res, Settings.Secure.LOCK_SCREEN_OWNER_INFO,
- UserHandle.USER_CURRENT);
-
- boolean dontShow = statusAreaUsed && mShareStatusRegion;
- if (!dontShow && ownerInfoEnabled && !TextUtils.isEmpty(text)) {
- text = text.trim(); // Remove trailing newlines
- maybeSetUpperCaseText(mOwnerInfoView, text);
- mOwnerInfoView.setVisibility(View.VISIBLE);
- } else {
- mOwnerInfoView.setVisibility(View.GONE);
- }
- }
-
- private CharSequence getPriorityTextMessage(MutableInt icon) {
- CharSequence string = null;
- if (mShowingBatteryInfo) {
- // Battery status
- if (mPluggedIn) {
- // Charging, charged or waiting to charge.
- string = getContext().getString(mBatteryCharged ?
- com.android.internal.R.string.lockscreen_charged
- :com.android.internal.R.string.lockscreen_plugged_in, mBatteryLevel);
- icon.value = CHARGING_ICON;
- } else if (mBatteryIsLow) {
- // Battery is low
- string = getContext().getString(
- com.android.internal.R.string.lockscreen_low_battery);
- icon.value = BATTERY_LOW_ICON;
- }
- }
- return string;
- }
-
- void refreshDate() {
- maybeSetUpperCaseText(mDateView, DateFormat.format(mDateFormatString, new Date()));
- }
-
- private void maybeSetUpperCaseText(TextView textView, CharSequence text) {
- if (KeyguardViewManager.USE_UPPER_CASE
- && textView.getId() != R.id.owner_info) { // currently only required for date view
- textView.setText(text != null ? text.toString().toUpperCase() : null);
- } else {
- textView.setText(text);
- }
- }
-
- private Context getContext() {
- return mContainer.getContext();
- }
-
- @Override
- public void showBouncer(int duration) {
- }
-
- @Override
- public void hideBouncer(int duration) {
- }
-
- @Override
- public void setTimeout(int timeout_ms) {
- }
-
-}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitor.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitor.java
index 5fb8cf088605..1968ecd917ce 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitor.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitor.java
@@ -81,6 +81,8 @@ public class KeyguardUpdateMonitor {
private static final int MSG_USER_SWITCHED = 310;
private static final int MSG_USER_REMOVED = 311;
private static final int MSG_KEYGUARD_VISIBILITY_CHANGED = 312;
+ protected static final int MSG_BOOT_COMPLETED = 313;
+
private static KeyguardUpdateMonitor sInstance;
@@ -93,6 +95,7 @@ public class KeyguardUpdateMonitor {
private int mRingMode;
private int mPhoneState;
private boolean mKeyguardIsVisible;
+ private boolean mBootCompleted;
// Device provisioning state
private boolean mDeviceProvisioned;
@@ -152,6 +155,9 @@ public class KeyguardUpdateMonitor {
case MSG_KEYGUARD_VISIBILITY_CHANGED:
handleKeyguardVisibilityChanged(msg.arg1);
break;
+ case MSG_BOOT_COMPLETED:
+ handleBootCompleted();
+ break;
}
}
@@ -198,6 +204,8 @@ public class KeyguardUpdateMonitor {
} else if (Intent.ACTION_USER_REMOVED.equals(action)) {
mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_REMOVED,
intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0), 0));
+ } else if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
+ mHandler.sendMessage(mHandler.obtainMessage(MSG_BOOT_COMPLETED));
}
}
};
@@ -342,6 +350,11 @@ public class KeyguardUpdateMonitor {
filter.addAction(Intent.ACTION_USER_REMOVED);
context.registerReceiver(mBroadcastReceiver, filter);
+ final IntentFilter bootCompleteFilter = new IntentFilter();
+ bootCompleteFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
+ bootCompleteFilter.addAction(Intent.ACTION_BOOT_COMPLETED);
+ context.registerReceiver(mBroadcastReceiver, bootCompleteFilter);
+
try {
ActivityManagerNative.getDefault().registerUserSwitchObserver(
new IUserSwitchObserver.Stub() {
@@ -420,6 +433,27 @@ public class KeyguardUpdateMonitor {
}
/**
+ * Handle {@link #MSG_BOOT_COMPLETED}
+ */
+ protected void handleBootCompleted() {
+ mBootCompleted = true;
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
+ if (cb != null) {
+ cb.onBootCompleted();
+ }
+ }
+ }
+
+ /**
+ * We need to store this state in the KeyguardUpdateMonitor since this class will not be
+ * destroyed.
+ */
+ public boolean hasBootCompleted() {
+ return mBootCompleted;
+ }
+
+ /**
* Handle {@link #MSG_USER_SWITCHED}
*/
protected void handleUserRemoved(int userId) {
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitorCallback.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitorCallback.java
index 8c9ac8ba5126..1ba13880e407 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitorCallback.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitorCallback.java
@@ -99,4 +99,12 @@ class KeyguardUpdateMonitorCallback {
* Called when a user is removed.
*/
void onUserRemoved(int userId) { }
+
+ /**
+ * Called when boot completed.
+ *
+ * Note, this callback will only be received if boot complete occurs after registering with
+ * KeyguardUpdateMonitor.
+ */
+ void onBootCompleted() { }
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewBase.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewBase.java
index 9e3424df06e8..6fcacd3c418b 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewBase.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewBase.java
@@ -260,4 +260,5 @@ public abstract class KeyguardViewBase extends FrameLayout {
KeyguardViewMediator.ViewMediatorCallback viewMediatorCallback) {
mViewMediatorCallback = viewMediatorCallback;
}
+
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewManager.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewManager.java
index 6d886521b778..76ba811aa0ae 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewManager.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewManager.java
@@ -18,6 +18,7 @@ package com.android.internal.policy.impl.keyguard;
import android.app.Activity;
import android.app.ActivityManager;
+import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
@@ -167,6 +168,7 @@ public class KeyguardViewManager {
int flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
+ | WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN
| WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
if (!mNeedsInput) {
@@ -213,7 +215,7 @@ public class KeyguardViewManager {
mKeyguardHost.removeView(v);
}
// TODO: Remove once b/7094175 is fixed
- Slog.d(TAG, "inflateKeyguardView: b/7094175 mContext.config="
+ if (false) Slog.d(TAG, "inflateKeyguardView: b/7094175 mContext.config="
+ mContext.getResources().getConfiguration());
final LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.keyguard_host_view, mKeyguardHost, true);
@@ -240,6 +242,11 @@ public class KeyguardViewManager {
if (options.getBoolean(LockPatternUtils.KEYGUARD_SHOW_SECURITY_CHALLENGE)) {
mKeyguardView.showNextSecurityScreenIfPresent();
}
+ int widgetToShow = options.getInt(LockPatternUtils.KEYGUARD_SHOW_APPWIDGET,
+ AppWidgetManager.INVALID_APPWIDGET_ID);
+ if (widgetToShow != AppWidgetManager.INVALID_APPWIDGET_ID) {
+ mKeyguardView.goToWidget(widgetToShow);
+ }
}
}
@@ -418,4 +425,10 @@ public class KeyguardViewManager {
public synchronized boolean isShowing() {
return (mKeyguardHost != null && mKeyguardHost.getVisibility() == View.VISIBLE);
}
+
+ public void showAssistant() {
+ if (mKeyguardView != null) {
+ mKeyguardView.showAssistant();
+ }
+ }
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java
index 3648d99abbb4..c227619fc94b 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java
@@ -22,6 +22,7 @@ import android.app.Activity;
import android.app.ActivityManagerNative;
import android.app.AlarmManager;
import android.app.PendingIntent;
+import android.app.SearchManager;
import android.app.StatusBarManager;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
@@ -116,6 +117,7 @@ public class KeyguardViewMediator {
private static final int KEYGUARD_DONE_AUTHENTICATING = 11;
private static final int SET_HIDDEN = 12;
private static final int KEYGUARD_TIMEOUT = 13;
+ private static final int SHOW_ASSISTANT = 14;
/**
* The default amount of time we stay awake (used for all key input)
@@ -165,6 +167,9 @@ public class KeyguardViewMediator {
/** UserManager for querying number of users */
private UserManager mUserManager;
+ /** SearchManager for determining whether or not search assistant is available */
+ private SearchManager mSearchManager;
+
/**
* Used to keep the device awake while to ensure the keyguard finishes opening before
* we sleep.
@@ -175,7 +180,7 @@ public class KeyguardViewMediator {
* Does not turn on screen, held while a call to {@link KeyguardViewManager#wakeWhenReadyTq(int)}
* is called to make sure the device doesn't sleep before it has a chance to poke
* the wake lock.
- * @see #wakeWhenReadyLocked(int)
+ * @see #wakeWhenReady(int)
*/
private PowerManager.WakeLock mWakeAndHandOff;
@@ -235,6 +240,7 @@ public class KeyguardViewMediator {
*/
private boolean mWaitingUntilKeyguardVisible = false;
private LockPatternUtils mLockPatternUtils;
+ private boolean mKeyguardDonePending = false;
private SoundPool mLockSounds;
private int mLockSoundId;
@@ -294,6 +300,11 @@ public class KeyguardViewMediator {
* has changed and needs to be reapplied to the window.
*/
void onUserActivityTimeoutChanged();
+
+ /**
+ * Report that the keyguard is dismissable, pending the next keyguardDone call.
+ */
+ void keyguardDonePending();
}
KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() {
@@ -436,6 +447,11 @@ public class KeyguardViewMediator {
public void onUserActivityTimeoutChanged() {
mKeyguardViewManager.updateUserActivityTimeout();
}
+
+ @Override
+ public void keyguardDonePending() {
+ mKeyguardDonePending = true;
+ }
};
public void wakeUp() {
@@ -515,6 +531,7 @@ public class KeyguardViewMediator {
* Let us know that the system is ready after startup.
*/
public void onSystemReady() {
+ mSearchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE);
synchronized (this) {
if (DEBUG) Log.d(TAG, "onSystemReady");
mSystemReady = true;
@@ -555,6 +572,8 @@ public class KeyguardViewMediator {
mScreenOn = false;
if (DEBUG) Log.d(TAG, "onScreenTurnedOff(" + why + ")");
+ mKeyguardDonePending = false;
+
// Lock immediately based on setting if secure (user has a pin/pattern/password).
// This also "locks" the device when not secure to provide easy access to the
// camera while preventing unwanted input.
@@ -935,8 +954,8 @@ public class KeyguardViewMediator {
* @see #handleWakeWhenReady
* @see #onWakeKeyWhenKeyguardShowingTq(int)
*/
- private void wakeWhenReadyLocked(int keyCode) {
- if (DBG_WAKE) Log.d(TAG, "wakeWhenReadyLocked(" + keyCode + ")");
+ private void wakeWhenReady(int keyCode) {
+ if (DBG_WAKE) Log.d(TAG, "wakeWhenReady(" + keyCode + ")");
/**
* acquire the handoff lock that will keep the cpu running. this will
@@ -1014,54 +1033,14 @@ public class KeyguardViewMediator {
* action should be posted to a handler.
*
* @param keyCode The keycode of the key that woke the device
- * @param isDocked True if the device is in the dock
- * @return Whether we poked the wake lock (and turned the screen on)
*/
- public boolean onWakeKeyWhenKeyguardShowingTq(int keyCode, boolean isDocked) {
+ public void onWakeKeyWhenKeyguardShowingTq(int keyCode) {
if (DEBUG) Log.d(TAG, "onWakeKeyWhenKeyguardShowing(" + keyCode + ")");
- if (isWakeKeyWhenKeyguardShowing(keyCode, isDocked)) {
- // give the keyguard view manager a chance to adjust the state of the
- // keyguard based on the key that woke the device before poking
- // the wake lock
- wakeWhenReadyLocked(keyCode);
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * When the keyguard is showing we ignore some keys that might otherwise typically
- * be considered wake keys. We filter them out here.
- *
- * {@link KeyEvent#KEYCODE_POWER} is notably absent from this list because it
- * is always considered a wake key.
- */
- private boolean isWakeKeyWhenKeyguardShowing(int keyCode, boolean isDocked) {
- switch (keyCode) {
- // ignore volume keys unless docked
- case KeyEvent.KEYCODE_VOLUME_UP:
- case KeyEvent.KEYCODE_VOLUME_DOWN:
- case KeyEvent.KEYCODE_VOLUME_MUTE:
- return isDocked;
-
- // ignore media and camera keys
- case KeyEvent.KEYCODE_MUTE:
- case KeyEvent.KEYCODE_HEADSETHOOK:
- case KeyEvent.KEYCODE_MEDIA_PLAY:
- case KeyEvent.KEYCODE_MEDIA_PAUSE:
- case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
- case KeyEvent.KEYCODE_MEDIA_STOP:
- case KeyEvent.KEYCODE_MEDIA_NEXT:
- case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
- case KeyEvent.KEYCODE_MEDIA_REWIND:
- case KeyEvent.KEYCODE_MEDIA_RECORD:
- case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
- case KeyEvent.KEYCODE_CAMERA:
- return false;
- }
- return true;
+ // give the keyguard view manager a chance to adjust the state of the
+ // keyguard based on the key that woke the device before poking
+ // the wake lock
+ wakeWhenReady(keyCode);
}
/**
@@ -1073,20 +1052,18 @@ public class KeyguardViewMediator {
* The 'Tq' suffix is per the documentation in {@link WindowManagerPolicy}.
* Be sure not to take any action that takes a long time; any significant
* action should be posted to a handler.
- *
- * @return Whether we poked the wake lock (and turned the screen on)
*/
- public boolean onWakeMotionWhenKeyguardShowingTq() {
+ public void onWakeMotionWhenKeyguardShowingTq() {
if (DEBUG) Log.d(TAG, "onWakeMotionWhenKeyguardShowing()");
// give the keyguard view manager a chance to adjust the state of the
// keyguard based on the key that woke the device before poking
// the wake lock
- wakeWhenReadyLocked(KeyEvent.KEYCODE_UNKNOWN);
- return true;
+ wakeWhenReady(KeyEvent.KEYCODE_UNKNOWN);
}
public void keyguardDone(boolean authenticated, boolean wakeup) {
+ mKeyguardDonePending = false;
synchronized (this) {
EventLog.writeEvent(70000, 2);
if (DEBUG) Log.d(TAG, "keyguardDone(" + authenticated + ")");
@@ -1161,6 +1138,9 @@ public class KeyguardViewMediator {
doKeyguardLocked((Bundle) msg.obj);
}
break;
+ case SHOW_ASSISTANT:
+ handleShowAssistant();
+ break;
}
}
};
@@ -1253,6 +1233,7 @@ public class KeyguardViewMediator {
mKeyguardViewManager.show(options);
mShowing = true;
+ mKeyguardDonePending = false;
updateActivityLockScreenState();
adjustStatusBarLocked();
userActivity();
@@ -1288,6 +1269,7 @@ public class KeyguardViewMediator {
mKeyguardViewManager.hide();
mShowing = false;
+ mKeyguardDonePending = false;
updateActivityLockScreenState();
adjustStatusBarLocked();
}
@@ -1336,6 +1318,9 @@ public class KeyguardViewMediator {
// showing secure lockscreen; disable ticker.
flags |= StatusBarManager.DISABLE_NOTIFICATION_TICKER;
}
+ if (!isAssistantAvailable()) {
+ flags |= StatusBarManager.DISABLE_SEARCH;
+ }
}
if (DEBUG) {
@@ -1350,7 +1335,7 @@ public class KeyguardViewMediator {
}
/**
- * Handle message sent by {@link #wakeWhenReadyLocked(int)}
+ * Handle message sent by {@link #wakeWhenReady(int)}
* @param keyCode The key that woke the device.
* @see #WAKE_WHEN_READY
*/
@@ -1420,4 +1405,21 @@ public class KeyguardViewMediator {
}
}
+ public boolean isDismissable() {
+ return mKeyguardDonePending || !isSecure();
+ }
+
+ public void showAssistant() {
+ Message msg = mHandler.obtainMessage(SHOW_ASSISTANT);
+ mHandler.sendMessage(msg);
+ }
+
+ public void handleShowAssistant() {
+ mKeyguardViewManager.showAssistant();
+ }
+
+ private boolean isAssistantAvailable() {
+ return mSearchManager != null
+ && mSearchManager.getAssistIntent(mContext, UserHandle.USER_CURRENT) != null;
+ }
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewStateManager.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewStateManager.java
index e53358b1f079..0a166e17058d 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewStateManager.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewStateManager.java
@@ -15,6 +15,7 @@
*/
package com.android.internal.policy.impl.keyguard;
+import android.appwidget.AppWidgetManager;
import android.os.Handler;
import android.os.Looper;
import android.view.View;
@@ -25,6 +26,7 @@ public class KeyguardViewStateManager implements
private KeyguardWidgetPager mKeyguardWidgetPager;
private ChallengeLayout mChallengeLayout;
+ private KeyguardHostView mKeyguardHostView;
private int[] mTmpPoint = new int[2];
private int[] mTmpLoc = new int[2];
@@ -49,7 +51,8 @@ public class KeyguardViewStateManager implements
int mChallengeTop = 0;
- public KeyguardViewStateManager() {
+ public KeyguardViewStateManager(KeyguardHostView hostView) {
+ mKeyguardHostView = hostView;
}
public void setPagedView(KeyguardWidgetPager pagedView) {
@@ -113,6 +116,12 @@ public class KeyguardViewStateManager implements
scl.fadeOutChallenge();
mPageIndexOnPageBeginMoving = mKeyguardWidgetPager.getCurrentPage();
}
+ // We use mAppWidgetToShow to show a particular widget after you add it--
+ // once the user swipes a page we clear that behavior
+ if (mKeyguardHostView != null) {
+ mKeyguardHostView.clearAppWidgetToShow();
+ mKeyguardHostView.setOnDismissAction(null);
+ }
if (mHideHintsRunnable != null) {
mMainQueue.removeCallbacks(mHideHintsRunnable);
mHideHintsRunnable = null;
@@ -195,6 +204,13 @@ public class KeyguardViewStateManager implements
pt[1] += y - vY;
}
+ private void userActivity() {
+ if (mKeyguardHostView != null) {
+ mKeyguardHostView.onUserActivityTimeoutChanged();
+ mKeyguardHostView.userActivity();
+ }
+ }
+
@Override
public void onScrollStateChanged(int scrollState) {
if (mKeyguardWidgetPager == null || mChallengeLayout == null) return;
@@ -208,15 +224,23 @@ public class KeyguardViewStateManager implements
if (!challengeOverlapping) {
if (!mKeyguardWidgetPager.isPageMoving()) {
frame.resetSize();
+ userActivity();
} else {
mKeyguardWidgetPager.setWidgetToResetOnPageFadeOut(mPageListeningToSlider);
}
}
- frame.hideFrame(this);
+ if (frame.isSmall()) {
+ // This is to make sure that if the scroller animation gets cut off midway
+ // that the frame doesn't stay in a partial down position.
+ frame.setFrameHeight(frame.getSmallFrameHeight());
+ }
+ if (scrollState != SlidingChallengeLayout.SCROLL_STATE_FADING) {
+ frame.hideFrame(this);
+ }
updateEdgeSwiping();
if (mChallengeLayout.isChallengeShowing()) {
- mKeyguardSecurityContainer.onResume();
+ mKeyguardSecurityContainer.onResume(KeyguardSecurityView.VIEW_REVEALED);
} else {
mKeyguardSecurityContainer.onPause();
}
@@ -231,14 +255,16 @@ public class KeyguardViewStateManager implements
// Skip showing the frame and shrinking the widget if we are
if (!mChallengeLayout.isBouncing()) {
- frame.showFrame(this);
+ if (scrollState != SlidingChallengeLayout.SCROLL_STATE_FADING) {
+ frame.showFrame(this);
+ }
// As soon as the security begins sliding, the widget becomes small (if it wasn't
// small to begin with).
if (!frame.isSmall()) {
// We need to fetch the final page, in case the pages are in motion.
mPageListeningToSlider = mKeyguardWidgetPager.getNextPage();
- frame.shrinkWidget();
+ frame.shrinkWidget(false);
}
} else {
if (!frame.isSmall()) {
@@ -257,7 +283,7 @@ public class KeyguardViewStateManager implements
public void onScrollPositionChanged(float scrollPosition, int challengeTop) {
mChallengeTop = challengeTop;
KeyguardWidgetFrame frame = mKeyguardWidgetPager.getWidgetPageAt(mPageListeningToSlider);
- if (frame != null && !mKeyguardWidgetPager.isPageMoving()) {
+ if (frame != null && mLastScrollState != SlidingChallengeLayout.SCROLL_STATE_FADING) {
frame.adjustFrame(getChallengeTopRelativeToFrame(frame, mChallengeTop));
}
}
@@ -299,6 +325,9 @@ public class KeyguardViewStateManager implements
mKeyguardWidgetPager.zoomOutToBouncer();
} else {
mKeyguardWidgetPager.zoomInFromBouncer();
+ if (mKeyguardHostView != null) {
+ mKeyguardHostView.setOnDismissAction(null);
+ }
}
}
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java
index fa1a1ae2648e..3c792064a392 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java
@@ -69,8 +69,6 @@ public class KeyguardWidgetFrame extends FrameLayout {
private float mBackgroundAlphaMultiplier = 1.0f;
private Drawable mBackgroundDrawable;
private Rect mBackgroundRect = new Rect();
- private int mLastMeasuredWidth = -1;
- private int mLastMeasuredHeight = 1;
// These variables are all needed in order to size things properly before we're actually
// measured.
@@ -79,6 +77,7 @@ public class KeyguardWidgetFrame extends FrameLayout {
private boolean mWidgetLockedSmall = false;
private int mMaxChallengeTop = -1;
private int mFrameStrokeAdjustment;
+ private boolean mPerformAppWidgetSizeUpdateOnBootComplete;
// This will hold the width value before we've actually been measured
private int mFrameHeight;
@@ -110,22 +109,42 @@ public class KeyguardWidgetFrame extends FrameLayout {
int padding = (int) (res.getDisplayMetrics().density * 8);
setPadding(padding, padding, padding, padding);
- mFrameStrokeAdjustment = (int) (2 * density);
+ mFrameStrokeAdjustment = 2 + (int) (2 * density);
// This will be overriden on phones based on the current security mode, however on tablets
// we need to specify a height.
mSmallWidgetHeight =
res.getDimensionPixelSize(com.android.internal.R.dimen.kg_small_widget_height);
- mBackgroundDrawable = res.getDrawable(R.drawable.kg_bouncer_bg_white);
+ mBackgroundDrawable = res.getDrawable(R.drawable.kg_widget_bg_padded);
mGradientColor = res.getColor(com.android.internal.R.color.kg_widget_pager_gradient);
mGradientPaint.setXfermode(sAddBlendMode);
}
@Override
protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
cancelLongPress();
+ KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallbacks);
+
}
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallbacks);
+ }
+
+ private KeyguardUpdateMonitorCallback mUpdateMonitorCallbacks =
+ new KeyguardUpdateMonitorCallback() {
+ @Override
+ public void onBootCompleted() {
+ if (mPerformAppWidgetSizeUpdateOnBootComplete) {
+ performAppWidgetSizeCallbacksIfNecessary();
+ mPerformAppWidgetSizeUpdateOnBootComplete = false;
+ }
+ }
+ };
+
void setIsHoveringOverDeleteDropTarget(boolean isHovering) {
if (ENABLE_HOVER_OVER_DELETE_DROP_TARGET_OVERLAY) {
if (mIsHoveringOverDeleteDropTarget != isHovering) {
@@ -329,6 +348,7 @@ public class KeyguardWidgetFrame extends FrameLayout {
public void setMaxChallengeTop(int top) {
boolean dirty = mMaxChallengeTop != top;
+ mMaxChallengeTop = top;
mSmallWidgetHeight = top - getPaddingTop();
mSmallFrameHeight = top + getPaddingBottom();
if (dirty && mIsSmall) {
@@ -348,10 +368,21 @@ public class KeyguardWidgetFrame extends FrameLayout {
setFrameHeight(frameHeight);
}
- public void shrinkWidget() {
+ public void shrinkWidget(boolean alsoShrinkFrame) {
mIsSmall = true;
setWidgetHeight(mSmallWidgetHeight);
- setFrameHeight(mSmallFrameHeight);
+
+ if (alsoShrinkFrame) {
+ setFrameHeight(mSmallFrameHeight);
+ }
+ }
+
+ public int getSmallFrameHeight() {
+ return mSmallFrameHeight;
+ }
+
+ public void shrinkWidget() {
+ shrinkWidget(true);
}
public void setWidgetLockedSmall(boolean locked) {
@@ -372,6 +403,10 @@ public class KeyguardWidgetFrame extends FrameLayout {
public void setFrameHeight(int height) {
mFrameHeight = height;
mBackgroundRect.set(0, 0, getMeasuredWidth(), Math.min(mFrameHeight, getMeasuredHeight()));
+ mForegroundRect.set(mFrameStrokeAdjustment, mFrameStrokeAdjustment,getMeasuredWidth() -
+ mFrameStrokeAdjustment, Math.min(getMeasuredHeight(), mFrameHeight) -
+ mFrameStrokeAdjustment);
+ updateGradient();
invalidate();
}
@@ -401,27 +436,30 @@ public class KeyguardWidgetFrame extends FrameLayout {
mFrameFade.start();
}
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- super.onSizeChanged(w, h, oldw, oldh);
-
- // mFrameStrokeAdjustment is a cludge to prevent the overlay from drawing outside the
- // rounded rect background.
- mForegroundRect.set(mFrameStrokeAdjustment, mFrameStrokeAdjustment,
- w - mFrameStrokeAdjustment, h - mFrameStrokeAdjustment);
-
+ private void updateGradient() {
float x0 = mLeftToRight ? 0 : mForegroundRect.width();
float x1 = mLeftToRight ? mForegroundRect.width(): 0;
mLeftToRightGradient = new LinearGradient(x0, 0f, x1, 0f,
mGradientColor, 0, Shader.TileMode.CLAMP);
mRightToLeftGradient = new LinearGradient(x1, 0f, x0, 0f,
mGradientColor, 0, Shader.TileMode.CLAMP);
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
if (!mIsSmall) {
mFrameHeight = h;
}
+ // mFrameStrokeAdjustment is a cludge to prevent the overlay from drawing outside the
+ // rounded rect background.
+ mForegroundRect.set(mFrameStrokeAdjustment, mFrameStrokeAdjustment,
+ w - mFrameStrokeAdjustment, Math.min(h, mFrameHeight) - mFrameStrokeAdjustment);
+
mBackgroundRect.set(0, 0, getMeasuredWidth(), Math.min(h, mFrameHeight));
+ updateGradient();
invalidate();
}
@@ -434,12 +472,14 @@ public class KeyguardWidgetFrame extends FrameLayout {
View content = getContent();
if (!(content instanceof AppWidgetHostView)) return;
- boolean sizeDirty = content.getMeasuredWidth() != mLastMeasuredWidth ||
- content.getMeasuredHeight() != mLastMeasuredHeight;
- if (sizeDirty) {
-
+ if (!KeyguardUpdateMonitor.getInstance(mContext).hasBootCompleted()) {
+ mPerformAppWidgetSizeUpdateOnBootComplete = true;
+ return;
}
+ // TODO: there's no reason to force the AppWidgetHostView to catch duplicate size calls.
+ // We can do that even more cheaply here. It's not an issue right now since we're in the
+ // system process and hence no binder calls.
AppWidgetHostView awhv = (AppWidgetHostView) content;
float density = getResources().getDisplayMetrics().density;
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetPager.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetPager.java
index 274e12b2f26f..25e278182f44 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetPager.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetPager.java
@@ -22,9 +22,9 @@ import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.animation.TimeInterpolator;
import android.appwidget.AppWidgetHostView;
+import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
import android.content.Context;
-import android.content.res.Resources;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.AttributeSet;
@@ -36,9 +36,9 @@ import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
+import android.view.animation.DecelerateInterpolator;
import android.widget.FrameLayout;
-import com.android.internal.R;
import com.android.internal.widget.LockPatternUtils;
import java.util.ArrayList;
@@ -69,12 +69,10 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
private int mPage = 0;
private Callbacks mCallbacks;
- private boolean mCameraWidgetEnabled;
-
private int mWidgetToResetAfterFadeOut;
// Bouncer
- protected int BOUNCER_ZOOM_IN_OUT_DURATION = 250;
+ private int mBouncerZoomInOutDuration = 250;
private float BOUNCER_SCALE_FACTOR = 0.67f;
// Background worker thread: used here for persistence, also made available to widget frames
@@ -97,10 +95,6 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
setPageSwitchListener(this);
- Resources r = getResources();
- mCameraWidgetEnabled = r.getBoolean(R.bool.kg_enable_camera_default_widget);
- mCenterSmallWidgetsVertically =
- r.getBoolean(com.android.internal.R.bool.kg_center_small_widgets_vertically);
mBackgroundWorkerThread = new HandlerThread("KeyguardWidgetPager Worker");
mBackgroundWorkerThread.start();
mBackgroundWorkerHandler = new Handler(mBackgroundWorkerThread.getLooper());
@@ -180,6 +174,22 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
}
}
+ private void updateWidgetFramesImportantForAccessibility() {
+ final int pageCount = getPageCount();
+ for (int i = 0; i < pageCount; i++) {
+ KeyguardWidgetFrame frame = getWidgetPageAt(i);
+ updateWidgetFrameImportantForAccessibility(frame);
+ }
+ }
+
+ private void updateWidgetFrameImportantForAccessibility(KeyguardWidgetFrame frame) {
+ if (frame.getContentAlpha() <= 0) {
+ frame.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
+ } else {
+ frame.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ }
+ }
+
private void userActivity() {
if (mCallbacks != null) {
mCallbacks.onUserActivityTimeoutChanged();
@@ -226,6 +236,8 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
public interface Callbacks {
public void userActivity();
public void onUserActivityTimeoutChanged();
+ public void onAddView(View v);
+ public void onRemoveView(View v);
}
public void addWidget(View widget) {
@@ -235,6 +247,9 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
public void onRemoveView(View v) {
final int appWidgetId = ((KeyguardWidgetFrame) v).getContentAppWidgetId();
+ if (mCallbacks != null) {
+ mCallbacks.onRemoveView(v);
+ }
mBackgroundWorkerHandler.post(new Runnable() {
@Override
public void run() {
@@ -248,6 +263,9 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
final int[] pagesRange = new int[mTempVisiblePagesRange.length];
getVisiblePages(pagesRange);
boundByReorderablePages(true, pagesRange);
+ if (mCallbacks != null) {
+ mCallbacks.onAddView(v);
+ }
// Subtract from the index to take into account pages before the reorderable
// pages (e.g. the "add widget" page)
mBackgroundWorkerHandler.post(new Runnable() {
@@ -312,6 +330,7 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
content.getContentDescription());
frame.setContentDescription(contentDescription);
}
+ updateWidgetFrameImportantForAccessibility(frame);
}
/**
@@ -466,6 +485,10 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
v.setCameraDistance(mDensity * CAMERA_DISTANCE);
if (isOverScrollChild(i, scrollProgress) && PERFORM_OVERSCROLL_ROTATION) {
+ float pivotX = v.getMeasuredWidth() / 2;
+ float pivotY = v.getMeasuredHeight() / 2;
+ v.setPivotX(pivotX);
+ v.setPivotY(pivotY);
v.setRotationY(- OVERSCROLL_MAX_ROTATION * scrollProgress);
v.setOverScrollAmount(Math.abs(scrollProgress), scrollProgress < 0);
} else {
@@ -485,35 +508,34 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
}
}
+ public boolean isWidgetPage(int pageIndex) {
+ if (pageIndex < 0 || pageIndex >= getChildCount()) {
+ return false;
+ }
+ View v = getChildAt(pageIndex);
+ if (v != null && v instanceof KeyguardWidgetFrame) {
+ KeyguardWidgetFrame kwf = (KeyguardWidgetFrame) v;
+ return kwf.getContentAppWidgetId() != AppWidgetManager.INVALID_APPWIDGET_ID;
+ }
+ return false;
+ }
+
+ /**
+ * Returns the bounded set of pages that are re-orderable. The range is fully inclusive.
+ */
@Override
void boundByReorderablePages(boolean isReordering, int[] range) {
if (isReordering) {
- if (isAddWidgetPageVisible()) {
- range[0]++;
- }
- if (isMusicWidgetVisible()) {
+ // Remove non-widget pages from the range
+ while (range[1] >= range[0] && !isWidgetPage(range[1])) {
range[1]--;
}
- if (isCameraWidgetVisible()) {
- range[1]--;
+ while (range[0] <= range[1] && !isWidgetPage(range[0])) {
+ range[0]++;
}
}
}
- /*
- * Special widgets
- */
- boolean isAddWidgetPageVisible() {
- // TODO: Make proper test once we decide whether the add-page is always showing
- return true;
- }
- boolean isMusicWidgetVisible() {
- return mViewStateManager.getTransportState() != KeyguardViewStateManager.TRANSPORT_GONE;
- }
- boolean isCameraWidgetVisible() {
- return mCameraWidgetEnabled;
- }
-
protected void reorderStarting() {
showOutlinesAndSidePages();
}
@@ -559,6 +581,12 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
}
@Override
+ void setCurrentPage(int currentPage) {
+ super.setCurrentPage(currentPage);
+ updateWidgetFramesImportantForAccessibility();
+ }
+
+ @Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
mHasMeasure = false;
@@ -669,6 +697,7 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
}
mWidgetToResetAfterFadeOut = -1;
}
+ updateWidgetFramesImportantForAccessibility();
}
});
mChildrenOutlineFadeAnimation.start();
@@ -727,6 +756,10 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
}
}
+ void setBouncerAnimationDuration(int duration) {
+ mBouncerZoomInOutDuration = duration;
+ }
+
// Zoom in after the bouncer is dismissed
void zoomInFromBouncer() {
if (mZoomInOutAnim != null && mZoomInOutAnim.isRunning()) {
@@ -735,10 +768,11 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
final View currentPage = getPageAt(getCurrentPage());
if (currentPage.getScaleX() < 1f || currentPage.getScaleY() < 1f) {
mZoomInOutAnim = new AnimatorSet();
- mZoomInOutAnim.setDuration(BOUNCER_ZOOM_IN_OUT_DURATION);
mZoomInOutAnim.playTogether(
ObjectAnimator.ofFloat(currentPage, "scaleX", 1f),
ObjectAnimator.ofFloat(currentPage , "scaleY", 1f));
+ mZoomInOutAnim.setDuration(mBouncerZoomInOutDuration);
+ mZoomInOutAnim.setInterpolator(new DecelerateInterpolator(1.5f));
mZoomInOutAnim.start();
}
}
@@ -748,14 +782,38 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
if (mZoomInOutAnim != null && mZoomInOutAnim.isRunning()) {
mZoomInOutAnim.cancel();
}
- View currentPage = getPageAt(getCurrentPage());
+ int curPage = getCurrentPage();
+ View currentPage = getPageAt(curPage);
+ if (shouldSetTopAlignedPivotForWidget(curPage)) {
+ currentPage.setPivotY(0);
+ // Note: we are working around the issue that setting the x-pivot to the same value as it
+ // was does not actually work.
+ currentPage.setPivotX(0);
+ currentPage.setPivotX(currentPage.getMeasuredWidth() / 2);
+ }
if (!(currentPage.getScaleX() < 1f || currentPage.getScaleY() < 1f)) {
mZoomInOutAnim = new AnimatorSet();
- mZoomInOutAnim.setDuration(BOUNCER_ZOOM_IN_OUT_DURATION);
mZoomInOutAnim.playTogether(
ObjectAnimator.ofFloat(currentPage, "scaleX", BOUNCER_SCALE_FACTOR),
ObjectAnimator.ofFloat(currentPage, "scaleY", BOUNCER_SCALE_FACTOR));
+ mZoomInOutAnim.setDuration(mBouncerZoomInOutDuration);
+ mZoomInOutAnim.setInterpolator(new DecelerateInterpolator(1.5f));
mZoomInOutAnim.start();
}
}
+
+ boolean isAddPage(int pageIndex) {
+ View v = getChildAt(pageIndex);
+ return v != null && v.getId() == com.android.internal.R.id.keyguard_add_widget;
+ }
+
+ boolean isCameraPage(int pageIndex) {
+ View v = getChildAt(pageIndex);
+ return v != null && v instanceof CameraWidgetFrame;
+ }
+
+ @Override
+ protected boolean shouldSetTopAlignedPivotForWidget(int childIndex) {
+ return !isCameraPage(childIndex) && super.shouldSetTopAlignedPivotForWidget(childIndex);
+ }
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/MultiPaneChallengeLayout.java b/policy/src/com/android/internal/policy/impl/keyguard/MultiPaneChallengeLayout.java
index 3bc39eb38af1..0ca46c32cddf 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/MultiPaneChallengeLayout.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/MultiPaneChallengeLayout.java
@@ -16,21 +16,22 @@
package com.android.internal.policy.impl.keyguard;
+import com.android.internal.R;
+
import android.animation.Animator;
-import android.animation.AnimatorSet;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.content.Context;
+import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Rect;
import android.util.AttributeSet;
+import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
-import com.android.internal.R;
-
public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayout {
private static final String TAG = "MultiPaneChallengeLayout";
@@ -39,7 +40,7 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
public static final int HORIZONTAL = LinearLayout.HORIZONTAL;
public static final int VERTICAL = LinearLayout.VERTICAL;
- protected static final int ANIMATE_BOUNCE_DURATION = 750;
+ public static final int ANIMATE_BOUNCE_DURATION = 350;
private KeyguardSecurityContainer mChallengeView;
private View mUserSwitcherView;
@@ -47,7 +48,9 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
private OnBouncerStateChangedListener mBouncerListener;
private final Rect mTempRect = new Rect();
- private final Context mContext;
+ private final Rect mZeroPadding = new Rect();
+
+ private final DisplayMetrics mDisplayMetrics;
private final OnClickListener mScrimClickListener = new OnClickListener() {
@Override
@@ -67,13 +70,16 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
public MultiPaneChallengeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
- mContext = context;
-
final TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.MultiPaneChallengeLayout, defStyleAttr, 0);
mOrientation = a.getInt(R.styleable.MultiPaneChallengeLayout_orientation,
HORIZONTAL);
a.recycle();
+
+ final Resources res = getResources();
+ mDisplayMetrics = res.getDisplayMetrics();
+
+ setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE);
}
@Override
@@ -91,6 +97,11 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
}
@Override
+ public int getBouncerAnimationDuration() {
+ return ANIMATE_BOUNCE_DURATION;
+ }
+
+ @Override
public void showBouncer() {
if (mIsBouncing) return;
mIsBouncing = true;
@@ -169,15 +180,34 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
mScrimView.setOnClickListener(mScrimClickListener);
}
+ private int getVirtualHeight(LayoutParams lp, int height, int heightUsed) {
+ int virtualHeight = height;
+ final View root = getRootView();
+ if (root != null) {
+ // This calculation is super dodgy and relies on several assumptions.
+ // Specifically that the root of the window will be padded in for insets
+ // and that the window is LAYOUT_IN_SCREEN.
+ virtualHeight = mDisplayMetrics.heightPixels - root.getPaddingTop();
+ }
+ if (lp.childType == LayoutParams.CHILD_TYPE_WIDGET ||
+ lp.childType == LayoutParams.CHILD_TYPE_USER_SWITCHER) {
+ // Always measure the widget pager/user switcher as if there were no IME insets
+ // on the window. We want to avoid resizing widgets when possible as it can
+ // be ugly/expensive. This lets us simply clip them instead.
+ return virtualHeight - heightUsed;
+ } else if (lp.childType == LayoutParams.CHILD_TYPE_PAGE_DELETE_DROP_TARGET) {
+ return height;
+ }
+ return Math.min(virtualHeight - heightUsed, height);
+ }
+
@Override
- protected void onMeasure(int widthSpec, int heightSpec) {
+ protected void onMeasure(final int widthSpec, final int heightSpec) {
if (MeasureSpec.getMode(widthSpec) != MeasureSpec.EXACTLY ||
MeasureSpec.getMode(heightSpec) != MeasureSpec.EXACTLY) {
throw new IllegalArgumentException(
"MultiPaneChallengeLayout must be measured with an exact size");
}
- float squashedLayoutThreshold =
- mContext.getResources().getDimension(R.dimen.kg_squashed_layout_threshold);
final int width = MeasureSpec.getSize(widthSpec);
final int height = MeasureSpec.getSize(heightSpec);
@@ -213,32 +243,26 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
mUserSwitcherView = child;
if (child.getVisibility() == GONE) continue;
- if (height < squashedLayoutThreshold) {
- int zero = MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY);
- measureChild(child, zero, zero);
- } else {
- int adjustedWidthSpec = widthSpec;
- int adjustedHeightSpec = heightSpec;
- if (lp.maxWidth >= 0) {
- adjustedWidthSpec = MeasureSpec.makeMeasureSpec(
- Math.min(lp.maxWidth, MeasureSpec.getSize(widthSpec)),
- MeasureSpec.EXACTLY);
- }
- if (lp.maxHeight >= 0) {
- adjustedHeightSpec = MeasureSpec.makeMeasureSpec(
- Math.min(lp.maxHeight, MeasureSpec.getSize(heightSpec)),
- MeasureSpec.EXACTLY);
- }
- // measureChildWithMargins will resolve layout direction for the LayoutParams
- measureChildWithMargins(child, adjustedWidthSpec, 0, adjustedHeightSpec, 0);
-
- // Only subtract out space from one dimension. Favor vertical.
- // Offset by 1.5x to add some balance along the other edge.
- if (Gravity.isVertical(lp.gravity)) {
- heightUsed += child.getMeasuredHeight() * 1.5f;
- } else if (Gravity.isHorizontal(lp.gravity)) {
- widthUsed += child.getMeasuredWidth() * 1.5f;
- }
+
+ int adjustedWidthSpec = widthSpec;
+ int adjustedHeightSpec = heightSpec;
+ if (lp.maxWidth >= 0) {
+ adjustedWidthSpec = MeasureSpec.makeMeasureSpec(
+ Math.min(lp.maxWidth, width), MeasureSpec.EXACTLY);
+ }
+ if (lp.maxHeight >= 0) {
+ adjustedHeightSpec = MeasureSpec.makeMeasureSpec(
+ Math.min(lp.maxHeight, height), MeasureSpec.EXACTLY);
+ }
+ // measureChildWithMargins will resolve layout direction for the LayoutParams
+ measureChildWithMargins(child, adjustedWidthSpec, 0, adjustedHeightSpec, 0);
+
+ // Only subtract out space from one dimension. Favor vertical.
+ // Offset by 1.5x to add some balance along the other edge.
+ if (Gravity.isVertical(lp.gravity)) {
+ heightUsed += child.getMeasuredHeight() * 1.5f;
+ } else if (Gravity.isHorizontal(lp.gravity)) {
+ widthUsed += child.getMeasuredWidth() * 1.5f;
}
} else if (lp.childType == LayoutParams.CHILD_TYPE_SCRIM) {
setScrimView(child);
@@ -258,6 +282,8 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
continue;
}
+ final int virtualHeight = getVirtualHeight(lp, height, heightUsed);
+
int adjustedWidthSpec;
int adjustedHeightSpec;
if (lp.centerWithinArea > 0) {
@@ -266,19 +292,19 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
(int) ((width - widthUsed) * lp.centerWithinArea + 0.5f),
MeasureSpec.EXACTLY);
adjustedHeightSpec = MeasureSpec.makeMeasureSpec(
- MeasureSpec.getSize(heightSpec) - heightUsed, MeasureSpec.EXACTLY);
+ virtualHeight, MeasureSpec.EXACTLY);
} else {
adjustedWidthSpec = MeasureSpec.makeMeasureSpec(
- MeasureSpec.getSize(widthSpec) - widthUsed, MeasureSpec.EXACTLY);
+ width - widthUsed, MeasureSpec.EXACTLY);
adjustedHeightSpec = MeasureSpec.makeMeasureSpec(
- (int) ((height - heightUsed) * lp.centerWithinArea + 0.5f),
+ (int) (virtualHeight * lp.centerWithinArea + 0.5f),
MeasureSpec.EXACTLY);
}
} else {
adjustedWidthSpec = MeasureSpec.makeMeasureSpec(
- MeasureSpec.getSize(widthSpec) - widthUsed, MeasureSpec.EXACTLY);
+ width - widthUsed, MeasureSpec.EXACTLY);
adjustedHeightSpec = MeasureSpec.makeMeasureSpec(
- MeasureSpec.getSize(heightSpec) - heightUsed, MeasureSpec.EXACTLY);
+ virtualHeight, MeasureSpec.EXACTLY);
}
if (lp.maxWidth >= 0) {
adjustedWidthSpec = MeasureSpec.makeMeasureSpec(
@@ -314,6 +340,7 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
final int count = getChildCount();
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
+ LayoutParams lp = (LayoutParams) child.getLayoutParams();
// We did the user switcher above if we have one.
if (child == mUserSwitcherView || child.getVisibility() == GONE) continue;
@@ -321,6 +348,9 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
if (child == mScrimView) {
child.layout(0, 0, width, height);
continue;
+ } else if (lp.childType == LayoutParams.CHILD_TYPE_PAGE_DELETE_DROP_TARGET) {
+ layoutWithGravity(width, height, child, mZeroPadding, false);
+ continue;
}
layoutWithGravity(width, height, child, padding, false);
@@ -331,6 +361,9 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
boolean adjustPadding) {
final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ final int heightUsed = padding.top + padding.bottom - getPaddingTop() - getPaddingBottom();
+ height = getVirtualHeight(lp, height, heightUsed);
+
final int gravity = Gravity.getAbsoluteGravity(lp.gravity, getLayoutDirection());
final boolean fixedLayoutSize = lp.centerWithinArea > 0;
@@ -344,7 +377,7 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
adjustedWidth = (int) (paddedWidth * lp.centerWithinArea + 0.5f);
adjustedHeight = height;
} else if (fixedLayoutVertical) {
- final int paddedHeight = height - padding.top - padding.bottom;
+ final int paddedHeight = height - getPaddingTop() - getPaddingBottom();
adjustedWidth = width;
adjustedHeight = (int) (paddedHeight * lp.centerWithinArea + 0.5f);
} else {
@@ -373,8 +406,8 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
break;
case Gravity.BOTTOM:
bottom = fixedLayoutVertical
- ? height - padding.bottom - (adjustedHeight - childHeight) / 2
- : height - padding.bottom;
+ ? padding.top + height - (adjustedHeight - childHeight) / 2
+ : padding.top + height;
top = bottom - childHeight;
if (adjustPadding && isVertical) {
padding.bottom = height - top;
@@ -382,8 +415,7 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
}
break;
case Gravity.CENTER_VERTICAL:
- final int paddedHeight = height - padding.top - padding.bottom;
- top = padding.top + (paddedHeight - childHeight) / 2;
+ top = padding.top + (height - childHeight) / 2;
bottom = top + childHeight;
break;
}
@@ -449,6 +481,7 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
public static final int CHILD_TYPE_CHALLENGE = 2;
public static final int CHILD_TYPE_USER_SWITCHER = 3;
public static final int CHILD_TYPE_SCRIM = 4;
+ public static final int CHILD_TYPE_PAGE_DELETE_DROP_TARGET = 7;
public int gravity = Gravity.NO_GRAVITY;
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/PagedView.java b/policy/src/com/android/internal/policy/impl/keyguard/PagedView.java
index 8f4757807205..3900ab4475d9 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/PagedView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/PagedView.java
@@ -34,6 +34,7 @@ import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
+import android.util.DisplayMetrics;
import android.util.Log;
import android.view.InputDevice;
import android.view.KeyEvent;
@@ -232,6 +233,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
private Matrix mTmpInvMatrix = new Matrix();
private float[] mTmpPoint = new float[2];
private Rect mTmpRect = new Rect();
+ private Rect mAltTmpRect = new Rect();
// Fling to delete
private int FLING_TO_DELETE_FADE_OUT_DURATION = 350;
@@ -577,6 +579,10 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
computeScrollHelper();
}
+ protected boolean shouldSetTopAlignedPivotForWidget(int childIndex) {
+ return mTopAlignPageWhenShrinkingForBouncer;
+ }
+
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (!mIsDataReady || getChildCount() == 0) {
@@ -593,8 +599,10 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
// NOTE: We multiply by 1.5f to account for the fact that depending on the offset of the
// viewport, we can be at most one and a half screens offset once we scale down
- int parentWidthSize = (int) (1.5f * parent.getMeasuredWidth());
- int parentHeightSize = parent.getMeasuredHeight();
+ DisplayMetrics dm = getResources().getDisplayMetrics();
+ int maxSize = Math.max(dm.widthPixels, dm.heightPixels);
+ int parentWidthSize = (int) (1.5f * maxSize);
+ int parentHeightSize = maxSize;
int scaledWidthSize = (int) (parentWidthSize / mMinScale);
int scaledHeightSize = (int) (parentHeightSize / mMinScale);
mViewport.set(0, 0, widthSize, heightSize);
@@ -651,10 +659,6 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
MeasureSpec.makeMeasureSpec(heightSize - verticalPadding, childHeightMode);
child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
- if (mTopAlignPageWhenShrinkingForBouncer) {
- child.setPivotX(child.getWidth() / 2);
- child.setPivotY(0f);
- }
}
setMeasuredDimension(scaledWidthSize, scaledHeightSize);
@@ -1015,6 +1019,17 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
return (x > (getViewportOffsetX() + getViewportWidth() - getRelativeChildOffset(mCurrentPage) + mPageSpacing));
}
+ /** Returns whether x and y originated within the buffered/unbuffered viewport */
+ private boolean isTouchPointInViewport(int x, int y, boolean buffer) {
+ if (buffer) {
+ mTmpRect.set(mViewport.left - mViewport.width() / 2, mViewport.top,
+ mViewport.right + mViewport.width() / 2, mViewport.bottom);
+ return mTmpRect.contains(x, y);
+ } else {
+ return mViewport.contains(x, y);
+ }
+ }
+
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (DISABLE_TOUCH_INTERACTION) {
@@ -1093,7 +1108,11 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
mTouchState = TOUCH_STATE_REST;
mScroller.abortAnimation();
} else {
- mTouchState = TOUCH_STATE_SCROLLING;
+ if (isTouchPointInViewport((int) mDownMotionX, (int) mDownMotionY, true)) {
+ mTouchState = TOUCH_STATE_SCROLLING;
+ } else {
+ mTouchState = TOUCH_STATE_REST;
+ }
}
// check if this can be the beginning of a tap on the side of the pages
@@ -1115,6 +1134,10 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
resetTouchState();
+ // Just intercept the touch event on up if we tap outside the strict viewport
+ if (!isTouchPointInViewport((int) mLastMotionX, (int) mLastMotionY, false)) {
+ return true;
+ }
break;
case MotionEvent.ACTION_POINTER_UP:
@@ -1139,24 +1162,19 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
* user moves their touch point too far.
*/
protected void determineScrollingStart(MotionEvent ev, float touchSlopScale) {
- /*
- * Locally do absolute value. mLastMotionX is set to the y value
- * of the down event.
- */
+ // Disallow scrolling if we don't have a valid pointer index
final int pointerIndex = ev.findPointerIndex(mActivePointerId);
+ if (pointerIndex == -1) return;
- if (pointerIndex == -1) {
- return;
- }
+ // Disallow scrolling if we started the gesture from outside the viewport
+ final float x = ev.getX(pointerIndex);
+ final float y = ev.getY(pointerIndex);
+ if (!isTouchPointInViewport((int) x, (int) y, true)) return;
// If we're only allowing edge swipes, we break out early if the down event wasn't
// at the edge.
- if (mOnlyAllowEdgeSwipes && !mDownEventOnEdge) {
- return;
- }
+ if (mOnlyAllowEdgeSwipes && !mDownEventOnEdge) return;
- final float x = ev.getX(pointerIndex);
- final float y = ev.getY(pointerIndex);
final int xDiff = (int) Math.abs(x - mLastMotionX);
final int yDiff = (int) Math.abs(y - mLastMotionY);
@@ -2434,7 +2452,13 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
/* Drag to delete */
private boolean isHoveringOverDeleteDropTarget(int x, int y) {
if (mDeleteDropTarget != null) {
+ mAltTmpRect.set(0, 0, 0, 0);
+ View parent = (View) mDeleteDropTarget.getParent();
+ if (parent != null) {
+ parent.getGlobalVisibleRect(mAltTmpRect);
+ }
mDeleteDropTarget.getGlobalVisibleRect(mTmpRect);
+ mTmpRect.offset(-mAltTmpRect.left, -mAltTmpRect.top);
return mTmpRect.contains(x, y);
}
return false;
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/SlidingChallengeLayout.java b/policy/src/com/android/internal/policy/impl/keyguard/SlidingChallengeLayout.java
index 16ec8c597ac0..073225f90f1e 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/SlidingChallengeLayout.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/SlidingChallengeLayout.java
@@ -26,8 +26,6 @@ import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.FloatProperty;
@@ -58,11 +56,10 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
private static final int DRAG_HANDLE_OPEN_ABOVE = 8; // dp
private static final int DRAG_HANDLE_OPEN_BELOW = 0; // dp
- private static final int HANDLE_ANIMATE_DURATION = 200; // ms
+ private static final int HANDLE_ANIMATE_DURATION = 250; // ms
// Drawn to show the drag handle in closed state; crossfades to the challenge view
// when challenge is fully visible
- private Drawable mFrameDrawable;
private boolean mEdgeCaptured;
private DisplayMetrics mDisplayMetrics;
@@ -76,6 +73,8 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
// Range: 0 (fully hidden) to 1 (fully visible)
private float mChallengeOffset = 1.f;
private boolean mChallengeShowing = true;
+ private boolean mChallengeShowingTargetState = true;
+ private boolean mWasChallengeShowing = true;
private boolean mIsBouncing = false;
private final Scroller mScroller;
@@ -127,8 +126,6 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
private ObjectAnimator mHandleAnimation;
private ObjectAnimator mFrameAnimation;
- private final Rect mTempRect = new Rect();
-
private boolean mHasGlowpad;
// We have an internal and external version, and we and them together.
@@ -149,23 +146,6 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
}
};
- static final Property<SlidingChallengeLayout, Float> FRAME_ALPHA =
- new FloatProperty<SlidingChallengeLayout>("frameAlpha") {
- @Override
- public void setValue(SlidingChallengeLayout view, float value) {
- if (view.mFrameDrawable != null) {
- view.mFrameAlpha = value;
- view.mFrameDrawable.setAlpha((int) (value * 0xFF));
- view.mFrameDrawable.invalidateSelf();
- }
- }
-
- @Override
- public Float get(SlidingChallengeLayout view) {
- return view.mFrameAlpha;
- }
- };
-
// True if at least one layout pass has happened since the view was attached.
private boolean mHasLayout;
@@ -280,6 +260,7 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
mChallengeBottomBound = res.getDimensionPixelSize(R.dimen.kg_widget_pager_bottom_padding);
setWillNotDraw(false);
+ setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE);
}
public void setHandleAlpha(float alpha) {
@@ -310,46 +291,6 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
mHandleAnimation.start();
}
- void animateFrame(final boolean visible, final boolean full) {
- if (mFrameDrawable == null) return;
-
- final float targetAlpha = visible ? (full ? 1.f : 0.5f) : 0.f;
- if (mFrameAnimation != null && targetAlpha != mFrameAnimationTarget) {
- mFrameAnimation.cancel();
- mFrameAnimationTarget = Float.MIN_VALUE;
- }
- if (targetAlpha == mFrameAlpha || targetAlpha == mFrameAnimationTarget) {
- return;
- }
- mFrameAnimationTarget = targetAlpha;
-
- mFrameAnimation = ObjectAnimator.ofFloat(this, FRAME_ALPHA, targetAlpha);
- mFrameAnimation.setInterpolator(sHandleFadeInterpolator);
- mFrameAnimation.setDuration(HANDLE_ANIMATE_DURATION);
- mFrameAnimation.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mFrameAnimationTarget = Float.MIN_VALUE;
-
- if (!visible && full && mChallengeView != null) {
- // Mess with padding/margin to remove insets on the bouncer frame.
- mChallengeView.setPadding(0, 0, 0, 0);
- LayoutParams lp = (LayoutParams) mChallengeView.getLayoutParams();
- lp.leftMargin = lp.rightMargin = getChallengeMargin(true);
- mChallengeView.setLayoutParams(lp);
- }
- mFrameAnimation = null;
- }
-
- @Override
- public void onAnimationCancel(Animator animation) {
- mFrameAnimationTarget = Float.MIN_VALUE;
- mFrameAnimation = null;
- }
- });
- mFrameAnimation.start();
- }
-
private void sendInitialListenerUpdates() {
if (mScrollListener != null) {
int challengeTop = mChallengeView != null ? mChallengeView.getTop() : 0;
@@ -409,9 +350,6 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
mScrollState = state;
animateHandle(state == SCROLL_STATE_IDLE && !mChallengeShowing);
- if (!mIsBouncing) {
- animateFrame(false, false);
- }
if (mScrollListener != null) {
mScrollListener.onScrollStateChanged(state);
}
@@ -419,7 +357,8 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
}
void completeChallengeScroll() {
- setChallengeShowing(mChallengeOffset != 0);
+ setChallengeShowing(mChallengeShowingTargetState);
+ mChallengeOffset = mChallengeShowing ? 1.f : 0.f;
setScrollState(SCROLL_STATE_IDLE);
mChallengeInteractiveInternal = true;
mChallengeView.setLayerType(LAYER_TYPE_NONE, null);
@@ -530,30 +469,30 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
}
@Override
+ public int getBouncerAnimationDuration() {
+ return HANDLE_ANIMATE_DURATION;
+ }
+
+ @Override
public void showBouncer() {
if (mIsBouncing) return;
+ mWasChallengeShowing = mChallengeShowing;
mIsBouncing = true;
showChallenge(true);
if (mScrimView != null) {
- mScrimView.setVisibility(VISIBLE);
+ Animator anim = ObjectAnimator.ofFloat(mScrimView, "alpha", 1f);
+ anim.setDuration(HANDLE_ANIMATE_DURATION);
+ anim.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ mScrimView.setVisibility(VISIBLE);
+ }
+ });
+ anim.start();
}
if (mChallengeView != null) {
mChallengeView.showBouncer(HANDLE_ANIMATE_DURATION);
}
- // Mess with padding/margin to inset the bouncer frame.
- // We have more space available to us otherwise.
- if (mChallengeView != null) {
- if (mFrameDrawable == null || !mFrameDrawable.getPadding(mTempRect)) {
- mTempRect.set(0, 0, 0, 0);
- }
- mChallengeView.setPadding(mTempRect.left, mTempRect.top, mTempRect.right,
- mTempRect.bottom);
- final LayoutParams lp = (LayoutParams) mChallengeView.getLayoutParams();
- lp.leftMargin = lp.rightMargin = getChallengeMargin(false);
- mChallengeView.setLayoutParams(lp);
- }
-
- animateFrame(true, true);
if (mBouncerListener != null) {
mBouncerListener.onBouncerStateChanged(true);
@@ -563,15 +502,23 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
@Override
public void hideBouncer() {
if (!mIsBouncing) return;
- showChallenge(false);
+ if (!mWasChallengeShowing) showChallenge(false);
mIsBouncing = false;
+
if (mScrimView != null) {
- mScrimView.setVisibility(GONE);
+ Animator anim = ObjectAnimator.ofFloat(mScrimView, "alpha", 0f);
+ anim.setDuration(HANDLE_ANIMATE_DURATION);
+ anim.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mScrimView.setVisibility(GONE);
+ }
+ });
+ anim.start();
}
if (mChallengeView != null) {
mChallengeView.hideBouncer(HANDLE_ANIMATE_DURATION);
}
- animateFrame(false, true);
if (mBouncerListener != null) {
mBouncerListener.onBouncerStateChanged(false);
}
@@ -823,6 +770,26 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
return horizOk && vertOk;
}
+ private int makeChildMeasureSpec(int maxSize, int childDimen) {
+ final int mode;
+ final int size;
+ switch (childDimen) {
+ case LayoutParams.WRAP_CONTENT:
+ mode = MeasureSpec.AT_MOST;
+ size = maxSize;
+ break;
+ case LayoutParams.MATCH_PARENT:
+ mode = MeasureSpec.EXACTLY;
+ size = maxSize;
+ break;
+ default:
+ mode = MeasureSpec.EXACTLY;
+ size = Math.min(maxSize, childDimen);
+ break;
+ }
+ return MeasureSpec.makeMeasureSpec(size, mode);
+ }
+
@Override
protected void onMeasure(int widthSpec, int heightSpec) {
if (MeasureSpec.getMode(widthSpec) != MeasureSpec.EXACTLY ||
@@ -861,7 +828,6 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
mChallengeView.setVisibility(mChallengeShowing ? VISIBLE : INVISIBLE);
}
// We're going to play silly games with the frame's background drawable later.
- mFrameDrawable = mChallengeView.getBackground();
if (!mHasLayout) {
// Set up the margin correctly based on our content for the first run.
mHasGlowpad = child.findViewById(R.id.keyguard_selector_view) != null;
@@ -889,7 +855,25 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
// needs to do things its measure pass that are dependent on the challenge view
// having been measured.
if (mChallengeView != null && mChallengeView.getVisibility() != View.GONE) {
- measureChildWithMargins(mChallengeView, widthSpec, 0, heightSpec, 0);
+ // This one's a little funny. If the IME is present - reported in the form
+ // of insets on the root view - we only give the challenge the space it would
+ // have had if the IME wasn't there in order to keep the rest of the layout stable.
+ // We base this on the layout_maxHeight on the challenge view. If it comes out
+ // negative or zero, either we didn't have a maxHeight or we're totally out of space,
+ // so give up and measure as if this rule weren't there.
+ int challengeHeightSpec = heightSpec;
+ final View root = getRootView();
+ if (root != null) {
+ final LayoutParams lp = (LayoutParams) mChallengeView.getLayoutParams();
+ final int specSize = MeasureSpec.getSize(heightSpec);
+ final int windowHeight = mDisplayMetrics.heightPixels - root.getPaddingTop();
+ final int diff = windowHeight - specSize;
+ final int maxChallengeHeight = lp.maxHeight - diff;
+ if (maxChallengeHeight > 0) {
+ challengeHeightSpec = makeChildMeasureSpec(maxChallengeHeight, lp.height);
+ }
+ }
+ measureChildWithMargins(mChallengeView, widthSpec, 0, challengeHeightSpec, 0);
}
// Measure the rest of the children
@@ -971,9 +955,6 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
}
if (!mHasLayout) {
- if (mFrameDrawable != null) {
- mFrameDrawable.setAlpha(0);
- }
mHasLayout = true;
}
}
@@ -1187,6 +1168,7 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
}
if (mHasLayout) {
+ mChallengeShowingTargetState = show;
final int layoutBottom = getLayoutBottom();
animateChallengeTo(show ? layoutBottom :
layoutBottom + mChallengeView.getHeight() - mChallengeBottomBound, velocity);
@@ -1223,6 +1205,8 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
public static final int CHILD_TYPE_WIDGETS = 5;
public static final int CHILD_TYPE_EXPAND_CHALLENGE_HANDLE = 6;
+ public int maxHeight;
+
public LayoutParams() {
this(MATCH_PARENT, WRAP_CONTENT);
}
@@ -1252,6 +1236,8 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
R.styleable.SlidingChallengeLayout_Layout);
childType = a.getInt(R.styleable.SlidingChallengeLayout_Layout_layout_childType,
CHILD_TYPE_NONE);
+ maxHeight = a.getDimensionPixelSize(
+ R.styleable.SlidingChallengeLayout_Layout_layout_maxHeight, 0);
a.recycle();
}
}
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index b38b01648a2c..7ac314b8a7a9 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -133,7 +133,7 @@ import javax.crypto.spec.SecretKeySpec;
class BackupManagerService extends IBackupManager.Stub {
private static final String TAG = "BackupManagerService";
- private static final boolean DEBUG = true;
+ private static final boolean DEBUG = false;
private static final boolean MORE_DEBUG = false;
// Name and current contents version of the full-backup manifest file
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index 033aa1e42603..a7c4d7301390 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -629,7 +629,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
wimaxStateTrackerClassName = context.getResources().getString(
com.android.internal.R.string.config_wimaxStateTrackerClassname);
- log("wimaxJarLocation: " + wimaxJarLocation);
+ if (DBG) log("wimaxJarLocation: " + wimaxJarLocation);
wimaxClassLoader = new DexClassLoader(wimaxJarLocation,
new ContextWrapper(context).getCacheDir().getAbsolutePath(),
wimaxLibLocation, ClassLoader.getSystemClassLoader());
@@ -648,7 +648,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
}
try {
- log("Starting Wimax Service... ");
+ if (DBG) log("Starting Wimax Service... ");
Constructor wmxStTrkrConst = wimaxStateTrackerClass.getConstructor
(new Class[] {Context.class, Handler.class});
@@ -2686,18 +2686,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
state + "/" + info.getDetailedState());
}
- // Connectivity state changed:
- // [31-14] Reserved for future use
- // [13-10] Network subtype (for mobile network, as defined
- // by TelephonyManager)
- // [9-4] Detailed state ordinal (as defined by
- // NetworkInfo.DetailedState)
- // [3-0] Network type (as defined by ConnectivityManager)
- int eventLogParam = (info.getType() & 0xf) |
- ((info.getDetailedState().ordinal() & 0x3f) << 4) |
- (info.getSubtype() << 10);
- EventLog.writeEvent(EventLogTags.CONNECTIVITY_STATE_CHANGED,
- eventLogParam);
+ EventLogTags.writeConnectivityStateChanged(
+ info.getType(), info.getSubtype(), info.getDetailedState().ordinal());
if (info.getDetailedState() ==
NetworkInfo.DetailedState.FAILED) {
diff --git a/services/java/com/android/server/EventLogTags.logtags b/services/java/com/android/server/EventLogTags.logtags
index 0fe66fccc921..8bc2da26ae92 100644
--- a/services/java/com/android/server/EventLogTags.logtags
+++ b/services/java/com/android/server/EventLogTags.logtags
@@ -135,12 +135,8 @@ option java_package com.android.server
# ---------------------------
# ConnectivityService.java
# ---------------------------
-# Connectivity state changed:
-# [31-14] Reserved for future use
-# [13-10] Network subtype (for mobile network, as defined by TelephonyManager)
-# [ 9- 4] Detailed state ordinal (as defined by NetworkInfo.DetailedState)
-# [ 3- 0] Network type (as defined by ConnectivityManager)
-50020 connectivity_state_changed (custom|1|5)
+# Connectivity state changed
+50020 connectivity_state_changed (type|1),(subtype|1),(state|1)
# ---------------------------
diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java
index 9416b521a542..89fa6d0580fb 100644
--- a/services/java/com/android/server/LocationManagerService.java
+++ b/services/java/com/android/server/LocationManagerService.java
@@ -1214,8 +1214,8 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
throw new IllegalArgumentException("provider doesn't exisit: " + provider);
}
- Log.i(TAG, "request " + Integer.toHexString(System.identityHashCode(receiver)) + " " +
- name + " " + request + " from " + packageName + "(" + uid + ")");
+ if (D) Log.d(TAG, "request " + Integer.toHexString(System.identityHashCode(receiver))
+ + " " + name + " " + request + " from " + packageName + "(" + uid + ")");
UpdateRecord record = new UpdateRecord(name, request, receiver);
UpdateRecord oldRecord = receiver.mUpdateRecords.put(name, record);
@@ -1253,7 +1253,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
}
private void removeUpdatesLocked(Receiver receiver) {
- Log.i(TAG, "remove " + Integer.toHexString(System.identityHashCode(receiver)));
+ if (D) Log.i(TAG, "remove " + Integer.toHexString(System.identityHashCode(receiver)));
if (mReceivers.remove(receiver.mKey) != null && receiver.isListener()) {
receiver.getListener().asBinder().unlinkToDeath(receiver, 0);
@@ -1351,6 +1351,11 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
// geo-fence manager uses the public location API, need to clear identity
int uid = Binder.getCallingUid();
+ if (UserHandle.getUserId(uid) != UserHandle.USER_OWNER) {
+ // temporary measure until geofences work for secondary users
+ Log.w(TAG, "proximity alerts are currently available only to the primary user");
+ return;
+ }
long identity = Binder.clearCallingIdentity();
try {
mGeofenceManager.addFence(sanitizedRequest, geofence, intent, uid, packageName);
diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java
index 0e171cdf6c47..f3a38f0c7cdb 100755
--- a/services/java/com/android/server/NotificationManagerService.java
+++ b/services/java/com/android/server/NotificationManagerService.java
@@ -1086,8 +1086,17 @@ public class NotificationManagerService extends INotificationManager.Stub
}
// vibrate
+ // new in 4.2: if there was supposed to be a sound and we're in vibrate mode,
+ // we always vibrate, even if no vibration was specified
+ final boolean convertSoundToVibration =
+ notification.vibrate == null
+ && (useDefaultSound || notification.sound != null)
+ && (audioManager.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE);
+
final boolean useDefaultVibrate =
- (notification.defaults & Notification.DEFAULT_VIBRATE) != 0;
+ (notification.defaults & Notification.DEFAULT_VIBRATE) != 0
+ || convertSoundToVibration;
+
if ((useDefaultVibrate || notification.vibrate != null)
&& !(audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT)) {
mVibrateNotification = r;
@@ -1261,6 +1270,10 @@ public class NotificationManagerService extends INotificationManager.Stub
if (!notificationMatchesUserId(r, userId)) {
continue;
}
+ // Don't remove notifications to all, if there's no package name specified
+ if (r.userId == UserHandle.USER_ALL && pkg == null) {
+ continue;
+ }
if ((r.notification.flags & mustHaveFlags) != mustHaveFlags) {
continue;
}
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index d2cd646ba7b7..db64a9ad34bd 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -14229,6 +14229,7 @@ public final class ActivityManagerService extends ActivityManagerNative
startHomeActivityLocked(userId);
}
+ EventLogTags.writeAmSwitchUser(userId);
getUserManagerLocked().userForeground(userId);
sendUserSwitchBroadcastsLocked(oldUserId, userId);
if (needStart) {
diff --git a/services/java/com/android/server/am/EventLogTags.logtags b/services/java/com/android/server/am/EventLogTags.logtags
index 6ee750710d6c..88c0c0330d9b 100644
--- a/services/java/com/android/server/am/EventLogTags.logtags
+++ b/services/java/com/android/server/am/EventLogTags.logtags
@@ -83,3 +83,6 @@ option java_package com.android.server.am
30039 am_crash (User|1|5),(PID|1|5),(Process Name|3),(Flags|1|5),(Exception|3),(Message|3),(File|3),(Line|1|5)
# Log.wtf() called
30040 am_wtf (User|1|5),(PID|1|5),(Process Name|3),(Flags|1|5),(Tag|3),(Message|3)
+
+# User switched
+30041 am_switch_user (id|1|5)
diff --git a/services/java/com/android/server/location/GeofenceManager.java b/services/java/com/android/server/location/GeofenceManager.java
index d04d2f32d46e..f9be7195ab81 100644
--- a/services/java/com/android/server/location/GeofenceManager.java
+++ b/services/java/com/android/server/location/GeofenceManager.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 20012 The Android Open Source Project
+ * 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.
@@ -21,7 +21,6 @@ import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
-import android.Manifest.permission;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
@@ -31,10 +30,11 @@ import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationRequest;
import android.os.Bundle;
-import android.os.Looper;
+import android.os.Handler;
+import android.os.Message;
import android.os.PowerManager;
import android.os.SystemClock;
-import android.util.Log;
+import android.util.Slog;
import com.android.server.LocationManagerService;
@@ -42,6 +42,8 @@ public class GeofenceManager implements LocationListener, PendingIntent.OnFinish
private static final String TAG = "GeofenceManager";
private static final boolean D = LocationManagerService.D;
+ private static final int MSG_UPDATE_FENCES = 1;
+
/**
* Assume a maximum land speed, as a heuristic to throttle location updates.
* (Air travel should result in an airplane mode toggle which will
@@ -49,37 +51,77 @@ public class GeofenceManager implements LocationListener, PendingIntent.OnFinish
*/
private static final int MAX_SPEED_M_S = 100; // 360 km/hr (high speed train)
+ /**
+ * Maximum age after which a location is no longer considered fresh enough to use.
+ */
+ private static final long MAX_AGE_NANOS = 5 * 60 * 1000000000L; // five minutes
+
+ /**
+ * Most frequent update interval allowed.
+ */
+ private static final long MIN_INTERVAL_MS = 1 * 60 * 1000; // one minute
+
+ /**
+ * Least frequent update interval allowed.
+ */
+ private static final long MAX_INTERVAL_MS = 2 * 60 * 60 * 1000; // two hours
+
private final Context mContext;
private final LocationManager mLocationManager;
private final PowerManager.WakeLock mWakeLock;
- private final Looper mLooper; // looper thread to take location updates on
+ private final GeofenceHandler mHandler;
private final LocationBlacklist mBlacklist;
private Object mLock = new Object();
// access to members below is synchronized on mLock
+ /**
+ * A list containing all registered geofences.
+ */
private List<GeofenceState> mFences = new LinkedList<GeofenceState>();
+ /**
+ * This is set true when we have an active request for {@link Location} updates via
+ * {@link LocationManager#requestLocationUpdates(LocationRequest, LocationListener,
+ * android.os.Looper).
+ */
+ private boolean mReceivingLocationUpdates;
+
+ /**
+ * The update interval component of the current active {@link Location} update request.
+ */
+ private long mLocationUpdateInterval;
+
+ /**
+ * The {@link Location} most recently received via {@link #onLocationChanged(Location)}.
+ */
+ private Location mLastLocationUpdate;
+
+ /**
+ * This is set true when a {@link Location} is received via
+ * {@link #onLocationChanged(Location)} or {@link #scheduleUpdateFencesLocked()}, and cleared
+ * when that Location has been processed via {@link #updateFences()}
+ */
+ private boolean mPendingUpdate;
+
public GeofenceManager(Context context, LocationBlacklist blacklist) {
mContext = context;
mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
- mLooper = Looper.myLooper();
+ mHandler = new GeofenceHandler();
mBlacklist = blacklist;
-
- LocationRequest request = new LocationRequest()
- .setQuality(LocationRequest.POWER_NONE)
- .setFastestInterval(0);
- mLocationManager.requestLocationUpdates(request, this, Looper.myLooper());
}
- public void addFence(LocationRequest request, Geofence geofence, PendingIntent intent, int uid,
- String packageName) {
- Location lastLocation = mLocationManager.getLastLocation();
- GeofenceState state = new GeofenceState(geofence, lastLocation,
- request.getExpireAt(), packageName, intent);
+ public void addFence(LocationRequest request, Geofence geofence, PendingIntent intent,
+ int uid, String packageName) {
+ if (D) {
+ Slog.d(TAG, "addFence: request=" + request + ", geofence=" + geofence
+ + ", intent=" + intent + ", uid=" + uid + ", packageName=" + packageName);
+ }
+ GeofenceState state = new GeofenceState(geofence,
+ request.getExpireAt(), packageName, intent);
synchronized (mLock) {
// first make sure it doesn't already exist
for (int i = mFences.size() - 1; i >= 0; i--) {
@@ -91,11 +133,15 @@ public class GeofenceManager implements LocationListener, PendingIntent.OnFinish
}
}
mFences.add(state);
- updateProviderRequirementsLocked();
+ scheduleUpdateFencesLocked();
}
}
public void removeFence(Geofence fence, PendingIntent intent) {
+ if (D) {
+ Slog.d(TAG, "removeFence: fence=" + fence + ", intent=" + intent);
+ }
+
synchronized (mLock) {
Iterator<GeofenceState> iter = mFences.iterator();
while (iter.hasNext()) {
@@ -103,7 +149,7 @@ public class GeofenceManager implements LocationListener, PendingIntent.OnFinish
if (state.mIntent.equals(intent)) {
if (fence == null) {
- // alwaus remove
+ // always remove
iter.remove();
} else {
// just remove matching fences
@@ -113,11 +159,15 @@ public class GeofenceManager implements LocationListener, PendingIntent.OnFinish
}
}
}
- updateProviderRequirementsLocked();
+ scheduleUpdateFencesLocked();
}
}
public void removeFence(String packageName) {
+ if (D) {
+ Slog.d(TAG, "removeFence: packageName=" + packageName);
+ }
+
synchronized (mLock) {
Iterator<GeofenceState> iter = mFences.iterator();
while (iter.hasNext()) {
@@ -126,7 +176,7 @@ public class GeofenceManager implements LocationListener, PendingIntent.OnFinish
iter.remove();
}
}
- updateProviderRequirementsLocked();
+ scheduleUpdateFencesLocked();
}
}
@@ -141,29 +191,133 @@ public class GeofenceManager implements LocationListener, PendingIntent.OnFinish
}
}
- private void processLocation(Location location) {
+ private void scheduleUpdateFencesLocked() {
+ if (!mPendingUpdate) {
+ mPendingUpdate = true;
+ mHandler.sendEmptyMessage(MSG_UPDATE_FENCES);
+ }
+ }
+
+ /**
+ * Returns the location received most recently from {@link #onLocationChanged(Location)},
+ * or consult {@link LocationManager#getLastLocation()} if none has arrived. Does not return
+ * either if the location would be too stale to be useful.
+ *
+ * @return a fresh, valid Location, or null if none is available
+ */
+ private Location getFreshLocationLocked() {
+ // Prefer mLastLocationUpdate to LocationManager.getLastLocation().
+ Location location = mReceivingLocationUpdates ? mLastLocationUpdate : null;
+ if (location == null && !mFences.isEmpty()) {
+ location = mLocationManager.getLastLocation();
+ }
+
+ // Early out for null location.
+ if (location == null) {
+ return null;
+ }
+
+ // Early out for stale location.
+ long now = SystemClock.elapsedRealtimeNanos();
+ if (now - location.getElapsedRealtimeNanos() > MAX_AGE_NANOS) {
+ return null;
+ }
+
+ // Made it this far? Return our fresh, valid location.
+ return location;
+ }
+
+ /**
+ * The geofence update loop. This function removes expired fences, then tests the most
+ * recently-received {@link Location} against each registered {@link GeofenceState}, sending
+ * {@link Intent}s for geofences that have been tripped. It also adjusts the active location
+ * update request with {@link LocationManager} as appropriate for any active geofences.
+ */
+ // Runs on the handler.
+ private void updateFences() {
List<PendingIntent> enterIntents = new LinkedList<PendingIntent>();
List<PendingIntent> exitIntents = new LinkedList<PendingIntent>();
synchronized (mLock) {
+ mPendingUpdate = false;
+
+ // Remove expired fences.
removeExpiredFencesLocked();
+ // Get a location to work with, either received via onLocationChanged() or
+ // via LocationManager.getLastLocation().
+ Location location = getFreshLocationLocked();
+
+ // Update all fences.
+ // Keep track of the distance to the nearest fence.
+ double minFenceDistance = Double.MAX_VALUE;
+ boolean needUpdates = false;
for (GeofenceState state : mFences) {
if (mBlacklist.isBlacklisted(state.mPackageName)) {
- if (D) Log.d(TAG, "skipping geofence processing for blacklisted app: " +
- state.mPackageName);
+ if (D) {
+ Slog.d(TAG, "skipping geofence processing for blacklisted app: "
+ + state.mPackageName);
+ }
continue;
}
- int event = state.processLocation(location);
- if ((event & GeofenceState.FLAG_ENTER) != 0) {
- enterIntents.add(state.mIntent);
+ needUpdates = true;
+ if (location != null) {
+ int event = state.processLocation(location);
+ if ((event & GeofenceState.FLAG_ENTER) != 0) {
+ enterIntents.add(state.mIntent);
+ }
+ if ((event & GeofenceState.FLAG_EXIT) != 0) {
+ exitIntents.add(state.mIntent);
+ }
+
+ // FIXME: Ideally this code should take into account the accuracy of the
+ // location fix that was used to calculate the distance in the first place.
+ double fenceDistance = state.getDistanceToBoundary(); // MAX_VALUE if unknown
+ if (fenceDistance < minFenceDistance) {
+ minFenceDistance = fenceDistance;
+ }
+ }
+ }
+
+ // Request or cancel location updates if needed.
+ if (needUpdates) {
+ // Request location updates.
+ // Compute a location update interval based on the distance to the nearest fence.
+ long intervalMs;
+ if (location != null && Double.compare(minFenceDistance, Double.MAX_VALUE) != 0) {
+ intervalMs = (long)Math.min(MAX_INTERVAL_MS, Math.max(MIN_INTERVAL_MS,
+ minFenceDistance * 1000 / MAX_SPEED_M_S));
+ } else {
+ intervalMs = MIN_INTERVAL_MS;
}
- if ((event & GeofenceState.FLAG_EXIT) != 0) {
- exitIntents.add(state.mIntent);
+ if (!mReceivingLocationUpdates || mLocationUpdateInterval != intervalMs) {
+ mReceivingLocationUpdates = true;
+ mLocationUpdateInterval = intervalMs;
+ mLastLocationUpdate = location;
+
+ LocationRequest request = new LocationRequest();
+ request.setInterval(intervalMs).setFastestInterval(0);
+ mLocationManager.requestLocationUpdates(request, this, mHandler.getLooper());
}
+ } else {
+ // Cancel location updates.
+ if (mReceivingLocationUpdates) {
+ mReceivingLocationUpdates = false;
+ mLocationUpdateInterval = 0;
+ mLastLocationUpdate = null;
+
+ mLocationManager.removeUpdates(this);
+ }
+ }
+
+ if (D) {
+ Slog.d(TAG, "updateFences: location=" + location
+ + ", mFences.size()=" + mFences.size()
+ + ", mReceivingLocationUpdates=" + mReceivingLocationUpdates
+ + ", mLocationUpdateInterval=" + mLocationUpdateInterval
+ + ", mLastLocationUpdate=" + mLastLocationUpdate);
}
- updateProviderRequirementsLocked();
}
// release lock before sending intents
@@ -176,55 +330,54 @@ public class GeofenceManager implements LocationListener, PendingIntent.OnFinish
}
private void sendIntentEnter(PendingIntent pendingIntent) {
+ if (D) {
+ Slog.d(TAG, "sendIntentEnter: pendingIntent=" + pendingIntent);
+ }
+
Intent intent = new Intent();
intent.putExtra(LocationManager.KEY_PROXIMITY_ENTERING, true);
sendIntent(pendingIntent, intent);
}
private void sendIntentExit(PendingIntent pendingIntent) {
+ if (D) {
+ Slog.d(TAG, "sendIntentExit: pendingIntent=" + pendingIntent);
+ }
+
Intent intent = new Intent();
intent.putExtra(LocationManager.KEY_PROXIMITY_ENTERING, false);
sendIntent(pendingIntent, intent);
}
private void sendIntent(PendingIntent pendingIntent, Intent intent) {
+ mWakeLock.acquire();
try {
- mWakeLock.acquire();
- pendingIntent.send(mContext, 0, intent, this, null, permission.ACCESS_FINE_LOCATION);
+ pendingIntent.send(mContext, 0, intent, this, null,
+ android.Manifest.permission.ACCESS_FINE_LOCATION);
} catch (PendingIntent.CanceledException e) {
removeFence(null, pendingIntent);
mWakeLock.release();
}
+ // ...otherwise, mWakeLock.release() gets called by onSendFinished()
}
- private void updateProviderRequirementsLocked() {
- double minDistance = Double.MAX_VALUE;
- for (GeofenceState state : mFences) {
- if (state.getDistance() < minDistance) {
- minDistance = state.getDistance();
+ // Runs on the handler (which was passed into LocationManager.requestLocationUpdates())
+ @Override
+ public void onLocationChanged(Location location) {
+ synchronized (mLock) {
+ if (mReceivingLocationUpdates) {
+ mLastLocationUpdate = location;
}
- }
- if (minDistance == Double.MAX_VALUE) {
- disableLocationLocked();
- } else {
- int intervalMs = (int)(minDistance * 1000) / MAX_SPEED_M_S;
- requestLocationLocked(intervalMs);
+ // Update the fences immediately before returning in
+ // case the caller is holding a wakelock.
+ if (mPendingUpdate) {
+ mHandler.removeMessages(MSG_UPDATE_FENCES);
+ } else {
+ mPendingUpdate = true;
+ }
}
- }
-
- private void requestLocationLocked(int intervalMs) {
- mLocationManager.requestLocationUpdates(new LocationRequest().setInterval(intervalMs), this,
- mLooper);
- }
-
- private void disableLocationLocked() {
- mLocationManager.removeUpdates(this);
- }
-
- @Override
- public void onLocationChanged(Location location) {
- processLocation(location);
+ updateFences();
}
@Override
@@ -253,4 +406,20 @@ public class GeofenceManager implements LocationListener, PendingIntent.OnFinish
pw.append("\n");
}
}
+
+ private final class GeofenceHandler extends Handler {
+ public GeofenceHandler() {
+ super(true /*async*/);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_UPDATE_FENCES: {
+ updateFences();
+ break;
+ }
+ }
+ }
+ }
}
diff --git a/services/java/com/android/server/location/GeofenceState.java b/services/java/com/android/server/location/GeofenceState.java
index 1fd737f3de20..11705ffa572f 100644
--- a/services/java/com/android/server/location/GeofenceState.java
+++ b/services/java/com/android/server/location/GeofenceState.java
@@ -39,11 +39,12 @@ public class GeofenceState {
public final PendingIntent mIntent;
int mState; // current state
- double mDistance; // current distance to center of fence
+ double mDistanceToCenter; // current distance to center of fence
- public GeofenceState(Geofence fence, Location prevLocation, long expireAt,
+ public GeofenceState(Geofence fence, long expireAt,
String packageName, PendingIntent intent) {
mState = STATE_UNKNOWN;
+ mDistanceToCenter = Double.MAX_VALUE;
mFence = fence;
mExpireAt = expireAt;
@@ -53,10 +54,6 @@ public class GeofenceState {
mLocation = new Location("");
mLocation.setLatitude(fence.getLatitude());
mLocation.setLongitude(fence.getLongitude());
-
- if (prevLocation != null) {
- processLocation(prevLocation);
- }
}
/**
@@ -64,26 +61,35 @@ public class GeofenceState {
* @return FLAG_ENTER or FLAG_EXIT if the fence was crossed, 0 otherwise
*/
public int processLocation(Location location) {
- mDistance = mLocation.distanceTo(location);
+ mDistanceToCenter = mLocation.distanceTo(location);
int prevState = mState;
//TODO: inside/outside detection could be made more rigorous
- boolean inside = mDistance <= Math.max(mFence.getRadius(), location.getAccuracy());
+ boolean inside = mDistanceToCenter <= Math.max(mFence.getRadius(), location.getAccuracy());
if (inside) {
mState = STATE_INSIDE;
+ if (prevState != STATE_INSIDE) {
+ return FLAG_ENTER; // return enter if previously exited or unknown
+ }
} else {
mState = STATE_OUTSIDE;
- }
-
- if (prevState != 0 && mState != prevState) {
- if (mState == STATE_INSIDE) return FLAG_ENTER;
- if (mState == STATE_OUTSIDE) return FLAG_EXIT;
+ if (prevState == STATE_INSIDE) {
+ return FLAG_EXIT; // return exit only if previously entered
+ }
}
return 0;
}
- public double getDistance() {
- return mDistance;
+ /**
+ * Gets the distance from the current location to the fence's boundary.
+ * @return The distance or {@link Double#MAX_VALUE} if unknown.
+ */
+ public double getDistanceToBoundary() {
+ if (Double.compare(mDistanceToCenter, Double.MAX_VALUE) == 0) {
+ return Double.MAX_VALUE;
+ } else {
+ return Math.abs(mFence.getRadius() - mDistanceToCenter);
+ }
}
@Override
@@ -99,6 +105,6 @@ public class GeofenceState {
default:
state = "?";
}
- return String.format("%s d=%.0f %s", mFence.toString(), mDistance, state);
+ return String.format("%s d=%.0f %s", mFence.toString(), mDistanceToCenter, state);
}
}
diff --git a/services/java/com/android/server/usb/UsbDeviceManager.java b/services/java/com/android/server/usb/UsbDeviceManager.java
index 95797ef2301e..f34a52da7ad3 100644
--- a/services/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/java/com/android/server/usb/UsbDeviceManager.java
@@ -668,9 +668,9 @@ public class UsbDeviceManager {
id = com.android.internal.R.string.usb_accessory_notification_title;
} else {
// There is a different notification for USB tethering so we don't need one here
- if (!containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_RNDIS)) {
- Slog.e(TAG, "No known USB function in updateUsbNotification");
- }
+ //if (!containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_RNDIS)) {
+ // Slog.e(TAG, "No known USB function in updateUsbNotification");
+ //}
}
}
if (id != mUsbNotificationId) {
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 06594090e326..51edb44f2db1 100755
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -2779,10 +2779,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
- if (DEBUG_LAYOUT
- // TODO: Remove once b/7094175 is fixed
- || ((String)win.mAttrs.getTitle()).contains("Keyguard")
- ) Slog.v(TAG, "Relayout " + win + ": viewVisibility=" + viewVisibility
+ 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;
@@ -9403,9 +9400,7 @@ public class WindowManagerService extends IWindowManager.Stub
"Reporting new frame to " + win + ": " + win.mCompatFrame);
int diff = 0;
boolean configChanged = win.isConfigChanged();
- if ((DEBUG_RESIZE || DEBUG_ORIENTATION || DEBUG_CONFIGURATION
- // TODO: Remove once b/7094175 is fixed
- || ((String)win.mAttrs.getTitle()).contains("Keyguard"))
+ if ((DEBUG_RESIZE || DEBUG_ORIENTATION || DEBUG_CONFIGURATION)
&& configChanged) {
Slog.i(TAG, "Sending new config to window " + win + ": "
+ winAnimator.mSurfaceW + "x" + winAnimator.mSurfaceH
@@ -10347,6 +10342,19 @@ public class WindowManagerService extends IWindowManager.Stub
public void lockNow(Bundle options) {
mPolicy.lockNow(options);
}
+
+ public boolean isSafeModeEnabled() {
+ return mSafeMode;
+ }
+
+ public void showAssistant() {
+ // TODO: What permission?
+ if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER)
+ != PackageManager.PERMISSION_GRANTED) {
+ return;
+ }
+ mPolicy.showAssistant();
+ }
void dumpPolicyLocked(PrintWriter pw, String[] args, boolean dumpAll) {
pw.println("WINDOW MANAGER POLICY STATE (dumpsys window policy)");
diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
index da736b752834..3e625f98367d 100644
--- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
+++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
@@ -446,6 +446,16 @@ public class IWindowManagerImpl implements IWindowManager {
public void lockNow(Bundle options) {
// TODO Auto-generated method stub
}
+
+ @Override
+ public boolean isSafeModeEnabled() {
+ return false;
+ }
+
+ @Override
+ public void showAssistant() {
+
+ }
@Override
public IBinder getFocusedWindowToken() {
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index b871cdca9f5a..0e29882ef17c 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -508,6 +508,10 @@ public class WifiManager {
private Messenger mWifiServiceMessenger;
private final CountDownLatch mConnected = new CountDownLatch(1);
+ private static Object sThreadRefLock = new Object();
+ private static int sThreadRefCount;
+ private static HandlerThread sHandlerThread;
+
/**
* Create a new WifiManager instance.
* Applications will almost always want to use
@@ -1365,9 +1369,14 @@ public class WifiManager {
return;
}
- HandlerThread t = new HandlerThread("WifiManager");
- t.start();
- mHandler = new ServiceHandler(t.getLooper());
+ synchronized (sThreadRefLock) {
+ if (++sThreadRefCount == 1) {
+ sHandlerThread = new HandlerThread("WifiManager");
+ sHandlerThread.start();
+ }
+ }
+
+ mHandler = new ServiceHandler(sHandlerThread.getLooper());
mAsyncChannel.connect(mContext, mHandler, mWifiServiceMessenger);
try {
mConnected.await();
@@ -1983,8 +1992,10 @@ public class WifiManager {
protected void finalize() throws Throwable {
try {
- if (mHandler != null && mHandler.getLooper() != null) {
- mHandler.getLooper().quit();
+ synchronized (sThreadRefLock) {
+ if (--sThreadRefCount == 0 && sHandlerThread != null) {
+ sHandlerThread.getLooper().quit();
+ }
}
} finally {
super.finalize();
diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java
index 4c5fc5d07410..5e25623a1126 100644
--- a/wifi/java/android/net/wifi/WifiNative.java
+++ b/wifi/java/android/net/wifi/WifiNative.java
@@ -61,7 +61,7 @@ public class WifiNative {
/* Sends a kill signal to supplicant. To be used when we have lost connection
or when the supplicant is hung */
- public native static boolean killSupplicant();
+ public native static boolean killSupplicant(boolean p2pSupported);
private native boolean connectToSupplicant(String iface);
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 040ff248f59e..dafa8e8322d6 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -1944,6 +1944,7 @@ public class WifiStateMachine extends StateMachine {
case CMD_STOP_DRIVER:
case CMD_DELAYED_STOP_DRIVER:
case CMD_DRIVER_START_TIMED_OUT:
+ case CMD_CAPTIVE_CHECK_COMPLETE:
case CMD_START_AP:
case CMD_START_AP_SUCCESS:
case CMD_START_AP_FAILURE:
@@ -2189,6 +2190,13 @@ public class WifiStateMachine extends StateMachine {
loge("Unable to change interface settings: " + ie);
}
+ /* Stop a running supplicant after a runtime restart
+ * Avoids issues with drivers that do not handle interface down
+ * on a running supplicant properly.
+ */
+ if (DBG) log("Kill any running supplicant");
+ mWifiNative.killSupplicant(mP2pSupported);
+
if(mWifiNative.startSupplicant(mP2pSupported)) {
if (DBG) log("Supplicant start successful");
mWifiMonitor.startMonitoring();
@@ -2384,7 +2392,7 @@ public class WifiStateMachine extends StateMachine {
case WifiMonitor.SUP_DISCONNECTION_EVENT:
if (++mSupplicantRestartCount <= SUPPLICANT_RESTART_TRIES) {
loge("Failed to setup control channel, restart supplicant");
- mWifiNative.killSupplicant();
+ mWifiNative.killSupplicant(mP2pSupported);
transitionTo(mDriverLoadedState);
sendMessageDelayed(CMD_START_SUPPLICANT, SUPPLICANT_RESTART_INTERVAL_MSECS);
} else {
@@ -2451,7 +2459,7 @@ public class WifiStateMachine extends StateMachine {
break;
case WifiMonitor.SUP_DISCONNECTION_EVENT: /* Supplicant connection lost */
loge("Connection lost, restart supplicant");
- mWifiNative.killSupplicant();
+ mWifiNative.killSupplicant(mP2pSupported);
mWifiNative.closeSupplicantConnection();
mNetworkInfo.setIsAvailable(false);
handleNetworkDisconnect();
@@ -2605,14 +2613,14 @@ public class WifiStateMachine extends StateMachine {
/* Socket connection can be lost when we do a graceful shutdown
* or when the driver is hung. Ensure supplicant is stopped here.
*/
- mWifiNative.killSupplicant();
+ mWifiNative.killSupplicant(mP2pSupported);
mWifiNative.closeSupplicantConnection();
transitionTo(mDriverLoadedState);
break;
case CMD_STOP_SUPPLICANT_FAILED:
if (message.arg1 == mSupplicantStopFailureToken) {
loge("Timed out on a supplicant stop, kill and proceed");
- mWifiNative.killSupplicant();
+ mWifiNative.killSupplicant(mP2pSupported);
mWifiNative.closeSupplicantConnection();
transitionTo(mDriverLoadedState);
}