diff options
132 files changed, 4221 insertions, 1475 deletions
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 182ebef..ee92646 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -896,6 +896,9 @@ public class Notification implements Parcelable /** {@hide} */ public void setUser(UserHandle user) { + if (user.getIdentifier() == UserHandle.USER_ALL) { + user = UserHandle.OWNER; + } if (tickerView != null) { tickerView.setUser(user); } diff --git a/core/java/android/app/Presentation.java b/core/java/android/app/Presentation.java index 3e8af60..16a0c57 100644 --- a/core/java/android/app/Presentation.java +++ b/core/java/android/app/Presentation.java @@ -79,17 +79,16 @@ import android.util.TypedValue; * Here's how to use the media router to create and show a presentation on the preferred * presentation display using {@link android.media.MediaRouter.RouteInfo#getPresentationDisplay()}. * </p> - * {@samplecode + * <pre> * MediaRouter mediaRouter = (MediaRouter) context.getSystemService(Context.MEDIA_ROUTER_SERVICE); * MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute(); - * if (route != null) ${ + * if (route != null) { * Display presentationDisplay = route.getPresentationDisplay(); - * if (presentationDisplay != null) ${ + * if (presentationDisplay != null) { * Presentation presentation = new MyPresentation(context, presentationDisplay); * presentation.show(); - * $} - * $} - * } + * } + * }</pre> * <p> * The following sample code from <code>ApiDemos</code> demonstrates how to use the media * router to automatically switch between showing content in the main activity and showing @@ -114,18 +113,17 @@ import android.util.TypedValue; * {@link DisplayManager#getDisplays(String)} and the * {@link DisplayManager#DISPLAY_CATEGORY_PRESENTATION} category. * </p> - * {@samplecode + * <pre> * DisplayManager displayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE); * Display[] presentationDisplays = displayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION); - * if (presentationDisplays.length > 0) ${ + * if (presentationDisplays.length > 0) { * // If there is more than one suitable presentation display, then we could consider * // giving the user a choice. For this example, we simply choose the first display * // which is the one the system recommends as the preferred presentation display. * Display display = presentationDisplays[0]; * Presentation presentation = new MyPresentation(context, presentationDisplay); * presentation.show(); - * $} - * } + * }</pre> * <p> * The following sample code from <code>ApiDemos</code> demonstrates how to use the display * manager to enumerate displays and show content on multiple presentation displays diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 6966793..4c0eba0 100755 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -1228,7 +1228,7 @@ public class DevicePolicyManager { public static final int KEYGUARD_DISABLE_SECURE_CAMERA = 1 << 1; /** - * Disable all current and future keyguard customizations + * Disable all current and future keyguard customizations. */ public static final int KEYGUARD_DISABLE_FEATURES_ALL = 0x7fffffff; @@ -1381,8 +1381,9 @@ public class DevicePolicyManager { * this method; if it has not, a security exception will be thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. - * @param which {@link DevicePolicyManager#KEYGUARD_DISABLE_WIDGETS_ALL} or - * {@link DevicePolicyManager#KEYGUARD_DISABLE_FEATURES_NONE} (the default). + * @param which {@link #KEYGUARD_DISABLE_FEATURES_NONE} (default), + * {@link #KEYGUARD_DISABLE_WIDGETS_ALL}, {@link #KEYGUARD_DISABLE_SECURE_CAMERA}, + * {@link #KEYGUARD_DISABLE_FEATURES_ALL} */ public void setKeyguardDisabledFeatures(ComponentName admin, int which) { if (mService != null) { @@ -1399,6 +1400,8 @@ public class DevicePolicyManager { * admin, if specified, or all admins. * @param admin The name of the admin component to check, or null to check if any admins * have disabled features in keyguard. + * @return bitfield of flags. See {@link #setKeyguardDisabledFeatures(ComponentName, int)} + * for a list. */ public int getKeyguardDisabledFeatures(ComponentName admin) { return getKeyguardDisabledFeatures(admin, UserHandle.myUserId()); diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java index d56556f..52771ee 100644 --- a/core/java/android/appwidget/AppWidgetHostView.java +++ b/core/java/android/appwidget/AppWidgetHostView.java @@ -244,14 +244,22 @@ public class AppWidgetHostView extends FrameLayout { * * @param newOptions The bundle of options, in addition to the size information, * can be null. - * @param minWidth The minimum width that the widget will be displayed at. - * @param minHeight The maximum height that the widget will be displayed at. - * @param maxWidth The maximum width that the widget will be displayed at. - * @param maxHeight The maximum height that the widget will be displayed at. + * @param minWidth The minimum width in dips that the widget will be displayed at. + * @param minHeight The maximum height in dips that the widget will be displayed at. + * @param maxWidth The maximum width in dips that the widget will be displayed at. + * @param maxHeight The maximum height in dips that the widget will be displayed at. * */ public void updateAppWidgetSize(Bundle newOptions, int minWidth, int minHeight, int maxWidth, int maxHeight) { + updateAppWidgetSize(newOptions, minWidth, minHeight, maxWidth, maxHeight, false); + } + + /** + * @hide + */ + public void updateAppWidgetSize(Bundle newOptions, int minWidth, int minHeight, int maxWidth, + int maxHeight, boolean ignorePadding) { if (newOptions == null) { newOptions = new Bundle(); } @@ -265,10 +273,10 @@ public class AppWidgetHostView extends FrameLayout { int xPaddingDips = (int) ((padding.left + padding.right) / density); int yPaddingDips = (int) ((padding.top + padding.bottom) / density); - int newMinWidth = minWidth - xPaddingDips; - int newMinHeight = minHeight - yPaddingDips; - int newMaxWidth = maxWidth - xPaddingDips; - int newMaxHeight = maxHeight - yPaddingDips; + int newMinWidth = minWidth - (ignorePadding ? 0 : xPaddingDips); + int newMinHeight = minHeight - (ignorePadding ? 0 : yPaddingDips); + int newMaxWidth = maxWidth - (ignorePadding ? 0 : xPaddingDips); + int newMaxHeight = maxHeight - (ignorePadding ? 0 : yPaddingDips); AppWidgetManager widgetManager = AppWidgetManager.getInstance(mContext); @@ -545,7 +553,10 @@ public class AppWidgetHostView extends FrameLayout { if (options.containsKey(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY)) { int category = options.getInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY); if (category == AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD) { - layoutId = mInfo.initialKeyguardLayout; + int kgLayoutId = mInfo.initialKeyguardLayout; + // If a default keyguard layout is not specified, use the standard + // default layout. + layoutId = kgLayoutId == 0 ? layoutId : kgLayoutId; } } defaultView = inflater.inflate(layoutId, this, false); diff --git a/core/java/android/appwidget/AppWidgetProviderInfo.java b/core/java/android/appwidget/AppWidgetProviderInfo.java index 6bf12e6..7b8b286 100644 --- a/core/java/android/appwidget/AppWidgetProviderInfo.java +++ b/core/java/android/appwidget/AppWidgetProviderInfo.java @@ -260,7 +260,7 @@ public class AppWidgetProviderInfo implements Parcelable { that.minResizeWidth = this.minResizeHeight; that.minResizeHeight = this.minResizeHeight; that.updatePeriodMillis = this.updatePeriodMillis; - that.initialLayout = that.initialLayout; + that.initialLayout = this.initialLayout; that.initialKeyguardLayout = this.initialKeyguardLayout; that.configure = this.configure == null ? null : this.configure.clone(); that.label = this.label == null ? null : this.label.substring(0); diff --git a/core/java/android/net/NetworkStatsHistory.java b/core/java/android/net/NetworkStatsHistory.java index a37c26f..382b25e 100644 --- a/core/java/android/net/NetworkStatsHistory.java +++ b/core/java/android/net/NetworkStatsHistory.java @@ -177,6 +177,12 @@ public class NetworkStatsHistory implements Parcelable { throw new ProtocolException("unexpected version: " + version); } } + + if (bucketStart.length != bucketCount || rxBytes.length != bucketCount + || rxPackets.length != bucketCount || txBytes.length != bucketCount + || txPackets.length != bucketCount || operations.length != bucketCount) { + throw new ProtocolException("Mismatched history lengths"); + } } public void writeToStream(DataOutputStream out) throws IOException { diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index a3360bc..b6016e9 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -2338,6 +2338,7 @@ public final class ViewRootImpl implements ViewParent, mAccessibilityFocusedVirtualView.getBoundsInScreen(bounds); } bounds.offset(-mAttachInfo.mWindowLeft, -mAttachInfo.mWindowTop); + bounds.intersect(0, 0, mAttachInfo.mViewRootImpl.mWidth, mAttachInfo.mViewRootImpl.mHeight); drawable.setBounds(bounds); drawable.draw(canvas); } diff --git a/core/java/android/view/accessibility/AccessibilityRecord.java b/core/java/android/view/accessibility/AccessibilityRecord.java index 5c60a12..7147c57 100644 --- a/core/java/android/view/accessibility/AccessibilityRecord.java +++ b/core/java/android/view/accessibility/AccessibilityRecord.java @@ -168,6 +168,17 @@ public class AccessibilityRecord { } /** + * Sets the window id. + * + * @param windowId The window id. + * + * @hide + */ + public void setWindowId(int windowId) { + mSourceWindowId = windowId; + } + + /** * Gets the id of the window from which the event comes from. * * @return The window id. diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 495e46b..5397eb6 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -144,7 +144,6 @@ public class Editor { CharSequence mError; boolean mErrorWasChanged; ErrorPopup mErrorPopup; - private int mLastLayoutDirection = -1; /** * This flag is set if the TextView tries to display an error before it @@ -290,29 +289,12 @@ public class Editor { public void setError(CharSequence error, Drawable icon) { mError = TextUtils.stringOrSpannedString(error); mErrorWasChanged = true; - final int layoutDirection = mTextView.getLayoutDirection(); - if (mLastLayoutDirection != layoutDirection) { - final Drawables dr = mTextView.mDrawables; - switch (layoutDirection) { - default: - case View.LAYOUT_DIRECTION_LTR: - if (dr != null) { - mTextView.setCompoundDrawables(dr.mDrawableLeft, dr.mDrawableTop, icon, - dr.mDrawableBottom); - } else { - mTextView.setCompoundDrawables(null, null, icon, null); - } - break; - case View.LAYOUT_DIRECTION_RTL: - if (dr != null) { - mTextView.setCompoundDrawables(icon, dr.mDrawableTop, dr.mDrawableRight, - dr.mDrawableBottom); - } else { - mTextView.setCompoundDrawables(icon, null, null, null); - } - break; - } - mLastLayoutDirection = layoutDirection; + 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) { diff --git a/core/java/android/widget/TextClock.java b/core/java/android/widget/TextClock.java index 4c46658..908eb0a 100644 --- a/core/java/android/widget/TextClock.java +++ b/core/java/android/widget/TextClock.java @@ -29,6 +29,7 @@ import android.os.SystemClock; import android.provider.Settings; import android.text.format.DateFormat; import android.util.AttributeSet; +import android.view.RemotableViewMethod; import com.android.internal.R; @@ -266,6 +267,7 @@ public class TextClock extends TextView { * * @attr ref android.R.styleable#TextClock_format12Hour */ + @RemotableViewMethod public void setFormat12Hour(CharSequence format) { mFormat12 = format; @@ -307,6 +309,7 @@ public class TextClock extends TextView { * * @attr ref android.R.styleable#TextClock_format24Hour */ + @RemotableViewMethod public void setFormat24Hour(CharSequence format) { mFormat24 = format; @@ -366,6 +369,7 @@ public class TextClock extends TextView { * * @attr ref android.R.styleable#TextClock_timeZone */ + @RemotableViewMethod public void setTimeZone(String timeZone) { mTimeZone = timeZone; diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index a46481c..5d90400 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -8780,8 +8780,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener + " before=" + before + " after=" + after + ": " + buffer); if (AccessibilityManager.getInstance(mContext).isEnabled() - && !isPasswordInputType(getInputType()) - && !hasPasswordTransformationMethod()) { + && ((!isPasswordInputType(getInputType()) && !hasPasswordTransformationMethod()) + || shouldSpeakPasswordsForAccessibility())) { mBeforeText = buffer.toString(); } diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index 3ee3c8c..e5e1a2b 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -1073,11 +1073,7 @@ public class LockPatternUtils { } return appWidgetIds; } - if (appWidgetIdString == null) { - return new int[] { LockPatternUtils.ID_DEFAULT_STATUS_WIDGET }; - } else { - return new int[0]; - } + return new int[0]; } private static String combineStrings(int[] list, String separator) { diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 3f20ed1..7971ccb 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -290,7 +290,16 @@ android:permissionGroup="android.permission-group.PERSONAL_INFO" android:protectionLevel="signature|system" /> - <!-- Allows an application to read the user's call log. --> + <!-- Allows an application to read the user's call log. + <p class="note"><strong>Note:</strong> If your app uses the + {@link #READ_CONTACTS} permission and <em>both</em> your <a + href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code + minSdkVersion}</a> and <a + href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code + targetSdkVersion}</a> values are set to 15 or lower, the system implicitly + grants your app this permission. If you don't need this permission, be sure your <a + href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code + targetSdkVersion}</a> is 16 or higher.</p> --> <permission android:name="android.permission.READ_CALL_LOG" android:permissionGroup="android.permission-group.SOCIAL_INFO" android:protectionLevel="dangerous" @@ -298,7 +307,16 @@ android:description="@string/permdesc_readCallLog" /> <!-- Allows an application to write (but not read) the user's - contacts data. --> + contacts data. + <p class="note"><strong>Note:</strong> If your app uses the + {@link #WRITE_CONTACTS} permission and <em>both</em> your <a + href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code + minSdkVersion}</a> and <a + href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code + targetSdkVersion}</a> values are set to 15 or lower, the system implicitly + grants your app this permission. If you don't need this permission, be sure your <a + href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code + targetSdkVersion}</a> is 16 or higher.</p> --> <permission android:name="android.permission.WRITE_CALL_LOG" android:permissionGroup="android.permission-group.SOCIAL_INFO" android:protectionLevel="dangerous" @@ -888,7 +906,15 @@ android:label="@string/permlab_modifyPhoneState" android:description="@string/permdesc_modifyPhoneState" /> - <!-- Allows read only access to phone state. --> + <!-- Allows read only access to phone state. + <p class="note"><strong>Note:</strong> If <em>both</em> your <a + href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code + minSdkVersion}</a> and <a + href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code + targetSdkVersion}</a> values are set to 3 or lower, the system implicitly + grants your app this permission. If you don't need this permission, be sure your <a + href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code + targetSdkVersion}</a> is 4 or higher. --> <permission android:name="android.permission.READ_PHONE_STATE" android:permissionGroup="android.permission-group.PHONE_CALLS" android:protectionLevel="dangerous" @@ -931,14 +957,41 @@ android:permissionGroupFlags="personalInfo" android:priority="240" /> - <!-- Allows an application to read from external storage --> + <!-- Allows an application to read from external storage. + <p>Any app that declares the {@link #WRITE_EXTERNAL_STORAGE} permission is implicitly + granted this permission.</p> + <p>Currently, this permission is not enforced and all apps still have access to read from + external storage without this permission. That will change in a future release and apps + will require this permission to read from external storage. So if your + app reads from the external storage, you should add this permission to your app now + to ensure that it continues to work on future versions of Android.</p> + <p>You can test your app with the permission enforced by either running your app on the + Android Emulator when running Android 4.1 or higher, or enabling <em>Protect USB + storage</em> under Developer options in the Settings app on a device running Android 4.1 or + higher.</p> + <p class="note"><strong>Note:</strong> If <em>both</em> your <a + href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code + minSdkVersion}</a> and <a + href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code + targetSdkVersion}</a> values are set to 3 or lower, the system implicitly + grants your app this permission. If you don't need this permission, be sure your <a + href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code + targetSdkVersion}</a> is 4 or higher.--> <permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:permissionGroup="android.permission-group.SYSTEM_TOOLS" android:label="@string/permlab_sdcardRead" android:description="@string/permdesc_sdcardRead" android:protectionLevel="normal" /> - <!-- Allows an application to write to external storage --> + <!-- Allows an application to write to external storage. + <p class="note"><strong>Note:</strong> If <em>both</em> your <a + href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code + minSdkVersion}</a> and <a + href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code + targetSdkVersion}</a> values are set to 3 or lower, the system implicitly + grants your app this permission. If you don't need this permission, be sure your <a + href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code + targetSdkVersion}</a> is 4 or higher. --> <permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:permissionGroup="android.permission-group.STORAGE" android:label="@string/permlab_sdcardWrite" diff --git a/core/res/res/drawable-hdpi/kg_widget_delete_drop_target.png b/core/res/res/drawable-hdpi/kg_widget_delete_drop_target.png Binary files differnew file mode 100644 index 0000000..84549ff --- /dev/null +++ b/core/res/res/drawable-hdpi/kg_widget_delete_drop_target.png diff --git a/core/res/res/drawable-mdpi/kg_widget_delete_drop_target.png b/core/res/res/drawable-mdpi/kg_widget_delete_drop_target.png Binary files differnew file mode 100644 index 0000000..219f3e5 --- /dev/null +++ b/core/res/res/drawable-mdpi/kg_widget_delete_drop_target.png diff --git a/core/res/res/drawable-xhdpi/kg_widget_delete_drop_target.png b/core/res/res/drawable-xhdpi/kg_widget_delete_drop_target.png Binary files differnew file mode 100644 index 0000000..d4965d9 --- /dev/null +++ b/core/res/res/drawable-xhdpi/kg_widget_delete_drop_target.png diff --git a/core/res/res/layout-land/keyguard_host_view.xml b/core/res/res/layout-land/keyguard_host_view.xml index 67ac1d5..be1d5b6 100644 --- a/core/res/res/layout-land/keyguard_host_view.xml +++ b/core/res/res/layout-land/keyguard_host_view.xml @@ -33,6 +33,12 @@ android:layout_height="match_parent" android:clipChildren="false"> + <include layout="@layout/keyguard_widget_remove_drop_target" + android:id="@+id/keyguard_widget_pager_delete_target" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="top|center_horizontal" /> + <include layout="@layout/keyguard_widget_pager" android:id="@+id/app_widget_container" android:layout_width="match_parent" diff --git a/core/res/res/layout-land/keyguard_widget_pager.xml b/core/res/res/layout-land/keyguard_widget_pager.xml index 975288f..02c6d0e 100644 --- a/core/res/res/layout-land/keyguard_widget_pager.xml +++ b/core/res/res/layout-land/keyguard_widget_pager.xml @@ -25,7 +25,6 @@ android:paddingRight="25dp" android:paddingTop="25dp" android:paddingBottom="25dp" - android:clipChildren="false" android:clipToPadding="false" androidprv:pageSpacing="10dp"> </com.android.internal.policy.impl.keyguard.KeyguardWidgetCarousel>
\ 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 b3270e0..b2bf3f1 100644 --- a/core/res/res/layout-port/keyguard_host_view.xml +++ b/core/res/res/layout-port/keyguard_host_view.xml @@ -35,6 +35,16 @@ <FrameLayout android:layout_width="match_parent" + android:layout_height="wrap_content"> + <include layout="@layout/keyguard_widget_remove_drop_target" + android:id="@+id/keyguard_widget_pager_delete_target" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="top|center_horizontal" /> + </FrameLayout> + + <FrameLayout + android:layout_width="match_parent" android:layout_height="match_parent" androidprv:layout_childType="widgets"> <include layout="@layout/keyguard_widget_pager" @@ -54,7 +64,6 @@ android:layout_width="wrap_content" android:layout_height="@dimen/keyguard_security_height" androidprv:layout_childType="challenge" - android:background="@drawable/kg_bouncer_bg_white" android:padding="0dp" android:gravity="bottom|center_horizontal"> <com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper diff --git a/core/res/res/layout-port/keyguard_widget_pager.xml b/core/res/res/layout-port/keyguard_widget_pager.xml index 7fd370b..7f22709 100644 --- a/core/res/res/layout-port/keyguard_widget_pager.xml +++ b/core/res/res/layout-port/keyguard_widget_pager.xml @@ -26,7 +26,6 @@ android:paddingRight="25dp" android:paddingTop="25dp" android:paddingBottom="@dimen/kg_widget_pager_bottom_padding" - android:clipChildren="false" android:clipToPadding="false" androidprv:pageSpacing="10dp"> </com.android.internal.policy.impl.keyguard.KeyguardWidgetPager> 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 5d858ae..809104d 100644 --- a/core/res/res/layout-sw600dp-port/keyguard_host_view.xml +++ b/core/res/res/layout-sw600dp-port/keyguard_host_view.xml @@ -34,6 +34,12 @@ android:clipChildren="false" android:orientation="vertical"> + <include layout="@layout/keyguard_widget_remove_drop_target" + android:id="@+id/keyguard_widget_pager_delete_target" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="top|center_horizontal" /> + <include layout="@layout/keyguard_widget_pager" android:id="@+id/app_widget_container" android:layout_width="match_parent" diff --git a/core/res/res/layout/keyguard_face_unlock_view.xml b/core/res/res/layout/keyguard_face_unlock_view.xml index 39e8f31..c1e35cf 100644 --- a/core/res/res/layout/keyguard_face_unlock_view.xml +++ b/core/res/res/layout/keyguard_face_unlock_view.xml @@ -31,32 +31,39 @@ android:layout_height="wrap_content" /> - <com.android.internal.widget.FaceUnlockView - android:id="@+id/face_unlock_area_view" - android:layout_width="match_parent" - android:layout_height="0dp" - android:background="@*android:drawable/intro_bg" - android:gravity="center" - android:layout_weight="1"> + <FrameLayout + android:id="@+id/keyguard_bouncer_frame" + android:background="@*android:drawable/kg_bouncer_bg_white" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + > + <com.android.internal.widget.FaceUnlockView + android:id="@+id/face_unlock_area_view" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@*android:drawable/intro_bg" + android:gravity="center"> - <View - android:id="@+id/spotlightMask" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@*android:color/facelock_spotlight_mask" - /> + <View + android:id="@+id/spotlightMask" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@*android:color/facelock_spotlight_mask" + /> - <ImageButton - android:id="@+id/face_unlock_cancel_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:padding="5dip" - android:layout_alignParentTop="true" - android:layout_alignParentEnd="true" - android:background="#00000000" - android:src="@*android:drawable/ic_facial_backup" - /> - </com.android.internal.widget.FaceUnlockView> + <ImageButton + android:id="@+id/face_unlock_cancel_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="5dip" + android:layout_alignParentTop="true" + android:layout_alignParentEnd="true" + android:background="#00000000" + android:src="@*android:drawable/ic_facial_backup" + /> + </com.android.internal.widget.FaceUnlockView> + </FrameLayout> <include layout="@layout/keyguard_emergency_carrier_area" android:id="@+id/keyguard_selector_fade_container" diff --git a/core/res/res/layout/keyguard_password_view.xml b/core/res/res/layout/keyguard_password_view.xml index a054d07..2e2ada8 100644 --- a/core/res/res/layout/keyguard_password_view.xml +++ b/core/res/res/layout/keyguard_password_view.xml @@ -39,45 +39,51 @@ <!-- Password entry field --> <!-- Note: the entire container is styled to look like the edit field, since the backspace/IME switcher looks better inside --> - <LinearLayout + <FrameLayout + android:id="@+id/keyguard_bouncer_frame" + android:background="@*android:drawable/kg_bouncer_bg_white" android:layout_height="wrap_content" android:layout_width="match_parent" - android:orientation="horizontal" - android:background="#70000000" - android:layout_marginTop="8dp" - android:layout_marginBottom="8dp" > - - <EditText android:id="@+id/passwordEntry" - android:layout_width="0dip" + <LinearLayout android:layout_height="wrap_content" - android:layout_weight="1" - android:gravity="center_horizontal" - android:layout_gravity="center_vertical" - android:layout_marginStart="@*android:dimen/keyguard_lockscreen_pin_margin_left" - android:singleLine="true" - android:textStyle="normal" - android:inputType="textPassword" - android:textSize="36sp" - android:background="@null" - android:textAppearance="?android:attr/textAppearanceMedium" - android:textColor="#ffffffff" - android:imeOptions="flagForceAscii|actionDone" - /> + android:layout_width="match_parent" + android:orientation="horizontal" + android:background="#70000000" + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp" + > - <ImageView android:id="@+id/switch_ime_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:src="@*android:drawable/ic_lockscreen_ime" - android:clickable="true" - android:padding="8dip" - android:layout_gravity="center" - android:background="?android:attr/selectableItemBackground" - android:visibility="gone" - /> + <EditText android:id="@+id/passwordEntry" + android:layout_width="0dip" + android:layout_height="wrap_content" + android:layout_weight="1" + android:gravity="center_horizontal" + android:layout_gravity="center_vertical" + android:layout_marginStart="@*android:dimen/keyguard_lockscreen_pin_margin_left" + android:singleLine="true" + android:textStyle="normal" + android:inputType="textPassword" + android:textSize="36sp" + android:background="@null" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textColor="#ffffffff" + android:imeOptions="flagForceAscii|actionDone" + /> - </LinearLayout> + <ImageView android:id="@+id/switch_ime_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@*android:drawable/ic_lockscreen_ime" + android:clickable="true" + android:padding="8dip" + android:layout_gravity="center" + android:background="?android:attr/selectableItemBackground" + android:visibility="gone" + /> + </LinearLayout> + </FrameLayout> <include layout="@layout/keyguard_emergency_carrier_area" android:id="@+id/keyguard_selector_fade_container" android:layout_width="match_parent" diff --git a/core/res/res/layout/keyguard_pattern_view.xml b/core/res/res/layout/keyguard_pattern_view.xml index 5ebc000..1c11fdd 100644 --- a/core/res/res/layout/keyguard_pattern_view.xml +++ b/core/res/res/layout/keyguard_pattern_view.xml @@ -43,14 +43,17 @@ android:orientation="vertical" android:layout_gravity="center"> - <!-- We need MATCH_PARENT here only to force the size of the parent to be passed to - the pattern view for it to compute its size. This is an unusual case, caused by - LockPatternView's requirement to maintain a square aspect ratio based on the width - of the screen. --> + <FrameLayout + android:id="@+id/keyguard_bouncer_frame" + android:background="@*android:drawable/kg_bouncer_bg_white" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + > <com.android.internal.widget.LockPatternView android:id="@+id/lockPatternView" - android:layout_width="wrap_content" - android:layout_height="0dp" + android:layout_width="match_parent" + android:layout_height="match_parent" android:layout_weight="1" android:layout_marginEnd="8dip" android:layout_marginBottom="4dip" @@ -58,15 +61,14 @@ android:layout_gravity="center_horizontal" android:gravity="center" android:contentDescription="@string/keyguard_accessibility_pattern_area" /> - - <include layout="@layout/keyguard_emergency_carrier_area" - 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" /> - + </FrameLayout> + <include layout="@layout/keyguard_emergency_carrier_area" + 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" /> </LinearLayout> </FrameLayout> diff --git a/core/res/res/layout/keyguard_pin_view.xml b/core/res/res/layout/keyguard_pin_view.xml index 29e69f3..d486d5e 100644 --- a/core/res/res/layout/keyguard_pin_view.xml +++ b/core/res/res/layout/keyguard_pin_view.xml @@ -31,177 +31,185 @@ android:layout_height="wrap_content" /> <LinearLayout - android:layout_width="match_parent" - android:layout_height="0dp" - android:orientation="horizontal" - android:layout_weight="1" - > - <TextView android:id="@+id/pinEntry" - android:editable="true" - android:layout_width="0dip" - android:layout_height="match_parent" - android:layout_weight="1" - android:gravity="center" - android:layout_marginStart="@*android:dimen/keyguard_lockscreen_pin_margin_left" - android:singleLine="true" - android:cursorVisible="false" - android:background="@null" - android:textAppearance="@android:style/TextAppearance.NumPadKey" - android:imeOptions="flagForceAscii|actionDone" - /> - <ImageButton android:id="@+id/delete_button" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:gravity="center_vertical" - android:src="@*android:drawable/ic_input_delete" - android:clickable="true" - android:paddingTop="8dip" - android:paddingBottom="8dip" - android:paddingLeft="24dp" - android:paddingRight="24dp" - android:background="?android:attr/selectableItemBackground" - android:contentDescription="@string/keyboardview_keycode_delete" - /> - </LinearLayout> - <View - android:layout_width="wrap_content" - android:layout_height="1dp" - android:background="#55FFFFFF" - /> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1" - android:orientation="horizontal" - > - <view class="com.android.internal.policy.impl.keyguard.NumPadKey" - android:id="@+id/key1" - style="@style/Widget.Button.NumPadKey" - android:layout_width="0px" - android:layout_height="match_parent" - android:layout_weight="1" - androidprv:textView="@+id/pinEntry" - androidprv:digit="1" - /> - <view class="com.android.internal.policy.impl.keyguard.NumPadKey" - android:id="@+id/key2" - style="@style/Widget.Button.NumPadKey" - android:layout_width="0px" - android:layout_height="match_parent" - android:layout_weight="1" - androidprv:textView="@+id/pinEntry" - androidprv:digit="2" - /> - <view class="com.android.internal.policy.impl.keyguard.NumPadKey" - android:id="@+id/key3" - style="@style/Widget.Button.NumPadKey" - android:layout_width="0px" - android:layout_height="match_parent" - android:layout_weight="1" - androidprv:textView="@+id/pinEntry" - androidprv:digit="3" - /> - </LinearLayout> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1" - android:orientation="horizontal" - > - <view class="com.android.internal.policy.impl.keyguard.NumPadKey" - android:id="@+id/key4" - style="@style/Widget.Button.NumPadKey" - android:layout_width="0px" - android:layout_height="match_parent" - android:layout_weight="1" - androidprv:textView="@+id/pinEntry" - androidprv:digit="4" - /> - <view class="com.android.internal.policy.impl.keyguard.NumPadKey" - android:id="@+id/key5" - style="@style/Widget.Button.NumPadKey" - android:layout_width="0px" - android:layout_height="match_parent" - android:layout_weight="1" - androidprv:textView="@+id/pinEntry" - androidprv:digit="5" - /> - <view class="com.android.internal.policy.impl.keyguard.NumPadKey" - android:id="@+id/key6" - style="@style/Widget.Button.NumPadKey" - android:layout_width="0px" - android:layout_height="match_parent" - android:layout_weight="1" - androidprv:textView="@+id/pinEntry" - androidprv:digit="6" - /> + android:id="@+id/keyguard_bouncer_frame" + android:background="@*android:drawable/kg_bouncer_bg_white" + android:layout_width="match_parent" + android:layout_height="0dp" + android:orientation="vertical" + android:layout_weight="1" + > + <LinearLayout + android:layout_width="match_parent" + android:layout_height="0dp" + android:orientation="horizontal" + android:layout_weight="1" + > + <TextView android:id="@+id/pinEntry" + android:editable="true" + android:layout_width="0dip" + android:layout_height="match_parent" + android:layout_weight="1" + android:gravity="center" + android:layout_marginStart="@*android:dimen/keyguard_lockscreen_pin_margin_left" + android:singleLine="true" + android:cursorVisible="false" + android:background="@null" + android:textAppearance="@style/TextAppearance.NumPadKey" + android:imeOptions="flagForceAscii|actionDone" + /> + <ImageButton android:id="@+id/delete_button" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:gravity="center_vertical" + android:src="@*android:drawable/ic_input_delete" + android:clickable="true" + android:paddingTop="8dip" + android:paddingBottom="8dip" + android:paddingLeft="24dp" + android:paddingRight="24dp" + android:background="?android:attr/selectableItemBackground" + android:contentDescription="@string/keyboardview_keycode_delete" + /> + </LinearLayout> + <View + android:layout_width="wrap_content" + android:layout_height="1dp" + android:background="#55FFFFFF" + /> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:orientation="horizontal" + > + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key1" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="1" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key2" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="2" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key3" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="3" + /> + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:orientation="horizontal" + > + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key4" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="4" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key5" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="5" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key6" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="6" + /> + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="0dp" + android:orientation="horizontal" + android:layout_weight="1" + > + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key7" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="7" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key8" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="8" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key9" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="9" + /> + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:orientation="horizontal" + > + <Space + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key0" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="0" + /> + <ImageButton + android:id="@+id/key_enter" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + android:paddingRight="30dp" + android:src="@drawable/sym_keyboard_return_holo" + android:contentDescription="@string/keyboardview_keycode_enter" + /> + </LinearLayout> </LinearLayout> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="0dp" - android:orientation="horizontal" - android:layout_weight="1" - > - <view class="com.android.internal.policy.impl.keyguard.NumPadKey" - android:id="@+id/key7" - style="@style/Widget.Button.NumPadKey" - android:layout_width="0px" - android:layout_height="match_parent" - android:layout_weight="1" - androidprv:textView="@+id/pinEntry" - androidprv:digit="7" - /> - <view class="com.android.internal.policy.impl.keyguard.NumPadKey" - android:id="@+id/key8" - style="@style/Widget.Button.NumPadKey" - android:layout_width="0px" - android:layout_height="match_parent" - android:layout_weight="1" - androidprv:textView="@+id/pinEntry" - androidprv:digit="8" - /> - <view class="com.android.internal.policy.impl.keyguard.NumPadKey" - android:id="@+id/key9" - style="@style/Widget.Button.NumPadKey" - android:layout_width="0px" - android:layout_height="match_parent" - android:layout_weight="1" - androidprv:textView="@+id/pinEntry" - androidprv:digit="9" - /> - </LinearLayout> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1" - android:orientation="horizontal" - > - <Space - android:layout_width="0px" - android:layout_height="match_parent" - android:layout_weight="1" - /> - <view class="com.android.internal.policy.impl.keyguard.NumPadKey" - android:id="@+id/key0" - style="@style/Widget.Button.NumPadKey" - android:layout_width="0px" - android:layout_height="match_parent" - android:layout_weight="1" - androidprv:textView="@+id/pinEntry" - androidprv:digit="0" - /> - <ImageButton - android:id="@+id/key_enter" - style="@style/Widget.Button.NumPadKey" - android:gravity="center" - android:layout_width="0px" - android:layout_height="match_parent" - android:layout_weight="1" - android:src="@drawable/sym_keyboard_return_holo" - android:contentDescription="@string/keyboardview_keycode_enter" - /> - </LinearLayout> - <include layout="@layout/keyguard_emergency_carrier_area" android:id="@+id/keyguard_selector_fade_container" android:layout_width="match_parent" diff --git a/core/res/res/layout/keyguard_sim_pin_view.xml b/core/res/res/layout/keyguard_sim_pin_view.xml index ad61709..fbfb7cf 100644 --- a/core/res/res/layout/keyguard_sim_pin_view.xml +++ b/core/res/res/layout/keyguard_sim_pin_view.xml @@ -19,98 +19,209 @@ <!-- This is the SIM PIN view that allows the user to enter a SIM PIN to unlock the device. --> <com.android.internal.policy.impl.keyguard.KeyguardSimPinView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/res/android" android:id="@+id/keyguard_sim_pin_view" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal"> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1" - android:orientation="vertical"> - - <LinearLayout - android:layout_height="0dip" - android:layout_width="match_parent" - android:layout_weight="1" - android:orientation="vertical" - android:gravity="center"> - - <ImageView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:src="@drawable/ic_lockscreen_sim"/> - - <include layout="@layout/keyguard_message_area_large" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> - - </LinearLayout> - - <!-- Password entry field --> - <!-- Note: the entire container is styled to look like the edit field, - since the backspace/IME switcher looks better inside --> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" - android:layout_marginEnd="4dip" - android:layout_marginStart="4dip" - android:gravity="center_vertical" - android:background="#70000000"> - - <!-- displays dots as user enters pin --> - <EditText android:id="@+id/sim_pin_entry" - android:layout_width="0dip" - android:layout_height="wrap_content" - android:layout_weight="1" - android:maxLines="1" - android:singleLine="true" - android:gravity="center_horizontal" - android:layout_gravity="center_vertical" - android:layout_marginStart="@*android:dimen/keyguard_lockscreen_pin_margin_left" - android:textStyle="normal" - android:inputType="textPassword" - android:textSize="36sp" - android:background="@null" - android:textAppearance="?android:attr/textAppearanceMedium" - android:textColor="#ffffffff" - android:imeOptions="flagForceAscii|actionDone" - /> - - <ImageButton android:id="@+id/delete_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:src="@android:drawable/ic_input_delete" - android:clickable="true" - android:padding="8dip" - android:background="?android:attr/selectableItemBackground" - /> - </LinearLayout> + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/ic_lockscreen_sim"/> - <!-- Numeric keyboard --> - <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginStart="4dip" - android:layout_marginEnd="4dip" - android:paddingTop="4dip" - android:paddingBottom="4dip" - android:background="#40000000" - android:keyBackground="@*android:drawable/btn_keyboard_key_ics" - android:clickable="true" + <include layout="@layout/keyguard_message_area" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + <LinearLayout + android:id="@+id/keyguard_bouncer_frame" + android:background="@*android:drawable/kg_bouncer_bg_white" + android:layout_width="match_parent" + android:layout_height="0dp" + android:orientation="vertical" + android:layout_weight="1" + > + <LinearLayout + android:layout_width="match_parent" + android:layout_height="0dp" + android:orientation="horizontal" + android:layout_weight="1" + > + <TextView android:id="@+id/pinEntry" + android:editable="true" + android:layout_width="0dip" + android:layout_height="match_parent" + android:layout_weight="1" + android:gravity="center" + android:layout_marginStart="@*android:dimen/keyguard_lockscreen_pin_margin_left" + android:singleLine="true" + android:cursorVisible="false" + android:background="@null" + android:textAppearance="@style/TextAppearance.NumPadKey" + android:imeOptions="flagForceAscii|actionDone" + /> + <ImageButton android:id="@+id/delete_button" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:gravity="center_vertical" + android:src="@*android:drawable/ic_input_delete" + android:clickable="true" + android:paddingTop="8dip" + android:paddingBottom="8dip" + android:paddingLeft="24dp" + android:paddingRight="24dp" + android:background="?android:attr/selectableItemBackground" + android:contentDescription="@string/keyboardview_keycode_delete" + /> + </LinearLayout> + <View + android:layout_width="wrap_content" + android:layout_height="1dp" + android:background="#55FFFFFF" + /> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:orientation="horizontal" + > + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key1" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="1" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key2" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="2" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key3" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="3" + /> + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:orientation="horizontal" + > + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key4" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="4" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key5" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="5" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key6" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="6" + /> + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="0dp" + android:orientation="horizontal" + android:layout_weight="1" + > + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key7" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="7" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key8" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="8" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key9" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="9" + /> + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:orientation="horizontal" + > + <Space + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key0" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="0" + /> + <ImageButton + android:id="@+id/key_enter" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + android:paddingRight="30dp" + android:src="@drawable/sym_keyboard_return_holo" + android:contentDescription="@string/keyboardview_keycode_enter" + /> + </LinearLayout> </LinearLayout> <include layout="@layout/keyguard_emergency_carrier_area" - 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" /> + 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.KeyguardSimPinView> diff --git a/core/res/res/layout/keyguard_sim_puk_view.xml b/core/res/res/layout/keyguard_sim_puk_view.xml index cc97005..10b86b8 100644 --- a/core/res/res/layout/keyguard_sim_puk_view.xml +++ b/core/res/res/layout/keyguard_sim_puk_view.xml @@ -20,97 +20,208 @@ carrier-provided PUK code and entering a new SIM PIN for it. --> <com.android.internal.policy.impl.keyguard.KeyguardSimPukView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/res/android" android:id="@+id/keyguard_sim_puk_view" + android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" - android:orientation="vertical" android:gravity="center_horizontal"> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1" - android:orientation="vertical"> - - <LinearLayout - android:layout_height="0dip" - android:layout_width="match_parent" - android:layout_weight="1" - android:orientation="vertical" - android:gravity="center"> - - <ImageView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:src="@drawable/ic_lockscreen_sim"/> - - <include layout="@layout/keyguard_message_area_large" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> - - </LinearLayout> - - <!-- Password entry field --> - <!-- Note: the entire container is styled to look like the edit field, - since the backspace/IME switcher looks better inside --> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" - android:layout_marginEnd="4dip" - android:layout_marginStart="4dip" - android:gravity="center_vertical" - android:background="#70000000"> - - <!-- displays dots as user enters pin --> - <EditText android:id="@+id/sim_pin_entry" - android:layout_width="0dip" - android:layout_height="wrap_content" - android:layout_weight="1" - android:maxLines="1" - android:singleLine="true" - android:gravity="center_horizontal" - android:layout_gravity="center_vertical" - android:layout_marginStart="@*android:dimen/keyguard_lockscreen_pin_margin_left" - android:textStyle="normal" - android:inputType="textPassword" - android:textSize="36sp" - android:background="@null" - android:textAppearance="?android:attr/textAppearanceMedium" - android:textColor="#ffffffff" - android:imeOptions="flagForceAscii|actionDone" - /> - - <ImageButton android:id="@+id/delete_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:src="@android:drawable/ic_input_delete" - android:clickable="true" - android:padding="8dip" - android:background="?android:attr/selectableItemBackground" - /> - </LinearLayout> + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/ic_lockscreen_sim"/> - <!-- Numeric keyboard --> - <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginStart="4dip" - android:layout_marginEnd="4dip" - android:paddingTop="4dip" - android:paddingBottom="4dip" - android:background="#40000000" - android:keyBackground="@*android:drawable/btn_keyboard_key_ics" - android:clickable="true" + <include layout="@layout/keyguard_message_area" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + <LinearLayout + android:id="@+id/keyguard_bouncer_frame" + android:background="@*android:drawable/kg_bouncer_bg_white" + android:layout_width="match_parent" + android:layout_height="0dp" + android:orientation="vertical" + android:layout_weight="1" + > + <LinearLayout + android:layout_width="match_parent" + android:layout_height="0dp" + android:orientation="horizontal" + android:layout_weight="1" + > + <TextView android:id="@+id/pinEntry" + android:editable="true" + android:layout_width="0dip" + android:layout_height="match_parent" + android:layout_weight="1" + android:gravity="center" + android:layout_marginStart="@*android:dimen/keyguard_lockscreen_pin_margin_left" + android:singleLine="true" + android:cursorVisible="false" + android:background="@null" + android:textAppearance="@style/TextAppearance.NumPadKey" + android:imeOptions="flagForceAscii|actionDone" + /> + <ImageButton android:id="@+id/delete_button" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:gravity="center_vertical" + android:src="@*android:drawable/ic_input_delete" + android:clickable="true" + android:paddingTop="8dip" + android:paddingBottom="8dip" + android:paddingLeft="24dp" + android:paddingRight="24dp" + android:background="?android:attr/selectableItemBackground" + android:contentDescription="@string/keyboardview_keycode_delete" + /> + </LinearLayout> + <View + android:layout_width="wrap_content" + android:layout_height="1dp" + android:background="#55FFFFFF" + /> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:orientation="horizontal" + > + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key1" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="1" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key2" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="2" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key3" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="3" + /> + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:orientation="horizontal" + > + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key4" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="4" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key5" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="5" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key6" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="6" + /> + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="0dp" + android:orientation="horizontal" + android:layout_weight="1" + > + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key7" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="7" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key8" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="8" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key9" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="9" + /> + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:orientation="horizontal" + > + <Space + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + /> + <view class="com.android.internal.policy.impl.keyguard.NumPadKey" + android:id="@+id/key0" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + androidprv:textView="@+id/pinEntry" + androidprv:digit="0" + /> + <ImageButton + android:id="@+id/key_enter" + style="@style/Widget.Button.NumPadKey" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" + android:paddingRight="30dp" + android:src="@drawable/sym_keyboard_return_holo" + android:contentDescription="@string/keyboardview_keycode_enter" + /> + </LinearLayout> </LinearLayout> <include layout="@layout/keyguard_emergency_carrier_area" - 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" /> + 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.KeyguardSimPukView> diff --git a/core/res/res/layout/keyguard_widget_remove_drop_target.xml b/core/res/res/layout/keyguard_widget_remove_drop_target.xml new file mode 100644 index 0000000..c4fe9e0 --- /dev/null +++ b/core/res/res/layout/keyguard_widget_remove_drop_target.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. +*/ +--> +<TextView + xmlns:android="http://schemas.android.com/apk/res/android" + android:gravity="center" + android:padding="20dp" + android:paddingLeft="40dp" + android:paddingRight="40dp" + android:drawableLeft="@drawable/kg_widget_delete_drop_target" + android:drawablePadding="4dp" + android:textColor="#FFF" + android:textSize="13sp" + android:shadowColor="#000" + android:shadowDy="1.0" + android:shadowRadius="1.0" + android:visibility="gone" />
\ No newline at end of file diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index fe77b05..b00495b 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Patroon uitgevee"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Sel bygevoeg"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Patroon klaar"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Legstuk %2$d van %3$d."</string> + <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_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_expand_lock_area" msgid="519859720934178024">"Vou ontsluitruimte uit."</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Skyfie 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="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> @@ -1420,6 +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="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 b89e01b..debb0b3 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -585,8 +585,7 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"በተጠቃሚ መዝገበ ቃላት ውስጥ አዲስ ቃል እንዲጽፍ ለመተግበሪያው ይፈቅዳሉ፡፡"</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"ጥበቃ ወደሚደረግለት ማከማቻ ያለ መዳረሻን ፈትሽ"</string> <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"ጥበቃ ወደሚደረግለት ማከማቻ ያለ መዳረሻን ፈትሽ"</string> - <!-- no translation found for permdesc_sdcardRead (3642473292348132072) --> - <skip /> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"መተግበሪያው በወደፊት መሳሪዎች ላይ ለሚኖር የUSB ማህደረ ትውስታ ፈቃድ እንዲሞክር ይፈቅድለታል።"</string> <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"መተግበሪያው በወደፊት መሳሪዎች ላይ ለሚኖረው SD ካርድ ፈቃድ እንዲሞክር ይፈቅድለታል።"</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"የUSB ማከማቻህን ይዘቶች ቀይር ወይም ሰርዝ"</string> <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"የSD ካርድህን ይዘቶች ቀይር ወይም ሰርዝ"</string> @@ -811,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"ንድፍ ጸድቷል"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"ሕዋስ ታክሏል"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ንድፍ ተጠናቋል"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s። ምግብር %2$d ከ%3$d።"</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_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> + <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_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> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"በፒን መክፈት።"</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="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> @@ -1421,6 +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="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 5bd5f28..b10ce53 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"تم محو النمط"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"تمت إضافة الخلية"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"اكتمل النمط"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. الأداة %2$d من %3$d."</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_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> + <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_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> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"إلغاء القفل باستخدام رقم التعريف الشخصي."</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="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string> <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ب ت ث"</string> <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string> @@ -1420,6 +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="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 5d7009b..f0c3725 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Ключ выдалены"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Сотавы дададзены"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Ключ завершаны"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ВIджэт %2$d з %3$d."</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_widget" msgid="6527131039741808240">"Віджэт <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string> <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Селектар карыстальнiка"</string> <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Стан"</string> + <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_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">"Разблакiроўка слайда."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Узор разблакiроўкі."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Фэйскантроль"</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN-код разблакiроўкі."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Пароль разблакiроўкі."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Вобласць узора."</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> @@ -1420,6 +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="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 d55d89e..13b5fe8 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -585,8 +585,7 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Разрешава на приложението да записва нови думи в потребителския речник."</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"изпробване на достъп до защитено хранилище"</string> <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"изпробване на достъп до защитено хранилище"</string> - <!-- no translation found for permdesc_sdcardRead (3642473292348132072) --> - <skip /> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Разрешава на приложението да изпробва разрешение за USB хран., което ще е налице на бъдещи у-ва."</string> <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Разрешава на приложението да изпробва разрешение за SD картата, което ще бъде налице на бъдещи устройства."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"промяна или изтрив. на съдърж. от USB хран. ви"</string> <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"промяна или изтриване на съдържанието от SD картата ви"</string> @@ -811,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Фигурата е изчистена"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Клетката е добавена"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Фигурата е завършена"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Приспособление %2$d от %3$d."</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_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> + <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_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> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Отключване с ПИН код."</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="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string> <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"АБВ"</string> <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string> @@ -1421,6 +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="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 df2d085..e565223 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Patró esborrat"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"S\'ha afegit una cel·la"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Patró completat"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d."</string> + <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_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> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Càmera"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Controls multimèdia"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"S\'ha iniciat la reorganització del widget."</string> + <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="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> @@ -1420,6 +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="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 d7af330..4a409d3 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Bezpečnostní gesto vymazáno"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Buňka přidána"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Bezpečnostní gesto dokončeno"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d z %3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Přidat widget"</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Prázdné"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Oblast odemknutí byla rozšířena."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Oblast odemknutí byla sbalena."</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">"Výběr uživatele"</string> <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Stav"</string> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Fotoaparát"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Ovládání médií"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Přeuspořádání widgetů bylo zahájeno."</string> + <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Přeuspořádání widgetů bylo dokončeno."</string> + <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> byl smazán."</string> + <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Rozšířit oblast odemknutí"</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Odemknutí přejetím prstem."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odemknutí gestem."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Odemknutí obličejem."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odemknutí kódem PIN."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Odemknutí heslem."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Oblast pro zadání bezpečnostního gesta."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Oblast pro přejetí prstem."</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> @@ -1420,6 +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="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 7d0394c..6c64c69 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -585,8 +585,7 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Tillader, at appen kan skrive nye ord i brugerordbogen."</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"test adgangen til beskyttet lagring"</string> <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"test adgangen til beskyttet lagring"</string> - <!-- no translation found for permdesc_sdcardRead (3642473292348132072) --> - <skip /> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Tillader, at appen tester en tilladelse til USB-lagring, der vil være tilgængelig på fremtidige enheder."</string> <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Tillader, at appen kan teste en tilladelse for SD-kortet, der vil være tilgængelig på fremtidige enheder."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"ændre eller slette indhold på USB-lager"</string> <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"ændre eller slette indholdet på dit SD-kort"</string> @@ -811,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Mønster er ryddet"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Celle er tilføjet"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Mønster er afsluttet"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d af %3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Tilføj widget."</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tom"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Oplåsningsområdet er udvidet."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Oplåsningsområdet er skjult."</string> + <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget til <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string> <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Brugervælger"</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">"Mediekontrolelementer"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Omrokering af widgets er påbegyndt."</string> + <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Omrokering af widgets er afsluttet."</string> + <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widgetten <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> er slettet."</string> + <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Udvid oplåsningsområdet."</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Lås op ved at stryge."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Lås op med mønster."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Lås op med ansigt."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Lås op med pinkode."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Lås op med adgangskode."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Mønsterområde."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Strygeområde."</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> @@ -1421,6 +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="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 0fa14b3..fc12d90 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -810,10 +810,33 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Muster gelöscht"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Zelle hinzugefügt"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Muster abgeschlossen"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d von %3$d."</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_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> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Mediensteuerelemente"</string> + <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="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> @@ -1420,6 +1443,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="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 33899ba..b2a2bbd 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -585,7 +585,7 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Επιτρέπει στην εφαρμογή την εγγραφή νέων λέξεων στο λεξικό χρήστη."</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"δοκιμή πρόσβασης σε προστατευμένο χώρο αποθήκευσης"</string> <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"δοκιμή πρόσβασης σε προστατευμένο χώρο αποθήκευσης"</string> - <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Επιτρ.στην εφαρμ. τη δοκ.άδειας αποθ. χώρ.USB που θα διατ. σε μελλ.συσκ."</string> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Επιτρέπει USB για άλλες συσκ."</string> <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Επιτρέπει στην εφαρμογή τη δοκιμή μια άδειας για την κάρτα SD που θα διατίθεται σε μελλοντικές συσκευές."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"τροπ. ή διαγρ. περιεχ. αποθ. χώρ. USB"</string> <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"τροποποίηση ή διαγραφή των περιεχομένων της κάρτας SD"</string> @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Το μοτίβο απαλείφθηκε"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Προστέθηκε κελί"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Το μοτίβο ολοκληρώθηκε"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Γραφικό στοιχείο %2$d από %3$d."</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_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> + <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_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">"Face unlock."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Ξεκλείδωμα κωδικού ασφαλείας"</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="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string> <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ΑΒΓ"</string> <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string> @@ -1420,6 +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="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 1267b14..260e931 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Pattern cleared"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cell added"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Pattern completed"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d of %3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Add widget"</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Empty"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Unlock area expanded."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Unlock area collapsed."</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">"User selector"</string> <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Status"</string> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Camera"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Media controls"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Widget reordering started."</string> + <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Widget reordering ended."</string> + <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> deleted."</string> + <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Expand unlock area."</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Slide unlock."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pattern unlock."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face unlock."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin unlock."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Password unlock."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Pattern area."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Slide 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> @@ -1420,6 +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="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 ebeb296..a4c72c0 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -585,8 +585,7 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Permite que la aplicación ingrese palabras nuevas en el diccionario del usuario."</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"probar acceso a almacenamiento protegido"</string> <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"probar acceso a almacenamiento protegido"</string> - <!-- no translation found for permdesc_sdcardRead (3642473292348132072) --> - <skip /> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Prueba permiso almac. USB."</string> <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Permite que la aplicación pruebe un permiso para la tarjeta SD que estará disponible en futuros dispositivos."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"modificar/borrar contenido USB"</string> <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"modificar o eliminar el contenido de la tarjeta SD"</string> @@ -811,10 +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_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d"</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Agrega un 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_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_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_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="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> @@ -1421,6 +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="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 3ea30d1..2172c00 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Patrón borrado"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Se ha añadido una celda."</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Patrón completado"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d"</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Añadir widget"</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vacío"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Área de desbloqueo ampliada"</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Área de desbloqueo contraída"</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 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 multimedia"</string> + <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_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_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_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> <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string> <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string> @@ -1420,6 +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="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 03fcfbb..ac15420 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Muster on kustutatud"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Lahter on lisatud"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Muster on valmis"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Vidin %2$d/%3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Vidina lisamine."</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tühi"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Avamisala on laiendatud."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Avamisala on ahendatud."</string> + <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Vidin <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string> <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Kasutaja valija"</string> <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_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> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Mustriga avamine."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Näoga avamine."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN-koodiga avamine."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Parooliga avamine."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Mustri ala."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Lohistamisala."</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> @@ -1420,6 +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="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 de1e9a9..76fd591 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"الگو پاک شد"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"سلول اضافه شد"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"الگو تکمیل شد"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ابزارک %2$d از %3$d."</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_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> + <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_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> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"باز کردن قفل با پین."</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="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> @@ -1420,6 +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="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 ec48526..9da7d3d 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Kuvio tyhjennetty"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Solu lisätty"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Kuvio valmis"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d/%3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Lisää widget."</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tyhjä"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Lukituksen poiston alue laajennettu."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Lukituksen poiston alue tiivistetty."</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">"Käyttäjävalitsin"</string> <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Tila"</string> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Mediaohjaimet"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Widgetien järjestely aloitettu."</string> + <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Widgetien järjestely päättyi."</string> + <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> poistettu."</string> + <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Laajenna lukituksen poiston aluetta."</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Lukituksen poisto liu\'uttamalla."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Lukituksen poisto salasanalla."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face Unlock"</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Lukituksen poisto PIN-koodilla."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Lukituksen poisto salasanalla."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Kuvioalue."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Liu\'utusalue."</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> @@ -1420,6 +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="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 912bda0..b92d4bf 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -810,10 +810,33 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Schéma effacé."</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cellule ajoutée."</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Schéma terminé."</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d sur %3$d."</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_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_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="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> @@ -1420,6 +1443,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="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 67148f1..57d3ed6 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"प्रतिमान साफ़ किया गया"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"कक्ष जोड़ा गया"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"प्रतिमान पूरा किया गया"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d विजेट में से %2$d."</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_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> + <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_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> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"पिन अनलॉक."</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="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> @@ -1420,6 +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="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 1314458..245aefb 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Uzorak je obrisan"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Dodan je mobitel"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Uzorak je dovršen"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d od %3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Dodavanje widgeta."</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Prazno"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Područje za otključavanje prošireno je."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Područje za otključavanje sažeto je."</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">"Birač korisnika"</string> <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Status"</string> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Fotoaparat"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Nadzor medija"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Pokrenuta je promjena redoslijeda widgeta."</string> + <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_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="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> @@ -1420,6 +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="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 6a9e54d..a97b93e 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Minta törölve"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cella hozzáadva"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Minta befejezve"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Modul %3$d/%2$d"</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Modul hozzáadása."</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Üres"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Feloldási terület kiterjesztve."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Feloldási terület összecsukva."</string> + <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> modul."</string> <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Felhasználóválasztó"</string> <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Állapot"</string> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Médiaelemek vezérlője"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"A modulátrendezés elkezdődött."</string> + <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"A modulátrendezés véget ért."</string> + <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> modul törölve."</string> + <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"A feloldási terület kiterjesztése."</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Feloldás csúsztatással"</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Feloldás mintával"</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Arcalapú feloldás"</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Feloldás PIN kóddal"</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Feloldás jelszóval"</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Mintaterület"</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Csúsztatási terület"</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> @@ -1420,6 +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="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 8822ec1..69ac54f 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Pola dihapus"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Sel ditambahkan"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Pola selesai"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d dari %3$d."</string> + <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_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> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Kontrol media"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Pengurutan ulang widget dimulai."</string> + <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_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> <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string> <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string> @@ -1420,6 +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="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 214876f..2e4dfe4 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Sequenza cancellata"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cella aggiunta"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Sequenza completata"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d di %3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Aggiungi widget."</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vuoto"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Area di sblocco estesa."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Area di sblocco compressa."</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">"Selettore utente"</string> <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Stato"</string> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Fotocamera"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Controlli media"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Riordino dei widget iniziato."</string> + <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Riordino dei widget terminato."</string> + <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> eliminato."</string> + <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Espandi area di sblocco."</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Sblocco con scorrimento."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Sblocco con sequenza."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Sblocco col sorriso."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Sblocco con PIN."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Sblocco con password."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Area sequenza."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Area di scorrimento."</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> @@ -1420,6 +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="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 a2e9f87..58e1d25 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"התבנית נמחקה"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"התא נוסף"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"התבנית הושלמה"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d מתוך %3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"הוסף Widget."</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">"Widget <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> + <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">"סידור מחדש של Widgets התחיל."</string> + <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"סידור מחדש של Widgets הסתיים."</string> + <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <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> + <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="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string> <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"אבג"</string> <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string> @@ -1420,6 +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="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 34dc52a..8abee85 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"パターンを消去しました"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"セルを追加しました"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"パターンの描画が完了しました"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。ウィジェット%2$d/%3$d。"</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_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> + <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_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> + <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="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> @@ -1420,6 +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="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 c99dbf1..d640481 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -585,8 +585,7 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"앱이 사용자 사전에 새 단어를 입력할 수 있도록 허용합니다."</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"보호된 저장소에 액세스 테스트"</string> <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"보호된 저장소에 액세스 테스트"</string> - <!-- no translation found for permdesc_sdcardRead (3642473292348132072) --> - <skip /> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"앱이 향후 기기에서 사용할 수 있는 USB 저장소의 권한을 테스트하도록 허용합니다."</string> <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"앱이 미래의 기기에서 사용할 수 있는 SD 카드의 권한을 테스트하도록 허용합니다."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"USB 저장소의 콘텐츠 수정 또는 삭제"</string> <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD 카드의 콘텐츠 수정 또는 삭제"</string> @@ -811,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"패턴 삭제"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"셀 추가됨"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"패턴 완료"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d의 위젯 %2$d."</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_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> + <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_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> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"핀을 사용하여 잠금해제합니다."</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="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> @@ -1421,6 +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="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/dimens.xml b/core/res/res/values-land/dimens.xml index 36f2628..8f1bd9a 100644 --- a/core/res/res/values-land/dimens.xml +++ b/core/res/res/values-land/dimens.xml @@ -56,4 +56,9 @@ <!-- Bottom padding for the widget pager --> <dimen name="kg_widget_pager_bottom_padding">0dp</dimen> + <!-- If the height if keyguard drops below this threshold (most likely + due to the appearance of the IME), then drop the multiuser selector. + Landscape's layout allows this to be smaller than for portrait. --> + <dimen name="kg_squashed_layout_threshold">400dp</dimen> + </resources> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 0de01b2..1dc3f54 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Šablonas išvalytas"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Pridėtas langelis"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Šablonas užbaigtas"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %2$d valdiklis iš %3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Pridėti valdiklį."</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tuščia"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Atrakinimo sritis išplėsta."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Atrakinimo sritis sutraukta."</string> + <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Valdiklis <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string> <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Naudotojo pasirinkimo valdiklis"</string> <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Būsena"</string> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Fotoaparatas"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Medijos valdikliai"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Valdiklių pertvarkymas pradėtas."</string> + <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Valdiklių pertvarkymas baigtas."</string> + <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Valdiklis <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ištrintas."</string> + <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Išplėsti atrakinimo sritį."</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Atrakinimas slystant."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Atrakinimas pagal piešinį."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Atrakinimas pagal veidą."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Atrakinimas įvedus PIN kodą."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Atrakinimas įvedus slaptažodį."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Atrakinimo pagal piešinį sritis."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Slydimo sritis."</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> @@ -1420,6 +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="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 0b1519e..d126477 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -585,7 +585,7 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Ļauj lietotnei rakstīt jaunus vārdus lietotāja vārdnīcā."</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"aizsargātai krātuvei pieejamas piekļuves pārbaude"</string> <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"aizsargātai krātuvei pieejamas piekļuves pārbaude"</string> - <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Ļauj lietotnei pārbaudīt atļauju USB krātuvei, kas būs pieejama turpmākajās ierīcēs."</string> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Ļauj lietotnei pārbaudīt USB krātuves atļauju; krātuve būs pieejama turpmākajās ierīcēs."</string> <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Ļauj lietotnei pārbaudīt atļauju SD kartei, kas būs pieejama turpmākajās ierīcēs."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"mainīt vai dzēst USB atm. sat."</string> <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD kartes satura pārveidošana vai dzēšana"</string> @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Kombinācija notīrīta"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Šūna pievienota"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Kombinācija pabeigta"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %2$d. logrīks no %3$d."</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_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_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_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_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> <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string> @@ -1420,6 +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="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 704a0fd..6eb3afc 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Corak dipadamkan"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Sel ditambahkan"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Corak siap"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d dari %3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Tambah widget."</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Kosong"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Bahagian buka kunci dikembangkan."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Bahagian buka kunci diruntuhkan."</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> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Kawalan media"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Penyusunan semula widget dimulakan."</string> + <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Penyusunan semula widget tamat."</string> + <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> dipadamkan."</string> + <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Kembangkan bahagian buka kunci."</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Buka kunci luncur."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Buka kunci corak."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Wajah Buka Kunci"</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Buka kunci pin."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Buka kunci kata laluan."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Kawasan corak."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Kawasan luncur."</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> @@ -1420,6 +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="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 f54990e..ed8af78 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -585,8 +585,7 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Lar appen skrive nye ord i brukerordlisten."</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"testadgang til beskyttet lagring"</string> <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"testadgang til beskyttet lagring"</string> - <!-- no translation found for permdesc_sdcardRead (3642473292348132072) --> - <skip /> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Lar appen teste en tillatelse for USB-lagring som kommer til å bli tilgjengelig på fremtidige enheter."</string> <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Lar appen teste en tillatelse for SD-kortet som kommer til å bli tilgjengelig på fremtidige enheter."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"endre eller slette innholdet i USB-lagringen"</string> <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"endre eller slette innhold i SD-kortet"</string> @@ -811,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Mønsteret er slettet"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Celle er lagt til"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Mønsteret er fullført"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Modul %2$d av %3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Legg til modul."</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tom"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Opplåsingsfeltet vises."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Opplåsingsfeltet skjules."</string> + <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>-modul."</string> <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Brukervelgeren"</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">"Mediekontroll"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Endring av modulplasseringen har startet."</string> + <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Endringen av modulplasseringen er ferdig."</string> + <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Modulen <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ble slettet."</string> + <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Vis opplåsingsfeltet."</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Opplåsning ved å dra med fingeren."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Mønsteropplåsning."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Ansiktsopplåsning."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN-opplåsning."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Passordopplåsning."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Mønsterområde."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Dra-felt."</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> @@ -1421,6 +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="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 bb48630..0680114 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Patroon gewist"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cel toegevoegd"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Patroon voltooid"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d van %3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget toevoegen."</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Leeg"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Ontgrendelingsgebied uitgevouwen."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Ontgrendelingsgebied samengevouwen."</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">"Gebruikersselectie"</string> <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Status"</string> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Camera"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Mediabediening"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Opnieuw indelen van widget gestart."</string> + <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Opnieuw indelen van widget beëindigd."</string> + <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> verwijderd."</string> + <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Ontgrendelingsgebied uitvouwen."</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Ontgrendeling via schuiven."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ontgrendeling via patroon."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Ontgrendeling via gezichtsherkenning."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Ontgrendeling via pincode."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Ontgrendeling via wachtwoord."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Tekengebied voor patroon."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Schuifgebied."</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> @@ -1420,6 +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="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 da09bcb..d4c5a6a 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -810,10 +810,43 @@ <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> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widżet %2$d z %3$d."</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_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="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="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> @@ -1420,6 +1453,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="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-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 7ce4a34..e4a2778 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Sequência apagada"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Célula adicionada"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Sequência concluída"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d."</string> + <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_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_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> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueio através de sequência."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueio através do rosto."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueio através de PIN."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueio através de palavra-passe."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Área da sequência."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Área de deslize."</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> @@ -1420,6 +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="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 0780630..0bb96ee 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Padrão apagado"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Célula adicionada"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Padrão concluído"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d."</string> + <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 recolhida."</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">"Seletor de usuários"</string> <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Status"</string> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Câmera"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Controles de mídia"</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> excluído."</string> + <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Expandir a área de desbloqueio."</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Desbloqueio com deslize."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueio com padrão."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueio facial."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueio com PIN."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueio com senha."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Área do padrão."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Área de deslize."</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> @@ -1420,6 +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="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 5ea84c7..71dadfd 100644 --- a/core/res/res/values-rm/strings.xml +++ b/core/res/res/values-rm/strings.xml @@ -1297,14 +1297,46 @@ <skip /> <!-- no translation found for lockscreen_access_pattern_detected (4988730895554057058) --> <skip /> - <!-- no translation found for keyguard_accessibility_widget_changed (5678624624681400191) --> + <!-- 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 /> <!-- no translation found for keyguard_accessibility_user_selector (1226798370913698896) --> <skip /> <!-- no translation found for keyguard_accessibility_status (8008264603935930611) --> <skip /> + <!-- no translation found for keyguard_accessibility_camera (8904231194181114603) --> + <skip /> <!-- no translation found for keygaurd_accessibility_media_controls (262209654292161806) --> <skip /> + <!-- 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="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> @@ -2294,6 +2326,8 @@ <skip /> <!-- no translation found for kg_failed_attempts_almost_at_login (1437638152015574839) --> <skip /> + <!-- no translation found for kg_text_message_separator (2639217074783293687) --> + <skip /> <!-- no translation found for safe_media_volume_warning (7382971871993371648) --> <skip /> <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 438522d..f3d9193 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -585,8 +585,7 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Permite aplicaţiei să scrie cuvinte noi în dicţionarul utilizatorului."</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"testează accesul la stocarea protejată"</string> <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"testează accesul la stocarea protejată"</string> - <!-- no translation found for permdesc_sdcardRead (3642473292348132072) --> - <skip /> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Permite aplicaţiei testarea permisiunii pt. stocarea USB, disponibilă pe gadgeturi viitoare."</string> <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Permite aplicaţiei să testeze o permisiune pentru cardul SD care va fi disponibil pe dispozitivele viitoare."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"modifică sau şterge conţinutul stocării USB"</string> <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"modifică sau şterge conţinutul cardului SD"</string> @@ -811,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Modelul a fost şters"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Celulă adăugată"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Modelul a fost desenat"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d din %3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Adăugaţi un widget."</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Gol"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Zona de deblocare a fost extinsă."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Zona de deblocare a fost restrânsă."</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">"Selector utilizator"</string> <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Stare"</string> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Cameră foto"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Comenzi media"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"A început reordonarea widgeturilor."</string> + <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Reordonarea widgeturilor s-a încheiat."</string> + <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widgetul <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> a fost eliminat."</string> + <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Extindeţi zona de deblocare."</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Deblocare prin glisare."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Deblocare cu model."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Deblocare facială."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Deblocare cu PIN."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Deblocare cu parolă."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Zonă model."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Zonă glisare."</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> @@ -1421,6 +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="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 8513659..c6770b2 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -585,8 +585,7 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Приложение сможет добавлять слова в пользовательский словарь."</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"Проверка доступа к защищенному хранилищу"</string> <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"Проверка доступа к защищенному хранилищу"</string> - <!-- no translation found for permdesc_sdcardRead (3642473292348132072) --> - <skip /> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Приложение сможет проверять разрешение для USB-накопителя, которое в дальнейшем будет предоставляться на других устройствах."</string> <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Приложение сможет проверять разрешение для SD-карты, которое в дальнейшем будет предоставляться на других устройствах."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"Изменение/удаление данных на USB-накопителе"</string> <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"Изменение или удаление содержимого SD-карты"</string> @@ -811,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Графический ключ сброшен"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Ячейка добавлена"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Графический ключ введен"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Виджет %2$d из %3$d."</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_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> + <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_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> + <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="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string> <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"АБВ"</string> <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string> @@ -1421,6 +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="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 fc40852..da02bb6 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -585,8 +585,7 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Umožňuje aplikácii zapisovať nové slová do používateľského slovníka."</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"testovanie prístupu do chráneného ukladacieho priestoru"</string> <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"testovanie prístupu do chráneného ukladacieho priestoru"</string> - <!-- no translation found for permdesc_sdcardRead (3642473292348132072) --> - <skip /> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Umožňuje aplikácii testovať povolenie pre úložisko USB, ktoré bude k dispozícii na zariadeniach."</string> <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Umožňuje aplikácii testovať povolenie pre kartu SD, ktorá bude k dispozícii v budúcich zariadeniach."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"upraviť alebo odstrániť obsah úložiska USB"</string> <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"úprava alebo odstránenie obsahu na karte SD"</string> @@ -811,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Bezpečnostný vzor bol vymazaný"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Bunka bola pridaná"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Bezpečnostný vzor bol dokončený"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Miniaplikácia %2$d z %3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Pridať miniaplikáciu."</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Prázdne"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Oblasť na odomknutie bola rozšírená."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Oblasť na odomknutie bola zúžená."</string> + <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Miniaplikácia <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string> <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Výber používateľa"</string> <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Stav"</string> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Fotoaparát"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Ovládacie prvky médií"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Zmena usporiadania miniaplikácií sa začala."</string> + <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Zmena usporiadania miniaplikácií sa skončila."</string> + <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Miniaplikácia <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> bola odstránená."</string> + <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Rozšíriť oblasť na odomknutie."</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Odomknutie prejdením prstom."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odomknutie vzorom."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Odomknutie tvárou."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odomknutie kódom PIN."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Odomknutie heslom."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Oblasť na zadanie bezpečnostného vzoru."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Oblasť na prejdenie prstom."</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> @@ -1421,6 +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="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 3dda747..a7fc8b3 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Vzorec je izbrisan"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Celica je dodana"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Vzorec je končan"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Pripomoček %2$d za %3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Dodajanje pripomočka."</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Prazno"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Območje odklepanja razširjeno."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Območje odklepanja strnjeno."</string> + <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Pripomoček <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string> <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Izbirnik uporabnika"</string> <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Stanje"</string> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Fotoaparat"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Kontrolniki predstavnosti"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Prerazporejanje pripomočkov začeto."</string> + <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Prerazporejanje pripomočkov končano."</string> + <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Pripomoček <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> izbrisan."</string> + <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Razširitev območja odklepanja."</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Odklepanje s podrsanjem."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odklepanje z vzorcem."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Odklepanje z obrazom."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odklepanje s kodo PIN."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Odklepanje z geslom."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Območje vzorca."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Območje podrsanja."</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> @@ -1420,6 +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="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 92d8acb..c31ee7a 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Образац је обрисан"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Ћелија је додата"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Образац је довршен"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Виџет %2$d од %3$d."</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_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> + <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_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> + <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="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> @@ -1420,6 +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="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 9776029..bfed283 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Grafiskt lösenord har tagits bort"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"En cell har lagts till"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Grafiskt lösenord har slutförts"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d av %3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Lägg till en widget."</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tom"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Expanderad upplåsningsyta."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Komprimerad upplåsningsyta."</string> + <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget för <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string> <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Användarväljare"</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">"Mediereglage"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Ändring av widgetarnas ordning har påbörjats."</string> + <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Ändring av widgetarnas ordning har avslutats."</string> + <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widgeten <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> har tagits bort."</string> + <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Expandera upplåsningsytan."</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Lås upp genom att dra."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Lås upp med grafiskt lösenord."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Lås upp med Ansiktslås."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Lås upp med PIN-kod."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Lås upp med lösenord."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Fält för grafiskt lösenord."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Fält med dragreglage."</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> @@ -1420,6 +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="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 cd397fc..2bd4972 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -810,10 +810,26 @@ <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_widget_changed" msgid="5678624624681400191">"%1$s. Wiji %2$d ya %3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ongeza wijeti."</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_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_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> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Kufungua kwa uso."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Kufungua kwa PIN."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Kufungua kwa nenosiri."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Eneo la ruwaza."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Eneo la slaidi."</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> @@ -1420,6 +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="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-th/strings.xml b/core/res/res/values-th/strings.xml index 5609a77..59e7c03 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"ล้างรูปแบบแล้ว"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"เพิ่มเซลแล้ว"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"วาดรูปแบบเสร็จสิ้น"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s วิดเจ็ต %2$d ของ %3$d"</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_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> + <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_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> + <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="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> @@ -1420,6 +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="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 cf6314f..acb6834 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Na-clear ang pattern"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Idinagdag ang cell"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Nakumpleto ang pattern"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d ng %3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Magdagdag ng widget."</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Walang laman"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Pinalaki ang bahagi ng pag-unlock."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Pinaliit ang bahagi ng pag-unlock."</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">"Tagapili ng user"</string> <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Katayuan"</string> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Camera"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Mga kontrol ng media"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Nagsimula na ang pagbabago ng ayos ng widget."</string> + <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Natapos na ang pagbabago ng ayos ng widget."</string> + <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Tinanggal ang widget na <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string> + <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Palakihin ang bahagi ng pag-unlock."</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Pag-unlock ng slide."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pag-unlock ng pattern."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face unlock."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pag-unlock ng pin."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Pag-unlock ng password."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Bahagi ng pattern."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Bahagi ng slide."</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> @@ -1420,6 +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="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 f037250..c0f2537 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -585,8 +585,7 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Uygulamaya, kullanıcı sözlüğüne yeni kelimeler yazma izni verir."</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"korumalı depolama birimine erişimi test et"</string> <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"korumalı depolama birimine erişimi test et"</string> - <!-- no translation found for permdesc_sdcardRead (3642473292348132072) --> - <skip /> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Uygulamaya, gelecekteki cihazlarda kullanılabilecek USB depolama birimi için bir izni test etme olanağı verir."</string> <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Uygulamaya gelecekteki cihazlarda kullanılabilecek SD karta ilişkin bir izni test etme olanağı verir."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"USB belleğimin içeriğini değiştir veya sil"</string> <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD kartın içeriğini değiştir veya sil"</string> @@ -811,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Desen temizlendi"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Hücre eklendi"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Desen tamamlandı"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d / %3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget ekleyin."</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Boş"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Kilit açma alanı genişletildi."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Kilit açma alanı daraltıldı."</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">"Kullanıcı seçici"</string> <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Durum"</string> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Medya denetimleri"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Widget\'ları yeniden sıralama işlemi başladı."</string> + <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Widget\'ları yeniden sıralama işlemi bitti."</string> + <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget\'ı silindi."</string> + <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Kilit açma alanını genişletin."</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Kaydırarak kilit açma."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desenle kilit açma."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Yüzle kilit açma."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin koduyla kilit açma."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Şifreyle kilit açma."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Desen alanı."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Kaydırma alanı."</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> @@ -1421,6 +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="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 8ce89f2..1ca6edf 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Ключ очищено"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Телефон додано"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Малювання ключа закінчено"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Віджет %2$d з %3$d."</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_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> + <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_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> + <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="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> @@ -1420,6 +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="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 160dda7..fb291a2 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Đã xóa hình"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Đã thêm ô"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Đã vẽ xong hình"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Tiện ích %2$d trong số %3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Thêm tiện ích."</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Trống"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Đã mở rộng vùng khóa."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Đã thu gọn vùng khóa."</string> + <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> tiện ích."</string> <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Bộ chọn người dùng"</string> <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Trạng thái"</string> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Máy ảnh"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Điều khiển phương tiện"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Đã bắt đầu xắp xếp lại tiện ích."</string> + <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Đã kết thúc sắp xếp lại tiện ích."</string> + <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Đã xóa tiện ích <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string> + <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Mở rộng vùng khóa."</string> + <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Mở khóa bằng cách trượt."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Mở khóa bằng hình."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Mở khóa bằng khuôn mặt."</string> + <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Mở khóa bằng mã pin."</string> + <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Mở khóa bằng mật khẩu."</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Khu vực hình."</string> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Khu vực trượt."</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> @@ -1420,6 +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="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 028b476..dfb9d99 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -344,8 +344,8 @@ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"允许用户绑定到 VPN 服务的顶级接口。普通应用绝不需要此权限。"</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"绑定到壁纸"</string> <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"允许用户绑定到壁纸的顶级接口。普通应用绝不需要此权限。"</string> - <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"绑定到窗口小部件服务"</string> - <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"允许用户绑定到窗口小部件服务的顶级接口。普通应用绝不需要此权限。"</string> + <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"绑定到小部件服务"</string> + <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"允许应用绑定到小部件服务的顶级接口。普通应用绝不需要此权限。"</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"与设备管理器交互"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"允许用户将意向发送给设备管理员。普通应用绝不需要此权限。"</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"更改屏幕显示方向"</string> @@ -495,8 +495,8 @@ <string name="permdesc_locationUpdates" msgid="1120741557891438876">"允许应用启用/停用来自无线装置的位置更新通知。普通应用不能使用此权限。"</string> <string name="permlab_checkinProperties" msgid="7855259461268734914">"访问检入属性"</string> <string name="permdesc_checkinProperties" msgid="4024526968630194128">"允许应用对登记服务上传的属性拥有读取/写入权限。普通应用不能使用此权限。"</string> - <string name="permlab_bindGadget" msgid="776905339015863471">"选择窗口小部件"</string> - <string name="permdesc_bindGadget" msgid="8261326938599049290">"允许应用告知系统哪些窗口小部件可供哪个应用使用。拥有此权限的应用可向其他应用授予对个人资料的访问权限。普通应用不能使用此权限。"</string> + <string name="permlab_bindGadget" msgid="776905339015863471">"选择小部件"</string> + <string name="permdesc_bindGadget" msgid="8261326938599049290">"允许应用告知系统哪些小部件可供哪个应用使用。拥有此权限的应用可向其他应用授予对个人资料的访问权限。普通应用不应使用此权限。"</string> <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"修改手机状态"</string> <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"允许应用控制设备的电话功能。拥有此权限的应用可在不通知您的情况下执行切换网络、开关手机无线装置等此类操作。"</string> <string name="permlab_readPhoneState" msgid="9178228524507610486">"读取手机状态和身份"</string> @@ -585,8 +585,7 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"允许应用向用户词典中写入新词。"</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"测试对受保护存储空间的访问权限"</string> <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"测试对受保护存储空间的访问权限"</string> - <!-- no translation found for permdesc_sdcardRead (3642473292348132072) --> - <skip /> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"允许应用测试以后的设备将支持的 USB 存储设备权限。"</string> <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"允许该应用测试将对以后的设备开放的 SD 卡权限。"</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"修改或删除您的 USB 存储设备中的内容"</string> <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"修改或删除您的 SD 卡中的内容"</string> @@ -811,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"图案已清除"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"已添加单元格"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"图案绘制完成"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。%3$d的小部件%2$d。"</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_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> + <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_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> + <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="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> @@ -1198,7 +1213,7 @@ <string name="permlab_route_media_output" msgid="1642024455750414694">"更改媒体输出线路"</string> <string name="permdesc_route_media_output" msgid="4932818749547244346">"允许该应用将媒体输出线路更改到其他外部设备。"</string> <string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"触摸两次可进行缩放控制"</string> - <string name="gadget_host_error_inflating" msgid="4882004314906466162">"无法添加窗口小部件。"</string> + <string name="gadget_host_error_inflating" msgid="4882004314906466162">"无法添加小部件。"</string> <string name="ime_action_go" msgid="8320845651737369027">"开始"</string> <string name="ime_action_search" msgid="658110271822807811">"搜索"</string> <string name="ime_action_send" msgid="2316166556349314424">"发送"</string> @@ -1224,9 +1239,9 @@ <string name="vpn_title_long" msgid="6400714798049252294">"“<xliff:g id="APP">%s</xliff:g>”已激活 VPN"</string> <string name="vpn_text" msgid="3011306607126450322">"触摸可管理网络。"</string> <string name="vpn_text_long" msgid="6407351006249174473">"已连接到“<xliff:g id="SESSION">%s</xliff:g>”。触摸可管理网络。"</string> - <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"正在连接到始终处于打开状态的 VPN…"</string> - <string name="vpn_lockdown_connected" msgid="8202679674819213931">"已连接到始终处于打开状态的 VPN"</string> - <string name="vpn_lockdown_error" msgid="6009249814034708175">"始终处于打开状态的 VPN 出现错误"</string> + <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"正在连接到始终开启的 VPN…"</string> + <string name="vpn_lockdown_connected" msgid="8202679674819213931">"已连接到始终开启的 VPN"</string> + <string name="vpn_lockdown_error" msgid="6009249814034708175">"始终开启的 VPN 出现错误"</string> <string name="vpn_lockdown_reset" msgid="5365010427963548932">"触摸即可重置连接"</string> <string name="upload_file" msgid="2897957172366730416">"选择文件"</string> <string name="no_file_chosen" msgid="6363648562170759465">"未选定任何文件"</string> @@ -1421,6 +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="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 10af434..d39df85 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -585,7 +585,7 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"允許應用程式將新字詞寫入使用者的字典。"</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"測試能否存取受保護的儲存裝置"</string> <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"測試能否存取受保護的儲存裝置"</string> - <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"允許應用程式測試未來裝置將支援的 USB 儲存裝置權限。"</string> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"允許應用程式測試未來裝置將支援的 USB 儲存權限。"</string> <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"允許應用程式測試未來裝置將支援的 SD 卡權限。"</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"修改或刪除 USB 儲存裝置的內容"</string> <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"修改或刪除 SD 卡的內容"</string> @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"已清除解鎖圖形"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"已加入 1 格"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"已畫出解鎖圖形"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。第 %2$d 個小工具,共 %3$d 個。"</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_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> + <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_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> + <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="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> @@ -1420,6 +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="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 02f9705..fc5007d 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -585,7 +585,7 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Ivumela insiza ukuthi ibhale amagama amasha esichazinimazwi."</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"ukufinyelela kokuhlola esilondolozini esivikelekile"</string> <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"ukufinyelela kokuhlola esilondolozini esivikelekile"</string> - <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Ivumela uhlelo lokusebenza ukuhlola imvume yokugciniwe okufinyeleleka nge-USB okuzotholakala kumadivayisi alandelayo."</string> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Ivumela uhlelo lokusebenza ukuhlola imvume yesitoreji se-USB okuzotholakala kumadivayisi alandelayo."</string> <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Ivumela uhlelo lokusebenza ukuhlola imvume yekhadi le-SD okuzotholakala kumadivayisi alandelayo."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"guqula noma ususe okuqukethwe kwakho okugciniwe okufinyeleleka nge-USB"</string> <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"shintsha noma ususe okuqukethwe ekhadini lakho le-SD"</string> @@ -810,10 +810,26 @@ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Iphethini isusiwe"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Kwengezwe"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Iphethini isiphelile"</string> - <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. iwijethi %2$d ye-%3$d."</string> + <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Engeza iwijethi."</string> + <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Akunalutho"</string> + <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Indawo yokuvula inwetshisiwe."</string> + <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Indawo yokuvula inciphisiwe."</string> + <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> iwijethi."</string> <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Isikhethi somsebenzisi"</string> <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Isimo"</string> + <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Ikhamera"</string> <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Izilawuli zemidiya"</string> + <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Ukuhlelwa kabusha kwewijethi kuqalile"</string> + <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_pattern_unlock" msgid="1490840706075246612">"Ukuvula ngephethini."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Ukuvula 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> + <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Indawo yokushelelisa."</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> @@ -1420,6 +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="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/colors.xml b/core/res/res/values/colors.xml index b19e23d..604bf4b 100644 --- a/core/res/res/values/colors.xml +++ b/core/res/res/values/colors.xml @@ -118,7 +118,7 @@ <!-- keyguard overscroll widget pager --> <color name="kg_multi_user_text_active">#ffffffff</color> <color name="kg_multi_user_text_inactive">#ff808080</color> - <color name="kg_widget_pager_gradient">#ff33B5E5</color> + <color name="kg_widget_pager_gradient">#ffffffff</color> <!-- FaceLock --> <color name="facelock_spotlight_mask">#CC000000</color> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 148560a..3b7d73a 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -404,6 +404,12 @@ --> <integer name="config_longPressOnPowerBehavior">1</integer> + <!-- Package name for default keyguard appwidget [DO NOT TRANSLATE] --> + <string name="widget_default_package_name"></string> + + <!-- Class name for default keyguard appwidget [DO NOT TRANSLATE] --> + <string name="widget_default_class_name"></string> + <!-- Indicate whether the SD card is accessible without removing the battery. --> <bool name="config_batterySdCardAccessibility">false</bool> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 4966b97..3a24cc1 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -330,4 +330,9 @@ <!-- Size of the region along the edge of the screen that will accept swipes to scroll the widget area. --> <dimen name="kg_edge_swipe_region_size">24dp</dimen> + + <!-- If the height if keyguard drops below this threshold (most likely + due to the appearance of the IME), then drop the multiuser selector. --> + <dimen name="kg_squashed_layout_threshold">600dp</dimen> + </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 51d6429..73b9021 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -2065,15 +2065,6 @@ <!-- This can be used in any application wanting to disable the text "Emergency number" --> <string name="emergency_call_dialog_number_for_display">Emergency number</string> - <!-- String to display if the clock status widget is selected (it is the default) [CHAR LIMIT=22] --> - <string name="widget_default" msgid="8269383575996003796">Clock</string> - - <!-- Package name for default widget [DO NOT TRANSLATE] --> - <string name="widget_default_package_name">com.android.deskclock</string> - - <!-- Class name for default widget [DO NOT TRANSLATE] --> - <string name="widget_default_class_name">com.android.deskclock.DeskClock</string> - <!-- *** touch based lock / unlock *** --> <skip /> @@ -2110,7 +2101,7 @@ <string name="lockscreen_plugged_in">Charging, <xliff:g id="number">%d</xliff:g><xliff:g id="percent">%%</xliff:g></string> <!-- When the lock screen is showing, the phone is plugged in and the battery is fully charged, say that it is charged. --> - <string name="lockscreen_charged">Charged.</string> + <string name="lockscreen_charged">Charged</string> <!-- A short representation of charging information, e.g "34%" --> <string name="lockscreen_battery_short"><xliff:g id="number">%d</xliff:g><xliff:g id="percent">%%</xliff:g></string> @@ -3976,6 +3967,9 @@ you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="number">%d</xliff:g> seconds. </string> + <!-- Sequence of characters used to separate message strings in keyguard. Typically just em-dash + with spaces on either side. [CHAR LIMIT=3] --> + <string name="kg_text_message_separator" product="default">" \u2014 "</string> <!-- Message shown in dialog when user is attempting to set the music volume above the recommended maximum level for headphones --> diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index 180f864..f489786 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -2482,13 +2482,14 @@ please see styles_device_defaults.xml. <style name="Widget.Button.NumPadKey" parent="@android:style/Widget.Button"> <item name="android:singleLine">true</item> - <item name="android:padding">6dip</item> <item name="android:gravity">left|center_vertical</item> <item name="android:background">?android:attr/selectableItemBackground</item> <item name="android:textSize">34dp</item> <item name="android:fontFamily">sans-serif</item> <item name="android:textStyle">normal</item> <item name="android:textColor">#ffffff</item> + <item name="android:paddingBottom">10dp</item> + <item name="android:paddingLeft">20dp</item> </style> <style name="TextAppearance.NumPadKey" parent="@android:style/TextAppearance"> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 05edbcc..dfa2b4a 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -479,7 +479,6 @@ <java-symbol type="string" name="emailTypeOther" /> <java-symbol type="string" name="emailTypeWork" /> <java-symbol type="string" name="emergency_call_dialog_number_for_display" /> - <java-symbol type="string" name="widget_default" /> <java-symbol type="string" name="widget_default_package_name" /> <java-symbol type="string" name="widget_default_class_name" /> <java-symbol type="string" name="emergency_calls_only" /> @@ -1235,6 +1234,7 @@ <java-symbol type="dimen" name="keyguard_avatar_frame_stroke_width" /> <java-symbol type="dimen" name="keyguard_avatar_frame_shadow_radius" /> <java-symbol type="dimen" name="kg_edge_swipe_region_size" /> + <java-symbol type="dimen" name="kg_squashed_layout_threshold" /> <java-symbol type="drawable" name="ic_jog_dial_sound_off" /> <java-symbol type="drawable" name="ic_jog_dial_sound_on" /> <java-symbol type="drawable" name="ic_jog_dial_unlock" /> @@ -1319,6 +1319,8 @@ <java-symbol type="id" name="keyguard_sim_puk_view" /> <java-symbol type="id" name="keyguard_account_view" /> <java-symbol type="id" name="keyguard_selector_fade_container" /> + <java-symbol type="id" name="keyguard_widget_pager_delete_target" /> + <java-symbol type="id" name="keyguard_bouncer_frame" /> <java-symbol type="id" name="app_widget_container" /> <java-symbol type="id" name="view_flipper" /> <java-symbol type="id" name="emergency_call_button" /> @@ -1327,9 +1329,7 @@ <java-symbol type="id" name="lockPatternView" /> <java-symbol type="id" name="forgot_password_button" /> <java-symbol type="id" name="glow_pad_view" /> - <java-symbol type="id" name="sim_pin_entry" /> <java-symbol type="id" name="delete_button" /> - <java-symbol type="id" name="sim_pin_entry" /> <java-symbol type="id" name="keyguard_user_avatar" /> <java-symbol type="id" name="keyguard_user_name" /> <java-symbol type="id" name="keyguard_transport_control" /> @@ -1478,6 +1478,7 @@ <java-symbol type="string" name="kg_failed_attempts_almost_at_login" /> <java-symbol type="string" name="kg_enter_confirm_pin_hint" /> <java-symbol type="string" name="kg_invalid_confirm_pin_hint" /> + <java-symbol type="string" name="kg_text_message_separator" /> <!-- From services --> <java-symbol type="anim" name="screen_rotate_0_enter" /> diff --git a/docs/html/training/load-data-background/define-launch-query.jd b/docs/html/training/load-data-background/define-launch-query.jd new file mode 100644 index 0000000..f7978f4 --- /dev/null +++ b/docs/html/training/load-data-background/define-launch-query.jd @@ -0,0 +1,83 @@ +page.title=Defining and Launching the Query +trainingnavtop=true +startpage=true + +@jd:body + +<!-- This is the training bar --> +<div id="tb-wrapper"> + <div id="tb"> +<h2>This lesson teaches you to</h2> +<ol> + <li> + <a href="#DefineLaunch">Define and Launch the Query</a> + </li> +</ol> + </div> +</div> + +<p> + To perform a query, create the {@link android.support.v4.content.CursorLoader}, set up its + query, and pass it to the loader framework. From then on, the framework manages everything. + It runs the query on a background thread, returns the results to the foreground, and + watches for changes to the data associated with the query. +</p> +<p> + Pass a {@link android.support.v4.content.CursorLoader} to the loader framework in + your implementation of + {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()}. + The loader framework calls this method when you <i>create</i> a loader by calling + {@link android.support.v4.app.LoaderManager#initLoader initLoader()}. You can create + a {@link android.support.v4.content.CursorLoader} anywhere, + but the preferred way is to create it in + {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()}, + because this defers creation until the object is actually needed. +</p> +<p> + Notice that {@link android.support.v4.app.LoaderManager#initLoader initLoader()} will only + {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()} + if the {@link android.support.v4.content.CursorLoader} doesn't already exist; otherwise, it + re-uses the existing {@link android.support.v4.content.CursorLoader}. The loader framework + tracks {@link android.support.v4.content.CursorLoader} instance using the <code>id</code> + value passed to {@link android.support.v4.app.LoaderManager#initLoader initLoader()}. +</p> +<h2 id="DefineLaunch">Define and Launch the Query</h2> +<p> + To create a {@link android.support.v4.content.CursorLoader} and define its + query at the same time, call the constructor +{@link android.support.v4.content.CursorLoader#CursorLoader(Context, Uri, String[], String, String[], String) + CursorLoader(context, uri, projection, selection, selectionArgs, sortOrder)}. The + <code>context</code> and <code>uri</code> arguments are required, but the others are optional. + To use the default value for an optional argument, pass in <code>null</code>. The + {@link android.support.v4.content.CursorLoader} runs the query against the + {@link android.content.ContentProvider} identified by <code>uri</code>, just as if you had + called {@link android.content.ContentResolver#query ContentResolver.query()} with the same + arguments. +</p> +<p> + For example: +</p> +<pre> +public Loader<Cursor> onCreateLoader(int loaderID, Bundle bundle) +{ + /* + * Takes action based on the ID of the Loader that's being created + */ + switch (loaderID) { + case URL_LOADER: + /* + * Return a new CursorLoader + */ + return new CursorLoader( + this, // Context + DataProviderContract.IMAGE_URI, // Provider's content URI + PROJECTION, // Columns to return + null, // Return all rows + null, // No search arguments + null); // Default search order + default: + // An invalid id was passed in + return null; + } +} +</pre> diff --git a/docs/html/training/load-data-background/handle-results.jd b/docs/html/training/load-data-background/handle-results.jd new file mode 100644 index 0000000..f8e003a --- /dev/null +++ b/docs/html/training/load-data-background/handle-results.jd @@ -0,0 +1,104 @@ +page.title=Handling the Results +trainingnavtop=true +startpage=true + +@jd:body + +<!-- This is the training bar --> +<div id="tb-wrapper"> + <div id="tb"> +<h2>This lesson teaches you to</h2> +<ol> + <li> + <a href="#HandleResults">Handle Query Results</a> + </li> + <li> + <a href="#HandleReset">Clear Out Old Data</a></li> +</ol> + </div> +</div> + +<p> + {@link android.support.v4.content.CursorLoader} returns its query results to your + implementation of + {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onLoadFinished + LoaderCallbacks.onLoadFinished()}, in the form of a {@link android.database.Cursor}. In the + callback, you can update your data display, do further processing on the + {@link android.database.Cursor} data, and so forth. +</p> +<p> + When the loader framework detects changes to data associated with the query, + it resets the {@link android.support.v4.content.CursorLoader}, closes the current + {@link android.database.Cursor}, and then invokes your implementation of + {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onLoaderReset onLoaderReset()}. + Use this callback to delete references to the current {@link android.database.Cursor}; when the + loader framework destroys the {@link android.database.Cursor}, you won't have outstanding + references that cause memory leaks. +</p> +<h2 id="HandleFinished">Handle Query Results</h2> +<p> + The following two snippets are an example of displaying the results of a query, using a + {@link android.widget.ListView} backed by a + {@link android.support.v4.widget.SimpleCursorAdapter}. +</p> +<p> + The first snippet shows the {@link android.widget.ListView} and + {@link android.support.v4.widget.SimpleCursorAdapter}: +</p> +<pre> +// Gets a handle to the Android built-in ListView widget +mListView = ((ListView) findViewById(android.R.id.list)); +// Creates a CursorAdapter +mAdapter = + new SimpleCursorAdapter( + this, // Current context + R.layout.logitem, // View for each item in the list + null, // Don't provide the cursor yet + FROM_COLUMNS, // List of cursor columns to display + TO_FIELDS, // List of TextViews in each line + 0 // flags +); +// Links the adapter to the ListView +mListView.setAdapter(mAdapter); +</pre> +<p> + The next snippet shows an implementation of + {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onLoadFinished onLoadFinished()} + that moves the query results in the returned {@link android.database.Cursor} to the + {@link android.support.v4.widget.SimpleCursorAdapter}. Changing the + {@link android.database.Cursor} in the + {@link android.support.v4.widget.SimpleCursorAdapter} triggers a refresh of the + {@link android.widget.ListView} with the new data: +</p> +<pre> +public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) +{ + /* + * Move the results into the adapter. This + * triggers the ListView to re-display. + */ + mAdapter.swapCursor(cursor); +} +</pre> +<h2 id="HandleReset">Handle a Loader Reset</h2> +<p> + The loader framework resets the {@link android.support.v4.content.CursorLoader} whenever the + {@link android.database.Cursor} becomes invalid. This usually occurs because the data associated + with the {@link android.database.Cursor} has changed. Before re-running the query, + the framework calls your implementation of + {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onLoaderReset onLoaderReset()}. In + this callback, make sure to prevent memory leaks by deleting all references to the current + {@link android.database.Cursor}. Once you return from + {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onLoaderReset onLoaderReset()}, + the loader framework re-runs the query. +</p> +<p> + For example: +</p> +<pre> +public void onLoaderReset(Loader<Cursor> loader) +{ + // Remove the reference to the current Cursor + mAdapter.swapCursor(null); +} +</pre> diff --git a/docs/html/training/load-data-background/index.jd b/docs/html/training/load-data-background/index.jd new file mode 100644 index 0000000..574a32c --- /dev/null +++ b/docs/html/training/load-data-background/index.jd @@ -0,0 +1,117 @@ +page.title=Loading Data in the Background +trainingnavtop=true +startpage=true + +@jd:body +<div id="tb-wrapper"> +<div id="tb"> + +<!-- Required platform, tools, add-ons, devices, knowledge, etc. --> +<h2>Dependencies and prerequisites</h2> +<h3>Dependencies</h3> +<ul> + <li> + Android 1.6 or later + </li> +</ul> +<h3>Prerequisites</h3> +<ul> + <li> + <a href="{@docRoot}training/basics/firstapp/index.html">Building Your First App</a> class + </li> + <li> + <a href="{@docRoot}training/basics/activity-lifecycle/index.html"> + Managing the Activity Lifecycle</a> class + </li> +</ul> + +<!-- related docs (NOT javadocs) --> +<h2>You should also read</h2> +<ul> + <li> + <a href="{@docRoot}guide/components/loaders.html">Loaders</a> + </li> + <li> + <a href="{@docRoot}guide/topics/data/data-storage.html#db">Using Databases</a> + </li> + <li> +<a href="{@docRoot}guide/topics/providers/content-provider-basics.html">Content Provider Basics</a> + </li> +</ul> +</div> +</div> +<p> + A {@link android.support.v4.content.CursorLoader} runs a query against a + {@link android.content.ContentProvider} on a background thread and returns a + {@link android.database.Cursor} to the main thread. +</p> +<p> + {@link android.support.v4.content.CursorLoader} has these advantages over alternate ways of + running a query: +</p> +<dl> + <dt> + Query on a background thread + </dt> + <dd> + A {@link android.support.v4.content.CursorLoader} query runs asynchronously on a + background thread, so it doesn't cause "Application Not Responding" (ANR) errors on the UI + thread. {@link android.support.v4.content.CursorLoader} creates and starts the + background thread; all you have to do is initialize the loader framework and handle the + results of the query. + </dd> + <dt> + Automatic re-query + </dt> + <dd> + A {@link android.support.v4.content.CursorLoader} automatically runs a new query when + the loader framework detects that the data underlying the {@link android.database.Cursor} + has changed. + </dd> + <dt> + Simple API + </dt> + <dd> + The {@link android.support.v4.content.CursorLoader} API provides the + query framework and cursor monitoring that you would have to define yourself if you used + {@link android.os.AsyncTask}. + </dd> +</dl> +<p> + A {@link android.support.v4.content.CursorLoader} is limited in that the query must be + against a {@link android.net.Uri} and must return a {@link android.database.Cursor}. Because of + this, a {@link android.support.v4.content.CursorLoader} can only run a query against a + {@link android.content.ContentProvider}. +</p> +<p> + This class describes how to define and use a {@link android.support.v4.content.CursorLoader}. + Examples in this class use the {@link android.support.v4 v4 support library} versions of + classes, which support platforms starting with Android 1.6. +</p> +<h2>Lessons</h2> +<dl> + <dt> + <strong><a href="setup-loader.html">Setting Up the Loader</a></strong> + </dt> + <dd> + Learn how to set up an {@link android.app.Activity} that inherits the necessary classes + for running a {@link android.support.v4.content.CursorLoader} and returning results. + </dd> + <dt> + <strong><a href="define-launch-query.html">Defining and Launching the Query</a></strong> + </dt> + <dd> + Learn how to perform a query against a {@link android.content.ContentProvider} using + a {@link android.support.v4.content.CursorLoader}. + </dd> + <dt> + <strong> + <a href="handle-results.html">Handling the Results</a> + </strong> + </dt> + <dd> + Learn how to handle the {@link android.database.Cursor} returned from the query, and how + to remove references to the current {@link android.database.Cursor} when the loader + framework re-sets the {@link android.support.v4.content.CursorLoader}. + </dd> +</dl> diff --git a/docs/html/training/load-data-background/setup-loader.jd b/docs/html/training/load-data-background/setup-loader.jd new file mode 100644 index 0000000..4b40611 --- /dev/null +++ b/docs/html/training/load-data-background/setup-loader.jd @@ -0,0 +1,90 @@ +page.title=Setting Up the Loader +trainingnavtop=true +startpage=true + +@jd:body + +<!-- This is the training bar --> +<div id="tb-wrapper"> + <div id="tb"> +<h2>This lesson teaches you to</h2> +<ol> + <li> + <a href="#AddExtensions">Extend an Activity</a> + </li> + <li> + <a href="#GetLoader">Retrieve a LoaderManager</a> + </li> + <li> + <a href="#InitializeLoader">Initialize the Loader Framework</a> + </li> +</ol> + </div> +</div> +<p> + You create a {@link android.support.v4.content.CursorLoader} within a + <b>loader framework</b>. To set up the framework, you implement the + {@link android.support.v4.app.LoaderManager.LoaderCallbacks LoaderCallbacks<Cursor>} + as part of an {@link android.app.Activity}. In addition, to provide compatibility + compatible with platform versions starting with Android 1.6, you must extend the + {@link android.app.Activity} with the {@link android.support.v4.app.FragmentActivity} class. +</p> +<p class="note"> + <strong>Note:</strong> A {@link android.support.v4.app.Fragment} is not a prerequisite for + {@link android.support.v4.content.CursorLoader}. As a convenience, the support library class + {@link android.support.v4.app.FragmentActivity} contains the fragment and the loader frameworks, + but they are completely independent of each other. +</p> +<p> + Before you can use the loader framework, you need to initialize it. To do this, retrieve + a {@link android.support.v4.app.LoaderManager} object and call its + {@link android.support.v4.app.LoaderManager#initLoader initLoader()} method. +</p> +<p> + If you do use one or more {@link android.support.v4.app.Fragment} objects in an + {@link android.app.Activity}, the {@link android.support.v4.app.LoaderManager} you retrieve is + available to all of them. +</p> +<h2 id="AddExtensions">Extend an Activity</h2> +<p> + To set up an {@link android.app.Activity} subclass to contain a + {@link android.support.v4.content.CursorLoader}, extend the subclass with + must extend {@link android.support.v4.app.FragmentActivity}, which provides the loader + framework, and implement the {@link android.support.v4.app.LoaderManager.LoaderCallbacks + LoaderCallbacks<Cursor>} interface, which specifies method signatures that the loader + framework uses to interact with the {@link android.app.Activity}. +</p> +<p> + For example: +</p> +<pre> +public class DisplayActivity extends FragmentActivity + implements LoaderManager.LoaderCallbacks<Cursor> +</pre> +<h2 id="GetLoader">Retrieve a LoaderManager</h2> +<p> + To get an instance {@link android.support.v4.app.LoaderManager} for use in your + {@link android.app.Activity}, call + {@link android.support.v4.app.FragmentActivity#getSupportLoaderManager + FragmentActivity.getSupportLoaderManager()} at the beginning of the + {@link android.app.Activity#onCreate onCreate()} method. For example: +</p> +<pre> +private LoaderManager mLoaderManager; +public void onCreate() { +... +mLoaderManager = this.getSupportLoaderManager(); +</pre> +<h2 id="InitializeLoader">Initialize the Loader Framework</h2> +<p> + Once you have the {@link android.support.v4.app.LoaderManager} object, initialize + it by calling {@link android.support.v4.app.LoaderManager#initLoader initLoader()}. For + example: +</p> +<pre> +// CursorLoader instance identifier +public static final int URL_LOADER = 0; +... +// Initializes the CursorLoader +getSupportLoaderManager().initLoader(URL_LOADER, null, this); +</pre> diff --git a/docs/html/training/training_toc.cs b/docs/html/training/training_toc.cs index 4a5b0fa..1c85ae8 100644 --- a/docs/html/training/training_toc.cs +++ b/docs/html/training/training_toc.cs @@ -58,7 +58,7 @@ </li> </ul> </li> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>training/basics/supporting-devices/index.html"> <span class="en">Supporting Different Devices</span> @@ -78,7 +78,7 @@ </li> </ul> </li> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>training/basics/fragments/index.html"> <span class="en">Building a Dynamic UI with Fragments</span> @@ -143,9 +143,9 @@ </ul> </li> - + </ul> - </li><!-- end basic training --> + </li><!-- end basic training --> <li class="nav-section"> <div class="nav-section-header"> <a href="<?cs var:toroot ?>training/advanced.html"> @@ -193,7 +193,7 @@ </li> </ul> </li> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>training/efficient-downloads/index.html"> <span class="en">Transferring Data Without Draining the Battery</span> @@ -233,12 +233,12 @@ </li> </ul> </li> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>training/multiscreen/index.html" zh-CN-lang="针对多种屏幕进行设计" ja-lang="複数画面のデザイン" - es-lang="Cómo diseñar aplicaciones para varias pantallas" + es-lang="Cómo diseñar aplicaciones para varias pantallas" >Designing for Multiple Screens</a> </div> <ul> @@ -246,24 +246,24 @@ zh-CN-lang="支持各种屏幕尺寸" ko-lang="다양한 화면 크기 지원" ja-lang="さまざまな画面サイズのサポート" - es-lang="Cómo admitir varios tamaños de pantalla" + es-lang="Cómo admitir varios tamaños de pantalla" >Designing for Multiple Screens</a> </li> <li><a href="<?cs var:toroot ?>training/multiscreen/screendensities.html" zh-CN-lang="支持各种屏幕密度" ja-lang="さまざまな画面密度のサポート" - es-lang="Cómo admitir varias densidades de pantalla" + es-lang="Cómo admitir varias densidades de pantalla" >Supporting Different Screen Densities</a> </li> <li><a href="<?cs var:toroot ?>training/multiscreen/adaptui.html" zh-CN-lang="实施自适应用户界面流程" ja-lang="順応性のある UI フローの実装" - es-lang="Cómo implementar interfaces de usuario adaptables" + es-lang="Cómo implementar interfaces de usuario adaptables" >Implementing Adaptive UI Flows</a> </li> </ul> </li> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>training/improving-layouts/index.html"> <span class="en">Improving Layout Performance</span> @@ -335,37 +335,37 @@ </li> </ul> </li> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>training/monitoring-device-state/index.html" zh-CN-lang="优化电池使用时间" ja-lang="電池消費量の最適化" - es-lang="Cómo optimizar la duración de la batería" + es-lang="Cómo optimizar la duración de la batería" >Optimizing Battery Life</a> </div> <ul> <li><a href="<?cs var:toroot ?>training/monitoring-device-state/battery-monitoring.html" zh-CN-lang="监控电池电量和充电状态" ja-lang="電池残量と充電状態の監視" - es-lang="Cómo controlar el nivel de batería y el estado de carga" + es-lang="Cómo controlar el nivel de batería y el estado de carga" >Monitoring the Battery Level and Charging State</a> </li> <li><a href="<?cs var:toroot ?>training/monitoring-device-state/docking-monitoring.html" zh-CN-lang="确定和监控基座对接状态和类型" ja-lang="ホルダーの装着状態とタイプの特定と監視" - es-lang="Cómo determinar y controlar el tipo de conector y el estado de la conexión" + es-lang="Cómo determinar y controlar el tipo de conector y el estado de la conexión" >Determining and Monitoring the Docking State and Type</a> </li> <li><a href="<?cs var:toroot ?>training/monitoring-device-state/connectivity-monitoring.html" zh-CN-lang="确定和监控网络连接状态" ja-lang="接続状態の特定と監視" - es-lang="Cómo determinar y controlar el estado de la conectividad" + es-lang="Cómo determinar y controlar el estado de la conectividad" >Determining and Monitoring the Connectivity Status</a> </li> <li><a href="<?cs var:toroot ?>training/monitoring-device-state/manifest-receivers.html" zh-CN-lang="根据需要操作广播接收器" ja-lang="オンデマンドでのブロードキャスト レシーバ操作" - es-lang="Cómo manipular los receptores de emisión bajo demanda" + es-lang="Cómo manipular los receptores de emisión bajo demanda" >Manipulating Broadcast Receivers On Demand</a> </li> </ul> @@ -455,7 +455,7 @@ </li> </ul> </li> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>training/camera/index.html"> <span class="en">Capturing Photos</span> @@ -475,7 +475,7 @@ </li> </ul> </li> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>training/multiple-apks/index.html"> <span class="en">Maintaining Multiple APKs</span> @@ -535,7 +535,7 @@ </li> </ul> </li> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>training/monetization/index.html"> <span class="en">Monetizing Your App</span> @@ -547,7 +547,7 @@ </li> </ul> </li> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>training/design-navigation/index.html"> <span class="en">Designing Effective Navigation</span> @@ -620,7 +620,7 @@ </li> </ul> </li> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>training/displaying-bitmaps/index.html"> <span class="en">Displaying Bitmaps Efficiently</span> @@ -717,6 +717,25 @@ </ul> </li> + <li class="nav-section"> + <div class="nav-section-header"><a href="<?cs var:toroot ?>training/load-data-background/index.html"> + <span class="en">Loading Data in the Background</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>training/load-data-background/setup-loader.html"> + <span class="en">Setting Up the Loader</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/load-data-background/define-launch-query.html"> + <span class="en">Defining and Launching the Query</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/load-data-background/handle-results.html"> + <span class="en">Handling the Results</span> + </a> + </li> + </ul> + </li> </ul> </li> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 983328d..5eeef93 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -224,6 +224,8 @@ public class NavigationBarView extends LinearLayout { (0 != (hints & StatusBarManager.NAVIGATION_HINT_BACK_ALT)) ? (mVertical ? mBackAltLandIcon : mBackAltIcon) : (mVertical ? mBackLandIcon : mBackIcon)); + + setDisabledFlags(mDisabledFlags, true); } public void setDisabledFlags(int disabledFlags) { @@ -237,7 +239,8 @@ public class NavigationBarView extends LinearLayout { final boolean disableHome = ((disabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0); final boolean disableRecent = ((disabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0); - final boolean disableBack = ((disabledFlags & View.STATUS_BAR_DISABLE_BACK) != 0); + final boolean disableBack = ((disabledFlags & View.STATUS_BAR_DISABLE_BACK) != 0) + && ((mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) == 0); final boolean disableSearch = ((disabledFlags & View.STATUS_BAR_DISABLE_SEARCH) != 0); if (SLIPPERY_WHEN_DISABLED) { diff --git a/policy/src/com/android/internal/policy/impl/GlobalActions.java b/policy/src/com/android/internal/policy/impl/GlobalActions.java index c215f1b..d1f8ef1 100644 --- a/policy/src/com/android/internal/policy/impl/GlobalActions.java +++ b/policy/src/com/android/internal/policy/impl/GlobalActions.java @@ -314,8 +314,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac } // one more thing: optionally add a list of users to switch to - // temporarily enable this by default - if (true || SystemProperties.getBoolean("fw.power_user_switcher", false)) { + if (SystemProperties.getBoolean("fw.power_user_switcher", false)) { addUsersToMenu(mItems); } diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index de028a4..406f644 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -4500,6 +4500,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // oh well } } + setLastInputMethodWindowLw(null, null); } @Override @@ -4581,8 +4582,42 @@ public class PhoneWindowManager implements WindowManagerPolicy { pw.print(prefix); pw.print("mShowingLockscreen="); pw.print(mShowingLockscreen); pw.print(" mShowingDream="); pw.print(mShowingDream); pw.print(" mDreamingLockscreen="); pw.println(mDreamingLockscreen); - pw.print(prefix); pw.print("mTopFullscreenOpaqueWindowState="); - pw.println(mTopFullscreenOpaqueWindowState); + if (mLastInputMethodWindow != null) { + pw.print(prefix); pw.print("mLastInputMethodWindow="); + pw.println(mLastInputMethodWindow); + } + if (mLastInputMethodTargetWindow != null) { + pw.print(prefix); pw.print("mLastInputMethodTargetWindow="); + pw.println(mLastInputMethodTargetWindow); + } + if (mStatusBar != null) { + pw.print(prefix); pw.print("mStatusBar="); + pw.println(mStatusBar); + } + if (mNavigationBar != null) { + pw.print(prefix); pw.print("mNavigationBar="); + pw.println(mNavigationBar); + } + if (mKeyguard != null) { + pw.print(prefix); pw.print("mKeyguard="); + pw.println(mKeyguard); + } + if (mFocusedWindow != null) { + pw.print(prefix); pw.print("mFocusedWindow="); + pw.println(mFocusedWindow); + } + if (mFocusedApp != null) { + pw.print(prefix); pw.print("mFocusedApp="); + pw.println(mFocusedApp); + } + if (mWinDismissingKeyguard != null) { + pw.print(prefix); pw.print("mWinDismissingKeyguard="); + pw.println(mWinDismissingKeyguard); + } + if (mTopFullscreenOpaqueWindowState != null) { + pw.print(prefix); pw.print("mTopFullscreenOpaqueWindowState="); + pw.println(mTopFullscreenOpaqueWindowState); + } pw.print(prefix); pw.print("mTopIsFullscreen="); pw.print(mTopIsFullscreen); pw.print(" mHideLockScreen="); pw.println(mHideLockScreen); pw.print(prefix); pw.print("mForceStatusBar="); pw.print(mForceStatusBar); 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 2728bfc..dbd9999 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/CameraWidgetFrame.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/CameraWidgetFrame.java @@ -40,12 +40,14 @@ import com.android.internal.policy.impl.keyguard.KeyguardActivityLauncher.Camera public class CameraWidgetFrame extends KeyguardWidgetFrame implements View.OnClickListener { private static final String TAG = CameraWidgetFrame.class.getSimpleName(); private static final boolean DEBUG = KeyguardHostView.DEBUG; - private static final int WIDGET_ANIMATION_DURATION = 250; - private static final int WIDGET_WAIT_DURATION = 650; + private static final int WIDGET_ANIMATION_DURATION = 250; // ms + private static final int WIDGET_WAIT_DURATION = 650; // ms + private static final int RECOVERY_DELAY = 1000; // ms interface Callbacks { void onLaunchingCamera(); - void onCameraLaunched(); + void onCameraLaunchedSuccessfully(); + void onCameraLaunchedUnsuccessfully(); } private final Handler mHandler = new Handler(); @@ -53,22 +55,45 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame implements View.OnCli private final Callbacks mCallbacks; private final WindowManager mWindowManager; private final Point mRenderedSize = new Point(); + private final int[] mScreenLocation = new int[2]; private View mWidgetView; private long mLaunchCameraStart; private boolean mActive; - private boolean mChallengeActive; private boolean mTransitioning; + private boolean mRecovering; private boolean mDown; - private final Runnable mLaunchCameraRunnable = new Runnable() { + private final Runnable mTransitionToCameraRunnable = new Runnable() { + @Override + public void run() { + transitionToCamera(); + }}; + + private final Runnable mTransitionToCameraEndAction = new Runnable() { @Override public void run() { if (!mTransitioning) return; + Handler worker = getWorkerHandler() != null ? getWorkerHandler() : mHandler; mLaunchCameraStart = SystemClock.uptimeMillis(); if (DEBUG) Log.d(TAG, "Launching camera at " + mLaunchCameraStart); - mActivityLauncher.launchCamera(); + mActivityLauncher.launchCamera(worker, mSecureCameraActivityStartedRunnable); + }}; + + private final Runnable mRecoverRunnable = new Runnable() { + @Override + public void run() { + recover(); + }}; + + private final Runnable mRecoverEndAction = new Runnable() { + @Override + public void run() { + if (!mRecovering) + return; + mCallbacks.onCameraLaunchedUnsuccessfully(); + reset(); }}; private final Runnable mRenderRunnable = new Runnable() { @@ -77,19 +102,31 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame implements View.OnCli render(); }}; - private final Runnable mTransitionToCameraRunnable = new Runnable() { + private final Runnable mSecureCameraActivityStartedRunnable = new Runnable() { @Override public void run() { - transitionToCamera(); - }}; + onSecureCameraActivityStarted(); + } + }; + + private final KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() { + private boolean mShowing; + void onKeyguardVisibilityChanged(boolean showing) { + if (mShowing == showing) + return; + mShowing = showing; + CameraWidgetFrame.this.onKeyguardVisibilityChanged(mShowing); + }; + }; private CameraWidgetFrame(Context context, Callbacks callbacks, KeyguardActivityLauncher activityLauncher) { super(context); - mCallbacks = callbacks; mActivityLauncher = activityLauncher; mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + KeyguardUpdateMonitor.getInstance(context).registerCallback(mCallback); + if (DEBUG) Log.d(TAG, "new CameraWidgetFrame instance " + instanceId()); } public static CameraWidgetFrame create(Context context, Callbacks callbacks, @@ -152,41 +189,66 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame implements View.OnCli } public void render() { + final Throwable[] thrown = new Throwable[1]; + final Bitmap[] offscreen = new Bitmap[1]; try { - int width = getRootView().getWidth(); - int height = getRootView().getHeight(); + final int width = getRootView().getWidth(); + final int height = getRootView().getHeight(); if (mRenderedSize.x == width && mRenderedSize.y == height) { - if (DEBUG) Log.d(TAG, String.format("already rendered at size=%sx%s", + if (DEBUG) Log.d(TAG, String.format("Already rendered at size=%sx%s", width, height)); return; } if (width == 0 || height == 0) { return; } - if (DEBUG) Log.d(TAG, String.format("render size=%sx%s instance=%s at %s", - width, height, - Integer.toHexString(hashCode()), - SystemClock.uptimeMillis())); - - Bitmap offscreen = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - Canvas c = new Canvas(offscreen); + final long start = SystemClock.uptimeMillis(); + offscreen[0] = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + final Canvas c = new Canvas(offscreen[0]); mWidgetView.measure( MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); mWidgetView.layout(0, 0, width, height); mWidgetView.draw(c); - ((ImageView)getChildAt(0)).setImageBitmap(offscreen); + + final long end = SystemClock.uptimeMillis(); + if (DEBUG) Log.d(TAG, String.format( + "Rendered camera widget in %sms size=%sx%s instance=%s at %s", + end - start, + width, height, + instanceId(), + end)); mRenderedSize.set(width, height); } catch (Throwable t) { - Log.w(TAG, "Error rendering camera widget", t); - removeAllViews(); - View genericView = inflateGenericWidgetView(mContext); - addView(genericView); + thrown[0] = t; } + + mHandler.post(new Runnable() { + @Override + public void run() { + if (thrown[0] == null) { + try { + ((ImageView) getChildAt(0)).setImageBitmap(offscreen[0]); + } catch (Throwable t) { + thrown[0] = t; + } + } + if (thrown[0] == null) + return; + + Log.w(TAG, "Error rendering camera widget", thrown[0]); + try { + removeAllViews(); + final View genericView = inflateGenericWidgetView(mContext); + addView(genericView); + } catch (Throwable t) { + Log.w(TAG, "Error inflating generic camera widget", t); + } + }}); } private void transitionToCamera() { - if (mTransitioning || mChallengeActive || mDown) return; + if (mTransitioning || mDown) return; mTransitioning = true; @@ -223,35 +285,42 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame implements View.OnCli .scaleY(scale) .translationY(finishCenter - startCenter) .setDuration(WIDGET_ANIMATION_DURATION) - .withEndAction(mLaunchCameraRunnable) + .withEndAction(mTransitionToCameraEndAction) .start(); mCallbacks.onLaunchingCamera(); } + private void recover() { + if (DEBUG) Log.d(TAG, "recovering at " + SystemClock.uptimeMillis()); + mRecovering = true; + animate() + .scaleX(1) + .scaleY(1) + .translationY(0) + .setDuration(WIDGET_ANIMATION_DURATION) + .withEndAction(mRecoverEndAction) + .start(); + } + @Override public void onClick(View v) { if (DEBUG) Log.d(TAG, "clicked"); if (mTransitioning) return; - if (mActive && !mChallengeActive) { + if (mActive) { cancelTransitionToCamera(); transitionToCamera(); } } @Override - public void onWindowFocusChanged(boolean hasWindowFocus) { - super.onWindowFocusChanged(hasWindowFocus); - if (DEBUG) Log.d(TAG, "onWindowFocusChanged: " + hasWindowFocus); - if (!hasWindowFocus) { - mTransitioning = false; - if (mLaunchCameraStart > 0) { - long launchTime = SystemClock.uptimeMillis() - mLaunchCameraStart; - if (DEBUG) Log.d(TAG, String.format("Camera took %sms to launch", launchTime)); - mLaunchCameraStart = 0; - onCameraLaunched(); - } - } + protected void onDetachedFromWindow() { + if (DEBUG) Log.d(TAG, "onDetachedFromWindow: instance " + instanceId() + + " at " + SystemClock.uptimeMillis()); + super.onDetachedFromWindow(); + KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mCallback); + cancelTransitionToCamera(); + mHandler.removeCallbacks(mRecoverRunnable); } @Override @@ -265,37 +334,35 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame implements View.OnCli } @Override - public boolean onUserInteraction(int action) { - if (mTransitioning) return true; - if (DEBUG) Log.d(TAG, "onUserInteraction " + action); + public boolean onUserInteraction(MotionEvent event) { + if (mTransitioning) { + if (DEBUG) Log.d(TAG, "onUserInteraction eaten: mTransitioning"); + return true; + } + + getLocationOnScreen(mScreenLocation); + int rawBottom = mScreenLocation[1] + getHeight(); + if (event.getRawY() > rawBottom) { + if (DEBUG) Log.d(TAG, "onUserInteraction eaten: below widget"); + return true; + } + + int action = event.getAction(); mDown = action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE; - if (mActive && !mChallengeActive) { + if (mActive) { rescheduleTransitionToCamera(); } + if (DEBUG) Log.d(TAG, "onUserInteraction observed, not eaten"); return false; } @Override protected void onFocusLost() { - if (DEBUG) Log.d(TAG, "onFocusLost"); + if (DEBUG) Log.d(TAG, "onFocusLost at " + SystemClock.uptimeMillis()); cancelTransitionToCamera(); super.onFocusLost(); } - @Override - public void onChallengeActive(boolean challengeActive) { - if (DEBUG) Log.d(TAG, "onChallengeActive: " + challengeActive); - mChallengeActive = challengeActive; - if (mTransitioning) return; - if (mActive) { - if (mChallengeActive) { - cancelTransitionToCamera(); - } else { - rescheduleTransitionToCamera(); - } - } - } - public void onScreenTurnedOff() { if (DEBUG) Log.d(TAG, "onScreenTurnedOff"); reset(); @@ -313,17 +380,18 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame implements View.OnCli } private void onCameraLaunched() { - mCallbacks.onCameraLaunched(); + mCallbacks.onCameraLaunchedSuccessfully(); reset(); } private void reset() { - if (DEBUG) Log.d(TAG, "reset"); + if (DEBUG) Log.d(TAG, "reset at " + SystemClock.uptimeMillis()); mLaunchCameraStart = 0; mTransitioning = false; - mChallengeActive = false; + mRecovering = false; mDown = false; cancelTransitionToCamera(); + mHandler.removeCallbacks(mRecoverRunnable); animate().cancel(); setScaleX(1); setScaleY(1); @@ -335,7 +403,8 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame implements View.OnCli protected void onSizeChanged(int w, int h, int oldw, int oldh) { if (DEBUG) Log.d(TAG, String.format("onSizeChanged new=%sx%s old=%sx%s at %s", w, h, oldw, oldh, SystemClock.uptimeMillis())); - mHandler.post(mRenderRunnable); + final Handler worker = getWorkerHandler(); + (worker != null ? worker : mHandler).post(mRenderRunnable); super.onSizeChanged(w, h, oldw, oldh); } @@ -347,8 +416,35 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame implements View.OnCli WindowManager.LayoutParams wlp = (WindowManager.LayoutParams) lp; int newWindowAnimations = isEnabled ? com.android.internal.R.style.Animation_LockScreen : 0; if (newWindowAnimations != wlp.windowAnimations) { + if (DEBUG) Log.d(TAG, "setting windowAnimations to: " + newWindowAnimations + + " at " + SystemClock.uptimeMillis()); wlp.windowAnimations = newWindowAnimations; mWindowManager.updateViewLayout(root, wlp); } } + + private void onKeyguardVisibilityChanged(boolean showing) { + if (DEBUG) Log.d(TAG, "onKeyguardVisibilityChanged " + showing + + " at " + SystemClock.uptimeMillis()); + if (mTransitioning && !showing) { + mTransitioning = false; + mRecovering = false; + mHandler.removeCallbacks(mRecoverRunnable); + if (mLaunchCameraStart > 0) { + long launchTime = SystemClock.uptimeMillis() - mLaunchCameraStart; + if (DEBUG) Log.d(TAG, String.format("Camera took %sms to launch", launchTime)); + mLaunchCameraStart = 0; + onCameraLaunched(); + } + } + } + + private void onSecureCameraActivityStarted() { + if (DEBUG) Log.d(TAG, "onSecureCameraActivityStarted at " + SystemClock.uptimeMillis()); + mHandler.postDelayed(mRecoverRunnable, RECOVERY_DELAY); + } + + private String instanceId() { + return Integer.toHexString(hashCode()); + } } 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 b031baf..f3ea992 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/CarrierText.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/CarrierText.java @@ -27,6 +27,8 @@ import com.android.internal.telephony.IccCardConstants.State; import com.android.internal.widget.LockPatternUtils; public class CarrierText extends TextView { + private static CharSequence mSeparator; + private LockPatternUtils mLockPatternUtils; private KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() { @@ -82,6 +84,7 @@ public class CarrierText extends TextView { @Override 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. } @@ -202,7 +205,7 @@ public class CarrierText extends TextView { final boolean plmnValid = !TextUtils.isEmpty(plmn); final boolean spnValid = !TextUtils.isEmpty(spn); if (plmnValid && spnValid) { - return plmn + "|" + spn; + return new StringBuilder().append(plmn).append(mSeparator).append(spn).toString(); } else if (plmnValid) { return plmn; } else if (spnValid) { diff --git a/policy/src/com/android/internal/policy/impl/keyguard/FaceUnlock.java b/policy/src/com/android/internal/policy/impl/keyguard/FaceUnlock.java index 9858c77..259f1e4 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/FaceUnlock.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/FaceUnlock.java @@ -149,6 +149,9 @@ public class FaceUnlock implements BiometricSensorUnlock, Handler.Callback { Log.e(TAG, "stop() called from non-UI thread"); } + // Clearing any old service connected messages. + mHandler.removeMessages(MSG_SERVICE_CONNECTED); + boolean mWasRunning = mIsRunning; stopUi(); 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 db36bcc..7c769a7 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardAbsKeyInputView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardAbsKeyInputView.java @@ -18,6 +18,7 @@ package com.android.internal.policy.impl.keyguard; import android.content.Context; import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.os.CountDownTimer; import android.os.SystemClock; import android.text.Editable; @@ -43,6 +44,8 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout protected TextView mPasswordEntry; protected LockPatternUtils mLockPatternUtils; protected SecurityMessageDisplay mSecurityMessageDisplay; + protected View mEcaView; + private Drawable mBouncerFrame; protected boolean mEnableHaptics; // To avoid accidental lockout due to events while the device in in the pocket, ignore @@ -122,6 +125,11 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout } }); mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this); + mEcaView = findViewById(R.id.keyguard_selector_fade_container); + View bouncerFrameView = findViewById(R.id.keyguard_bouncer_frame); + if (bouncerFrameView != null) { + mBouncerFrame = bouncerFrameView.getBackground(); + } } @Override @@ -130,6 +138,15 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout return mPasswordEntry.requestFocus(direction, previouslyFocusedRect); } + /* + * Override this if you have a different string for "wrong password" + * + * Note that PIN/PUK have their own implementation of verifyPasswordAndUnlock and so don't need this + */ + protected int getWrongPasswordStringId() { + return R.string.kg_wrong_password; + } + protected void verifyPasswordAndUnlock() { String entry = mPasswordEntry.getText().toString(); if (mLockPatternUtils.checkPassword(entry)) { @@ -144,7 +161,7 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout long deadline = mLockPatternUtils.setLockoutAttemptDeadline(); handleAttemptLockout(deadline); } - mSecurityMessageDisplay.setMessage(R.string.kg_wrong_pin, true); + mSecurityMessageDisplay.setMessage(getWrongPasswordStringId(), true); } mPasswordEntry.setText(""); } @@ -164,6 +181,7 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout @Override public void onFinish() { + mSecurityMessageDisplay.setMessage("", false); resetState(); } }.start(); @@ -229,5 +247,17 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout | HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); } } + + @Override + public void showBouncer(int duration) { + KeyguardSecurityViewHelper. + showBouncer(mSecurityMessageDisplay, mEcaView, mBouncerFrame, duration); + } + + @Override + public void hideBouncer(int duration) { + KeyguardSecurityViewHelper. + hideBouncer(mSecurityMessageDisplay, mEcaView, mBouncerFrame, duration); + } } 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 9c87755..3ce61d9 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardAccountView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardAccountView.java @@ -318,5 +318,13 @@ public class KeyguardAccountView extends LinearLayout implements KeyguardSecurit @Override public void showUsabilityHint() { } + + @Override + public void showBouncer(int duration) { + } + + @Override + public void hideBouncer(int duration) { + } } 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 8283af2..fabab75 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java @@ -18,12 +18,14 @@ package com.android.internal.policy.impl.keyguard; import android.app.ActivityManagerNative; import android.app.ActivityOptions; +import android.app.IActivityManager.WaitResult; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; +import android.os.Handler; import android.os.RemoteException; import android.os.SystemClock; import android.os.UserHandle; @@ -91,7 +93,7 @@ public abstract class KeyguardActivityLauncher { return info; } - public void launchCamera() { + public void launchCamera(Handler worker, Runnable onSecureCameraStarted) { LockPatternUtils lockPatternUtils = getLockPatternUtils(); if (lockPatternUtils.isSecure()) { // Launch the secure version of the camera @@ -100,26 +102,33 @@ public abstract class KeyguardActivityLauncher { // For now, we'll treat this like launching any other app from secure keyguard. // When they do, user sees the system's ResolverActivity which lets them choose // which secure camera to use. - launchActivity(SECURE_CAMERA_INTENT, false, false); + launchActivity(SECURE_CAMERA_INTENT, false, false, null, null); } else { - launchActivity(SECURE_CAMERA_INTENT, true, false); + launchActivity(SECURE_CAMERA_INTENT, true, false, worker, onSecureCameraStarted); } } else { // Launch the normal camera - launchActivity(INSECURE_CAMERA_INTENT, false, false); + launchActivity(INSECURE_CAMERA_INTENT, false, false, null, null); } } /** * Launches the said intent for the current foreground user. + * * @param intent * @param showsWhileLocked true if the activity can be run on top of keyguard. - * See {@link WindowManager#FLAG_SHOW_WHEN_LOCKED} + * See {@link WindowManager#FLAG_SHOW_WHEN_LOCKED} + * @param useDefaultAnimations true if default transitions should be used, else suppressed. + * @param worker if supplied along with onStarted, used to launch the blocking activity call. + * @param onStarted if supplied along with worker, called after activity is started. */ - public void launchActivity(final Intent intent, boolean showsWhileLocked, boolean animate) { + public void launchActivity(final Intent intent, + boolean showsWhileLocked, + boolean useDefaultAnimations, + final Handler worker, + final Runnable onStarted) { final Context context = getContext(); - final Bundle animation = animate ? null : - ActivityOptions.makeCustomAnimation(context, 0, 0).toBundle(); + final Bundle animation = ActivityOptions.makeCustomAnimation(context, 0, 0).toBundle(); LockPatternUtils lockPatternUtils = getLockPatternUtils(); intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK @@ -135,8 +144,7 @@ public abstract class KeyguardActivityLauncher { try { if (DEBUG) Log.d(TAG, String.format("Starting activity for intent %s at %s", intent, SystemClock.uptimeMillis())); - context.startActivityAsUser(intent, animation, - new UserHandle(UserHandle.USER_CURRENT)); + startActivityForCurrentUser(intent, animation, worker, onStarted); } catch (ActivityNotFoundException e) { Log.w(TAG, "Activity not found for intent + " + intent.getAction()); } @@ -147,14 +155,52 @@ public abstract class KeyguardActivityLauncher { callback.setOnDismissRunnable(new Runnable() { @Override public void run() { - context.startActivityAsUser(intent, animation, - new UserHandle(UserHandle.USER_CURRENT)); + startActivityForCurrentUser(intent, animation, worker, onStarted); } }); callback.dismiss(false); } } + private void startActivityForCurrentUser(final Intent intent, final Bundle options, + Handler worker, final Runnable onStarted) { + final UserHandle user = new UserHandle(UserHandle.USER_CURRENT); + if (worker == null || onStarted == null) { + getContext().startActivityAsUser(intent, options, user); + return; + } + // if worker + onStarted are supplied, run blocking activity launch call in the background + worker.post(new Runnable(){ + @Override + public void run() { + try { + WaitResult result = ActivityManagerNative.getDefault().startActivityAndWait( + null /*caller*/, + intent, + intent.resolveTypeIfNeeded(getContext().getContentResolver()), + null /*resultTo*/, + null /*resultWho*/, + 0 /*requestCode*/, + Intent.FLAG_ACTIVITY_NEW_TASK, + null /*profileFile*/, + null /*profileFd*/, + options, + user.getIdentifier()); + if (DEBUG) Log.d(TAG, String.format("waitResult[%s,%s,%s,%s] at %s", + result.result, result.thisTime, result.totalTime, result.who, + SystemClock.uptimeMillis())); + } catch (RemoteException e) { + Log.w(TAG, "Error starting activity", e); + return; + } + try { + onStarted.run(); + } catch (Throwable t) { + Log.w(TAG, "Error running onStarted callback", t); + } + }}); + } + private Intent getCameraIntent() { return getLockPatternUtils().isSecure() ? SECURE_CAMERA_INTENT : INSECURE_CAMERA_INTENT; } 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 c0095de..8ca6d2a 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardFaceUnlockView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardFaceUnlockView.java @@ -16,6 +16,7 @@ package com.android.internal.policy.impl.keyguard; import android.content.Context; +import android.graphics.drawable.Drawable; import android.os.PowerManager; import android.telephony.TelephonyManager; import android.util.AttributeSet; @@ -37,6 +38,9 @@ public class KeyguardFaceUnlockView extends LinearLayout implements KeyguardSecu private BiometricSensorUnlock mBiometricUnlock; private View mFaceUnlockAreaView; private ImageButton mCancelButton; + private SecurityMessageDisplay mSecurityMessageDisplay; + private View mEcaView; + private Drawable mBouncerFrame; private boolean mIsShowing = false; private final Object mIsShowingLock = new Object(); @@ -54,6 +58,13 @@ public class KeyguardFaceUnlockView extends LinearLayout implements KeyguardSecu super.onFinishInflate(); initializeBiometricUnlockView(); + + mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this); + mEcaView = findViewById(R.id.keyguard_selector_fade_container); + View bouncerFrameView = findViewById(R.id.keyguard_bouncer_frame); + if (bouncerFrameView != null) { + mBouncerFrame = bouncerFrameView.getBackground(); + } } @Override @@ -217,4 +228,17 @@ public class KeyguardFaceUnlockView extends LinearLayout implements KeyguardSecu @Override public void showUsabilityHint() { } + + @Override + public void showBouncer(int duration) { + KeyguardSecurityViewHelper. + showBouncer(mSecurityMessageDisplay, mEcaView, mBouncerFrame, duration); + } + + @Override + public void hideBouncer(int duration) { + KeyguardSecurityViewHelper. + hideBouncer(mSecurityMessageDisplay, mEcaView, mBouncerFrame, duration); + } + } 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 ca3d0a2..1f31482 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java @@ -29,8 +29,6 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentSender; -import android.content.pm.ActivityInfo; -import android.content.pm.PackageManager; import android.content.pm.UserInfo; import android.content.res.Resources; import android.graphics.Canvas; @@ -50,7 +48,6 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; -import android.view.accessibility.AccessibilityNodeInfo; import android.view.animation.AnimationUtils; import android.widget.RemoteViews.OnClickHandler; @@ -59,7 +56,6 @@ import com.android.internal.policy.impl.keyguard.KeyguardSecurityModel.SecurityM import com.android.internal.widget.LockPatternUtils; import java.io.File; -import java.util.ArrayList; import java.util.List; public class KeyguardHostView extends KeyguardViewBase { @@ -68,15 +64,14 @@ public class KeyguardHostView extends KeyguardViewBase { // Use this to debug all of keyguard public static boolean DEBUG = KeyguardViewMediator.DEBUG; - // also referenced in SecuritySettings.java static final int APPWIDGET_HOST_ID = 0x4B455947; private AppWidgetHost mAppWidgetHost; + private AppWidgetManager mAppWidgetManager; private KeyguardWidgetPager mAppWidgetContainer; private KeyguardSecurityViewFlipper mSecurityViewContainer; private KeyguardSelectorView mKeyguardSelectorView; private KeyguardTransportControlView mTransportControl; - private boolean mEnableMenuKey; private boolean mIsVerifyUnlockOnly; private boolean mEnableFallback; // TODO: This should get the value from KeyguardPatternView private SecurityMode mCurrentSecuritySelection = SecurityMode.Invalid; @@ -113,10 +108,9 @@ public class KeyguardHostView extends KeyguardViewBase { mLockPatternUtils = new LockPatternUtils(context); mAppWidgetHost = new AppWidgetHost( context, APPWIDGET_HOST_ID, mOnClickHandler, Looper.myLooper()); + mAppWidgetManager = AppWidgetManager.getInstance(mContext); mSecurityModel = new KeyguardSecurityModel(context); - // The following enables the MENU key to work for testing automation - mEnableMenuKey = shouldEnableMenuKey(); mViewStateManager = new KeyguardViewStateManager(); } @@ -153,15 +147,13 @@ public class KeyguardHostView extends KeyguardViewBase { protected void onFinishInflate() { // Grab instances of and make any necessary changes to the main layouts. Create // view state manager and wire up necessary listeners / callbacks. + View deleteDropTarget = findViewById(R.id.keyguard_widget_pager_delete_target); mAppWidgetContainer = (KeyguardWidgetPager) findViewById(R.id.app_widget_container); mAppWidgetContainer.setVisibility(VISIBLE); mAppWidgetContainer.setCallbacks(mWidgetCallbacks); + mAppWidgetContainer.setDeleteDropTarget(deleteDropTarget); mAppWidgetContainer.setMinScale(0.5f); - addDefaultWidgets(); - addWidgetsFromSettings(); - mSwitchPageRunnable.run(); - SlidingChallengeLayout slider = (SlidingChallengeLayout) findViewById(R.id.sliding_layout); if (slider != null) { @@ -177,14 +169,18 @@ public class KeyguardHostView extends KeyguardViewBase { mKeyguardSelectorView = (KeyguardSelectorView) findViewById(R.id.keyguard_selector_view); mViewStateManager.setSecurityViewContainer(mSecurityViewContainer); - mViewStateManager.showUsabilityHints(); - if (!(mContext instanceof Activity)) { setSystemUiVisibility(getSystemUiVisibility() | View.STATUS_BAR_DISABLE_BACK); } - showPrimarySecurityScreen(false); + addDefaultWidgets(); + addWidgetsFromSettings(); + mSwitchPageRunnable.run(); + // This needs to be called after the pages are all added. + mViewStateManager.showUsabilityHints(); + + showPrimarySecurityScreen(false); updateSecurityViews(); } @@ -200,6 +196,11 @@ public class KeyguardHostView extends KeyguardViewBase { KeyguardSecurityView ksv = (KeyguardSecurityView) view; ksv.setKeyguardCallback(mCallback); ksv.setLockPatternUtils(mLockPatternUtils); + if (mViewStateManager.isBouncing()) { + ksv.showBouncer(0); + } else { + ksv.hideBouncer(0); + } } else { Log.w(TAG, "View " + view + " is not a KeyguardSecurityView"); } @@ -541,7 +542,11 @@ public class KeyguardHostView extends KeyguardViewBase { } }); - mCallback.dismiss(false); + if (mViewStateManager.isChallengeShowing()) { + mViewStateManager.showBouncer(true); + } else { + mCallback.dismiss(false); + } return true; } else { return super.onClickHandler(view, pendingIntent, fillInIntent); @@ -549,8 +554,6 @@ public class KeyguardHostView extends KeyguardViewBase { }; }; - private KeyguardStatusViewManager mKeyguardStatusViewManager; - // Used to ignore callbacks from methods that are no longer current (e.g. face unlock). // This avoids unwanted asynchronous events from messing with the state. private KeyguardSecurityCallback mNullCallback = new KeyguardSecurityCallback() { @@ -590,6 +593,8 @@ public class KeyguardHostView extends KeyguardViewBase { } }; + protected boolean mShowSecurityWhenReturn; + @Override public void reset() { mIsVerifyUnlockOnly = false; @@ -715,6 +720,7 @@ public class KeyguardHostView extends KeyguardViewBase { // biometric unlock to start next time keyguard is shown. KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true); saveStickyWidgetIndex(); + checkAppWidgetConsistency(); showPrimarySecurityScreen(true); getSecurityView(mCurrentSecuritySelection).onPause(); CameraWidgetFrame cameraPage = findCameraPage(); @@ -812,15 +818,16 @@ public class KeyguardHostView extends KeyguardViewBase { } } - private void addWidget(int appId, int pageIndex) { - AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(mContext); - AppWidgetProviderInfo appWidgetInfo = appWidgetManager.getAppWidgetInfo(appId); + private boolean addWidget(int appId, int pageIndex) { + 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); + return false; } } @@ -828,26 +835,29 @@ public class KeyguardHostView extends KeyguardViewBase { new CameraWidgetFrame.Callbacks() { @Override public void onLaunchingCamera() { - SlidingChallengeLayout slider = locateSlider(); - if (slider != null) { - slider.setHandleAlpha(0); - } + setSliderHandleAlpha(0); } @Override - public void onCameraLaunched() { + public void onCameraLaunchedSuccessfully() { if (isCameraPage(mAppWidgetContainer.getCurrentPage())) { mAppWidgetContainer.scrollLeft(); } - SlidingChallengeLayout slider = locateSlider(); - if (slider != null) { - slider.setHandleAlpha(1); - slider.showChallenge(true); - } + setSliderHandleAlpha(1); + mShowSecurityWhenReturn = true; } - private SlidingChallengeLayout locateSlider() { - return (SlidingChallengeLayout) findViewById(R.id.sliding_layout); + @Override + public void onCameraLaunchedUnsuccessfully() { + setSliderHandleAlpha(1); + } + + private void setSliderHandleAlpha(float alpha) { + SlidingChallengeLayout slider = + (SlidingChallengeLayout) findViewById(R.id.sliding_layout); + if (slider != null) { + slider.setHandleAlpha(alpha); + } } }; @@ -890,22 +900,7 @@ public class KeyguardHostView extends KeyguardViewBase { @Override public void run() { - int defaultIconId = 0; - Resources res = KeyguardHostView.this.getContext().getResources(); - ComponentName clock = new ComponentName( - res.getString(R.string.widget_default_package_name), - res.getString(R.string.widget_default_class_name)); - try { - ActivityInfo activityInfo = - mContext.getPackageManager().getActivityInfo(clock, 0); - if (activityInfo != null) { - defaultIconId = activityInfo.icon; - } - } catch (PackageManager.NameNotFoundException e) { - defaultIconId = 0; - } - launchPickActivityIntent(R.string.widget_default, defaultIconId, clock, - LockPatternUtils.EXTRA_DEFAULT_WIDGET); + launchPickActivityIntent(); } }); mCallback.dismiss(false); @@ -916,8 +911,7 @@ public class KeyguardHostView extends KeyguardViewBase { initializeTransportControl(); } - private void launchPickActivityIntent(int defaultLabelId, int defaultIconId, - ComponentName defaultComponentName, String defaultTag) { + private void launchPickActivityIntent() { // Create intent to pick widget Intent pickIntent = new Intent(AppWidgetManager.ACTION_KEYGUARD_APPWIDGET_PICK); @@ -928,22 +922,6 @@ public class KeyguardHostView extends KeyguardViewBase { pickIntent.putExtra(AppWidgetManager.EXTRA_CATEGORY_FILTER, AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD); - // Add an custom entry for the default - AppWidgetProviderInfo defaultInfo = new AppWidgetProviderInfo(); - ArrayList<AppWidgetProviderInfo> extraInfos = new ArrayList<AppWidgetProviderInfo>(); - defaultInfo.label = getResources().getString(defaultLabelId); - defaultInfo.icon = defaultIconId; - defaultInfo.provider = defaultComponentName; - extraInfos.add(defaultInfo); - - ArrayList<Bundle> extraExtras = new ArrayList<Bundle>(); - Bundle b = new Bundle(); - b.putBoolean(defaultTag, true); - extraExtras.add(b); - - // Launch the widget picker - pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_INFO, extraInfos); - pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_EXTRAS, extraExtras); pickIntent.putExtra(Intent.EXTRA_INTENT, getBaseIntent()); pickIntent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK @@ -1024,6 +1002,22 @@ public class KeyguardHostView extends KeyguardViewBase { } } + private int getAddPageIndex() { + 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; + } + return addPageIndex; + } + + private void addDefaultStatusWidget(int index) { + LayoutInflater inflater = LayoutInflater.from(mContext); + View statusWidget = inflater.inflate(R.layout.keyguard_status_view, null, true); + mAppWidgetContainer.addWidget(statusWidget, index); + } + private void addWidgetsFromSettings() { DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); @@ -1036,23 +1030,17 @@ public class KeyguardHostView extends KeyguardViewBase { } } - 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 addPageIndex = getAddPageIndex(); // Add user-selected widget final int[] widgets = mLockPatternUtils.getAppWidgets(); + if (widgets == null) { Log.d(TAG, "Problem reading widgets"); } else { for (int i = widgets.length -1; i >= 0; i--) { if (widgets[i] == LockPatternUtils.ID_DEFAULT_STATUS_WIDGET) { - LayoutInflater inflater = LayoutInflater.from(mContext); - View statusWidget = inflater.inflate(R.layout.keyguard_status_view, null, true); - mAppWidgetContainer.addWidget(statusWidget, addPageIndex + 1); + addDefaultStatusWidget(addPageIndex + 1); } 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 @@ -1061,6 +1049,42 @@ public class KeyguardHostView extends KeyguardViewBase { } } } + checkAppWidgetConsistency(); + } + + public void checkAppWidgetConsistency() { + final int childCount = mAppWidgetContainer.getChildCount(); + boolean widgetPageExists = false; + for (int i = 0; i < childCount; i++) { + if (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); + } + // Use the built-in status/clock view if we can't inflate the default widget + if (!(bindSuccessful && addWidget(appWidgetId, addPageIndex + 1))) { + addDefaultStatusWidget(addPageIndex + 1); + } + mAppWidgetContainer.onAddView( + mAppWidgetContainer.getChildAt(addPageIndex + 1), addPageIndex + 1); + } } Runnable mSwitchPageRunnable = new Runnable() { @@ -1129,6 +1153,14 @@ public class KeyguardHostView extends KeyguardViewBase { if (DEBUG) Log.d(TAG, "Window is " + (hasWindowFocus ? "focused" : "unfocused")); if (!hasWindowFocus) { saveStickyWidgetIndex(); + } else if (mShowSecurityWhenReturn) { + SlidingChallengeLayout slider = + (SlidingChallengeLayout) findViewById(R.id.sliding_layout); + if (slider != null) { + slider.setHandleAlpha(1); + slider.showChallenge(true); + } + mShowSecurityWhenReturn = false; } } @@ -1155,6 +1187,15 @@ public class KeyguardHostView extends KeyguardViewBase { 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; @@ -1273,20 +1314,21 @@ public class KeyguardHostView extends KeyguardViewBase { return !configDisabled || isTestHarness || fileOverride; } - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_MENU && mEnableMenuKey) { - showNextSecurityScreenOrFinish(false); - return true; - } else { - return super.onKeyDown(keyCode, event); - } - } + public void goToUserSwitcher() { mAppWidgetContainer.setCurrentPage(getWidgetPosition(R.id.keyguard_multi_user_selector)); } + public boolean handleMenuKey() { + // The following enables the MENU key to work for testing automation + if (shouldEnableMenuKey()) { + showNextSecurityScreenOrFinish(false); + return true; + } + return false; + } + public boolean handleBackKey() { if (mCurrentSecuritySelection != SecurityMode.None) { mCallback.dismiss(false); diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardMessageArea.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardMessageArea.java index 5e331e1..ee5c4a6 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardMessageArea.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardMessageArea.java @@ -43,7 +43,6 @@ class KeyguardMessageArea extends TextView { static final int SECURITY_MESSAGE_DURATION = 5000; protected static final int FADE_DURATION = 750; - static final String SEPARATOR = " "; // are we showing battery information? boolean mShowingBatteryInfo = false; @@ -143,6 +142,8 @@ class KeyguardMessageArea extends TextView { } }; + private CharSequence mSeparator; + public KeyguardMessageArea(Context context) { this(context, null); } @@ -158,6 +159,8 @@ class KeyguardMessageArea extends TextView { mUpdateMonitor.registerCallback(mInfoCallback); mHandler = new Handler(Looper.myLooper()); + mSeparator = getResources().getString(R.string.kg_text_message_separator); + update(); } @@ -186,23 +189,23 @@ class KeyguardMessageArea extends TextView { setText(status); } - - private CharSequence concat(Object... args) { + private CharSequence concat(CharSequence... args) { StringBuilder b = new StringBuilder(); - for (int i = 0; i < args.length; i++) { - final Object arg = args[i]; - if (arg instanceof CharSequence) { - b.append((CharSequence)args[i]); - b.append(SEPARATOR); - } else if (arg instanceof String) { - b.append((String)args[i]); - b.append(SEPARATOR); + if (!TextUtils.isEmpty(args[0])) { + b.append(args[0]); + } + for (int i = 1; i < args.length; i++) { + CharSequence text = args[i]; + if (!TextUtils.isEmpty(text)) { + if (b.length() > 0) { + b.append(mSeparator); + } + b.append(text); } } return b.toString(); } - CharSequence getCurrentMessage() { return mShowingMessage ? mMessage : null; } @@ -237,22 +240,33 @@ class KeyguardMessageArea extends TextView { } private void hideMessage(int duration, boolean thenUpdate) { - Animator anim = ObjectAnimator.ofFloat(this, "alpha", 0f); - anim.setDuration(duration); - if (thenUpdate) { - anim.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - update(); - } + if (duration > 0) { + Animator anim = ObjectAnimator.ofFloat(this, "alpha", 0f); + anim.setDuration(duration); + if (thenUpdate) { + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + update(); + } }); + } + anim.start(); + } else { + setAlpha(0f); + if (thenUpdate) { + update(); + } } - anim.start(); } private void showMessage(int duration) { - Animator anim = ObjectAnimator.ofFloat(this, "alpha", 1f); - anim.setDuration(duration); - anim.start(); + if (duration > 0) { + Animator anim = ObjectAnimator.ofFloat(this, "alpha", 1f); + anim.setDuration(duration); + anim.start(); + } else { + setAlpha(1f); + } } } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardMultiUserAvatar.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardMultiUserAvatar.java index a21ebe3..7bf2bf9 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardMultiUserAvatar.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardMultiUserAvatar.java @@ -150,6 +150,11 @@ class KeyguardMultiUserAvatar extends FrameLayout { if (active) { KeyguardLinearLayout parent = (KeyguardLinearLayout) getParent(); parent.setTopChild(this); + // TODO: Create an appropriate asset when string changes are possible. + setContentDescription(mUserName.getText() + + ". " + mContext.getString(R.string.user_switched, "")); + } else { + setContentDescription(mUserName.getText()); } } updateVisualsForActive(mActive, animate, SWITCH_ANIMATION_DURATION, onComplete); diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPINView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPINView.java index b7d9990..fa80352 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPINView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPINView.java @@ -65,10 +65,12 @@ public class KeyguardPINView extends KeyguardAbsKeyInputView @Override public void onClick(View v) { doHapticKeyClick(); - verifyPasswordAndUnlock(); + if (mPasswordEntry.isEnabled()) { + verifyPasswordAndUnlock(); + } } }); - ok.setOnHoverListener(new NumPadKey.LiftToActivateListener(getContext())); + ok.setOnHoverListener(new LiftToActivateListener(getContext())); } // The delete button is of the PIN keyboard itself in some (e.g. tablet) layouts, @@ -78,16 +80,22 @@ public class KeyguardPINView extends KeyguardAbsKeyInputView pinDelete.setVisibility(View.VISIBLE); pinDelete.setOnClickListener(new OnClickListener() { public void onClick(View v) { - CharSequence str = mPasswordEntry.getText(); - if (str.length() > 0) { - mPasswordEntry.setText(str.subSequence(0, str.length()-1)); + // check for time-based lockouts + if (mPasswordEntry.isEnabled()) { + CharSequence str = mPasswordEntry.getText(); + if (str.length() > 0) { + mPasswordEntry.setText(str.subSequence(0, str.length()-1)); + } } doHapticKeyClick(); } }); pinDelete.setOnLongClickListener(new View.OnLongClickListener() { public boolean onLongClick(View v) { - mPasswordEntry.setText(""); + // check for time-based lockouts + if (mPasswordEntry.isEnabled()) { + mPasswordEntry.setText(""); + } doHapticKeyClick(); return true; } @@ -104,4 +112,9 @@ public class KeyguardPINView extends KeyguardAbsKeyInputView @Override public void showUsabilityHint() { } + + @Override + public int getWrongPasswordStringId() { + return R.string.kg_wrong_pin; + } } 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 64bbdd3..23ea2e9 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPasswordView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPasswordView.java @@ -195,4 +195,9 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView @Override public void showUsabilityHint() { } + + @Override + public int getWrongPasswordStringId() { + return R.string.kg_wrong_password; + } } 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 82cb44b..3a82687 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPatternView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPatternView.java @@ -23,6 +23,7 @@ import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; import android.content.Context; import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.CountDownTimer; import android.os.SystemClock; @@ -84,6 +85,8 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit }; private Rect mTempRect = new Rect(); private SecurityMessageDisplay mSecurityMessageDisplay; + private View mEcaView; + private Drawable mBouncerFrame; enum FooterMode { Normal, @@ -136,6 +139,11 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit maybeEnableFallback(mContext); mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this); + mEcaView = findViewById(R.id.keyguard_selector_fade_container); + View bouncerFrameView = findViewById(R.id.keyguard_bouncer_frame); + if (bouncerFrameView != null) { + mBouncerFrame = bouncerFrameView.getBackground(); + } } private void updateFooter(FooterMode mode) { @@ -381,7 +389,16 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit public KeyguardSecurityCallback getCallback() { return mCallback; } -} - + @Override + public void showBouncer(int duration) { + KeyguardSecurityViewHelper. + showBouncer(mSecurityMessageDisplay, mEcaView, mBouncerFrame, duration); + } + @Override + public void hideBouncer(int duration) { + KeyguardSecurityViewHelper. + hideBouncer(mSecurityMessageDisplay, mEcaView, mBouncerFrame, duration); + } +} diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityContainer.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityContainer.java index 04ab0a2..375a96a 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityContainer.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityContainer.java @@ -1,20 +1,13 @@ package com.android.internal.policy.impl.keyguard; -import android.animation.Animator; -import android.animation.ObjectAnimator; import android.content.Context; -import android.graphics.Canvas; -import android.graphics.drawable.Drawable; import android.util.AttributeSet; +import android.view.View; import android.widget.FrameLayout; import com.android.internal.R; public class KeyguardSecurityContainer extends FrameLayout { - - private float mBackgroundAlpha; - private Drawable mBackgroundDrawable; - public KeyguardSecurityContainer(Context context, AttributeSet attrs) { this(context, attrs, 0); } @@ -25,44 +18,30 @@ public class KeyguardSecurityContainer extends FrameLayout { public KeyguardSecurityContainer(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - mBackgroundDrawable = context.getResources().getDrawable(R.drawable.kg_bouncer_bg_white); - } - - public void setBackgroundAlpha(float alpha) { - if (Float.compare(mBackgroundAlpha, alpha) != 0) { - mBackgroundAlpha = alpha; - invalidate(); - } } - public float getBackgroundAlpha() { - return mBackgroundAlpha; - } - - @Override - protected void dispatchDraw(Canvas canvas) { - if (mBackgroundAlpha > 0.0f && mBackgroundDrawable != null) { - Drawable bg = mBackgroundDrawable; - bg.setAlpha((int) (mBackgroundAlpha * 255)); - bg.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); - bg.draw(canvas); + KeyguardSecurityViewFlipper getFlipper() { + for (int i = 0; i < getChildCount(); i++) { + View child = getChildAt(i); + if (child instanceof KeyguardSecurityViewFlipper) { + return (KeyguardSecurityViewFlipper) child; + } } - super.dispatchDraw(canvas); + return null; } public void showBouncer(int duration) { - SecurityMessageDisplay message = new KeyguardMessageArea.Helper(this); - message.showBouncer(duration); - Animator anim = ObjectAnimator.ofFloat(this, "BackgroundAlpha", 1f); - anim.setDuration(duration); - anim.start(); + KeyguardSecurityViewFlipper flipper = getFlipper(); + if (flipper != null) { + flipper.showBouncer(duration); + } } public void hideBouncer(int duration) { - SecurityMessageDisplay message = new KeyguardMessageArea.Helper(this); - message.hideBouncer(duration); - Animator anim = ObjectAnimator.ofFloat(this, "BackgroundAlpha", 0f); - anim.setDuration(duration); - anim.start(); + KeyguardSecurityViewFlipper flipper = getFlipper(); + if (flipper != null) { + flipper.hideBouncer(duration); + } } } + 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 2651743..027b16e 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityView.java @@ -66,4 +66,18 @@ public interface KeyguardSecurityView { * */ void showUsabilityHint(); + + /** + * Place the security view into bouncer mode. + * Animate transisiton if duration is non-zero. + * @param duration millisends for the transisiton animation. + */ + void showBouncer(int duration); + + /** + * Place the security view into non-bouncer mode. + * Animate transisiton if duration is non-zero. + * @param duration millisends for the transisiton animation. + */ + void hideBouncer(int duration); } 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 58cf567..3d4cb19 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityViewFlipper.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityViewFlipper.java @@ -125,4 +125,26 @@ public class KeyguardSecurityViewFlipper extends ViewFlipper implements Keyguard ksv.showUsabilityHint(); } } + + @Override + public void showBouncer(int duration) { + 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); + } + } + } + + @Override + public void hideBouncer(int duration) { + 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); + } + } + } } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityViewHelper.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityViewHelper.java new file mode 100644 index 0000000..2ccdc1d --- /dev/null +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityViewHelper.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.policy.impl.keyguard; + +import android.animation.Animator; +import android.animation.ObjectAnimator; +import android.graphics.drawable.Drawable; +import android.view.View; + +/** + * Some common functions that are useful for KeyguardSecurityViews. + */ +public class KeyguardSecurityViewHelper { + + public static void showBouncer(SecurityMessageDisplay securityMessageDisplay, + View ecaView, Drawable bouncerFrame, int duration) { + if (securityMessageDisplay != null) { + securityMessageDisplay.showBouncer(duration); + } + if (ecaView != null) { + if (duration > 0) { + Animator anim = ObjectAnimator.ofFloat(ecaView, "alpha", 0f); + anim.setDuration(duration); + anim.start(); + } else { + ecaView.setAlpha(0f); + } + } + if (bouncerFrame != null) { + if (duration > 0) { + Animator anim = ObjectAnimator.ofInt(bouncerFrame, "alpha", 255); + anim.setDuration(duration); + anim.start(); + } else { + bouncerFrame.setAlpha(255); + } + } + } + + public static void hideBouncer(SecurityMessageDisplay securityMessageDisplay, + View ecaView, Drawable bouncerFrame, int duration) { + if (securityMessageDisplay != null) { + securityMessageDisplay.hideBouncer(duration); + } + if (ecaView != null) { + if (duration > 0) { + Animator anim = ObjectAnimator.ofFloat(ecaView, "alpha", 1f); + anim.setDuration(duration); + anim.start(); + } else { + ecaView.setAlpha(1f); + } + } + if (bouncerFrame != null) { + if (duration > 0) { + Animator anim = ObjectAnimator.ofInt(bouncerFrame, "alpha", 0); + anim.setDuration(duration); + anim.start(); + } else { + bouncerFrame.setAlpha(0); + } + } + } +} 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 938e3bd..9167412 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java @@ -59,7 +59,7 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) .getAssistIntent(mContext, UserHandle.USER_CURRENT); if (assistIntent != null) { - mActivityLauncher.launchActivity(assistIntent, false, true); + mActivityLauncher.launchActivity(assistIntent, false, true, null, null); } else { Log.w(TAG, "Failed to get intent for assist activity"); } @@ -67,7 +67,7 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri break; case com.android.internal.R.drawable.ic_lockscreen_camera: - mActivityLauncher.launchCamera(); + mActivityLauncher.launchCamera(null, null); mCallback.userActivity(0); break; @@ -261,4 +261,12 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri public KeyguardSecurityCallback getCallback() { return mCallback; } + + @Override + public void showBouncer(int duration) { + } + + @Override + public void hideBouncer(int duration) { + } } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSimPinView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSimPinView.java index fcf45ff..ab364ee 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSimPinView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSimPinView.java @@ -16,47 +16,32 @@ package com.android.internal.policy.impl.keyguard; +import com.android.internal.telephony.ITelephony; + +import android.content.Context; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; -import android.content.Context; -import android.graphics.Rect; import android.os.RemoteException; import android.os.ServiceManager; - -import com.android.internal.telephony.ITelephony; -import com.android.internal.widget.LockPatternUtils; -import com.android.internal.widget.PasswordEntryKeyboardHelper; -import com.android.internal.widget.PasswordEntryKeyboardView; -import com.android.internal.R; - import android.text.Editable; +import android.text.InputType; import android.text.TextWatcher; +import android.text.method.DigitsKeyListener; import android.util.AttributeSet; -import android.view.KeyEvent; -import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; -import android.view.inputmethod.EditorInfo; -import android.widget.EditText; -import android.widget.LinearLayout; -import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; +import com.android.internal.R; + /** - * Displays a dialer like interface to unlock the SIM PIN. + * Displays a PIN pad for unlocking. */ -public class KeyguardSimPinView extends LinearLayout +public class KeyguardSimPinView extends KeyguardAbsKeyInputView implements KeyguardSecurityView, OnEditorActionListener, TextWatcher { - private EditText mPinEntry; private ProgressDialog mSimUnlockProgressDialog = null; - private KeyguardSecurityCallback mCallback; - private PasswordEntryKeyboardView mKeyboardView; - private PasswordEntryKeyboardHelper mKeyboardHelper; - private LockPatternUtils mLockPatternUtils; - private SecurityMessageDisplay mSecurityMessageDisplay; - private volatile boolean mSimCheckInProgress; public KeyguardSimPinView(Context context) { @@ -65,68 +50,69 @@ public class KeyguardSimPinView extends LinearLayout public KeyguardSimPinView(Context context, AttributeSet attrs) { super(context, attrs); - mLockPatternUtils = new LockPatternUtils(getContext()); } - public void setKeyguardCallback(KeyguardSecurityCallback callback) { - mCallback = callback; + public void resetState() { + mSecurityMessageDisplay.setMessage(R.string.kg_sim_pin_instructions, true); + mPasswordEntry.setEnabled(true); + } + + @Override + protected int getPasswordTextViewId() { + return R.id.pinEntry; } @Override protected void onFinishInflate() { super.onFinishInflate(); - mPinEntry = (EditText) findViewById(R.id.sim_pin_entry); - mPinEntry.setOnEditorActionListener(this); - mPinEntry.addTextChangedListener(this); - - mKeyboardView = (PasswordEntryKeyboardView) findViewById(R.id.keyboard); - mKeyboardHelper = new PasswordEntryKeyboardHelper(mContext, mKeyboardView, this, false, - new int[] { - R.xml.kg_password_kbd_numeric, - com.android.internal.R.xml.password_kbd_qwerty, - com.android.internal.R.xml.password_kbd_qwerty_shifted, - com.android.internal.R.xml.password_kbd_symbols, - com.android.internal.R.xml.password_kbd_symbols_shift - }); - mKeyboardHelper.setKeyboardMode(PasswordEntryKeyboardHelper.KEYBOARD_MODE_NUMERIC); - mKeyboardHelper.setEnableHaptics(mLockPatternUtils.isTactileFeedbackEnabled()); - - final View deleteButton = findViewById(R.id.delete_button); - if (deleteButton != null) { - deleteButton.setOnClickListener(new OnClickListener() { + final View ok = findViewById(R.id.key_enter); + if (ok != null) { + ok.setOnClickListener(new View.OnClickListener() { + @Override public void onClick(View v) { - mKeyboardHelper.handleBackspace(); + doHapticKeyClick(); + verifyPasswordAndUnlock(); } }); } - mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this); - mSecurityMessageDisplay.setTimeout(0); - reset(); - } - - @Override - protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) { - return mPinEntry.requestFocus(direction, previouslyFocusedRect); - } + // The delete button is of the PIN keyboard itself in some (e.g. tablet) layouts, + // not a separate view + View pinDelete = findViewById(R.id.delete_button); + if (pinDelete != null) { + pinDelete.setVisibility(View.VISIBLE); + pinDelete.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + CharSequence str = mPasswordEntry.getText(); + if (str.length() > 0) { + mPasswordEntry.setText(str.subSequence(0, str.length()-1)); + } + doHapticKeyClick(); + } + }); + pinDelete.setOnLongClickListener(new View.OnLongClickListener() { + public boolean onLongClick(View v) { + mPasswordEntry.setText(""); + doHapticKeyClick(); + return true; + } + }); + } - public void reset() { - // start fresh - mSecurityMessageDisplay.setMessage(R.string.kg_sim_pin_instructions, true); + mPasswordEntry.setKeyListener(DigitsKeyListener.getInstance()); + mPasswordEntry.setInputType(InputType.TYPE_CLASS_NUMBER + | InputType.TYPE_NUMBER_VARIATION_PASSWORD); - // make sure that the number of entered digits is consistent when we - // erase the SIM unlock code, including orientation changes. - mPinEntry.setText(""); - mPinEntry.requestFocus(); + mPasswordEntry.requestFocus(); } @Override public void showUsabilityHint() { } - /** {@inheritDoc} */ - public void cleanUp() { + @Override + public void onPause() { // dismiss the dialog. if (mSimUnlockProgressDialog != null) { mSimUnlockProgressDialog.dismiss(); @@ -167,19 +153,6 @@ public class KeyguardSimPinView extends LinearLayout } } - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - // Check if this was the result of hitting the enter key - mCallback.userActivity(KeyguardViewManager.DIGIT_PRESS_WAKE_MILLIS); - if (event.getAction() == MotionEvent.ACTION_DOWN && ( - actionId == EditorInfo.IME_NULL - || actionId == EditorInfo.IME_ACTION_DONE - || actionId == EditorInfo.IME_ACTION_NEXT)) { - checkPin(); - return true; - } - return false; - } - private Dialog getSimUnlockProgressDialog() { if (mSimUnlockProgressDialog == null) { mSimUnlockProgressDialog = new ProgressDialog(mContext); @@ -195,11 +168,14 @@ public class KeyguardSimPinView extends LinearLayout return mSimUnlockProgressDialog; } - private void checkPin() { - if (mPinEntry.getText().length() < 4) { + @Override + protected void verifyPasswordAndUnlock() { + String entry = mPasswordEntry.getText().toString(); + + if (entry.length() < 4) { // otherwise, display a message to the user, and don't submit. mSecurityMessageDisplay.setMessage(R.string.kg_invalid_sim_pin_hint, true); - mPinEntry.setText(""); + mPasswordEntry.setText(""); mCallback.userActivity(0); return; } @@ -208,7 +184,7 @@ public class KeyguardSimPinView extends LinearLayout if (!mSimCheckInProgress) { mSimCheckInProgress = true; // there should be only one - new CheckSimPin(mPinEntry.getText().toString()) { + new CheckSimPin(mPasswordEntry.getText().toString()) { void onSimCheckResponse(final boolean success) { post(new Runnable() { public void run() { @@ -223,7 +199,7 @@ public class KeyguardSimPinView extends LinearLayout } else { mSecurityMessageDisplay.setMessage (R.string.kg_password_wrong_pin_code, true); - mPinEntry.setText(""); + mPasswordEntry.setText(""); } mCallback.userActivity(0); mSimCheckInProgress = false; @@ -233,40 +209,5 @@ public class KeyguardSimPinView extends LinearLayout }.start(); } } - - public void setLockPatternUtils(LockPatternUtils utils) { - mLockPatternUtils = utils; - } - - public boolean needsInput() { - return false; // This view provides its own keypad - } - - public void onPause() { - - } - - public void onResume() { - reset(); - } - - public KeyguardSecurityCallback getCallback() { - return mCallback; - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - if (mCallback != null) { - mCallback.userActivity(KeyguardViewManager.DIGIT_PRESS_WAKE_MILLIS); - } - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - - @Override - public void afterTextChanged(Editable s) { - } - } + diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSimPukView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSimPukView.java index 0465805..e5b4b73 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSimPukView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSimPukView.java @@ -19,49 +19,30 @@ import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; -import android.graphics.Rect; import android.os.RemoteException; import android.os.ServiceManager; import android.text.Editable; +import android.text.InputType; import android.text.TextWatcher; +import android.text.method.DigitsKeyListener; import android.util.AttributeSet; -import android.view.KeyEvent; -import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; -import android.view.inputmethod.EditorInfo; -import android.widget.LinearLayout; -import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; import com.android.internal.telephony.ITelephony; -import com.android.internal.widget.LockPatternUtils; -import com.android.internal.widget.PasswordEntryKeyboardHelper; -import com.android.internal.widget.PasswordEntryKeyboardView; -import com.android.internal.R; -public class KeyguardSimPukView extends LinearLayout implements View.OnClickListener, - KeyguardSecurityView, OnEditorActionListener, TextWatcher { +import com.android.internal.R; - private View mDeleteButton; +/** + * Displays a PIN pad for entering a PUK (Pin Unlock Kode) provided by a carrier. + */ +public class KeyguardSimPukView extends KeyguardAbsKeyInputView + implements KeyguardSecurityView, OnEditorActionListener, TextWatcher { private ProgressDialog mSimUnlockProgressDialog = null; - private KeyguardSecurityCallback mCallback; - - private SecurityMessageDisplay mSecurityMessageDisplay; - - private PasswordEntryKeyboardView mKeyboardView; - - private PasswordEntryKeyboardHelper mKeyboardHelper; - - private LockPatternUtils mLockPatternUtils; - private volatile boolean mCheckInProgress; - - private TextView mSimPinEntry; - private String mPukText; - private String mPinText; private StateMachine mStateMachine = new StateMachine(); @@ -95,10 +76,11 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList com.android.internal.R.string.lockscreen_sim_unlock_progress_dialog_message; updateSim(); } else { + state = ENTER_PIN; // try again? msg = R.string.kg_invalid_confirm_pin_hint; } } - mSimPinEntry.setText(null); + mPasswordEntry.setText(null); if (msg != 0) { mSecurityMessageDisplay.setMessage(msg, true); } @@ -109,7 +91,7 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList mPukText=""; state = ENTER_PUK; mSecurityMessageDisplay.setMessage(R.string.kg_puk_enter_puk_hint, true); - mSimPinEntry.requestFocus(); + mPasswordEntry.requestFocus(); } } @@ -119,62 +101,71 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList public KeyguardSimPukView(Context context, AttributeSet attrs) { super(context, attrs); - mLockPatternUtils = new LockPatternUtils(getContext()); } - public void setKeyguardCallback(KeyguardSecurityCallback callback) { - mCallback = callback; - mLockPatternUtils = new LockPatternUtils(getContext()); + public void resetState() { + mStateMachine.reset(); + mPasswordEntry.setEnabled(true); } @Override - protected void onFinishInflate() { - super.onFinishInflate(); - mSimPinEntry = (TextView) findViewById(R.id.sim_pin_entry); - mSimPinEntry.setOnEditorActionListener(this); - mSimPinEntry.addTextChangedListener(this); - mDeleteButton = findViewById(R.id.delete_button); - mDeleteButton.setOnClickListener(this); - mKeyboardView = (PasswordEntryKeyboardView) findViewById(R.id.keyboard); - mKeyboardHelper = new PasswordEntryKeyboardHelper(mContext, mKeyboardView, this, false, - new int[] { - R.xml.kg_password_kbd_numeric, - com.android.internal.R.xml.password_kbd_qwerty, - com.android.internal.R.xml.password_kbd_qwerty_shifted, - com.android.internal.R.xml.password_kbd_symbols, - com.android.internal.R.xml.password_kbd_symbols_shift - }); - mKeyboardHelper.setKeyboardMode(PasswordEntryKeyboardHelper.KEYBOARD_MODE_NUMERIC); - mKeyboardHelper.setEnableHaptics(mLockPatternUtils.isTactileFeedbackEnabled()); - - mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this); - mSecurityMessageDisplay.setTimeout(0); // don't show ownerinfo/charging status by default - reset(); + protected int getPasswordTextViewId() { + return R.id.pinEntry; } @Override - protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) { - return mSimPinEntry.requestFocus(direction, previouslyFocusedRect); - } + protected void onFinishInflate() { + super.onFinishInflate(); - public boolean needsInput() { - return false; // This view provides its own keypad - } + final View ok = findViewById(R.id.key_enter); + if (ok != null) { + ok.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + doHapticKeyClick(); + verifyPasswordAndUnlock(); + } + }); + } - public void onPause() { + // The delete button is of the PIN keyboard itself in some (e.g. tablet) layouts, + // not a separate view + View pinDelete = findViewById(R.id.delete_button); + if (pinDelete != null) { + pinDelete.setVisibility(View.VISIBLE); + pinDelete.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + CharSequence str = mPasswordEntry.getText(); + if (str.length() > 0) { + mPasswordEntry.setText(str.subSequence(0, str.length()-1)); + } + doHapticKeyClick(); + } + }); + pinDelete.setOnLongClickListener(new View.OnLongClickListener() { + public boolean onLongClick(View v) { + mPasswordEntry.setText(""); + doHapticKeyClick(); + return true; + } + }); + } - } + mPasswordEntry.setKeyListener(DigitsKeyListener.getInstance()); + mPasswordEntry.setInputType(InputType.TYPE_CLASS_NUMBER + | InputType.TYPE_NUMBER_VARIATION_PASSWORD); + + mPasswordEntry.requestFocus(); - public void onResume() { - reset(); + mSecurityMessageDisplay.setTimeout(0); // don't show ownerinfo/charging status by default } @Override public void showUsabilityHint() { } - /** {@inheritDoc} */ - public void cleanUp() { + @Override + public void onPause() { // dismiss the dialog. if (mSimUnlockProgressDialog != null) { mSimUnlockProgressDialog.dismiss(); @@ -218,23 +209,11 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList } } - public void onClick(View v) { - if (v == mDeleteButton) { - mSimPinEntry.requestFocus(); - final Editable digits = mSimPinEntry.getEditableText(); - final int len = digits.length(); - if (len > 0) { - digits.delete(len-1, len); - } - } - mCallback.userActivity(KeyguardViewManager.DIGIT_PRESS_WAKE_MILLIS); - } - private Dialog getSimUnlockProgressDialog() { if (mSimUnlockProgressDialog == null) { mSimUnlockProgressDialog = new ProgressDialog(mContext); - mSimUnlockProgressDialog.setMessage(mContext.getString( - R.string.kg_sim_unlock_progress_dialog_message)); + mSimUnlockProgressDialog.setMessage( + mContext.getString(R.string.kg_sim_unlock_progress_dialog_message)); mSimUnlockProgressDialog.setIndeterminate(true); mSimUnlockProgressDialog.setCancelable(false); if (!(mContext instanceof Activity)) { @@ -247,8 +226,8 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList private boolean checkPuk() { // make sure the puk is at least 8 digits long. - if (mSimPinEntry.getText().length() >= 8) { - mPukText = mSimPinEntry.getText().toString(); + if (mPasswordEntry.getText().length() >= 8) { + mPukText = mPasswordEntry.getText().toString(); return true; } return false; @@ -256,16 +235,16 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList private boolean checkPin() { // make sure the PIN is between 4 and 8 digits - int length = mSimPinEntry.getText().length(); + int length = mPasswordEntry.getText().length(); if (length >= 4 && length <= 8) { - mPinText = mSimPinEntry.getText().toString(); + mPinText = mPasswordEntry.getText().toString(); return true; } return false; } public boolean confirmPin() { - return mPinText.equals(mSimPinEntry.getText().toString()); + return mPinText.equals(mPasswordEntry.getText().toString()); } private void updateSim() { @@ -295,46 +274,9 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList } @Override - public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { - // Check if this was the result of hitting the enter key - mCallback.userActivity(KeyguardViewManager.DIGIT_PRESS_WAKE_MILLIS); - if (event.getAction() == MotionEvent.ACTION_DOWN) { - if (actionId == EditorInfo.IME_NULL || actionId == EditorInfo.IME_ACTION_DONE - || actionId == EditorInfo.IME_ACTION_NEXT) { - mStateMachine.next(); - return true; - } - } - return false; - } - - @Override - public void setLockPatternUtils(LockPatternUtils utils) { - mLockPatternUtils = utils; - } - - @Override - public void reset() { - mStateMachine.reset(); - } - - @Override - public KeyguardSecurityCallback getCallback() { - return mCallback; - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - if (mCallback != null) { - mCallback.userActivity(KeyguardViewManager.DIGIT_PRESS_WAKE_MILLIS); - } + protected void verifyPasswordAndUnlock() { + mStateMachine.next(); } +} - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - @Override - public void afterTextChanged(Editable s) { - } -} 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 b224c08..7c117d9 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewManager.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewManager.java @@ -137,10 +137,11 @@ public class KeyguardViewManager { @Override public boolean dispatchKeyEvent(KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_DOWN - && event.getKeyCode() == KeyEvent.KEYCODE_BACK - && mKeyguardView != null) { - if (mKeyguardView.handleBackKey()) { + if (event.getAction() == KeyEvent.ACTION_DOWN && mKeyguardView != null) { + int keyCode = event.getKeyCode(); + if (keyCode == KeyEvent.KEYCODE_BACK && mKeyguardView.handleBackKey()) { + return true; + } else if (keyCode == KeyEvent.KEYCODE_MENU && mKeyguardView.handleMenuKey()) { return true; } } 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 fe4ac5b..d0fa81e 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java @@ -520,8 +520,22 @@ public class KeyguardViewMediator { mSystemReady = true; mUpdateMonitor.registerCallback(mUpdateCallback); - // Disable alternate unlock right after boot until things have settled. - mUpdateMonitor.setAlternateUnlockEnabled(false); + // Suppress biometric unlock right after boot until things have settled if it is the + // selected security method, otherwise unsuppress it. It must be unsuppressed if it is + // not the selected security method for the following reason: if the user starts + // without a screen lock selected, the biometric unlock would be suppressed the first + // time they try to use it. + // + // Note that the biometric unlock will still not show if it is not the selected method. + // Calling setAlternateUnlockEnabled(true) simply says don't suppress it if it is the + // selected method. + if (mLockPatternUtils.usingBiometricWeak() + && mLockPatternUtils.isBiometricWeakInstalled()) { + if (DEBUG) Log.d(TAG, "suppressing biometric unlock during boot"); + mUpdateMonitor.setAlternateUnlockEnabled(false); + } else { + mUpdateMonitor.setAlternateUnlockEnabled(true); + } doKeyguardLocked(); } 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 c89e880..969b65e 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewStateManager.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewStateManager.java @@ -21,9 +21,8 @@ import android.view.View; public class KeyguardViewStateManager implements SlidingChallengeLayout.OnChallengeScrolledListener { - private KeyguardWidgetPager mPagedView; + private KeyguardWidgetPager mKeyguardWidgetPager; private ChallengeLayout mChallengeLayout; - private Runnable mHideHintsRunnable; private int[] mTmpPoint = new int[2]; private int[] mTmpLoc = new int[2]; @@ -44,6 +43,7 @@ public class KeyguardViewStateManager implements SlidingChallengeLayout.OnChalle // Paged view state private int mPageListeningToSlider = -1; private int mCurrentPage = -1; + private int mPageIndexOnPageBeginMoving = -1; int mChallengeTop = 0; @@ -51,11 +51,23 @@ public class KeyguardViewStateManager implements SlidingChallengeLayout.OnChalle } public void setPagedView(KeyguardWidgetPager pagedView) { - mPagedView = pagedView; + mKeyguardWidgetPager = pagedView; + updateEdgeSwiping(); } public void setChallengeLayout(ChallengeLayout layout) { mChallengeLayout = layout; + updateEdgeSwiping(); + } + + private void updateEdgeSwiping() { + if (mChallengeLayout != null && mKeyguardWidgetPager != null) { + if (mChallengeLayout.isChallengeOverlapping()) { + mKeyguardWidgetPager.setOnlyAllowEdgeSwipes(true); + } else { + mKeyguardWidgetPager.setOnlyAllowEdgeSwipes(false); + } + } } public boolean isChallengeShowing() { @@ -76,9 +88,28 @@ public class KeyguardViewStateManager implements SlidingChallengeLayout.OnChalle mKeyguardSecurityContainer = container; } + public void showBouncer(boolean show) { + mChallengeLayout.showBouncer(); + } + + public boolean isBouncing() { + return mChallengeLayout.isBouncing(); + } + + public void fadeOutSecurity(int duration) { + ((View) mKeyguardSecurityContainer).animate().alpha(0).setDuration(duration); + } + + public void fadeInSecurity(int duration) { + ((View) mKeyguardSecurityContainer).animate().alpha(1f).setDuration(duration); + } + public void onPageBeginMoving() { - if (mChallengeLayout.isChallengeShowing()) { - mChallengeLayout.showChallenge(false); + if (mChallengeLayout.isChallengeOverlapping() && + mChallengeLayout instanceof SlidingChallengeLayout) { + SlidingChallengeLayout scl = (SlidingChallengeLayout) mChallengeLayout; + scl.fadeOutChallenge(); + mPageIndexOnPageBeginMoving = mKeyguardWidgetPager.getCurrentPage(); } if (mHideHintsRunnable != null) { mMainQueue.removeCallbacks(mHideHintsRunnable); @@ -87,37 +118,49 @@ public class KeyguardViewStateManager implements SlidingChallengeLayout.OnChalle } public void onPageEndMoving() { + mPageIndexOnPageBeginMoving = -1; } - public void showBouncer(boolean show) { - mChallengeLayout.showBouncer(); - } - - public void fadeOutSecurity(int duration) { - ((View) mKeyguardSecurityContainer).animate().alpha(0).setDuration(duration); - } + public void onPageSwitching(View newPage, int newPageIndex) { + if (mKeyguardWidgetPager != null && mChallengeLayout instanceof SlidingChallengeLayout) { + boolean isCameraPage = newPage instanceof CameraWidgetFrame; + ((SlidingChallengeLayout) mChallengeLayout).setChallengeInteractive(!isCameraPage); + } - public void fadeInSecurity(int duration) { - ((View) mKeyguardSecurityContainer).animate().alpha(1f).setDuration(duration); + // If the page we're settling to is the same as we started on, and the action of + // moving the page hid the security, we restore it immediately. + if (mPageIndexOnPageBeginMoving == mKeyguardWidgetPager.getNextPage() && + mChallengeLayout instanceof SlidingChallengeLayout) { + SlidingChallengeLayout scl = (SlidingChallengeLayout) mChallengeLayout; + scl.fadeInChallenge(); + mKeyguardWidgetPager.setWidgetToResetOnPageFadeOut(-1); + } + mPageIndexOnPageBeginMoving = -1; } - public void onPageSwitch(View newPage, int newPageIndex) { + public void onPageSwitched(View newPage, int newPageIndex) { // Reset the previous page size and ensure the current page is sized appropriately. // We only modify the page state if it is not currently under control by the slider. // This prevents conflicts. - if (mPagedView != null && mChallengeLayout != null) { - KeyguardWidgetFrame prevPage = mPagedView.getWidgetPageAt(mCurrentPage); - if (prevPage != null && mCurrentPage != mPageListeningToSlider) { + + // If the page hasn't switched, don't bother with any of this + if (mCurrentPage == newPageIndex) return; + + if (mKeyguardWidgetPager != null && mChallengeLayout != null) { + KeyguardWidgetFrame prevPage = mKeyguardWidgetPager.getWidgetPageAt(mCurrentPage); + if (prevPage != null && mCurrentPage != mPageListeningToSlider && mCurrentPage + != mKeyguardWidgetPager.getWidgetToResetOnPageFadeOut()) { prevPage.resetSize(); } - KeyguardWidgetFrame newCurPage = mPagedView.getWidgetPageAt(newPageIndex); + KeyguardWidgetFrame newCurPage = mKeyguardWidgetPager.getWidgetPageAt(newPageIndex); boolean challengeOverlapping = mChallengeLayout.isChallengeOverlapping(); if (challengeOverlapping && !newCurPage.isSmall() && mPageListeningToSlider != newPageIndex) { newCurPage.shrinkWidget(); } } + mCurrentPage = newPageIndex; } @@ -152,24 +195,22 @@ public class KeyguardViewStateManager implements SlidingChallengeLayout.OnChalle @Override public void onScrollStateChanged(int scrollState) { - if (mPagedView == null || mChallengeLayout == null) return; + if (mKeyguardWidgetPager == null || mChallengeLayout == null) return; boolean challengeOverlapping = mChallengeLayout.isChallengeOverlapping(); if (scrollState == SlidingChallengeLayout.SCROLL_STATE_IDLE) { - KeyguardWidgetFrame frame = mPagedView.getWidgetPageAt(mPageListeningToSlider); + KeyguardWidgetFrame frame = mKeyguardWidgetPager.getWidgetPageAt(mPageListeningToSlider); if (frame == null) return; if (!challengeOverlapping) { - frame.resetSize(); + if (!mKeyguardWidgetPager.isPageMoving()) { + frame.resetSize(); + } else { + mKeyguardWidgetPager.setWidgetToResetOnPageFadeOut(mPageListeningToSlider); + } } - frame.onChallengeActive(mChallengeLayout.isChallengeShowing()); frame.hideFrame(this); - - if (challengeOverlapping) { - mPagedView.setOnlyAllowEdgeSwipes(true); - } else { - mPagedView.setOnlyAllowEdgeSwipes(false); - } + updateEdgeSwiping(); if (mChallengeLayout.isChallengeShowing()) { mKeyguardSecurityContainer.onResume(); @@ -181,8 +222,8 @@ public class KeyguardViewStateManager implements SlidingChallengeLayout.OnChalle // Whether dragging or settling, if the last state was idle, we use this signal // to update the current page who will receive events from the sliding challenge. // We resize the frame as appropriate. - mPageListeningToSlider = mPagedView.getNextPage(); - KeyguardWidgetFrame frame = mPagedView.getWidgetPageAt(mPageListeningToSlider); + mPageListeningToSlider = mKeyguardWidgetPager.getNextPage(); + KeyguardWidgetFrame frame = mKeyguardWidgetPager.getWidgetPageAt(mPageListeningToSlider); if (frame == null) return; frame.showFrame(this); @@ -191,13 +232,11 @@ public class KeyguardViewStateManager implements SlidingChallengeLayout.OnChalle // small to begin with). if (!frame.isSmall()) { // We need to fetch the final page, in case the pages are in motion. - mPageListeningToSlider = mPagedView.getNextPage(); + mPageListeningToSlider = mKeyguardWidgetPager.getNextPage(); frame.shrinkWidget(); } // View is on the move. Pause the security view until it completes. mKeyguardSecurityContainer.onPause(); - - frame.onChallengeActive(true); } mLastScrollState = scrollState; } @@ -205,12 +244,21 @@ public class KeyguardViewStateManager implements SlidingChallengeLayout.OnChalle @Override public void onScrollPositionChanged(float scrollPosition, int challengeTop) { mChallengeTop = challengeTop; - KeyguardWidgetFrame frame = mPagedView.getWidgetPageAt(mPageListeningToSlider); - if (frame != null) { + KeyguardWidgetFrame frame = mKeyguardWidgetPager.getWidgetPageAt(mPageListeningToSlider); + if (frame != null && !mKeyguardWidgetPager.isPageMoving()) { frame.adjustFrame(getChallengeTopRelativeToFrame(frame, mChallengeTop)); } } + private Runnable mHideHintsRunnable = new Runnable() { + @Override + public void run() { + if (mKeyguardWidgetPager != null) { + mKeyguardWidgetPager.hideOutlinesAndSidePages(); + } + } + }; + public void showUsabilityHints() { mMainQueue.postDelayed( new Runnable() { @Override @@ -218,16 +266,10 @@ public class KeyguardViewStateManager implements SlidingChallengeLayout.OnChalle mKeyguardSecurityContainer.showUsabilityHint(); } } , SCREEN_ON_RING_HINT_DELAY); - mPagedView.showInitialPageHints(); - mHideHintsRunnable = new Runnable() { - @Override - public void run() { - mPagedView.hideOutlinesAndSidePages(); - mHideHintsRunnable = null; - } - }; - - mMainQueue.postDelayed(mHideHintsRunnable, SCREEN_ON_HINT_DURATION); + mKeyguardWidgetPager.showInitialPageHints(); + if (mHideHintsRunnable != null) { + mMainQueue.postDelayed(mHideHintsRunnable, SCREEN_ON_HINT_DURATION); + } } public void setTransportState(int state) { diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetCarousel.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetCarousel.java index 2e83b42..debf765 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetCarousel.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetCarousel.java @@ -86,6 +86,17 @@ public class KeyguardWidgetCarousel extends KeyguardWidgetPager { } } + public void showInitialPageHints() { + int count = getChildCount(); + for (int i = 0; i < count; i++) { + KeyguardWidgetFrame child = getWidgetPageAt(i); + if (i >= mCurrentPage - 1 && i <= mCurrentPage + 1) { + child.fadeFrame(this, true, KeyguardWidgetFrame.OUTLINE_ALPHA_MULTIPLIER, + CHILDREN_OUTLINE_FADE_IN_DURATION); + } + } + } + @Override protected void screenScrolled(int screenCenter) { mScreenCenter = screenCenter; 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 b1ff049..213b82f 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java @@ -20,6 +20,7 @@ import android.animation.Animator; import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.appwidget.AppWidgetHostView; +import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; @@ -30,6 +31,7 @@ import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.Shader; import android.graphics.drawable.Drawable; +import android.os.Handler; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; @@ -42,6 +44,10 @@ public class KeyguardWidgetFrame extends FrameLayout { new PorterDuffXfermode(PorterDuff.Mode.ADD); static final float OUTLINE_ALPHA_MULTIPLIER = 0.6f; + static final int HOVER_OVER_DELETE_DROP_TARGET_OVERLAY_COLOR = 0x99FF0000; + + // Temporarily disable this for the time being until we know why the gfx is messing up + static final boolean ENABLE_HOVER_OVER_DELETE_DROP_TARGET_OVERLAY = true; private int mGradientColor; private LinearGradient mForegroundGradient; @@ -56,13 +62,28 @@ public class KeyguardWidgetFrame extends FrameLayout { private CheckLongPressHelper mLongPressHelper; private Animator mFrameFade; private boolean mIsSmall = false; + private Handler mWorkerHandler; private float mBackgroundAlpha; private float mContentAlpha; 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. private int mSmallWidgetHeight; + private int mSmallFrameHeight; + private boolean mWidgetLockedSmall = false; + private int mMaxChallengeTop = -1; + private int mFrameStrokeAdjustment; + + // This will hold the width value before we've actually been measured + private int mFrameHeight; + + private boolean mIsHoveringOverDeleteDropTarget; // Multiple callers may try and adjust the alpha of the frame. When a caller shows // the outlines, we give that caller control, and nobody else can fade them out. @@ -85,9 +106,12 @@ public class KeyguardWidgetFrame extends FrameLayout { Resources res = context.getResources(); // TODO: this padding should really correspond to the padding embedded in the background // drawable (ie. outlines). + float density = res.getDisplayMetrics().density; int padding = (int) (res.getDisplayMetrics().density * 8); setPadding(padding, padding, padding, padding); + mFrameStrokeAdjustment = (int) (2 * density); + mBackgroundDrawable = res.getDrawable(R.drawable.kg_bouncer_bg_white); mGradientColor = res.getColor(com.android.internal.R.color.kg_widget_pager_gradient); mGradientPaint.setXfermode(sAddBlendMode); @@ -98,8 +122,13 @@ public class KeyguardWidgetFrame extends FrameLayout { cancelLongPress(); } - public void setMaxChallengeTop(int top) { - mSmallWidgetHeight = top - getPaddingTop(); + void setIsHoveringOverDeleteDropTarget(boolean isHovering) { + if (ENABLE_HOVER_OVER_DELETE_DROP_TARGET_OVERLAY) { + if (mIsHoveringOverDeleteDropTarget != isHovering) { + mIsHoveringOverDeleteDropTarget = isHovering; + invalidate(); + } + } } @Override @@ -163,6 +192,12 @@ public class KeyguardWidgetFrame extends FrameLayout { c.drawRect(mForegroundRect, mGradientPaint); } + private void drawHoveringOverDeleteOverlay(Canvas c) { + if (mIsHoveringOverDeleteDropTarget) { + c.drawColor(HOVER_OVER_DELETE_DROP_TARGET_OVERLAY_COLOR); + } + } + protected void drawBg(Canvas canvas) { if (mBackgroundAlpha > 0.0f) { Drawable bg = mBackgroundDrawable; @@ -175,9 +210,16 @@ public class KeyguardWidgetFrame extends FrameLayout { @Override protected void dispatchDraw(Canvas canvas) { + if (ENABLE_HOVER_OVER_DELETE_DROP_TARGET_OVERLAY) { + canvas.save(); + } drawBg(canvas); super.dispatchDraw(canvas); drawGradientOverlay(canvas); + if (ENABLE_HOVER_OVER_DELETE_DROP_TARGET_OVERLAY) { + drawHoveringOverDeleteOverlay(canvas); + canvas.restore(); + } } /** @@ -220,8 +262,10 @@ public class KeyguardWidgetFrame extends FrameLayout { View content = getContent(); if (content instanceof AppWidgetHostView) { return ((AppWidgetHostView) content).getAppWidgetId(); - } else { + } else if (content instanceof KeyguardStatusView) { return ((KeyguardStatusView) content).getAppWidgetId(); + } else { + return AppWidgetManager.INVALID_APPWIDGET_ID; } } @@ -260,22 +304,6 @@ public class KeyguardWidgetFrame extends FrameLayout { } /** - * Set the top location of the challenge. - * - * @param top The top of the challenge, in _local_ coordinates, or -1 to indicate the challenge - * is down. - */ - private void setChallengeTop(int top, boolean updateWidgetSize) { - // The widget starts below the padding, and extends to the top of the challengs. - int widgetHeight = top - getPaddingTop(); - int frameHeight = top + getPaddingBottom(); - setFrameHeight(frameHeight); - if (updateWidgetSize) { - setWidgetHeight(widgetHeight); - } - } - - /** * Depending on whether the security is up, the widget size needs to change * * @param height The height of the widget, -1 for full height @@ -295,37 +323,61 @@ public class KeyguardWidgetFrame extends FrameLayout { } } + public void setMaxChallengeTop(int top) { + boolean dirty = mMaxChallengeTop != top; + mSmallWidgetHeight = top - getPaddingTop(); + mSmallFrameHeight = top + getPaddingBottom(); + if (dirty && mIsSmall) { + setWidgetHeight(mSmallWidgetHeight); + setFrameHeight(mSmallFrameHeight); + } else if (dirty && mWidgetLockedSmall) { + setWidgetHeight(mSmallWidgetHeight); + } + } + public boolean isSmall() { return mIsSmall; } public void adjustFrame(int challengeTop) { - setChallengeTop(challengeTop, false); + int frameHeight = challengeTop + getPaddingBottom(); + setFrameHeight(frameHeight); } public void shrinkWidget() { mIsSmall = true; - setChallengeTop(mSmallWidgetHeight, true); + setWidgetHeight(mSmallWidgetHeight); + setFrameHeight(mSmallFrameHeight); + } + + public void setWidgetLockedSmall(boolean locked) { + if (locked) { + setWidgetHeight(mSmallWidgetHeight); + } + mWidgetLockedSmall = locked; } public void resetSize() { mIsSmall = false; + if (!mWidgetLockedSmall) { + setWidgetHeight(LayoutParams.MATCH_PARENT); + } setFrameHeight(getMeasuredHeight()); - setWidgetHeight(LayoutParams.MATCH_PARENT); } public void setFrameHeight(int height) { - height = Math.min(height, getMeasuredHeight()); - mBackgroundRect.set(0, 0, getMeasuredWidth(), height); + mFrameHeight = height; + mBackgroundRect.set(0, 0, getMeasuredWidth(), Math.min(mFrameHeight, getMeasuredHeight())); invalidate(); } public void hideFrame(Object caller) { - fadeFrame(caller, false, 0f, 150); + fadeFrame(caller, false, 0f, KeyguardWidgetPager.CHILDREN_OUTLINE_FADE_OUT_DURATION); } public void showFrame(Object caller) { - fadeFrame(caller, true, OUTLINE_ALPHA_MULTIPLIER, 150); + fadeFrame(caller, true, OUTLINE_ALPHA_MULTIPLIER, + KeyguardWidgetPager.CHILDREN_OUTLINE_FADE_IN_DURATION); } public void fadeFrame(Object caller, boolean takeControl, float alpha, int duration) { @@ -348,23 +400,61 @@ public class KeyguardWidgetFrame extends FrameLayout { @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); - mForegroundRect.set(getPaddingLeft(), getPaddingTop(), - w - getPaddingRight(), h - getPaddingBottom()); + + // mFrameStrokeAdjustment is a cludge to prevent the overlay from drawing outside the + // rounded rect background. + mForegroundRect.set(mFrameStrokeAdjustment, mFrameStrokeAdjustment, + w - mFrameStrokeAdjustment, h - mFrameStrokeAdjustment); + 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); - mBackgroundRect.set(0, 0, w, h); + + if (!mIsSmall) { + mFrameHeight = h; + } + + mBackgroundRect.set(0, 0, getMeasuredWidth(), Math.min(h, mFrameHeight)); invalidate(); } + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + performAppWidgetSizeCallbacksIfNecessary(); + } + + private void performAppWidgetSizeCallbacksIfNecessary() { + View content = getContent(); + if (!(content instanceof AppWidgetHostView)) return; + + boolean sizeDirty = content.getMeasuredWidth() != mLastMeasuredWidth || + content.getMeasuredHeight() != mLastMeasuredHeight; + if (sizeDirty) { + + } + + AppWidgetHostView awhv = (AppWidgetHostView) content; + float density = getResources().getDisplayMetrics().density; + + int width = (int) (content.getMeasuredWidth() / density); + int height = (int) (content.getMeasuredHeight() / density); + awhv.updateAppWidgetSize(null, width, height, width, height, true); + } + void setOverScrollAmount(float r, boolean left) { if (Float.compare(mOverScrollAmount, r) != 0) { mOverScrollAmount = r; mForegroundGradient = left ? mLeftToRightGradient : mRightToLeftGradient; - mForegroundAlpha = (int) Math.round((0.85f * r * 255)); + mForegroundAlpha = (int) Math.round((0.5f * r * 255)); + + // We bump up the alpha of the outline to hide the fact that the overlay is drawing + // over the rounded part of the frame. + float bgAlpha = Math.min(OUTLINE_ALPHA_MULTIPLIER + r * (1 - OUTLINE_ALPHA_MULTIPLIER), + 1f); + setBackgroundAlpha(bgAlpha); invalidate(); } } @@ -373,12 +463,16 @@ public class KeyguardWidgetFrame extends FrameLayout { // hook for subclasses } - public boolean onUserInteraction(int action) { + public boolean onUserInteraction(MotionEvent event) { // hook for subclasses return false; } - public void onChallengeActive(boolean challengeActive) { - // hook for subclasses + public void setWorkerHandler(Handler workerHandler) { + mWorkerHandler = workerHandler; + } + + public Handler getWorkerHandler() { + return mWorkerHandler; } } 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 f04c4df..7943b23 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetPager.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetPager.java @@ -21,6 +21,8 @@ import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.animation.TimeInterpolator; +import android.appwidget.AppWidgetHostView; +import android.appwidget.AppWidgetProviderInfo; import android.content.Context; import android.content.res.Resources; import android.os.Handler; @@ -31,9 +33,9 @@ import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.View.OnLongClickListener; +import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; -import android.view.ViewGroup; import android.widget.FrameLayout; import com.android.internal.R; @@ -53,13 +55,10 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit private LockPatternUtils mLockPatternUtils; // Related to the fading in / out background outlines - private static final int CHILDREN_OUTLINE_FADE_OUT_DURATION = 375; - private static final int CHILDREN_OUTLINE_FADE_IN_DURATION = 75; + public static final int CHILDREN_OUTLINE_FADE_OUT_DURATION = 375; + public static final int CHILDREN_OUTLINE_FADE_IN_DURATION = 100; protected AnimatorSet mChildrenOutlineFadeAnimation; - private float mChildrenOutlineAlpha = 0; - private float mSidePagesAlpha = 1f; protected int mScreenCenter; - private boolean mHasLayout = false; private boolean mHasMeasure = false; boolean showHintsAfterLayout = false; @@ -71,9 +70,11 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit private boolean mCameraWidgetEnabled; - // Background threads to deal with persistence - private HandlerThread mBgPersistenceWorkerThread; - private Handler mBgPersistenceWorkerHandler; + private int mWidgetToResetAfterFadeOut; + + // Background worker thread: used here for persistence, also made available to widget frames + private final HandlerThread mBackgroundWorkerThread; + private final Handler mBackgroundWorkerHandler; public KeyguardWidgetPager(Context context, AttributeSet attrs) { this(context, attrs, 0); @@ -93,19 +94,17 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit Resources r = getResources(); mCameraWidgetEnabled = r.getBoolean(R.bool.kg_enable_camera_default_widget); - mBgPersistenceWorkerThread = new HandlerThread("KeyguardWidgetPager Persistence"); - mBgPersistenceWorkerThread.start(); - mBgPersistenceWorkerHandler = new Handler(mBgPersistenceWorkerThread.getLooper()); + mBackgroundWorkerThread = new HandlerThread("KeyguardWidgetPager Worker"); + mBackgroundWorkerThread.start(); + mBackgroundWorkerHandler = new Handler(mBackgroundWorkerThread.getLooper()); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - // Clean up the persistence worker thread - if (mBgPersistenceWorkerThread != null) { - mBgPersistenceWorkerThread.quit(); - } + // Clean up the worker thread + mBackgroundWorkerThread.quit(); } public void setViewStateManager(KeyguardViewStateManager viewStateManager) { @@ -117,7 +116,14 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit } @Override - public void onPageSwitch(View newPage, int newPageIndex) { + public void onPageSwitching(View newPage, int newPageIndex) { + if (mViewStateManager != null) { + mViewStateManager.onPageSwitching(newPage, newPageIndex); + } + } + + @Override + public void onPageSwitched(View newPage, int newPageIndex) { boolean showingStatusWidget = false; if (newPage instanceof ViewGroup) { ViewGroup vg = (ViewGroup) newPage; @@ -156,7 +162,7 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit } } if (mViewStateManager != null) { - mViewStateManager.onPageSwitch(newPage, newPageIndex); + mViewStateManager.onPageSwitched(newPage, newPageIndex); } } @@ -176,11 +182,17 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit @Override public boolean onTouchEvent(MotionEvent ev) { + return captureUserInteraction(ev) || super.onTouchEvent(ev); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + return captureUserInteraction(ev) || super.onInterceptTouchEvent(ev); + } + + private boolean captureUserInteraction(MotionEvent ev) { KeyguardWidgetFrame currentWidgetPage = getWidgetPageAt(getCurrentPage()); - if (currentWidgetPage != null && currentWidgetPage.onUserInteraction(ev.getAction())) { - return true; - } - return super.onTouchEvent(ev); + return currentWidgetPage != null && currentWidgetPage.onUserInteraction(ev); } public void showPagingFeedback() { @@ -216,7 +228,7 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit public void onRemoveView(View v) { final int appWidgetId = ((KeyguardWidgetFrame) v).getContentAppWidgetId(); - mBgPersistenceWorkerHandler.post(new Runnable() { + mBackgroundWorkerHandler.post(new Runnable() { @Override public void run() { mLockPatternUtils.removeAppWidget(appWidgetId); @@ -231,7 +243,7 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit boundByReorderablePages(true, pagesRange); // Subtract from the index to take into account pages before the reorderable // pages (e.g. the "add widget" page) - mBgPersistenceWorkerHandler.post(new Runnable() { + mBackgroundWorkerHandler.post(new Runnable() { @Override public void run() { mLockPatternUtils.addAppWidget(appWidgetId, index - pagesRange[0]); @@ -250,10 +262,23 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); lp.gravity = Gravity.TOP; + // The framework adds a default padding to AppWidgetHostView. We don't need this padding // for the Keyguard, so we override it to be 0. widget.setPadding(0, 0, 0, 0); frame.addView(widget, lp); + + // We set whether or not this widget supports vertical resizing. + if (widget instanceof AppWidgetHostView) { + AppWidgetHostView awhv = (AppWidgetHostView) widget; + AppWidgetProviderInfo info = awhv.getAppWidgetInfo(); + if ((info.resizeMode & AppWidgetProviderInfo.RESIZE_VERTICAL) != 0) { + frame.setWidgetLockedSmall(false); + } else { + // Lock the widget to be small. + frame.setWidgetLockedSmall(true); + } + } } else { frame = (KeyguardWidgetFrame) widget; } @@ -261,6 +286,7 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit ViewGroup.LayoutParams pageLp = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); frame.setOnLongClickListener(this); + frame.setWorkerHandler(mBackgroundWorkerHandler); if (pageIndex == -1) { addView(frame, pageLp); @@ -358,14 +384,14 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit } } - protected void enablePageLayers() { + protected void enablePageContentLayers() { int children = getChildCount(); for (int i = 0; i < children; i++) { getWidgetPageAt(i).enableHardwareLayersForContent(); } } - protected void disablePageLayers() { + protected void disablePageContentLayers() { int children = getChildCount(); for (int i = 0; i < children; i++) { getWidgetPageAt(i).disableHardwareLayersForContent(); @@ -485,7 +511,7 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit @Override protected void onStartReordering() { super.onStartReordering(); - enablePageLayers(); + enablePageContentLayers(); reorderStarting(); } @@ -504,34 +530,33 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit } public void showInitialPageHints() { - if (mHasLayout) { - showOutlinesAndSidePages(); - } else { - // The layout hints depend on layout being run once - showHintsAfterLayout = true; + int count = getChildCount(); + for (int i = 0; i < count; i++) { + KeyguardWidgetFrame child = getWidgetPageAt(i); + if (i != mCurrentPage) { + child.fadeFrame(this, true, KeyguardWidgetFrame.OUTLINE_ALPHA_MULTIPLIER, + CHILDREN_OUTLINE_FADE_IN_DURATION); + child.setContentAlpha(0f); + } else { + child.setBackgroundAlpha(0f); + child.setContentAlpha(1f); + } } } + public void showSidePageHints() { + animateOutlinesAndSidePages(true, -1); + } + @Override public void onAttachedToWindow() { super.onAttachedToWindow(); mHasMeasure = false; - mHasLayout = false; } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); - if (showHintsAfterLayout) { - post(new Runnable() { - @Override - public void run() { - showOutlinesAndSidePages(); - } - }); - showHintsAfterLayout = false; - } - mHasLayout = true; } protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { @@ -549,26 +574,34 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit // coordinate relative to our children, hence we subtract the top padding.s maxChallengeTop = top - getPaddingTop(); challengeShowing = scl.isChallengeShowing(); - } - int count = getChildCount(); - for (int i = 0; i < count; i++) { - KeyguardWidgetFrame frame = getWidgetPageAt(i); - frame.setMaxChallengeTop(maxChallengeTop); - - // On the very first measure pass, if the challenge is showing, we need to make sure - // that the widget on the current page is small. - if (challengeShowing && i == mCurrentPage && !mHasMeasure) { - frame.shrinkWidget(); + int count = getChildCount(); + for (int i = 0; i < count; i++) { + KeyguardWidgetFrame frame = getWidgetPageAt(i); + frame.setMaxChallengeTop(maxChallengeTop); + // On the very first measure pass, if the challenge is showing, we need to make sure + // that the widget on the current page is small. + if (challengeShowing && i == mCurrentPage && !mHasMeasure) { + frame.shrinkWidget(); + } } } super.onMeasure(widthMeasureSpec, heightMeasureSpec); + mHasMeasure = true; } void animateOutlinesAndSidePages(final boolean show) { animateOutlinesAndSidePages(show, -1); } + public void setWidgetToResetOnPageFadeOut(int widget) { + mWidgetToResetAfterFadeOut = widget; + } + + public int getWidgetToResetOnPageFadeOut() { + return mWidgetToResetAfterFadeOut; + } + void animateOutlinesAndSidePages(final boolean show, int duration) { if (mChildrenOutlineFadeAnimation != null) { mChildrenOutlineFadeAnimation.cancel(); @@ -594,6 +627,7 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit finalContentAlpha = 0f; } KeyguardWidgetFrame child = getWidgetPageAt(i); + alpha = PropertyValuesHolder.ofFloat("contentAlpha", finalContentAlpha); ObjectAnimator a = ObjectAnimator.ofPropertyValuesHolder(child, alpha); anims.add(a); @@ -610,55 +644,26 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit @Override public void onAnimationStart(Animator animation) { if (show) { - enablePageLayers(); + enablePageContentLayers(); } } + @Override public void onAnimationEnd(Animator animation) { if (!show) { - disablePageLayers(); + disablePageContentLayers(); + KeyguardWidgetFrame frame = getWidgetPageAt(mWidgetToResetAfterFadeOut); + if (frame != null && !(frame == getWidgetPageAt(mCurrentPage) && + mViewStateManager.isChallengeOverlapping())) { + frame.resetSize(); + } + mWidgetToResetAfterFadeOut = -1; } } }); mChildrenOutlineFadeAnimation.start(); } - public void setChildrenOutlineAlpha(float alpha) { - mChildrenOutlineAlpha = alpha; - for (int i = 0; i < getChildCount(); i++) { - getWidgetPageAt(i).setBackgroundAlpha(alpha); - } - } - - public void setSidePagesAlpha(float alpha) { - // This gives the current page, or the destination page if in transit. - int curPage = getNextPage(); - mSidePagesAlpha = alpha; - for (int i = 0; i < getChildCount(); i++) { - if (curPage != i) { - getWidgetPageAt(i).setContentAlpha(alpha); - } else { - // We lock the current page alpha to 1. - getWidgetPageAt(i).setContentAlpha(1.0f); - } - } - } - - public void setChildrenOutlineMultiplier(float alpha) { - mChildrenOutlineAlpha = alpha; - for (int i = 0; i < getChildCount(); i++) { - getWidgetPageAt(i).setBackgroundAlphaMultiplier(alpha); - } - } - - public float getSidePagesAlpha() { - return mSidePagesAlpha; - } - - public float getChildrenOutlineAlpha() { - return mChildrenOutlineAlpha; - } - @Override public boolean onLongClick(View v) { // Disallow long pressing to reorder if the challenge is showing @@ -695,4 +700,10 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit return indexOfChild((KeyguardWidgetFrame)view.getParent()); } } + + @Override + protected void setPageHoveringOverDeleteDropTarget(int viewIndex, boolean isHovering) { + KeyguardWidgetFrame child = getWidgetPageAt(viewIndex); + child.setIsHoveringOverDeleteDropTarget(isHovering); + } } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/LiftToActivateListener.java b/policy/src/com/android/internal/policy/impl/keyguard/LiftToActivateListener.java new file mode 100644 index 0000000..818108c --- /dev/null +++ b/policy/src/com/android/internal/policy/impl/keyguard/LiftToActivateListener.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.policy.impl.keyguard; + +import android.content.Context; +import android.view.MotionEvent; +import android.view.View; +import android.view.accessibility.AccessibilityManager; + +/** + * Hover listener that implements lift-to-activate interaction for + * accessibility. May be added to multiple views. + */ +class LiftToActivateListener implements View.OnHoverListener { + /** Manager used to query accessibility enabled state. */ + private final AccessibilityManager mAccessibilityManager; + + private boolean mCachedClickableState; + + public LiftToActivateListener(Context context) { + mAccessibilityManager = (AccessibilityManager) context.getSystemService( + Context.ACCESSIBILITY_SERVICE); + } + + @Override + public boolean onHover(View v, MotionEvent event) { + // When touch exploration is turned on, lifting a finger while + // inside the view bounds should perform a click action. + if (mAccessibilityManager.isEnabled() + && mAccessibilityManager.isTouchExplorationEnabled()) { + switch (event.getActionMasked()) { + case MotionEvent.ACTION_HOVER_ENTER: + // Lift-to-type temporarily disables double-tap + // activation by setting the view as not clickable. + mCachedClickableState = v.isClickable(); + v.setClickable(false); + break; + case MotionEvent.ACTION_HOVER_EXIT: + final int x = (int) event.getX(); + final int y = (int) event.getY(); + if ((x > v.getPaddingLeft()) && (y > v.getPaddingTop()) + && (x < v.getWidth() - v.getPaddingRight()) + && (y < v.getHeight() - v.getPaddingBottom())) { + v.performClick(); + } + v.setClickable(mCachedClickableState); + break; + } + } + + // Pass the event to View.onHoverEvent() to handle accessibility. + v.onHoverEvent(event); + + // Consume the event so it doesn't fall through to other views. + return true; + } +}
\ No newline at end of file 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 b38eb28..3bc39eb 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/MultiPaneChallengeLayout.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/MultiPaneChallengeLayout.java @@ -47,6 +47,7 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo private OnBouncerStateChangedListener mBouncerListener; private final Rect mTempRect = new Rect(); + private final Context mContext; private final OnClickListener mScrimClickListener = new OnClickListener() { @Override @@ -66,6 +67,8 @@ 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, @@ -173,6 +176,8 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo 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); @@ -208,28 +213,32 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo mUserSwitcherView = child; if (child.getVisibility() == GONE) continue; - - 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; + 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; + } } } else if (lp.childType == LayoutParams.CHILD_TYPE_SCRIM) { setScrimView(child); diff --git a/policy/src/com/android/internal/policy/impl/keyguard/NumPadKey.java b/policy/src/com/android/internal/policy/impl/keyguard/NumPadKey.java index ca36007..a0038bc 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/NumPadKey.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/NumPadKey.java @@ -22,9 +22,7 @@ import android.text.SpannableStringBuilder; import android.text.style.TextAppearanceSpan; import android.util.AttributeSet; import android.view.HapticFeedbackConstants; -import android.view.MotionEvent; import android.view.View; -import android.view.accessibility.AccessibilityManager; import android.widget.Button; import android.widget.TextView; @@ -51,7 +49,8 @@ public class NumPadKey extends Button { } } } - if (mTextView != null) { + // check for time-based lockouts + if (mTextView != null && mTextView.isEnabled()) { mTextView.append(String.valueOf(mDigit)); } doHapticKeyClick(); @@ -75,6 +74,7 @@ public class NumPadKey extends Button { setOnClickListener(mListener); setOnHoverListener(new LiftToActivateListener(context)); + setAccessibilityDelegate(new ObscureSpeechDelegate(context)); mEnableHaptics = new LockPatternUtils(context).isTactileFeedbackEnabled(); @@ -89,6 +89,7 @@ public class NumPadKey extends Button { final String extra = sKlondike[mDigit]; final int extraLen = extra.length(); if (extraLen > 0) { + builder.append(" "); builder.append(extra); builder.setSpan( new TextAppearanceSpan(context, R.style.TextAppearance_NumPadKey_Klondike), @@ -99,6 +100,14 @@ public class NumPadKey extends Button { setText(builder); } + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + + // Reset the "announced headset" flag when detached. + ObscureSpeechDelegate.sAnnouncedHeadset = false; + } + public void setTextView(TextView tv) { mTextView = tv; } @@ -116,45 +125,4 @@ public class NumPadKey extends Button { | HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); } } - - /** - * Hover listener that implements lift-to-activate interaction for - * accessibility. May be added to multiple views. - */ - static class LiftToActivateListener implements View.OnHoverListener { - /** Manager used to query accessibility enabled state. */ - private final AccessibilityManager mAccessibilityManager; - - public LiftToActivateListener(Context context) { - mAccessibilityManager = (AccessibilityManager) context.getSystemService( - Context.ACCESSIBILITY_SERVICE); - } - - @Override - public boolean onHover(View v, MotionEvent event) { - // When touch exploration is turned on, lifting a finger while - // inside the view bounds should perform a click action. - if (mAccessibilityManager.isEnabled() - && mAccessibilityManager.isTouchExplorationEnabled()) { - switch (event.getActionMasked()) { - case MotionEvent.ACTION_HOVER_ENTER: - // Lift-to-type temporarily disables double-tap - // activation. - v.setClickable(false); - break; - case MotionEvent.ACTION_HOVER_EXIT: - final int x = (int) event.getX(); - final int y = (int) event.getY(); - if ((x > v.getPaddingLeft()) && (y > v.getPaddingTop()) - && (x < v.getWidth() - v.getPaddingRight()) - && (y < v.getHeight() - v.getPaddingBottom())) { - v.performClick(); - } - v.setClickable(true); - break; - } - } - return false; - } - } } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/ObscureSpeechDelegate.java b/policy/src/com/android/internal/policy/impl/keyguard/ObscureSpeechDelegate.java new file mode 100644 index 0000000..af043ab --- /dev/null +++ b/policy/src/com/android/internal/policy/impl/keyguard/ObscureSpeechDelegate.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.policy.impl.keyguard; + +import android.content.ContentResolver; +import android.content.Context; +import android.media.AudioManager; +import android.provider.Settings; +import android.view.View; +import android.view.View.AccessibilityDelegate; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; + +import com.android.internal.R; + +/** + * Accessibility delegate that obscures speech for a view when the user has + * not turned on the "speak passwords" preference and is not listening + * through headphones. + */ +class ObscureSpeechDelegate extends AccessibilityDelegate { + /** Whether any client has announced the "headset" notification. */ + static boolean sAnnouncedHeadset = false; + + private final ContentResolver mContentResolver; + private final AudioManager mAudioManager; + + public ObscureSpeechDelegate(Context context) { + mContentResolver = context.getContentResolver(); + mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); + } + + @Override + public void sendAccessibilityEvent(View host, int eventType) { + super.sendAccessibilityEvent(host, eventType); + + // Play the "headset required" announcement the first time the user + // places accessibility focus on a key. + if ((eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) + && !sAnnouncedHeadset && shouldObscureSpeech()) { + sAnnouncedHeadset = true; + host.announceForAccessibility(host.getContext().getString( + R.string.keyboard_headset_required_to_hear_password)); + } + } + + @Override + public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) { + super.onPopulateAccessibilityEvent(host, event); + + if ((event.getEventType() != AccessibilityEvent.TYPE_ANNOUNCEMENT) + && shouldObscureSpeech()) { + event.getText().clear(); + event.setContentDescription(host.getContext().getString( + R.string.keyboard_password_character_no_headset)); + } + } + + @Override + public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(host, info); + + if (shouldObscureSpeech()) { + final Context ctx = host.getContext(); + info.setText(null); + info.setContentDescription( + ctx.getString(R.string.keyboard_password_character_no_headset)); + } + } + + @SuppressWarnings("deprecation") + private boolean shouldObscureSpeech() { + // The user can optionally force speaking passwords. + if (Settings.Secure.getInt(mContentResolver, + Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD, 0) != 0) { + return false; + } + + // Always speak if the user is listening through headphones. + if (mAudioManager.isWiredHeadsetOn() || mAudioManager.isBluetoothA2dpOn()) { + return false; + } + + // Don't speak since this key is used to type a password. + return true; + } +}
\ No newline at end of file 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 6eeada5..00a0aed 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/PagedView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/PagedView.java @@ -48,6 +48,7 @@ import android.view.accessibility.AccessibilityNodeInfo; import android.view.animation.AnimationUtils; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; +import android.view.animation.LinearInterpolator; import android.widget.Scroller; import com.android.internal.R; @@ -205,6 +206,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc protected int REORDERING_ZOOM_IN_OUT_DURATION = 250; private int REORDERING_SIDE_PAGE_HOVER_TIMEOUT = 300; private float REORDERING_SIDE_PAGE_BUFFER_PERCENTAGE = 0.1f; + private long REORDERING_DELETE_DROP_TARGET_FADE_DURATION = 150; private float mMinScale = 1f; protected View mDragView; private AnimatorSet mZoomInOutAnim; @@ -228,18 +230,25 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc // Convenience/caching private Matrix mTmpInvMatrix = new Matrix(); private float[] mTmpPoint = new float[2]; + private Rect mTmpRect = new Rect(); // Fling to delete private int FLING_TO_DELETE_FADE_OUT_DURATION = 350; private float FLING_TO_DELETE_FRICTION = 0.035f; // The degrees specifies how much deviation from the up vector to still consider a fling "up" - private float FLING_TO_DELETE_MAX_FLING_DEGREES = 35f; - private int FLING_TO_DELETE_SLIDE_IN_SIDE_PAGE_DURATION = 250; + private float FLING_TO_DELETE_MAX_FLING_DEGREES = 65f; protected int mFlingToDeleteThresholdVelocity = -1400; - private boolean mIsFlingingToDelete = false; + // Drag to delete + private boolean mDeferringForDelete = false; + private int DELETE_SLIDE_IN_SIDE_PAGE_DURATION = 250; + private int DRAG_TO_DELETE_FADE_OUT_DURATION = 350; + + // Drop to delete + private View mDeleteDropTarget; public interface PageSwitchListener { - void onPageSwitch(View newPage, int newPageIndex); + void onPageSwitching(View newPage, int newPageIndex); + void onPageSwitched(View newPage, int newPageIndex); } public PagedView(Context context) { @@ -293,19 +302,23 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc setOnHierarchyChangeListener(this); } + void setDeleteDropTarget(View v) { + mDeleteDropTarget = v; + } + // Convenience methods to map points from self to parent and vice versa - float[] mapPointFromSelfToParent(float x, float y) { + float[] mapPointFromViewToParent(View v, float x, float y) { mTmpPoint[0] = x; mTmpPoint[1] = y; - getMatrix().mapPoints(mTmpPoint); - mTmpPoint[0] += getLeft(); - mTmpPoint[1] += getTop(); + v.getMatrix().mapPoints(mTmpPoint); + mTmpPoint[0] += v.getLeft(); + mTmpPoint[1] += v.getTop(); return mTmpPoint; } - float[] mapPointFromParentToSelf(float x, float y) { - mTmpPoint[0] = x - getLeft(); - mTmpPoint[1] = y - getTop(); - getMatrix().invert(mTmpInvMatrix); + float[] mapPointFromParentToView(View v, float x, float y) { + mTmpPoint[0] = x - v.getLeft(); + mTmpPoint[1] = y - v.getTop(); + v.getMatrix().invert(mTmpInvMatrix); mTmpInvMatrix.mapPoints(mTmpPoint); return mTmpPoint; } @@ -328,7 +341,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc public void setScaleX(float scaleX) { super.setScaleX(scaleX); if (isReordering(true)) { - float[] p = mapPointFromParentToSelf(mParentDownMotionX, mParentDownMotionY); + float[] p = mapPointFromParentToView(this, mParentDownMotionX, mParentDownMotionY); mLastMotionX = p[0]; mLastMotionY = p[1]; updateDragViewTranslationDuringDrag(); @@ -356,7 +369,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc public void setPageSwitchListener(PageSwitchListener pageSwitchListener) { mPageSwitchListener = pageSwitchListener; if (mPageSwitchListener != null) { - mPageSwitchListener.onPageSwitch(getPageAt(mCurrentPage), mCurrentPage); + mPageSwitchListener.onPageSwitched(getPageAt(mCurrentPage), mCurrentPage); } } @@ -415,6 +428,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc * Sets the current page. */ void setCurrentPage(int currentPage) { + notifyPageSwitching(currentPage); if (!mScroller.isFinished()) { mScroller.abortAnimation(); } @@ -428,7 +442,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc mCurrentPage = Math.max(0, Math.min(currentPage, getPageCount() - 1)); updateCurrentPageScroll(); updateScrollingIndicator(); - notifyPageSwitchListener(); + notifyPageSwitched(); invalidate(); } @@ -436,9 +450,15 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc mOnlyAllowEdgeSwipes = enable; } - protected void notifyPageSwitchListener() { + protected void notifyPageSwitching(int whichPage) { if (mPageSwitchListener != null) { - mPageSwitchListener.onPageSwitch(getPageAt(mCurrentPage), mCurrentPage); + mPageSwitchListener.onPageSwitching(getPageAt(whichPage), whichPage); + } + } + + protected void notifyPageSwitched() { + if (mPageSwitchListener != null) { + mPageSwitchListener.onPageSwitched(getPageAt(mCurrentPage), mCurrentPage); } } @@ -511,7 +531,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc // Update the last motion events when scrolling if (isReordering(true)) { - float[] p = mapPointFromParentToSelf(mParentDownMotionX, mParentDownMotionY); + float[] p = mapPointFromParentToView(this, mParentDownMotionX, mParentDownMotionY); mLastMotionX = p[0]; mLastMotionY = p[1]; updateDragViewTranslationDuringDrag(); @@ -532,13 +552,14 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc } else if (mNextPage != INVALID_PAGE) { mCurrentPage = Math.max(0, Math.min(mNextPage, getPageCount() - 1)); mNextPage = INVALID_PAGE; - notifyPageSwitchListener(); + notifyPageSwitched(); // We don't want to trigger a page end moving unless the page has settled // and the user has stopped scrolling if (mTouchState == TOUCH_STATE_REST) { pageEndMoving(); } + onPostReorderingAnimationCompleted(); return true; } @@ -632,7 +653,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc // ensure that the cache is filled with good values. invalidateCachedOffsets(); - if (mChildCountOnLastMeasure != getChildCount() && !mIsFlingingToDelete) { + if (mChildCountOnLastMeasure != getChildCount() && !mDeferringForDelete) { setCurrentPage(mCurrentPage); } mChildCountOnLastMeasure = getChildCount(); @@ -856,7 +877,6 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc final int pageCount = getChildCount(); if (pageCount > 0) { getVisiblePages(mTempVisiblePagesRange); - boundByReorderablePages(isReordering(false), mTempVisiblePagesRange); final int leftScreen = mTempVisiblePagesRange[0]; final int rightScreen = mTempVisiblePagesRange[1]; if (leftScreen != -1 && rightScreen != -1) { @@ -1038,7 +1058,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc mDownScrollX = getScrollX(); mLastMotionX = x; mLastMotionY = y; - float[] p = mapPointFromSelfToParent(x, y); + float[] p = mapPointFromViewToParent(this, x, y); mParentDownMotionX = p[0]; mParentDownMotionY = p[1]; mLastMotionXRemainder = 0; @@ -1270,7 +1290,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc mDownMotionX = mLastMotionX = ev.getX(); mDownMotionY = mLastMotionY = ev.getY(); mDownScrollX = getScrollX(); - float[] p = mapPointFromSelfToParent(mLastMotionX, mLastMotionY); + float[] p = mapPointFromViewToParent(this, mLastMotionX, mLastMotionY); mParentDownMotionX = p[0]; mParentDownMotionY = p[1]; mLastMotionXRemainder = 0; @@ -1322,7 +1342,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc // Update the parent down so that our zoom animations take this new movement into // account - float[] pt = mapPointFromSelfToParent(mLastMotionX, mLastMotionY); + float[] pt = mapPointFromViewToParent(this, mLastMotionX, mLastMotionY); mParentDownMotionX = pt[0]; mParentDownMotionY = pt[1]; updateDragViewTranslationDuringDrag(); @@ -1331,11 +1351,16 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc final int dragViewIndex = indexOfChild(mDragView); int bufferSize = (int) (REORDERING_SIDE_PAGE_BUFFER_PERCENTAGE * getViewportWidth()); - int leftBufferEdge = (int) (mapPointFromSelfToParent(mViewport.left, 0)[0] + int leftBufferEdge = (int) (mapPointFromViewToParent(this, mViewport.left, 0)[0] + bufferSize); - int rightBufferEdge = (int) (mapPointFromSelfToParent(mViewport.right, 0)[0] + int rightBufferEdge = (int) (mapPointFromViewToParent(this, mViewport.right, 0)[0] - bufferSize); + // Change the drag view if we are hovering over the drop target + boolean isHoveringOverDelete = isHoveringOverDeleteDropTarget( + (int) mParentDownMotionX, (int) mParentDownMotionY); + setPageHoveringOverDeleteDropTarget(dragViewIndex, isHoveringOverDelete); + if (DEBUG) Log.d(TAG, "leftBufferEdge: " + leftBufferEdge); if (DEBUG) Log.d(TAG, "rightBufferEdge: " + rightBufferEdge); if (DEBUG) Log.d(TAG, "mLastMotionX: " + mLastMotionX); @@ -1352,7 +1377,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc } final int pageUnderPointIndex = pageIndexToSnapTo; - if (pageUnderPointIndex > -1) { + if (pageUnderPointIndex > -1 && !isHoveringOverDelete) { mTempVisiblePagesRange[0] = 0; mTempVisiblePagesRange[1] = getPageCount() - 1; boundByReorderablePages(true, mTempVisiblePagesRange); @@ -1485,13 +1510,29 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc snapToDestination(); } } else if (mTouchState == TOUCH_STATE_REORDERING) { + // Update the last motion position + mLastMotionX = ev.getX(); + mLastMotionY = ev.getY(); + + // Update the parent down so that our zoom animations take this new movement into + // account + float[] pt = mapPointFromViewToParent(this, mLastMotionX, mLastMotionY); + mParentDownMotionX = pt[0]; + mParentDownMotionY = pt[1]; + updateDragViewTranslationDuringDrag(); + boolean handledFling = false; if (!DISABLE_FLING_TO_DELETE) { // Check the velocity and see if we are flinging-to-delete PointF flingToDeleteVector = isFlingingToDelete(); if (flingToDeleteVector != null) { onFlingToDelete(flingToDeleteVector); + handledFling = true; } } + if (!handledFling && isHoveringOverDeleteDropTarget((int) mParentDownMotionX, + (int) mParentDownMotionY)) { + onDropToDelete(); + } } else { onUnhandledTap(ev); } @@ -1743,7 +1784,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc } protected void snapToPage(int whichPage, int delta, int duration, boolean immediate) { mNextPage = whichPage; - + notifyPageSwitching(whichPage); View focusedChild = getFocusedChild(); if (focusedChild != null && whichPage != mCurrentPage && focusedChild == getPageAt(mCurrentPage)) { @@ -1761,13 +1802,14 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc if (!mScroller.isFinished()) mScroller.abortAnimation(); mScroller.startScroll(mUnboundedScrollX, 0, delta, 0, duration); - notifyPageSwitchListener(); + notifyPageSwitched(); // Trigger a compute() to finish switching pages if necessary if (immediate) { computeScroll(); } + mForceScreenScrolled = true; invalidate(); } @@ -1991,6 +2033,23 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc mZoomInOutAnim.playTogether( ObjectAnimator.ofFloat(this, "scaleX", mMinScale), ObjectAnimator.ofFloat(this, "scaleY", mMinScale)); + mZoomInOutAnim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + // Show the delete drop target + if (mDeleteDropTarget != null) { + mDeleteDropTarget.setVisibility(View.VISIBLE); + mDeleteDropTarget.animate().alpha(1f) + .setDuration(REORDERING_DELETE_DROP_TARGET_FADE_DURATION) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + mDeleteDropTarget.setAlpha(0f); + } + }); + } + } + }); mZoomInOutAnim.start(); return true; } @@ -2007,6 +2066,15 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc mTouchState = TOUCH_STATE_REORDERING; mIsReordering = true; + // Mark all the non-widget pages as invisible + getVisiblePages(mTempVisiblePagesRange); + boundByReorderablePages(true, mTempVisiblePagesRange); + for (int i = 0; i < getPageCount(); ++i) { + if (i < mTempVisiblePagesRange[0] || i > mTempVisiblePagesRange[1]) { + getPageAt(i).setAlpha(0f); + } + } + // We must invalidate to trigger a redraw to update the layers such that the drag view // is always drawn on top invalidate(); @@ -2028,6 +2096,15 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc R.string.keyguard_accessibility_widget_reorder_end)); } mIsReordering = false; + + // Mark all the non-widget pages as visible again + getVisiblePages(mTempVisiblePagesRange); + boundByReorderablePages(true, mTempVisiblePagesRange); + for (int i = 0; i < getPageCount(); ++i) { + if (i < mTempVisiblePagesRange[0] || i > mTempVisiblePagesRange[1]) { + getPageAt(i).setAlpha(1f); + } + } } public boolean startReordering() { @@ -2072,7 +2149,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc onEndReordering(); } }; - if (!mIsFlingingToDelete) { + if (!mDeferringForDelete) { mPostReorderingPreZoomInRunnable = new Runnable() { public void run() { zoomIn(onCompleteRunnable); @@ -2086,7 +2163,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc // Animate the drag view back to the front position animateDragViewToOriginalPosition(); } else { - zoomIn(onCompleteRunnable); + // Handled in post-delete-animation-callbacks } } @@ -2103,6 +2180,20 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc ObjectAnimator.ofFloat(this, "scaleY", 1f)); mZoomInOutAnim.addListener(new AnimatorListenerAdapter() { @Override + public void onAnimationStart(Animator animation) { + // Hide the delete drop target + if (mDeleteDropTarget != null) { + mDeleteDropTarget.animate().alpha(0f) + .setDuration(REORDERING_DELETE_DROP_TARGET_FADE_DURATION) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mDeleteDropTarget.setVisibility(View.GONE); + } + }); + } + } + @Override public void onAnimationCancel(Animator animation) { mDragView = null; } @@ -2186,6 +2277,97 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc } }; + private Runnable createPostDeleteAnimationRunnable(final View dragView) { + return new Runnable() { + @Override + public void run() { + int dragViewIndex = indexOfChild(dragView); + + // For each of the pages around the drag view, animate them from the previous + // position to the new position in the layout (as a result of the drag view moving + // in the layout) + // NOTE: We can make an assumption here because we have side-bound pages that we + // will always have pages to animate in from the left + getVisiblePages(mTempVisiblePagesRange); + boundByReorderablePages(true, mTempVisiblePagesRange); + boolean isLastWidgetPage = (mTempVisiblePagesRange[0] == mTempVisiblePagesRange[1]); + boolean slideFromLeft = (isLastWidgetPage || + dragViewIndex > mTempVisiblePagesRange[0]); + + // Setup the scroll to the correct page before we swap the views + if (slideFromLeft) { + snapToPageImmediately(dragViewIndex - 1); + } + + int firstIndex = (isLastWidgetPage ? 0 : mTempVisiblePagesRange[0]); + int lastIndex = Math.min(mTempVisiblePagesRange[1], getPageCount() - 1); + int lowerIndex = (slideFromLeft ? firstIndex : dragViewIndex + 1 ); + int upperIndex = (slideFromLeft ? dragViewIndex - 1 : lastIndex); + ArrayList<Animator> animations = new ArrayList<Animator>(); + for (int i = lowerIndex; i <= upperIndex; ++i) { + View v = getChildAt(i); + // dragViewIndex < pageUnderPointIndex, so after we remove the + // drag view all subsequent views to pageUnderPointIndex will + // shift down. + int oldX = 0; + int newX = 0; + if (slideFromLeft) { + if (i == 0) { + // Simulate the page being offscreen with the page spacing + oldX = getViewportOffsetX() + getChildOffset(i) - getChildWidth(i) + - mPageSpacing; + } else { + oldX = getViewportOffsetX() + getChildOffset(i - 1); + } + newX = getViewportOffsetX() + getChildOffset(i); + } else { + oldX = getChildOffset(i) - getChildOffset(i - 1); + newX = 0; + } + + // Animate the view translation from its old position to its new + // position + AnimatorSet anim = (AnimatorSet) v.getTag(); + if (anim != null) { + anim.cancel(); + } + + // Note: Hacky, but we want to skip any optimizations to not draw completely + // hidden views + v.setAlpha(Math.max(v.getAlpha(), 0.01f)); + v.setTranslationX(oldX - newX); + anim = new AnimatorSet(); + anim.playTogether( + ObjectAnimator.ofFloat(v, "translationX", 0f), + ObjectAnimator.ofFloat(v, "alpha", 1f)); + animations.add(anim); + v.setTag(anim); + } + + AnimatorSet slideAnimations = new AnimatorSet(); + slideAnimations.playTogether(animations); + slideAnimations.setDuration(DELETE_SLIDE_IN_SIDE_PAGE_DURATION); + slideAnimations.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + final Runnable onCompleteRunnable = new Runnable() { + @Override + public void run() { + mDeferringForDelete = false; + onEndReordering(); + } + }; + zoomIn(onCompleteRunnable); + } + }); + slideAnimations.start(); + + removeView(dragView); + onRemoveView(dragView); + } + }; + } + public void onFlingToDelete(PointF vel) { final long startTime = AnimationUtils.currentAnimationTimeMillis(); @@ -2222,59 +2404,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc AnimatorUpdateListener updateCb = new FlingAlongVectorAnimatorUpdateListener(dragView, vel, from, startTime, FLING_TO_DELETE_FRICTION); - final Runnable onAnimationEndRunnable = new Runnable() { - @Override - public void run() { - int dragViewIndex = indexOfChild(dragView); - // Setup the scroll to the correct page before we swap the views - snapToPageImmediately(dragViewIndex - 1); - - // For each of the pages around the drag view, animate them from the previous - // position to the new position in the layout (as a result of the drag view moving - // in the layout) - // NOTE: We can make an assumption here because we have side-bound pages that we - // will always have pages to animate in from the left - int lowerIndex = 0; - int upperIndex = dragViewIndex - 1; - for (int i = lowerIndex; i <= upperIndex; ++i) { - View v = getChildAt(i); - // dragViewIndex < pageUnderPointIndex, so after we remove the - // drag view all subsequent views to pageUnderPointIndex will - // shift down. - int oldX = 0; - if (i == 0) { - oldX = -(getViewportOffsetX() + getChildOffset(i)); - } else { - oldX = getViewportOffsetX() + getChildOffset(i - 1); - } - int newX = getViewportOffsetX() + getChildOffset(i); - - // Animate the view translation from its old position to its new - // position - AnimatorSet anim = (AnimatorSet) v.getTag(); - if (anim != null) { - anim.cancel(); - } - - v.setTranslationX(oldX - newX); - anim = new AnimatorSet(); - anim.setDuration(FLING_TO_DELETE_SLIDE_IN_SIDE_PAGE_DURATION); - anim.playTogether( - ObjectAnimator.ofFloat(v, "translationX", 0f)); - anim.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mIsFlingingToDelete = false; - } - }); - anim.start(); - v.setTag(anim); - } - - removeView(dragView); - onRemoveView(dragView); - } - }; + final Runnable onAnimationEndRunnable = createPostDeleteAnimationRunnable(dragView); // Create and start the animation ValueAnimator mDropAnim = new ValueAnimator(); @@ -2288,11 +2418,57 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc } }); mDropAnim.start(); - mIsFlingingToDelete = true; + mDeferringForDelete = true; } - /* Accessibility */ + /* Drag to delete */ + private boolean isHoveringOverDeleteDropTarget(int x, int y) { + if (mDeleteDropTarget != null) { + mDeleteDropTarget.getGlobalVisibleRect(mTmpRect); + return mTmpRect.contains(x, y); + } + return false; + } + + protected void setPageHoveringOverDeleteDropTarget(int viewIndex, boolean isHovering) {} + + private void onDropToDelete() { + final View dragView = mDragView; + final float toScale = 0f; + final float toAlpha = 0f; + + // Create and start the complex animation + ArrayList<Animator> animations = new ArrayList<Animator>(); + AnimatorSet motionAnim = new AnimatorSet(); + motionAnim.setInterpolator(new DecelerateInterpolator(2)); + motionAnim.playTogether( + ObjectAnimator.ofFloat(dragView, "scaleX", toScale), + ObjectAnimator.ofFloat(dragView, "scaleY", toScale)); + animations.add(motionAnim); + + AnimatorSet alphaAnim = new AnimatorSet(); + alphaAnim.setInterpolator(new LinearInterpolator()); + alphaAnim.playTogether( + ObjectAnimator.ofFloat(dragView, "alpha", toAlpha)); + animations.add(alphaAnim); + + final Runnable onAnimationEndRunnable = createPostDeleteAnimationRunnable(dragView); + + AnimatorSet anim = new AnimatorSet(); + anim.playTogether(animations); + anim.setDuration(DRAG_TO_DELETE_FADE_OUT_DURATION); + anim.addListener(new AnimatorListenerAdapter() { + public void onAnimationEnd(Animator animation) { + onAnimationEndRunnable.run(); + } + }); + anim.start(); + + mDeferringForDelete = true; + } + + /* Accessibility */ @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); 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 6156143..2712494 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/SlidingChallengeLayout.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/SlidingChallengeLayout.java @@ -16,6 +16,8 @@ package com.android.internal.policy.impl.keyguard; +import com.android.internal.R; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; @@ -29,7 +31,6 @@ import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.FloatProperty; import android.util.Log; -import android.util.MathUtils; import android.util.Property; import android.view.MotionEvent; import android.view.VelocityTracker; @@ -40,8 +41,6 @@ import android.view.accessibility.AccessibilityManager; import android.view.animation.Interpolator; import android.widget.Scroller; -import com.android.internal.R; - /** * This layout handles interaction with the sliding security challenge views * that overlay/resize other keyguard contents. @@ -53,7 +52,7 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout // The drag handle is measured in dp above & below the top edge of the // challenge view; these parameters change based on whether the challenge // is open or closed. - private static final int DRAG_HANDLE_CLOSED_ABOVE = 64; // dp + private static final int DRAG_HANDLE_CLOSED_ABOVE = 8; // dp private static final int DRAG_HANDLE_CLOSED_BELOW = 0; // dp private static final int DRAG_HANDLE_OPEN_ABOVE = 8; // dp private static final int DRAG_HANDLE_OPEN_BELOW = 0; // dp @@ -67,7 +66,7 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout // Initialized during measurement from child layoutparams private View mExpandChallengeView; - private View mChallengeView; + private KeyguardSecurityContainer mChallengeView; private View mScrimView; private View mWidgetsView; @@ -77,6 +76,7 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout private boolean mIsBouncing = false; private final Scroller mScroller; + private ObjectAnimator mFader; private int mScrollState; private OnChallengeScrolledListener mScrollListener; private OnBouncerStateChangedListener mBouncerListener; @@ -84,6 +84,10 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout public static final int SCROLL_STATE_IDLE = 0; public static final int SCROLL_STATE_DRAGGING = 1; public static final int SCROLL_STATE_SETTLING = 2; + public static final int SCROLL_STATE_FADING = 3; + + private static final int CHALLENGE_FADE_OUT_DURATION = 100; + private static final int CHALLENGE_FADE_IN_DURATION = 160; private static final int MAX_SETTLE_DURATION = 600; // ms @@ -124,6 +128,10 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout private boolean mHasGlowpad; + // We have an internal and external version, and we and them together. + private boolean mChallengeInteractiveExternal = true; + private boolean mChallengeInteractiveInternal = true; + static final Property<SlidingChallengeLayout, Float> HANDLE_ALPHA = new FloatProperty<SlidingChallengeLayout>("handleAlpha") { @Override @@ -276,6 +284,13 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout } } + public void setChallengeInteractive(boolean interactive) { + mChallengeInteractiveExternal = interactive; + if (mExpandChallengeView != null) { + mExpandChallengeView.setEnabled(interactive); + } + } + void animateHandle(boolean visible) { if (mHandleAnimation != null) { mHandleAnimation.cancel(); @@ -402,6 +417,7 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout void completeChallengeScroll() { setChallengeShowing(mChallengeOffset != 0); setScrollState(SCROLL_STATE_IDLE); + mChallengeInteractiveInternal = true; mChallengeView.setLayerType(LAYER_TYPE_NONE, null); } @@ -426,6 +442,11 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout // Nothing to do. return; } + + cancelTransitionsInProgress(); + + mChallengeInteractiveInternal = false; + mChallengeView.setLayerType(LAYER_TYPE_HARDWARE, null); final int sy = mChallengeView.getBottom(); final int dy = y - sy; if (dy == 0) { @@ -504,7 +525,9 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout if (mScrimView != null) { mScrimView.setVisibility(VISIBLE); } - + 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) { @@ -533,6 +556,9 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout if (mScrimView != null) { mScrimView.setVisibility(GONE); } + if (mChallengeView != null) { + mChallengeView.hideBouncer(HANDLE_ANIMATE_DURATION); + } animateFrame(false, true); if (mBouncerListener != null) { mBouncerListener.onBouncerStateChanged(false); @@ -581,25 +607,23 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout final float x = ev.getX(i); final float y = ev.getY(i); if (!mIsBouncing && mActivePointerId == INVALID_POINTER - && ((isInDragHandle(x, y) && MathUtils.sq(x - mGestureStartX) - + MathUtils.sq(y - mGestureStartY) > mTouchSlopSquare) - || crossedDragHandle(x, y, mGestureStartY) + && (crossedDragHandle(x, y, mGestureStartY) || (isInChallengeView(x, y) && - mScrollState == SCROLL_STATE_SETTLING))) { + mScrollState == SCROLL_STATE_SETTLING))) { mActivePointerId = ev.getPointerId(i); mGestureStartX = x; mGestureStartY = y; mGestureStartChallengeBottom = getChallengeBottom(); mDragging = true; mChallengeView.setLayerType(LAYER_TYPE_HARDWARE, null); - } else if (isInChallengeView(x, y)) { + } else if (mChallengeShowing && isInChallengeView(x, y)) { mBlockDrag = true; } } break; } - if (mBlockDrag) { + if (mBlockDrag || isChallengeInteractionBlocked()) { mActivePointerId = INVALID_POINTER; mDragging = false; } @@ -607,6 +631,10 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout return mDragging; } + private boolean isChallengeInteractionBlocked() { + return !mChallengeInteractiveExternal || !mChallengeInteractiveInternal; + } + private void resetTouch() { mVelocityTracker.recycle(); mVelocityTracker = null; @@ -630,7 +658,7 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout break; case MotionEvent.ACTION_CANCEL: - if (mDragging) { + if (mDragging && !isChallengeInteractionBlocked()) { showChallenge(0); } resetTouch(); @@ -641,7 +669,7 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout break; } case MotionEvent.ACTION_UP: - if (mDragging) { + if (mDragging && !isChallengeInteractionBlocked()) { mVelocityTracker.computeCurrentVelocity(1000, mMaxVelocity); showChallenge((int) mVelocityTracker.getYVelocity(mActivePointerId)); } @@ -657,7 +685,8 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout if ((isInDragHandle(x, y) || crossedDragHandle(x, y, mGestureStartY) || (isInChallengeView(x, y) && mScrollState == SCROLL_STATE_SETTLING)) - && mActivePointerId == INVALID_POINTER) { + && mActivePointerId == INVALID_POINTER + && !isChallengeInteractionBlocked()) { mGestureStartX = x; mGestureStartY = y; mActivePointerId = ev.getPointerId(i); @@ -767,11 +796,19 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout } private boolean crossedDragHandle(float x, float y, float initialY) { + final int challengeTop = mChallengeView.getTop(); - return x >= 0 && - x < getWidth() && - initialY < (challengeTop - getDragHandleSizeAbove()) && - y > challengeTop + getDragHandleSizeBelow(); + final boolean horizOk = x >= 0 && x < getWidth(); + + final boolean vertOk; + if (mChallengeShowing) { + vertOk = initialY < (challengeTop - getDragHandleSizeAbove()) && + y > challengeTop + getDragHandleSizeBelow(); + } else { + vertOk = initialY > challengeTop + getDragHandleSizeBelow() && + y < challengeTop - getDragHandleSizeAbove(); + } + return horizOk && vertOk; } @Override @@ -803,7 +840,11 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout throw new IllegalStateException( "There may only be one child with layout_isChallenge=\"true\""); } - mChallengeView = child; + if (!(child instanceof KeyguardSecurityContainer)) { + throw new IllegalArgumentException( + "Challenge must be a KeyguardSecurityContainer"); + } + mChallengeView = (KeyguardSecurityContainer) child; if (mChallengeView != oldChallengeView) { mChallengeView.setVisibility(mChallengeShowing ? VISIBLE : INVISIBLE); } @@ -942,6 +983,83 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout } } + private void cancelTransitionsInProgress() { + if (!mScroller.isFinished()) { + mScroller.abortAnimation(); + completeChallengeScroll(); + } + if (mFader != null) { + mFader.cancel(); + } + } + + public void fadeInChallenge() { + fadeChallenge(true); + } + + public void fadeOutChallenge() { + fadeChallenge(false); + } + + public void fadeChallenge(final boolean show) { + if (mChallengeView != null) { + + cancelTransitionsInProgress(); + float alpha = show ? 1f : 0f; + int duration = show ? CHALLENGE_FADE_IN_DURATION : CHALLENGE_FADE_OUT_DURATION; + mFader = ObjectAnimator.ofFloat(mChallengeView, "alpha", alpha); + mFader.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + onFadeStart(show); + } + @Override + public void onAnimationEnd(Animator animation) { + onFadeEnd(show); + } + }); + mFader.setDuration(duration); + mFader.start(); + } + } + + private int getMaxChallengeBottom() { + if (mChallengeView == null) return 0; + final int layoutBottom = getLayoutBottom(); + final int challengeHeight = mChallengeView.getMeasuredHeight(); + + return (layoutBottom + challengeHeight - mChallengeBottomBound); + } + + private int getMinChallengeBottom() { + return getLayoutBottom(); + } + + + private void onFadeStart(boolean show) { + mChallengeInteractiveInternal = false; + mChallengeView.setLayerType(LAYER_TYPE_HARDWARE, null); + + if (show) { + moveChallengeTo(getMinChallengeBottom()); + } + + setScrollState(SCROLL_STATE_FADING); + } + + private void onFadeEnd(boolean show) { + mChallengeInteractiveInternal = true; + setChallengeShowing(show); + + if (!show) { + moveChallengeTo(getMaxChallengeBottom()); + } + + mChallengeView.setLayerType(LAYER_TYPE_NONE, null); + mFader = null; + setScrollState(SCROLL_STATE_IDLE); + } + public int getMaxChallengeTop() { if (mChallengeView == null) return 0; @@ -967,8 +1085,8 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout final int layoutBottom = getLayoutBottom(); final int challengeHeight = mChallengeView.getHeight(); - bottom = Math.max(layoutBottom, - Math.min(bottom, layoutBottom + challengeHeight - mChallengeBottomBound)); + bottom = Math.max(getMinChallengeBottom(), + Math.min(bottom, getMaxChallengeBottom())); float offset = 1.f - (float) (bottom - layoutBottom) / (challengeHeight - mChallengeBottomBound); diff --git a/services/java/com/android/server/AppWidgetServiceImpl.java b/services/java/com/android/server/AppWidgetServiceImpl.java index d0dd9cf..daa82f2 100644 --- a/services/java/com/android/server/AppWidgetServiceImpl.java +++ b/services/java/com/android/server/AppWidgetServiceImpl.java @@ -599,7 +599,7 @@ class AppWidgetServiceImpl { } public void bindAppWidgetId(int appWidgetId, ComponentName provider, Bundle options) { - mContext.enforceCallingPermission(android.Manifest.permission.BIND_APPWIDGET, + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BIND_APPWIDGET, "bindAppWidgetId appWidgetId=" + appWidgetId + " provider=" + provider); bindAppWidgetIdImpl(appWidgetId, provider, options); } @@ -607,7 +607,7 @@ class AppWidgetServiceImpl { public boolean bindAppWidgetIdIfAllowed( String packageName, int appWidgetId, ComponentName provider, Bundle options) { try { - mContext.enforceCallingPermission(android.Manifest.permission.BIND_APPWIDGET, null); + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BIND_APPWIDGET, null); } catch (SecurityException se) { if (!callerHasBindAppWidgetPermission(packageName)) { return false; diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java index 0e51c47..c9ff595 100644 --- a/services/java/com/android/server/InputMethodManagerService.java +++ b/services/java/com/android/server/InputMethodManagerService.java @@ -730,7 +730,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub if (!updateOnlyWhenLocaleChanged) { hideCurrentInputLocked(0, null); mCurMethodId = null; - unbindCurrentMethodLocked(true); + unbindCurrentMethodLocked(true, false); } if (DEBUG) { Slog.i(TAG, "Locale has been changed to " + newLocale); @@ -1201,7 +1201,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub throw new IllegalArgumentException("Unknown id: " + mCurMethodId); } - unbindCurrentMethodLocked(false); + unbindCurrentMethodLocked(false, true); mCurIntent = new Intent(InputMethod.SERVICE_INTERFACE); mCurIntent.setComponent(info.getComponent()); @@ -1257,7 +1257,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub mCurMethod = IInputMethod.Stub.asInterface(service); if (mCurToken == null) { Slog.w(TAG, "Service connected without a token!"); - unbindCurrentMethodLocked(false); + unbindCurrentMethodLocked(false, false); return; } if (DEBUG) Slog.v(TAG, "Initiating attach with token: " + mCurToken); @@ -1292,7 +1292,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } } - void unbindCurrentMethodLocked(boolean reportToClient) { + void unbindCurrentMethodLocked(boolean reportToClient, boolean savePosition) { if (mVisibleBound) { mContext.unbindService(mVisibleConnection); mVisibleBound = false; @@ -1306,7 +1306,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub if (mCurToken != null) { try { if (DEBUG) Slog.v(TAG, "Removing window token: " + mCurToken); - if ((mImeWindowVis & InputMethodService.IME_ACTIVE) != 0) { + if ((mImeWindowVis & InputMethodService.IME_ACTIVE) != 0 && savePosition) { // The current IME is shown. Hence an IME switch (transition) is happening. mWindowManagerService.saveLastInputMethodWindowForTransition(); } @@ -1589,13 +1589,13 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } catch (IllegalArgumentException e) { Slog.w(TAG, "Unknown input method from prefs: " + id, e); mCurMethodId = null; - unbindCurrentMethodLocked(true); + unbindCurrentMethodLocked(true, false); } mShortcutInputMethodsAndSubtypes.clear(); } else { // There is no longer an input method set, so stop any current one. mCurMethodId = null; - unbindCurrentMethodLocked(true); + unbindCurrentMethodLocked(true, false); } } diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java index 37dee19..9416b52 100644 --- a/services/java/com/android/server/LocationManagerService.java +++ b/services/java/com/android/server/LocationManagerService.java @@ -224,7 +224,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run // listen for settings changes mContext.getContentResolver().registerContentObserver( - Settings.Secure.getUriFor(Settings.Secure.LOCATION_PROVIDERS_ALLOWED), true, + Settings.Secure.getUriFor(Settings.Secure.LOCATION_PROVIDERS_ALLOWED), true, new ContentObserver(mLocationHandler) { @Override public void onChange(boolean selfChange) { @@ -1540,7 +1540,8 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } - private static boolean shouldBroadcastSafe(Location loc, Location lastLoc, UpdateRecord record) { + private static boolean shouldBroadcastSafe( + Location loc, Location lastLoc, UpdateRecord record, long now) { // Always broadcast the first update if (lastLoc == null) { return true; @@ -1561,6 +1562,16 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } } + // Check whether sufficient number of udpates is left + if (record.mRequest.getNumUpdates() <= 0) { + return false; + } + + // Check whether the expiry date has passed + if (record.mRequest.getExpireAt() < now) { + return false; + } + return true; } @@ -1640,7 +1651,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } if (notifyLocation != null) { Location lastLoc = r.mLastFixBroadcast; - if ((lastLoc == null) || shouldBroadcastSafe(notifyLocation, lastLoc, r)) { + if ((lastLoc == null) || shouldBroadcastSafe(notifyLocation, lastLoc, r, now)) { if (lastLoc == null) { lastLoc = new Location(notifyLocation); r.mLastFixBroadcast = lastLoc; @@ -1651,6 +1662,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run Slog.w(TAG, "RemoteException calling onLocationChanged on " + receiver); receiverDead = true; } + r.mRequest.decrementNumUpdates(); } } @@ -1666,7 +1678,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } // track expired records - if (r.mRequest.getNumUpdates() == 0 || r.mRequest.getExpireAt() < now) { + if (r.mRequest.getNumUpdates() <= 0 || r.mRequest.getExpireAt() < now) { if (deadUpdateRecords == null) { deadUpdateRecords = new ArrayList<UpdateRecord>(); } diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java index 6b277c7..671cbfe 100644 --- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -40,7 +40,9 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.database.ContentObserver; +import android.graphics.Point; import android.graphics.Rect; +import android.hardware.display.DisplayManager; import android.hardware.input.InputManager; import android.net.Uri; import android.os.Binder; @@ -62,6 +64,7 @@ import android.text.TextUtils; import android.text.TextUtils.SimpleStringSplitter; import android.util.Slog; import android.util.SparseArray; +import android.view.Display; import android.view.IWindow; import android.view.IWindowManager; import android.view.InputDevice; @@ -137,6 +140,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { private final List<AccessibilityServiceInfo> mEnabledServicesForFeedbackTempList = new ArrayList<AccessibilityServiceInfo>(); + private final Rect mTempRect = new Rect(); + + private final Point mTempPoint = new Point(); + + private final Display mDefaultDisplay; + private final PackageManager mPackageManager; private final IWindowManager mWindowManagerService; @@ -194,6 +203,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { mWindowManagerService = (IWindowManager) ServiceManager.getService(Context.WINDOW_SERVICE); mSecurityPolicy = new SecurityPolicy(); mMainHandler = new MainHandler(mContext.getMainLooper()); + //TODO: (multi-display) We need to support multiple displays. + DisplayManager displayManager = (DisplayManager) + mContext.getSystemService(Context.DISPLAY_SERVICE); + mDefaultDisplay = displayManager.getDisplay(Display.DEFAULT_DISPLAY); registerBroadcastReceivers(); new AccessibilityContentObserver(mMainHandler).register( context.getContentResolver()); @@ -582,6 +595,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { * @param outBounds The output to which to write the focus bounds. * @return Whether accessibility focus was found and the bounds are populated. */ + // TODO: (multi-display) Make sure this works for multiple displays. boolean getAccessibilityFocusBoundsInActiveWindow(Rect outBounds) { // Instead of keeping track of accessibility focus events per // window to be able to find the focus in the active window, @@ -603,6 +617,13 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { return false; } focus.getBoundsInScreen(outBounds); + // Clip to the window rectangle. + Rect windowBounds = mTempRect; + getActiveWindowBounds(windowBounds); + outBounds.intersect(windowBounds); + // Clip to the screen rectangle. + mDefaultDisplay.getRealSize(mTempPoint); + outBounds.intersect(0, 0, mTempPoint.x, mTempPoint.y); return true; } finally { client.removeConnection(connectionId); @@ -1330,6 +1351,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { AccessibilityEvent event = AccessibilityEvent.obtain( AccessibilityEvent.TYPE_ANNOUNCEMENT); event.getText().add(message); + event.setWindowId(mSecurityPolicy.getRetrievalAllowingWindowLocked()); sendAccessibilityEvent(event, mCurrentUserId); } } diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java index c8d9cc3..54914c2 100644 --- a/services/java/com/android/server/wm/WindowAnimator.java +++ b/services/java/com/android/server/wm/WindowAnimator.java @@ -13,6 +13,7 @@ import static com.android.server.wm.WindowManagerService.LayoutFields.SET_ORIENT import static com.android.server.wm.WindowManagerService.H.UPDATE_ANIM_PARAMETERS; import android.content.Context; +import android.os.Debug; import android.os.SystemClock; import android.util.Log; import android.util.Slog; @@ -203,9 +204,9 @@ public class WindowAnimator { if (mWallpaperTarget != layoutToAnim.mWallpaperTarget || mLowerWallpaperTarget != layoutToAnim.mLowerWallpaperTarget || mUpperWallpaperTarget != layoutToAnim.mUpperWallpaperTarget) { - Slog.d(TAG, "Updating anim wallpaper: target=" + mWallpaperTarget - + " lower=" + mLowerWallpaperTarget + " upper=" - + mUpperWallpaperTarget); + Slog.d(TAG, "Pulling anim wallpaper: target=" + layoutToAnim.mWallpaperTarget + + " lower=" + layoutToAnim.mLowerWallpaperTarget + " upper=" + + layoutToAnim.mUpperWallpaperTarget); } } mWallpaperTarget = layoutToAnim.mWallpaperTarget; @@ -259,11 +260,30 @@ public class WindowAnimator { } } - void hideWallpapersLocked(final WindowState w) { - if ((mWallpaperTarget == w && mLowerWallpaperTarget == null) || mWallpaperTarget == null) { - final int numTokens = mWallpaperTokens.size(); + void hideWallpapersLocked(final WindowState w, boolean fromAnimator) { + // There is an issue where this function can be called either from + // the animation or the layout side of the window manager. The problem + // is that if it is called from the layout side, we may not yet have + // propagated the current layout wallpaper state over into the animation + // state. If that is the case, we can do bad things like hide the + // wallpaper when we had just made it shown because the animation side + // doesn't yet see that there is now a wallpaper target. As a temporary + // work-around, we tell the function here which side of the window manager + // is calling so it can use the right state. + if (fromAnimator) { + hideWallpapersLocked(w, mWallpaperTarget, mLowerWallpaperTarget, mWallpaperTokens); + } else { + hideWallpapersLocked(w, mService.mWallpaperTarget, + mService.mLowerWallpaperTarget, mService.mWallpaperTokens); + } + } + + void hideWallpapersLocked(final WindowState w, final WindowState wallpaperTarget, + final WindowState lowerWallpaperTarget, final ArrayList<WindowToken> wallpaperTokens) { + if ((wallpaperTarget == w && lowerWallpaperTarget == null) || wallpaperTarget == null) { + final int numTokens = wallpaperTokens.size(); for (int i = numTokens - 1; i >= 0; i--) { - final WindowToken token = mWallpaperTokens.get(i); + final WindowToken token = wallpaperTokens.get(i); final int numWindows = token.windows.size(); for (int j = numWindows - 1; j >= 0; j--) { final WindowState wallpaper = token.windows.get(j); @@ -276,7 +296,9 @@ public class WindowAnimator { } } if (WindowManagerService.DEBUG_WALLPAPER_LIGHT && !token.hidden) Slog.d(TAG, - "Hiding wallpaper " + token + " from " + w); + "Hiding wallpaper " + token + " from " + w + + " target=" + wallpaperTarget + " lower=" + lowerWallpaperTarget + + "\n" + Debug.getCallers(5, " ")); token.hidden = true; } } diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 137c8ee..0659409 100755 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -192,7 +192,7 @@ public class WindowManagerService extends IWindowManager.Stub static final boolean DEBUG_STARTING_WINDOW = false; static final boolean DEBUG_REORDER = false; static final boolean DEBUG_WALLPAPER = false; - static final boolean DEBUG_WALLPAPER_LIGHT = true || DEBUG_WALLPAPER; + static final boolean DEBUG_WALLPAPER_LIGHT = false || DEBUG_WALLPAPER; static final boolean DEBUG_DRAG = false; static final boolean DEBUG_SCREEN_ON = false; static final boolean DEBUG_SCREENSHOT = false; @@ -545,7 +545,7 @@ public class WindowManagerService extends IWindowManager.Stub WindowState mWallpaperTarget = null; // If non-null, we are in the middle of animating from one wallpaper target // to another, and this is the lower one in Z-order. - private WindowState mLowerWallpaperTarget = null; + WindowState mLowerWallpaperTarget = null; // If non-null, we are in the middle of animating from one wallpaper target // to another, and this is the higher one in Z-order. private WindowState mUpperWallpaperTarget = null; @@ -1566,6 +1566,7 @@ public class WindowManagerService extends IWindowManager.Stub int adjustWallpaperWindowsLocked() { mInnerFields.mWallpaperMayChange = false; int changed = 0; + boolean targetChanged = false; // TODO(multidisplay): Wallpapers on main screen only. final DisplayInfo displayInfo = getDefaultDisplayContentLocked().getDisplayInfo(); @@ -1608,7 +1609,7 @@ public class WindowManagerService extends IWindowManager.Stub if ((w.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0 && w.isReadyForDisplay() && (mWallpaperTarget == w || w.isDrawnLw())) { if (DEBUG_WALLPAPER) Slog.v(TAG, - "Found wallpaper activity: #" + i + "=" + w); + "Found wallpaper target: #" + i + "=" + w); foundW = w; foundI = i; if (w == mWallpaperTarget && w.mWinAnimator.isAnimating()) { @@ -1665,6 +1666,7 @@ public class WindowManagerService extends IWindowManager.Stub WindowState oldW = mWallpaperTarget; mWallpaperTarget = foundW; + targetChanged = true; // Now what is happening... if the current and new targets are // animating, then we are in our super special mode! @@ -1738,6 +1740,8 @@ public class WindowManagerService extends IWindowManager.Stub } mLowerWallpaperTarget = null; mUpperWallpaperTarget = null; + mWallpaperTarget = foundW; + targetChanged = true; } } @@ -1872,6 +1876,12 @@ public class WindowManagerService extends IWindowManager.Stub } } + if (targetChanged && DEBUG_WALLPAPER_LIGHT) { + Slog.d(TAG, "New wallpaper: target=" + mWallpaperTarget + + " lower=" + mLowerWallpaperTarget + " upper=" + + mUpperWallpaperTarget); + } + return changed; } @@ -2847,7 +2857,7 @@ public class WindowManagerService extends IWindowManager.Stub } if ((attrChanges&WindowManager.LayoutParams.FORMAT_CHANGED) != 0) { // To change the format, we need to re-build the surface. - winAnimator.destroySurfaceLocked(); + winAnimator.destroySurfaceLocked(false); toBeDisplayed = true; surfaceChanged = true; } @@ -2928,7 +2938,7 @@ public class WindowManagerService extends IWindowManager.Stub if (mInputMethodWindow == win) { mInputMethodWindow = null; } - winAnimator.destroySurfaceLocked(); + winAnimator.destroySurfaceLocked(false); } scheduleNotifyWindowTranstionIfNeededLocked(win, transit); } @@ -3030,7 +3040,7 @@ public class WindowManagerService extends IWindowManager.Stub if (win == null) { return; } - win.mWinAnimator.destroyDeferredSurfaceLocked(); + win.mWinAnimator.destroyDeferredSurfaceLocked(false); } } finally { Binder.restoreCallingIdentity(origId); @@ -8136,7 +8146,7 @@ public class WindowManagerService extends IWindowManager.Stub pw.flush(); Slog.w(TAG, "This window was lost: " + ws); Slog.w(TAG, sw.toString()); - ws.mWinAnimator.destroySurfaceLocked(); + ws.mWinAnimator.destroySurfaceLocked(false); } } Slog.w(TAG, "Current app token list:"); @@ -9443,7 +9453,7 @@ public class WindowManagerService extends IWindowManager.Stub if (win == mWallpaperTarget) { wallpaperDestroyed = true; } - win.mWinAnimator.destroySurfaceLocked(); + win.mWinAnimator.destroySurfaceLocked(false); } while (i > 0); mDestroySurface.clear(); } @@ -9692,6 +9702,15 @@ public class WindowManagerService extends IWindowManager.Stub allWinAnimatorLists.put(displayContent.getDisplayId(), winAnimatorList); } + if (WindowManagerService.DEBUG_WALLPAPER_LIGHT) { + if (mWallpaperTarget != layoutToAnim.mWallpaperTarget + || mLowerWallpaperTarget != layoutToAnim.mLowerWallpaperTarget + || mUpperWallpaperTarget != layoutToAnim.mUpperWallpaperTarget) { + Slog.d(TAG, "Pushing anim wallpaper: target=" + mWallpaperTarget + + " lower=" + mLowerWallpaperTarget + " upper=" + + mUpperWallpaperTarget + "\n" + Debug.getCallers(5, " ")); + } + } layoutToAnim.mWallpaperTarget = mWallpaperTarget; layoutToAnim.mLowerWallpaperTarget = mLowerWallpaperTarget; layoutToAnim.mUpperWallpaperTarget = mUpperWallpaperTarget; @@ -10054,6 +10073,11 @@ public class WindowManagerService extends IWindowManager.Stub mInputMonitor.freezeInputDispatchingLw(); + // Clear the last input window -- that is just used for + // clean transitions between IMEs, and if we are freezing + // the screen then the whole world is changing behind the scenes. + mPolicy.setLastInputMethodWindowLw(null, null); + if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET; mNextAppTransitionType = ActivityOptions.ANIM_NONE; diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java index e1cc58f..35bebbe 100644 --- a/services/java/com/android/server/wm/WindowState.java +++ b/services/java/com/android/server/wm/WindowState.java @@ -875,8 +875,8 @@ final class WindowState implements WindowManagerPolicy.WindowState { if (WindowManagerService.DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing " + this + " from " + mAttachedWindow); mAttachedWindow.mChildWindows.remove(this); } - mWinAnimator.destroyDeferredSurfaceLocked(); - mWinAnimator.destroySurfaceLocked(); + mWinAnimator.destroyDeferredSurfaceLocked(false); + mWinAnimator.destroySurfaceLocked(false); mSession.windowRemovedLocked(); try { mClient.asBinder().unlinkToDeath(mDeathRecipient, 0); diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java index 85f087f..7b30c89 100644 --- a/services/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/java/com/android/server/wm/WindowStateAnimator.java @@ -225,7 +225,7 @@ class WindowStateAnimator { mAnimation.cancel(); mAnimation = null; mLocalAnimating = false; - destroySurfaceLocked(); + destroySurfaceLocked(true); } } @@ -412,7 +412,7 @@ class WindowStateAnimator { mService.mPendingRemove.add(mWin); mWin.mRemoveOnExit = false; } - mAnimator.hideWallpapersLocked(mWin); + mAnimator.hideWallpapersLocked(mWin, true); } void hide() { @@ -500,17 +500,21 @@ class WindowStateAnimator { @Override public void setAlpha(float alpha) { super.setAlpha(alpha); + if (alpha != mSurfaceTraceAlpha) { + Slog.v(SURFACE_TAG, "setAlpha: " + this + ". Called by " + + Debug.getCallers(3)); + } mSurfaceTraceAlpha = alpha; - Slog.v(SURFACE_TAG, "setAlpha: " + this + ". Called by " - + Debug.getCallers(3)); } @Override public void setLayer(int zorder) { super.setLayer(zorder); + if (zorder != mLayer) { + Slog.v(SURFACE_TAG, "setLayer: " + this + ". Called by " + + Debug.getCallers(3)); + } mLayer = zorder; - Slog.v(SURFACE_TAG, "setLayer: " + this + ". Called by " - + Debug.getCallers(3)); sSurfaces.remove(this); int i; @@ -526,49 +530,61 @@ class WindowStateAnimator { @Override public void setPosition(float x, float y) { super.setPosition(x, y); + if (x != mPosition.x || y != mPosition.y) { + Slog.v(SURFACE_TAG, "setPosition: " + this + ". Called by " + + Debug.getCallers(3)); + } mPosition.set(x, y); - Slog.v(SURFACE_TAG, "setPosition: " + this + ". Called by " - + Debug.getCallers(3)); } @Override public void setSize(int w, int h) { super.setSize(w, h); + if (w != mSize.x || h != mSize.y) { + Slog.v(SURFACE_TAG, "setSize: " + this + ". Called by " + + Debug.getCallers(3)); + } mSize.set(w, h); - Slog.v(SURFACE_TAG, "setSize: " + this + ". Called by " - + Debug.getCallers(3)); } @Override public void setWindowCrop(Rect crop) { super.setWindowCrop(crop); if (crop != null) { + if (!crop.equals(mWindowCrop)) { + Slog.v(SURFACE_TAG, "setWindowCrop: " + this + ". Called by " + + Debug.getCallers(3)); + } mWindowCrop.set(crop); } - Slog.v(SURFACE_TAG, "setWindowCrop: " + this + ". Called by " - + Debug.getCallers(3)); } @Override public void setLayerStack(int layerStack) { super.setLayerStack(layerStack); + if (layerStack != mLayerStack) { + Slog.v(SURFACE_TAG, "setLayerStack: " + this + ". Called by " + Debug.getCallers(3)); + } mLayerStack = layerStack; - Slog.v(SURFACE_TAG, "setLayerStack: " + this + ". Called by " + Debug.getCallers(3)); } @Override public void hide() { super.hide(); + if (mShown) { + Slog.v(SURFACE_TAG, "hide: " + this + ". Called by " + + Debug.getCallers(3)); + } mShown = false; - Slog.v(SURFACE_TAG, "hide: " + this + ". Called by " - + Debug.getCallers(3)); } @Override public void show() { super.show(); + if (!mShown) { + Slog.v(SURFACE_TAG, "show: " + this + ". Called by " + + Debug.getCallers(3)); + } mShown = true; - Slog.v(SURFACE_TAG, "show: " + this + ". Called by " - + Debug.getCallers(3)); } @Override @@ -728,7 +744,7 @@ class WindowStateAnimator { return mSurface; } - void destroySurfaceLocked() { + void destroySurfaceLocked(boolean fromAnimator) { if (mWin.mAppToken != null && mWin == mWin.mAppToken.startingWindow) { mWin.mAppToken.startingDisplayed = false; } @@ -778,7 +794,7 @@ class WindowStateAnimator { } mSurface.destroy(); } - mAnimator.hideWallpapersLocked(mWin); + mAnimator.hideWallpapersLocked(mWin, fromAnimator); } catch (RuntimeException e) { Slog.w(TAG, "Exception thrown when destroying Window " + this + " surface " + mSurface + " session " + mSession @@ -792,7 +808,7 @@ class WindowStateAnimator { } } - void destroyDeferredSurfaceLocked() { + void destroyDeferredSurfaceLocked(boolean fromAnimator) { try { if (mPendingDestroySurface != null) { if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { @@ -804,7 +820,7 @@ class WindowStateAnimator { WindowManagerService.logSurface(mWin, "DESTROY PENDING", e); } mPendingDestroySurface.destroy(); - mAnimator.hideWallpapersLocked(mWin); + mAnimator.hideWallpapersLocked(mWin, fromAnimator); } } catch (RuntimeException e) { Slog.w(TAG, "Exception thrown when destroying Window " @@ -1192,7 +1208,7 @@ class WindowStateAnimator { hide(); } else if (w.mAttachedHidden || !w.isReadyForDisplay()) { hide(); - mAnimator.hideWallpapersLocked(w); + mAnimator.hideWallpapersLocked(w, true); // If we are waiting for this window to handle an // orientation change, well, it is hidden, so |
