diff options
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("New mail from " + 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 Binary files differnew file mode 100644 index 000000000000..e1e3e2a184cb --- /dev/null +++ b/core/res/res/drawable-hdpi/ic_coins_l.png diff --git a/core/res/res/drawable-hdpi/kg_add_widget.png b/core/res/res/drawable-hdpi/kg_add_widget.png Binary files differindex 7456705b402f..723d97a3a981 100644 --- a/core/res/res/drawable-hdpi/kg_add_widget.png +++ b/core/res/res/drawable-hdpi/kg_add_widget.png diff --git a/core/res/res/drawable-hdpi/kg_security_lock_focused.png b/core/res/res/drawable-hdpi/kg_security_lock_focused.png Binary files differindex 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 diff --git a/core/res/res/drawable-hdpi/kg_security_lock_normal.png b/core/res/res/drawable-hdpi/kg_security_lock_normal.png Binary files differindex 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 diff --git a/core/res/res/drawable-hdpi/kg_security_lock_pressed.png b/core/res/res/drawable-hdpi/kg_security_lock_pressed.png Binary files differindex 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 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 Binary files differnew file mode 100644 index 000000000000..dff1dfaf9d27 --- /dev/null +++ b/core/res/res/drawable-hdpi/kg_widget_bg_padded.9.png diff --git a/core/res/res/drawable-mdpi/ic_coins_l.png b/core/res/res/drawable-mdpi/ic_coins_l.png Binary files differnew file mode 100644 index 000000000000..a6d7abb372d9 --- /dev/null +++ b/core/res/res/drawable-mdpi/ic_coins_l.png diff --git a/core/res/res/drawable-mdpi/kg_add_widget.png b/core/res/res/drawable-mdpi/kg_add_widget.png Binary files differindex 1cab0d9328fb..5b0a5a485450 100644 --- a/core/res/res/drawable-mdpi/kg_add_widget.png +++ b/core/res/res/drawable-mdpi/kg_add_widget.png diff --git a/core/res/res/drawable-mdpi/kg_security_lock_focused.png b/core/res/res/drawable-mdpi/kg_security_lock_focused.png Binary files differindex 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 diff --git a/core/res/res/drawable-mdpi/kg_security_lock_normal.png b/core/res/res/drawable-mdpi/kg_security_lock_normal.png Binary files differindex 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 diff --git a/core/res/res/drawable-mdpi/kg_security_lock_pressed.png b/core/res/res/drawable-mdpi/kg_security_lock_pressed.png Binary files differindex 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 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 Binary files differnew file mode 100644 index 000000000000..c313df12f4aa --- /dev/null +++ b/core/res/res/drawable-mdpi/kg_widget_bg_padded.9.png diff --git a/core/res/res/drawable-xhdpi/ic_coins_l.png b/core/res/res/drawable-xhdpi/ic_coins_l.png Binary files differnew file mode 100644 index 000000000000..84e7e7239d03 --- /dev/null +++ b/core/res/res/drawable-xhdpi/ic_coins_l.png diff --git a/core/res/res/drawable-xhdpi/kg_add_widget.png b/core/res/res/drawable-xhdpi/kg_add_widget.png Binary files differindex d71905f8ff78..9c84de2e1d40 100644 --- a/core/res/res/drawable-xhdpi/kg_add_widget.png +++ b/core/res/res/drawable-xhdpi/kg_add_widget.png diff --git a/core/res/res/drawable-xhdpi/kg_security_lock_focused.png b/core/res/res/drawable-xhdpi/kg_security_lock_focused.png Binary files differindex 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 diff --git a/core/res/res/drawable-xhdpi/kg_security_lock_normal.png b/core/res/res/drawable-xhdpi/kg_security_lock_normal.png Binary files differindex 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 diff --git a/core/res/res/drawable-xhdpi/kg_security_lock_pressed.png b/core/res/res/drawable-xhdpi/kg_security_lock_pressed.png Binary files differindex 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 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 Binary files differnew file mode 100644 index 000000000000..a84bfa39ce6c --- /dev/null +++ b/core/res/res/drawable-xhdpi/kg_widget_bg_padded.9.png 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><FragmentBreadCrumbs></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 Binary files differindex 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 diff --git a/docs/html/images/tools/dev-options-inmilk.png b/docs/html/images/tools/dev-options-inmilk.png Binary files differnew file mode 100644 index 000000000000..f0e323e50b6d --- /dev/null +++ b/docs/html/images/tools/dev-options-inmilk.png 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 Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-hdpi/ic_notify_open_pressed.png b/packages/SystemUI/res/drawable-hdpi/ic_notify_open_pressed.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-hdpi/search_light.png b/packages/SystemUI/res/drawable-hdpi/search_light.png Binary files differnew file mode 100644 index 000000000000..c8b5a2ec9295 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/search_light.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_notify_open_normal.png b/packages/SystemUI/res/drawable-mdpi/ic_notify_open_normal.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-mdpi/ic_notify_open_pressed.png b/packages/SystemUI/res/drawable-mdpi/ic_notify_open_pressed.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-mdpi/search_light.png b/packages/SystemUI/res/drawable-mdpi/search_light.png Binary files differnew file mode 100644 index 000000000000..4b5b2a495a14 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/search_light.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_notify_open_normal.png b/packages/SystemUI/res/drawable-xhdpi/ic_notify_open_normal.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_notify_open_pressed.png b/packages/SystemUI/res/drawable-xhdpi/ic_notify_open_pressed.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xhdpi/search_light.png b/packages/SystemUI/res/drawable-xhdpi/search_light.png Binary files differnew file mode 100644 index 000000000000..3aa890fdfa8b --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/search_light.png 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); } |