diff options
139 files changed, 2226 insertions, 1140 deletions
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java index 463a18c..16d4ad6 100644 --- a/cmds/pm/src/com/android/commands/pm/Pm.java +++ b/cmds/pm/src/com/android/commands/pm/Pm.java @@ -43,6 +43,7 @@ import android.os.IUserManager; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; +import android.os.UserManager; import java.io.File; import java.lang.reflect.Field; @@ -174,6 +175,11 @@ public final class Pm { return; } + if ("get-max-users".equals(op)) { + runGetMaxUsers(); + return; + } + try { if (args.length == 1) { if (args[0].equalsIgnoreCase("-l")) { @@ -1017,8 +1023,10 @@ public final class Pm { return; } try { - if (!mUm.removeUser(userId)) { - System.err.println("Error: couldn't remove user #" + userId + "."); + if (mUm.removeUser(userId)) { + System.out.println("Success: removed user"); + } else { + System.err.println("Error: couldn't remove user id " + userId); } } catch (RemoteException e) { System.err.println(e.toString()); @@ -1042,6 +1050,11 @@ public final class Pm { System.err.println(PM_NOT_RUNNING_ERR); } } + + public void runGetMaxUsers() { + System.out.println("Maximum supported users: " + UserManager.getMaxSupportedUsers()); + } + class PackageDeleteObserver extends IPackageDeleteObserver.Stub { boolean finished; boolean result; @@ -1451,6 +1464,7 @@ public final class Pm { System.err.println(" pm trim-caches DESIRED_FREE_SPACE"); System.err.println(" pm create-user USER_NAME"); System.err.println(" pm remove-user USER_ID"); + System.err.println(" pm get-max-users"); System.err.println(""); System.err.println("pm list packages: prints all packages, optionally only"); System.err.println(" those whose package name contains the text in FILTER. Options:"); diff --git a/core/java/android/app/FragmentBreadCrumbs.java b/core/java/android/app/FragmentBreadCrumbs.java index df64035..b810b89 100644 --- a/core/java/android/app/FragmentBreadCrumbs.java +++ b/core/java/android/app/FragmentBreadCrumbs.java @@ -19,7 +19,9 @@ package android.app; import android.animation.LayoutTransition; import android.app.FragmentManager.BackStackEntry; import android.content.Context; +import android.content.res.TypedArray; import android.util.AttributeSet; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -51,7 +53,11 @@ public class FragmentBreadCrumbs extends ViewGroup private OnClickListener mParentClickListener; private OnBreadCrumbClickListener mOnBreadCrumbClickListener; - + + private int mGravity; + + private static final int DEFAULT_GRAVITY = Gravity.START | Gravity.CENTER_VERTICAL; + /** * Interface to intercept clicks on the bread crumbs. */ @@ -80,6 +86,14 @@ public class FragmentBreadCrumbs extends ViewGroup public FragmentBreadCrumbs(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); + + TypedArray a = context.obtainStyledAttributes(attrs, + com.android.internal.R.styleable.FragmentBreadCrumbs, defStyle, 0); + + mGravity = a.getInt(com.android.internal.R.styleable.FragmentBreadCrumbs_gravity, + DEFAULT_GRAVITY); + + a.recycle(); } /** @@ -159,16 +173,50 @@ public class FragmentBreadCrumbs extends ViewGroup @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { - // Eventually we should implement our own layout of the views, - // rather than relying on a linear layout. + // Eventually we should implement our own layout of the views, rather than relying on + // a single linear layout. final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); + if (childCount == 0) { + return; + } + + final View child = getChildAt(0); - int childRight = mPaddingLeft + child.getMeasuredWidth() - mPaddingRight; - int childBottom = mPaddingTop + child.getMeasuredHeight() - mPaddingBottom; - child.layout(mPaddingLeft, mPaddingTop, childRight, childBottom); + final int childTop = mPaddingTop; + final int childBottom = mPaddingTop + child.getMeasuredHeight() - mPaddingBottom; + + int childLeft; + int childRight; + + final int layoutDirection = getLayoutDirection(); + final int horizontalGravity = mGravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK; + switch (Gravity.getAbsoluteGravity(horizontalGravity, layoutDirection)) { + case Gravity.RIGHT: + childRight = mRight - mLeft - mPaddingRight; + childLeft = childRight - child.getMeasuredWidth(); + break; + + case Gravity.CENTER_HORIZONTAL: + childLeft = mPaddingLeft + (mRight - mLeft - child.getMeasuredWidth()) / 2; + childRight = childLeft + child.getMeasuredWidth(); + break; + + case Gravity.LEFT: + default: + childLeft = mPaddingLeft; + childRight = childLeft + child.getMeasuredWidth(); + break; } + + if (childLeft < mPaddingLeft) { + childLeft = mPaddingLeft; + } + + if (childRight > mRight - mLeft - mPaddingRight) { + childRight = mRight - mLeft - mPaddingRight; + } + + child.layout(childLeft, childTop, childRight, childBottom); } @Override diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 2739cac..898c766 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -320,6 +320,8 @@ public class UserManager { * @return a value greater than or equal to 1 */ public static int getMaxSupportedUsers() { + // Don't allow multiple users on certain builds + if (android.os.Build.ID.startsWith("JVP")) return 1; return SystemProperties.getInt("fw.max_users", Resources.getSystem().getInteger(R.integer.config_multiuserMaximumUsers)); } diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java index 6a505e1..0f8966e 100644 --- a/core/java/android/webkit/WebViewClassic.java +++ b/core/java/android/webkit/WebViewClassic.java @@ -5187,7 +5187,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc if (cm.hasPrimaryClip()) { Point cursorPoint = new Point(contentToViewX(mSelectCursorBase.x), contentToViewY(mSelectCursorBase.y)); - Point cursorTop = calculateCaretTop(); + Point cursorTop = calculateBaseCaretTop(); cursorTop.set(contentToViewX(cursorTop.x), contentToViewY(cursorTop.y)); @@ -5231,17 +5231,22 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc return scale; } + private Point calculateBaseCaretTop() { + return calculateCaretTop(mSelectCursorBase, mSelectCursorBaseTextQuad); + } + + private Point calculateDraggingCaretTop() { + return calculateCaretTop(mSelectDraggingCursor, mSelectDraggingTextQuad); + } + /** * Assuming arbitrary shape of a quadralateral forming text bounds, this * calculates the top of a caret. */ - private Point calculateCaretTop() { - float scale = scaleAlongSegment(mSelectCursorBase.x, mSelectCursorBase.y, - mSelectCursorBaseTextQuad.p4, mSelectCursorBaseTextQuad.p3); - int x = Math.round(scaleCoordinate(scale, - mSelectCursorBaseTextQuad.p1.x, mSelectCursorBaseTextQuad.p2.x)); - int y = Math.round(scaleCoordinate(scale, - mSelectCursorBaseTextQuad.p1.y, mSelectCursorBaseTextQuad.p2.y)); + private static Point calculateCaretTop(Point base, QuadF quad) { + float scale = scaleAlongSegment(base.x, base.y, quad.p4, quad.p3); + int x = Math.round(scaleCoordinate(scale, quad.p1.x, quad.p2.x)); + int y = Math.round(scaleCoordinate(scale, quad.p1.y, quad.p2.y)); return new Point(x, y); } @@ -5271,12 +5276,20 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc return true; } - private void updateWebkitSelection() { + private void updateWebkitSelection(boolean isSnapped) { int handleId = (mSelectDraggingCursor == mSelectCursorBase) ? HANDLE_ID_BASE : HANDLE_ID_EXTENT; + int x = mSelectDraggingCursor.x; + int y = mSelectDraggingCursor.y; + if (isSnapped) { + // "center" the cursor in the snapping quad + Point top = calculateDraggingCaretTop(); + x = Math.round((top.x + x) / 2); + y = Math.round((top.y + y) / 2); + } mWebViewCore.removeMessages(EventHub.SELECT_TEXT); mWebViewCore.sendMessageAtFrontOfQueue(EventHub.SELECT_TEXT, - mSelectDraggingCursor.x, mSelectDraggingCursor.y, (Integer)handleId); + x, y, (Integer)handleId); } private void resetCaretTimer() { @@ -5614,7 +5627,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc Math.max(0, mEditTextContentBounds.top - buffer), mEditTextContentBounds.right + buffer, mEditTextContentBounds.bottom + buffer); - Point caretTop = calculateCaretTop(); + Point caretTop = calculateBaseCaretTop(); if (visibleRect.width() < mEditTextContentBounds.width()) { // The whole edit won't fit in the width, so use the caret rect if (mSelectCursorBase.x < caretTop.x) { @@ -5945,10 +5958,12 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc } else { endScrollEdit(); } + boolean snapped = false; if (inCursorText || (mIsEditingText && !inEditBounds)) { snapDraggingCursor(); + snapped = true; } - updateWebkitSelection(); + updateWebkitSelection(snapped); if (!inCursorText && mIsEditingText && inEditBounds) { // Visually snap even if we have moved the handle. snapDraggingCursor(); @@ -6275,7 +6290,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc int oldX = mSelectDraggingCursor.x; int oldY = mSelectDraggingCursor.y; mSelectDraggingCursor.set(selectionX, selectionY); - updateWebkitSelection(); + updateWebkitSelection(false); scrollEditText(scrollX, scrollY); mSelectDraggingCursor.set(oldX, oldY); } diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index 1bba5b4..fd7a6a7 100644 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -145,7 +145,7 @@ static void ToColor_S4444_Alpha(SkColor dst[], const void* src, int width, static void ToColor_S4444_Opaque(SkColor dst[], const void* src, int width,
SkColorTable*) {
SkASSERT(width > 0);
- const SkPMColor* s = (const SkPMColor*)src;
+ const SkPMColor16* s = (const SkPMColor16*)src;
do {
SkPMColor c = SkPixel4444ToPixel32(*s++);
*dst++ = SkColorSetRGB(SkGetPackedR32(c), SkGetPackedG32(c),
diff --git a/core/res/res/layout-land/keyguard_host_view.xml b/core/res/res/layout-land/keyguard_host_view.xml index 6003b42..521853f 100644 --- a/core/res/res/layout-land/keyguard_host_view.xml +++ b/core/res/res/layout-land/keyguard_host_view.xml @@ -45,9 +45,6 @@ android:paddingBottom="@dimen/keyguard_security_view_margin" android:gravity="center"> - <!-- SelectorView is always used, so add it here. The rest are loaded dynamically --> - <include layout="@layout/keyguard_selector_view"/> - </com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper> </com.android.internal.policy.impl.keyguard.KeyguardHostView> diff --git a/core/res/res/layout-land/keyguard_status_area.xml b/core/res/res/layout-land/keyguard_status_area.xml new file mode 100644 index 0000000..78bf931 --- /dev/null +++ b/core/res/res/layout-land/keyguard_status_area.xml @@ -0,0 +1,87 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +** +** Copyright 2009, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License") +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- This is a view that shows general status information in Keyguard. --> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/keyguard_status_area" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end" + android:layout_marginTop="-16dp" + android:orientation="vertical"> + + <TextView + android:id="@+id/date" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end" + android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" + android:singleLine="true" + android:ellipsize="marquee" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textSize="@dimen/kg_status_date_font_size" + /> + + <TextView + android:id="@+id/alarm_status" + android:layout_gravity="end" + android:layout_marginTop="28dp" + android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" + android:singleLine="true" + android:ellipsize="marquee" + android:textAppearance="?android:attr/textAppearance" + android:textSize="@dimen/kg_status_line_font_size" + android:drawablePadding="4dip" + /> + + <TextView + android:id="@+id/owner_info" + android:layout_gravity="end" + android:layout_marginTop="4dp" + android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" + android:singleLine="true" + android:ellipsize="marquee" + android:textAppearance="?android:attr/textAppearance" + android:textSize="@dimen/kg_status_line_font_size" + /> + + <TextView + android:id="@+id/status1" + android:layout_gravity="end" + android:layout_marginTop="4dp" + android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" + android:singleLine="true" + android:ellipsize="marquee" + android:textAppearance="?android:attr/textAppearance" + android:textSize="@dimen/kg_status_line_font_size" + /> + + <TextView + android:id="@+id/status_security_message" + android:layout_gravity="center" + android:gravity="right" + android:layout_marginTop="12dp" + android:singleLine="false" + android:maxLines="3" + android:ellipsize="marquee" + android:textAppearance="?android:attr/textAppearance" + android:textSize="16dp" + /> +</LinearLayout>
\ No newline at end of file diff --git a/core/res/res/layout-port/keyguard_host_view.xml b/core/res/res/layout-port/keyguard_host_view.xml index 58e108c..3ce9365 100644 --- a/core/res/res/layout-port/keyguard_host_view.xml +++ b/core/res/res/layout-port/keyguard_host_view.xml @@ -27,21 +27,22 @@ android:gravity="center_horizontal" android:orientation="vertical"> + <include layout="@layout/keyguard_widget_region" + android:layout_width="match_parent" + android:layout_height="0dip" + android:layout_weight="27" /> + <com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper android:id="@+id/view_flipper" - android:layout_height="match_parent" + android:layout_height="0dp" android:clipChildren="false" android:clipToPadding="false" + android:layout_weight="73" android:paddingLeft="@dimen/keyguard_security_view_margin" android:paddingTop="@dimen/keyguard_security_view_margin" android:paddingRight="@dimen/keyguard_security_view_margin" android:paddingBottom="@dimen/keyguard_security_view_margin" android:gravity="center"> - - <!-- SelectorView is always used, so add it here. The rest are loaded dynamically --> - <include layout="@layout/keyguard_selector_view"/> - </com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper> - </com.android.internal.policy.impl.keyguard.KeyguardHostView> diff --git a/core/res/res/layout-port/keyguard_status_area.xml b/core/res/res/layout-port/keyguard_status_area.xml new file mode 100644 index 0000000..00aac7b --- /dev/null +++ b/core/res/res/layout-port/keyguard_status_area.xml @@ -0,0 +1,90 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +** +** Copyright 2009, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License") +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- This is a view that shows general status information in Keyguard. --> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/keyguard_status_area" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="right" + android:orientation="vertical"> + + <LinearLayout + android:orientation="horizontal" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="0dp" + android:layout_gravity="right"> + <TextView + android:id="@+id/date" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" + android:singleLine="true" + android:ellipsize="marquee" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textSize="@dimen/kg_status_date_font_size" + /> + + <TextView + android:id="@+id/alarm_status" + android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" + android:singleLine="true" + android:ellipsize="marquee" + android:textAppearance="?android:attr/textAppearance" + android:textSize="@dimen/kg_status_line_font_size" + android:drawablePadding="4dip" + /> + </LinearLayout> + + <TextView + android:id="@+id/owner_info" + android:layout_gravity="right" + android:layout_marginTop="4dp" + android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" + android:singleLine="true" + android:ellipsize="marquee" + android:textAppearance="?android:attr/textAppearance" + android:textSize="@dimen/kg_status_line_font_size" + /> + + <TextView + android:id="@+id/status1" + android:layout_gravity="right" + android:layout_marginTop="4dp" + android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" + android:singleLine="true" + android:ellipsize="marquee" + android:textAppearance="?android:attr/textAppearance" + android:textSize="@dimen/kg_status_line_font_size" + /> + + <TextView + android:id="@+id/status_security_message" + android:layout_gravity="right" + android:layout_marginTop="4dp" + android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" + android:singleLine="true" + android:ellipsize="marquee" + android:textAppearance="?android:attr/textAppearance" + android:textSize="@dimen/kg_status_line_font_size" + /> + +</LinearLayout>
\ No newline at end of file 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 a3e9b59..23c1e9c 100644 --- a/core/res/res/layout-sw600dp-port/keyguard_host_view.xml +++ b/core/res/res/layout-sw600dp-port/keyguard_host_view.xml @@ -45,8 +45,7 @@ android:paddingBottom="@dimen/keyguard_security_view_margin" android:layout_gravity="center"> - <!-- SelectorView is always used, so add it here. The rest are loaded dynamically --> - <include layout="@layout/keyguard_selector_view"/> + </com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper> diff --git a/core/res/res/layout-sw600dp-port/keyguard_status_area.xml b/core/res/res/layout-sw600dp-port/keyguard_status_area.xml new file mode 100644 index 0000000..679aebd --- /dev/null +++ b/core/res/res/layout-sw600dp-port/keyguard_status_area.xml @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +** +** Copyright 2009, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License") +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- This is a view that shows general status information in Keyguard. --> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/keyguard_status_area" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end" + android:layout_marginTop="-16dp" + android:orientation="vertical"> + + <TextView + android:id="@+id/date" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end" + android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" + android:singleLine="true" + android:ellipsize="marquee" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textSize="@dimen/kg_status_date_font_size" + /> + + <TextView + android:id="@+id/alarm_status" + android:layout_gravity="end" + android:layout_marginTop="28dp" + android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" + android:singleLine="true" + android:ellipsize="marquee" + android:textAppearance="?android:attr/textAppearance" + android:textSize="@dimen/kg_status_line_font_size" + android:drawablePadding="4dip" + /> + + <TextView + android:id="@+id/owner_info" + android:layout_gravity="end" + android:layout_marginTop="4dp" + android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" + android:singleLine="true" + android:ellipsize="marquee" + android:textAppearance="?android:attr/textAppearance" + android:textSize="@dimen/kg_status_line_font_size" + /> + + <TextView + android:id="@+id/status1" + android:layout_gravity="end" + android:layout_marginTop="4dp" + android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" + android:singleLine="true" + android:ellipsize="marquee" + android:textAppearance="?android:attr/textAppearance" + android:textSize="@dimen/kg_status_line_font_size" + /> +</LinearLayout>
\ No newline at end of file diff --git a/core/res/res/layout-sw600dp/keyguard_navigation.xml b/core/res/res/layout-sw600dp/keyguard_navigation.xml new file mode 100644 index 0000000..2e6fa37 --- /dev/null +++ b/core/res/res/layout-sw600dp/keyguard_navigation.xml @@ -0,0 +1,21 @@ +<?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. +*/ +--> +<merge xmlns:android="http://schemas.android.com/apk/res/android"> + <include layout="@layout/default_navigation" /> +</merge> diff --git a/core/res/res/layout-sw600dp/keyguard_sim_puk_pin_navigation.xml b/core/res/res/layout-sw600dp/keyguard_sim_puk_pin_navigation.xml new file mode 100644 index 0000000..2e6fa37 --- /dev/null +++ b/core/res/res/layout-sw600dp/keyguard_sim_puk_pin_navigation.xml @@ -0,0 +1,21 @@ +<?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. +*/ +--> +<merge xmlns:android="http://schemas.android.com/apk/res/android"> + <include layout="@layout/default_navigation" /> +</merge> diff --git a/core/res/res/layout/default_navigation.xml b/core/res/res/layout/default_navigation.xml new file mode 100644 index 0000000..b13103c --- /dev/null +++ b/core/res/res/layout/default_navigation.xml @@ -0,0 +1,35 @@ +<?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. +*/ +--> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/keyguard_click_area" + android:gravity="center"> + + <!-- message area for security screen --> + <TextView + android:id="@+id/keyguard_message_area" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="start" + android:ellipsize="marquee" + android:layout_marginEnd="4dip" + android:layout_marginStart="4dip" + android:textSize="22dip" + android:textAppearance="?android:attr/textAppearanceMedium"/> + +</LinearLayout>
\ No newline at end of file diff --git a/core/res/res/layout/empty_navigation.xml b/core/res/res/layout/empty_navigation.xml new file mode 100644 index 0000000..6422070 --- /dev/null +++ b/core/res/res/layout/empty_navigation.xml @@ -0,0 +1,19 @@ +<?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. +*/ +--> +<merge xmlns:android="http://schemas.android.com/apk/res/android" />
\ No newline at end of file diff --git a/core/res/res/layout/keyguard_emergency_carrier_area.xml b/core/res/res/layout/keyguard_emergency_carrier_area.xml index 62cbac4..c16955c 100644 --- a/core/res/res/layout/keyguard_emergency_carrier_area.xml +++ b/core/res/res/layout/keyguard_emergency_carrier_area.xml @@ -24,6 +24,7 @@ android:layout_height="wrap_content" android:orientation="vertical" android:gravity="center_horizontal" + android:layout_gravity="center_horizontal" android:layout_alignParentBottom="true"> <com.android.internal.policy.impl.keyguard.CarrierText @@ -33,7 +34,6 @@ android:ellipsize="marquee" android:textAppearance="?android:attr/textAppearanceMedium" android:textSize="@dimen/kg_status_line_font_size" - android:layout_marginLeft="@dimen/kg_emergency_button_shift" android:textColor="?android:attr/textColorSecondary"/> <com.android.internal.policy.impl.keyguard.EmergencyButton @@ -46,7 +46,6 @@ android:textAppearance="?android:attr/textAppearanceMedium" android:textSize="@dimen/kg_status_line_font_size" android:textColor="?android:attr/textColorSecondary" - android:layout_marginLeft="@dimen/kg_emergency_button_shift" android:drawablePadding="8dip" /> </LinearLayout> diff --git a/core/res/res/layout/keyguard_face_unlock_view.xml b/core/res/res/layout/keyguard_face_unlock_view.xml index e25d035..845c265 100644 --- a/core/res/res/layout/keyguard_face_unlock_view.xml +++ b/core/res/res/layout/keyguard_face_unlock_view.xml @@ -27,17 +27,13 @@ <include layout="@layout/keyguard_navigation"/> - <Space - android:layout_width="match_parent" - android:layout_height="0dip" - android:layout_weight="1" /> - <RelativeLayout android:id="@+id/face_unlock_area_view" android:layout_width="match_parent" - android:layout_height="@dimen/face_unlock_height" - android:background="@drawable/intro_bg" - android:gravity="center"> + android:layout_height="@*android:dimen/face_unlock_height" + android:background="@*android:drawable/intro_bg" + android:gravity="center" + android:layout_weight="1"> <View android:id="@+id/spotlightMask" @@ -59,4 +55,11 @@ </RelativeLayout> + <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" /> </com.android.internal.policy.impl.keyguard.KeyguardFaceUnlockView> diff --git a/core/res/res/layout/keyguard_navigation.xml b/core/res/res/layout/keyguard_navigation.xml index c29dc70..8230c52 100644 --- a/core/res/res/layout/keyguard_navigation.xml +++ b/core/res/res/layout/keyguard_navigation.xml @@ -16,20 +16,6 @@ ** limitations under the License. */ --> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/keyguard_click_area" - android:gravity="center"> - - <!-- message area for security screen --> - <TextView - android:id="@+id/keyguard_message_area" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="start" - android:ellipsize="marquee" - android:layout_marginEnd="4dip" - android:layout_marginStart="4dip" - android:textSize="22dip" - android:textAppearance="?android:attr/textAppearanceMedium"/> - -</LinearLayout> +<merge xmlns:android="http://schemas.android.com/apk/res/android"> + <include layout="@layout/empty_navigation" /> +</merge> diff --git a/core/res/res/layout/keyguard_password_view.xml b/core/res/res/layout/keyguard_password_view.xml index f7071d2..92a7551 100644 --- a/core/res/res/layout/keyguard_password_view.xml +++ b/core/res/res/layout/keyguard_password_view.xml @@ -22,88 +22,106 @@ android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" - android:gravity="center_horizontal"> + android:layout_gravity="center"> - <LinearLayout - android:layout_height="0dip" + <FrameLayout android:layout_width="match_parent" - android:layout_weight="1" - android:orientation="vertical" - android:gravity="center"> + android:layout_height="match_parent"> - <include layout="@layout/keyguard_navigation"/> + <LinearLayout + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:orientation="vertical" + android:layout_gravity="center"> - </LinearLayout> + <LinearLayout + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:orientation="vertical" + android:gravity="center"> + <include layout="@layout/keyguard_navigation"/> + </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_gravity="center_vertical|fill_horizontal" - android:layout_width="match_parent" - android:orientation="horizontal" - android:background="#70000000" - android:layout_marginStart="4dip" - android:layout_marginEnd="4dip"> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> - <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" - /> + <!-- 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_gravity="center_vertical|fill_horizontal" + android:layout_width="match_parent" + android:orientation="horizontal" + android:background="#70000000" + android:layout_marginStart="4dip" + android:layout_marginEnd="4dip"> - <!-- This delete button is only visible for numeric PIN entry --> - <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" - 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" + /> - <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" - /> + <!-- This delete button is only visible for numeric PIN entry --> + <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" + android:visibility="gone" + /> - </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" + /> - <!-- Numeric keyboard --> - <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard" - android:layout_width="match_parent" - 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:visibility="gone" - android:clickable="true" - /> + </LinearLayout> - <Space - android:layout_width="match_parent" - android:layout_height="@dimen/kg_secure_padding_height" - android:background="@drawable/lockscreen_protection_pattern" /> + <!-- 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:visibility="gone" + android:clickable="true" + /> + </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" /> + </LinearLayout> + </FrameLayout> </com.android.internal.policy.impl.keyguard.KeyguardPasswordView> diff --git a/core/res/res/layout/keyguard_pattern_view.xml b/core/res/res/layout/keyguard_pattern_view.xml index 311f77f..47dea9f 100644 --- a/core/res/res/layout/keyguard_pattern_view.xml +++ b/core/res/res/layout/keyguard_pattern_view.xml @@ -28,39 +28,56 @@ android:layout_height="match_parent" android:gravity="center_horizontal"> - <LinearLayout - android:layout_height="0dip" + <FrameLayout android:layout_width="match_parent" - android:layout_weight="1" - android:orientation="vertical" - android:gravity="center"> + android:layout_height="match_parent"> - <include layout="@layout/keyguard_navigation"/> - - <Button android:id="@+id/forgot_password_button" - android:layout_width="wrap_content" + <LinearLayout android:layout_height="wrap_content" - android:textSize="@dimen/kg_status_line_font_size" - android:visibility="gone"/> + android:layout_width="wrap_content" + android:orientation="vertical" + android:layout_gravity="center"> - </LinearLayout> + <LinearLayout + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:orientation="vertical" + android: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. --> - <com.android.internal.widget.LockPatternView - android:id="@+id/lockPatternView" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_marginEnd="8dip" - android:layout_marginBottom="4dip" - android:layout_marginStart="8dip" - android:layout_gravity="center_horizontal" /> + <include layout="@layout/keyguard_navigation"/> - <Space - android:layout_width="match_parent" - android:layout_height="@dimen/kg_secure_padding_height" - android:background="@drawable/lockscreen_protection_pattern" /> + <Button android:id="@+id/forgot_password_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textSize="@dimen/kg_status_line_font_size" + android:visibility="gone"/> + + </LinearLayout> + + <!-- 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. --> + <com.android.internal.widget.LockPatternView + android:id="@+id/lockPatternView" + android:layout_width="wrap_content" + android:layout_height="0dp" + android:layout_weight="1" + android:layout_marginEnd="8dip" + android:layout_marginBottom="4dip" + android:layout_marginStart="8dip" + android:layout_gravity="center_horizontal" + android:gravity="center" /> + + <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> </com.android.internal.policy.impl.keyguard.KeyguardPatternView> diff --git a/core/res/res/layout/keyguard_selector_view.xml b/core/res/res/layout/keyguard_selector_view.xml index 3d3c504..4838c2a 100644 --- a/core/res/res/layout/keyguard_selector_view.xml +++ b/core/res/res/layout/keyguard_selector_view.xml @@ -28,15 +28,9 @@ android:clipToPadding="false" android:orientation="vertical"> - <include layout="@layout/keyguard_widget_region" - android:layout_width="match_parent" - android:layout_height="0dip" - android:layout_weight="0.45" /> - <FrameLayout - android:layout_width="wrap_content" - android:layout_height="0dip" - android:layout_weight="0.55" + android:layout_width="match_parent" + android:layout_height="match_parent" android:layout_gravity="center" android:clipChildren="false" android:clipToPadding="false" @@ -51,7 +45,6 @@ android:orientation="vertical" android:layout_gravity="bottom|center_horizontal" android:gravity="center_horizontal" /> - </FrameLayout> </com.android.internal.policy.impl.keyguard.KeyguardSelectorView> diff --git a/core/res/res/layout/keyguard_sim_pin_view.xml b/core/res/res/layout/keyguard_sim_pin_view.xml index 91dd6d0..82268ad 100644 --- a/core/res/res/layout/keyguard_sim_pin_view.xml +++ b/core/res/res/layout/keyguard_sim_pin_view.xml @@ -26,78 +26,87 @@ android:gravity="center_horizontal"> <LinearLayout - android:layout_height="0dip" android:layout_width="match_parent" + android:layout_height="0dp" 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"/> + android:orientation="vertical"> - <include layout="@layout/keyguard_navigation"/> + <LinearLayout + android:layout_height="0dip" + android:layout_width="match_parent" + android:layout_weight="1" + android:orientation="vertical" + android:gravity="center"> - </LinearLayout> + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/ic_lockscreen_sim"/> - <!-- 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"> + <include layout="@layout/keyguard_sim_puk_pin_navigation"/> + </LinearLayout> - <!-- displays dots as user enters pin --> - <EditText android:id="@+id/sim_pin_entry" - android:layout_width="0dip" + <!-- 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: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" - /> + android:orientation="horizontal" + android:layout_marginEnd="4dip" + android:layout_marginStart="4dip" + android:gravity="center_vertical" + android:background="#70000000"> - <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" + <!-- 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> + + <!-- Numeric keyboard --> + <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard" + android:layout_width="match_parent" + 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" - android:padding="8dip" - android:background="?android:attr/selectableItemBackground" /> </LinearLayout> - <!-- Numeric keyboard --> - <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard" + <include layout="@layout/keyguard_emergency_carrier_area" + android:id="@+id/keyguard_selector_fade_container" android:layout_width="match_parent" - 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" - /> - - <Space - android:layout_width="match_parent" - android:layout_height="@dimen/kg_secure_padding_height" - android:background="@drawable/lockscreen_protection_pattern" /> + 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_pin_navigation.xml b/core/res/res/layout/keyguard_sim_puk_pin_navigation.xml new file mode 100644 index 0000000..2e6fa37 --- /dev/null +++ b/core/res/res/layout/keyguard_sim_puk_pin_navigation.xml @@ -0,0 +1,21 @@ +<?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. +*/ +--> +<merge xmlns:android="http://schemas.android.com/apk/res/android"> + <include layout="@layout/default_navigation" /> +</merge> diff --git a/core/res/res/layout/keyguard_sim_puk_view.xml b/core/res/res/layout/keyguard_sim_puk_view.xml index 0c41a34..6404efc 100644 --- a/core/res/res/layout/keyguard_sim_puk_view.xml +++ b/core/res/res/layout/keyguard_sim_puk_view.xml @@ -27,78 +27,87 @@ android:gravity="center_horizontal"> <LinearLayout - android:layout_height="0dip" android:layout_width="match_parent" + android:layout_height="0dp" android:layout_weight="1" - android:orientation="vertical" - android:gravity="center"> + android:orientation="vertical"> - <ImageView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:src="@drawable/ic_lockscreen_sim"/> + <LinearLayout + android:layout_height="0dip" + android:layout_width="match_parent" + android:layout_weight="1" + android:orientation="vertical" + android:gravity="center"> - <include layout="@layout/keyguard_navigation"/> + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/ic_lockscreen_sim"/> - </LinearLayout> + <include layout="@layout/keyguard_sim_puk_pin_navigation"/> - <!-- 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"> + </LinearLayout> - <!-- displays dots as user enters pin --> - <EditText android:id="@+id/sim_pin_entry" - android:layout_width="0dip" + <!-- 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: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" - /> + android:orientation="horizontal" + android:layout_marginEnd="4dip" + android:layout_marginStart="4dip" + android:gravity="center_vertical" + android:background="#70000000"> - <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" + <!-- 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> + + <!-- Numeric keyboard --> + <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard" + android:layout_width="match_parent" + 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" - android:padding="8dip" - android:background="?android:attr/selectableItemBackground" /> </LinearLayout> - <!-- Numeric keyboard --> - <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard" - android:layout_width="match_parent" - 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" - /> - - <Space + <include layout="@layout/keyguard_emergency_carrier_area" + android:id="@+id/keyguard_selector_fade_container" android:layout_width="match_parent" - android:layout_height="@dimen/kg_secure_padding_height" - android:background="@drawable/lockscreen_protection_pattern" /> - + 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_status_view.xml b/core/res/res/layout/keyguard_status_view.xml index 0d3d574..a462c54 100644 --- a/core/res/res/layout/keyguard_status_view.xml +++ b/core/res/res/layout/keyguard_status_view.xml @@ -21,16 +21,17 @@ <com.android.internal.policy.impl.keyguard.KeyguardWidgetFrame xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/keyguard_status_view" - android:layout_width="wrap_content" - android:layout_height="wrap_content" + android:layout_width="match_parent" + android:layout_height="match_parent" android:gravity="center_horizontal"> <com.android.internal.policy.impl.keyguard.KeyguardStatusView + android:id="@+id/keyguard_status_view_face_palm" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal|top" - android:contentDescription="@string/keyguard_accessibility_status"> + android:contentDescription="@*android:string/keyguard_accessibility_status"> <com.android.internal.policy.impl.keyguard.ClockView android:id="@+id/clock_view" @@ -38,7 +39,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/kg_clock_top_margin" android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" - android:layout_gravity="end"> + android:layout_gravity="right"> <TextView android:id="@+id/clock_text" android:layout_width="wrap_content" @@ -53,54 +54,7 @@ </com.android.internal.policy.impl.keyguard.ClockView> - <TextView - android:id="@+id/date" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end" - android:layout_marginTop="-16dp" - android:layout_marginBottom="24dp" - android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" - android:singleLine="true" - android:ellipsize="marquee" - android:textAppearance="?android:attr/textAppearanceMedium" - android:textSize="@dimen/kg_status_date_font_size" - /> - - <TextView - android:id="@+id/alarm_status" - android:layout_gravity="end" - android:layout_marginTop="4dp" - android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" - android:singleLine="true" - android:ellipsize="marquee" - android:textAppearance="?android:attr/textAppearanceMedium" - android:textSize="@dimen/kg_status_line_font_size" - android:drawablePadding="4dip" - /> - - <TextView - android:id="@+id/owner_info" - android:layout_gravity="end" - android:layout_marginTop="4dp" - android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" - android:singleLine="true" - android:ellipsize="marquee" - android:textAppearance="?android:attr/textAppearanceMedium" - android:textSize="@dimen/kg_status_line_font_size" - /> - - <TextView - android:id="@+id/status1" - android:layout_gravity="end" - android:layout_marginTop="4dp" - android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" - android:singleLine="true" - android:ellipsize="marquee" - android:textAppearance="?android:attr/textAppearanceMedium" - android:textSize="@dimen/kg_status_line_font_size" - /> + <include layout="@layout/keyguard_status_area" /> </com.android.internal.policy.impl.keyguard.KeyguardStatusView> - -</com.android.internal.policy.impl.keyguard.KeyguardWidgetFrame>
\ No newline at end of file +</com.android.internal.policy.impl.keyguard.KeyguardWidgetFrame> diff --git a/core/res/res/layout/keyguard_widget_region.xml b/core/res/res/layout/keyguard_widget_region.xml index 01b5551..ed10c2b 100644 --- a/core/res/res/layout/keyguard_widget_region.xml +++ b/core/res/res/layout/keyguard_widget_region.xml @@ -39,7 +39,8 @@ android:orientation="horizontal" android:paddingLeft="@dimen/kg_widget_pager_horizontal_padding" android:paddingRight="@dimen/kg_widget_pager_horizontal_padding" - android:layout_marginTop="@dimen/kg_runway_lights_top_margin"> + android:layout_marginTop="@dimen/kg_runway_lights_top_margin" + android:visibility="gone"> <com.android.internal.policy.impl.keyguard.KeyguardGlowStripView android:id="@+id/left_strip" android:paddingTop="@dimen/kg_runway_lights_vertical_padding" diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 61b1148..0f73ff5 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Hou aan om met twee vingers te hou om toeganklikheid te aktiveer."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Toeganklikheid geaktiveer."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Toeganklikheid gekanselleer."</string> <string name="user_switched" msgid="3768006783166984410">"Huidige gebruiker <xliff:g id="NAME">%1$s</xliff:g> ."</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 214d819..f60ac3e 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -1418,7 +1418,8 @@ <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> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"ድምጽ አደጋ ከሌለው መጠን በላይ ይጨመር??"\n"ለረጅም ጊዜ በከፍተኛ ድምጽ መስማት የመስማት ችሎታዎን ሊጎዳይ ይችላል።"</string> - <string name="continue_to_enable_accessibility" msgid="2184747411804432885">"ተደራሽነትን ለማንቃት ሁለት ጣቶችዎን ባሉበት ያቆዩዋቸው።"</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"ተደራሽነት ነቅቷል።"</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"ተደራሽነት ተሰርዟል።"</string> <string name="user_switched" msgid="3768006783166984410">"የአሁኑ ተጠቃሚ <xliff:g id="NAME">%1$s</xliff:g>።"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 790acac..dfa8834 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1418,7 +1418,8 @@ <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> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"هل تريد رفع مستوى الصوت فوق المستوى الآمن؟"\n"قد يضر سماع صوت عالٍ لفترات طويلة بسمعك."</string> - <string name="continue_to_enable_accessibility" msgid="2184747411804432885">"اضغط بإصبعين لأسفل مع الاستمرار لتمكين تسهيل الدخول."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"تم تمكين إمكانية الدخول."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"تم إلغاء تسهيل الدخول."</string> <string name="user_switched" msgid="3768006783166984410">"المستخدم الحالي <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 4342bb8..4403f97 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -1419,7 +1419,8 @@ <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> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Павялiчыць гук больш за рэкамендаваны ўзровень?"\n"Доўгае слуханне музыкi на вялiкай гучнасцi можа пашкодзiць ваш слых."</string> - <string name="continue_to_enable_accessibility" msgid="2184747411804432885">"Утрымлiвайце два пальца, каб уключыць даступнасць."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Даступнасць уключана."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Даступнасць адменена."</string> <string name="user_switched" msgid="3768006783166984410">"Бягучы карыстальнік <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index e71363a..b46e30a 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -1418,7 +1418,8 @@ <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> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Да се увеличи ли силата на звука над безопасното ниво?"\n"Продължителното слушане при висока сила на звука може да увреди слуха ви."</string> - <string name="continue_to_enable_accessibility" msgid="2184747411804432885">"Задръжте два пръста, за да активирате функцията за достъпност."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Достъпността е активирана."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Функцията за достъпност е анулирана."</string> <string name="user_switched" msgid="3768006783166984410">"Текущ потребител <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index aa2d431..501946b 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Mantén premuts els dos dits per activar l\'accessibilitat."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"S\'ha activat l\'accessibilitat."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Accessibilitat cancel·lada."</string> <string name="user_switched" msgid="3768006783166984410">"Usuari actual: <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index b6517dc..7381366 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Usnadnění povolíte přidržením dvěma prsty."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Usnadnění přístupu je aktivováno."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Usnadnění zrušeno."</string> <string name="user_switched" msgid="3768006783166984410">"Aktuální uživatel je <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 650fb72..e14e7de 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Hold fortsat dine to fingre nede for at aktivere tilgængelighed."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Tilgængelighed aktiveret."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Tilgængelighed er annulleret."</string> <string name="user_switched" msgid="3768006783166984410">"Nuværende bruger <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 9fbea68..c938ca5 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Drücken Sie mit zwei Fingern, um die Bedienungshilfen zu aktivieren."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Bedienungshilfen aktiviert"</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Bedienungshilfen abgebrochen"</string> <string name="user_switched" msgid="3768006783166984410">"Aktueller Nutzer <xliff:g id="NAME">%1$s</xliff:g>"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index b177c0f..9ced98c 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -1418,7 +1418,8 @@ <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> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Αύξηση έντασης ήχου πάνω από το επίπεδο ασφαλείας;"\n"Αν ακούτε μουσική σε υψηλή ένταση για μεγάλο χρονικό διάστημα ενδέχεται να προκληθεί βλάβη στην ακοή σας."</string> - <string name="continue_to_enable_accessibility" msgid="2184747411804432885">"Αγγίξτε παρατεταμένα με δύο δάχτυλα για να ενεργοποιήσετε τη λειτουργία προσβασιμότητας."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Ενεργοποιήθηκε η προσβασιμότητα."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Η λειτουργία προσβασιμότητας ακυρώθηκε."</string> <string name="user_switched" msgid="3768006783166984410">"Τρέχων χρήστης <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 9eaa77a..9011e9d 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Keep holding down your two fingers to enable accessibility."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Accessibility enabled."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Accessibility cancelled."</string> <string name="user_switched" msgid="3768006783166984410">"Current user <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 2b4e06a..d0a1cd9 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Mantén presionada el área con dos dedos para activar la accesibilidad."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Se activó la accesibilidad."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Se canceló la accesibilidad."</string> <string name="user_switched" msgid="3768006783166984410">"Usuario actual: <xliff:g id="NAME">%1$s</xliff:g>"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 0cb26d6..b45f001 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Mantén la pantalla pulsada con dos dedos para habilitar las funciones de accesibilidad."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Accesibilidad habilitada"</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Accesibilidad cancelada"</string> <string name="user_switched" msgid="3768006783166984410">"Usuario actual: <xliff:g id="NAME">%1$s</xliff:g>"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 682650b..fbb9f3e 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Hõlbustuse lubamiseks hoidke kaht sõrme all."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Hõlbustus on lubatud."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Hõlbustus on tühistatud."</string> <string name="user_switched" msgid="3768006783166984410">"Praegune kasutaja <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 8369261..ae0ca2b 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1418,7 +1418,8 @@ <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> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"صدا به بالاتر از سطح ایمن افزایش یابد؟"\n"گوش دادن به صدای بلند برای زمانهای طولانی میتواند به شنوایی شما آسیب برساند."</string> - <string name="continue_to_enable_accessibility" msgid="2184747411804432885">"برای فعال کردن قابلیت دسترسی، با دو انگشت خود همچنان به طرف پایین فشار دهید."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"قابلیت دسترسی فعال شد."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"قابلیت دسترسی لغو شد."</string> <string name="user_switched" msgid="3768006783166984410">"کاربر کنونی <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index ff4a8a2..ae2a4cb 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Ota esteettömyystila käyttöön koskettamalla pitkään kahdella sormella."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Esteettömyystila käytössä."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Esteettömyystila peruutettu."</string> <string name="user_switched" msgid="3768006783166984410">"Nykyinen käyttäjä: <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index c3a5be2..aa4f91e 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Appuyez de manière prolongée avec deux doigts pour activer l\'accessibilité."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"L\'accessibilité a bien été activée."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Accessibilité annulée."</string> <string name="user_switched" msgid="3768006783166984410">"Utilisateur actuel : <xliff:g id="NAME">%1$s</xliff:g>"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index c53e0fd..d0f1dc5 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1418,7 +1418,8 @@ <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> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"वॉल्यूम को सुरक्षित स्तर से अधिक करें?"\n"अधिक देर तक उच्च वॉल्यूम पर सुनने से आपकी सुनने की क्षमता को नुकसान हो सकता है."</string> - <string name="continue_to_enable_accessibility" msgid="2184747411804432885">"पहुंच-योग्यता सक्षम करने के लिए अपनी दो अंगुलियों को नीचे की ओर करके रखें."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"पहुंच-योग्यता सक्षम कर दी है."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"पहुंच-योग्यता रद्द की गई."</string> <string name="user_switched" msgid="3768006783166984410">"वर्तमान उपयोगकर्ता <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index a57d287..f223fa6 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Nastavite držati s dva prsta kako biste omogućili pristupačnost."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Dostupnost je omogućena."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Pristupačnost otkazana."</string> <string name="user_switched" msgid="3768006783166984410">"Trenutačni korisnik <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index d997deb..3815c38 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Továbbra is tartsa lenyomva két ujját a hozzáférés engedélyezéséhez."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Hozzáférés engedélyezve"</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Hozzáférés megszakítva."</string> <string name="user_switched" msgid="3768006783166984410">"<xliff:g id="NAME">%1$s</xliff:g> az aktuális felhasználó."</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 90b81b1..17b4944 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Terus tahan dua jari Anda untuk mengaktifkan aksesibilitas."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Aksesibilitas diaktifkan."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Aksesibilitas dibatalkan."</string> <string name="user_switched" msgid="3768006783166984410">"Pengguna saat ini <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index c54f8bc..3a91039 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Continua a tenere premuto con due dita per attivare l\'accessibilità."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Accessibilità attivata."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Accessibilità annullata."</string> <string name="user_switched" msgid="3768006783166984410">"Utente corrente <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 7c91c84..bd1ffb7 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1418,7 +1418,8 @@ <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> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"האם להעלות את עוצמת הקול מעל לרמה הבטוחה?"\n"האזנה בעוצמת קול גבוהה למשך זמן ארוך עלולה לפגוע בשמיעה."</string> - <string name="continue_to_enable_accessibility" msgid="2184747411804432885">"המשך לגעת בשתי אצבעות כדי להפעיל נגישות."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"נגישות הופעלה."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"נגישות בוטלה."</string> <string name="user_switched" msgid="3768006783166984410">"המשתמש הנוכחי <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index d5555b8..97a1675 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -1418,7 +1418,8 @@ <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> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"安全レベルを超えるまで音量を上げますか?"\n"大音量で長時間聞き続けると、聴力を損なう恐れがあります。"</string> - <string name="continue_to_enable_accessibility" msgid="2184747411804432885">"ユーザー補助機能を有効にするには2本の指で押し続けてください。"</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"ユーザー補助が有効になりました。"</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"ユーザー補助をキャンセルしました。"</string> <string name="user_switched" msgid="3768006783166984410">"現在のユーザーは<xliff:g id="NAME">%1$s</xliff:g>です。"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index fc0492d..e10fd3f 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1418,7 +1418,8 @@ <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> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"안전한 수준 이상으로 볼륨을 높이시겠습니까?"\n"높은 볼륨으로 장시간 청취하면 청력에 손상이 올 수 있습니다."</string> - <string name="continue_to_enable_accessibility" msgid="2184747411804432885">"두 손가락으로 길게 누르면 접근성을 사용하도록 설정됩니다."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"접근성을 사용 설정했습니다."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"접근성이 취소되었습니다."</string> <string name="user_switched" msgid="3768006783166984410">"현재 사용자는 <xliff:g id="NAME">%1$s</xliff:g>님입니다."</string> diff --git a/core/res/res/values-land/bools.xml b/core/res/res/values-land/bools.xml new file mode 100644 index 0000000..4dd9369 --- /dev/null +++ b/core/res/res/values-land/bools.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2012 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources> + <bool name="kg_share_status_area">false</bool> + <bool name="kg_sim_puk_full_screen">false</bool> +</resources> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 4170a16..ee0260a 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Laikykite palietę dviem pirštais, kad įgalintumėte pritaikymo neįgaliesiems režimą."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Pritaikymas neįgaliesiems įgalintas."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Pritaikymo neįgaliesiems režimas atšauktas."</string> <string name="user_switched" msgid="3768006783166984410">"Dabartinis naudotojas: <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 9ce4daa..dd26946 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Turiet nospiestus divus pirkstus, lai iespējotu pieejamību."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Pieejamības režīms ir iespējots."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Pieejamība ir atcelta."</string> <string name="user_switched" msgid="3768006783166984410">"Pašreizējais lietotājs: <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 6124e00..79eefef 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Teruskan menahan dengan dua jari anda untuk mendayakan kebolehcapaian."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Kebolehcapaian didayakan."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Kebolehcapaian dibatalkan."</string> <string name="user_switched" msgid="3768006783166984410">"Pengguna semasa <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index d805783..c10d7b4 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Fortsett å holde nede to fingre for å aktivere tilgjengelighetstjenesten."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Tilgjengelighet er aktivert."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Tilgjengelighetstjenesten ble avbrutt."</string> <string name="user_switched" msgid="3768006783166984410">"Gjeldende bruker: <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 74cbf07..41037d6 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Blijf het scherm met twee vingers aanraken om toegankelijkheid in te schakelen."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Toegankelijkheid ingeschakeld."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Toegankelijkheid geannuleerd."</string> <string name="user_switched" msgid="3768006783166984410">"Huidige gebruiker <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 6150e0b..7381794b 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1419,7 +1419,8 @@ <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> <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="2184747411804432885">"Aby włączyć ułatwienia dostępu, przytrzymaj dwa palce."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Włączono ułatwienia dostępu."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Ułatwienia dostępu zostały anulowane."</string> <string name="user_switched" msgid="3768006783166984410">"Bieżący użytkownik: <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-port/bools.xml b/core/res/res/values-port/bools.xml index fc62b69..1597af3 100644 --- a/core/res/res/values-port/bools.xml +++ b/core/res/res/values-port/bools.xml @@ -16,4 +16,6 @@ <resources> <bool name="action_bar_embed_tabs">false</bool> + <bool name="kg_share_status_area">true</bool> + <bool name="kg_sim_puk_full_screen">true</bool> </resources> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index de48970..9a06263 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Mantenha os dois dedos para ativar a acessibilidade."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Acessibilidade ativada."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Acessibilidade cancelada."</string> <string name="user_switched" msgid="3768006783166984410">"<xliff:g id="NAME">%1$s</xliff:g> do utilizador atual."</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 9f37c07..55f727a2 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Mantenha pressionado com dois dedos para ativar a acessibilidade."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Acessibilidade ativada."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Acessibilidade cancelada."</string> <string name="user_switched" msgid="3768006783166984410">"Usuário atual <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml index 5e6fc27..3f8bbf4 100644 --- a/core/res/res/values-rm/strings.xml +++ b/core/res/res/values-rm/strings.xml @@ -2290,7 +2290,7 @@ <skip /> <!-- no translation found for safe_media_volume_warning (7382971871993371648) --> <skip /> - <!-- no translation found for continue_to_enable_accessibility (2184747411804432885) --> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> <skip /> <!-- no translation found for accessibility_enabled (1381972048564547685) --> <skip /> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 051cd22..81aaaa0 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Menţineţi două degete pe ecran pentru a activa accesibilitatea."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"S-a activat accesibilitatea."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Accesibilitatea a fost anulată"</string> <string name="user_switched" msgid="3768006783166984410">"Utilizator curent: <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 13d3e0e..0b3d009 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1418,7 +1418,8 @@ <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> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Увеличить громкость до небезопасного уровня?"\n"Долговременное прослушивание на такой громкости может повредить слух."</string> - <string name="continue_to_enable_accessibility" msgid="2184747411804432885">"Чтобы включить специальные возможности, удерживайте пальцы на экране."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Специальные возможности включены."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Специальные возможности не будут включены."</string> <string name="user_switched" msgid="3768006783166984410">"Выбран аккаунт пользователя <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 7c60378..e6a3b38 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Zjednodušenie ovládania povolíte podržaním dvoma prstami."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Zjednodušenie ovládania je povolené."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Zjednodušenie ovládania bolo zrušené."</string> <string name="user_switched" msgid="3768006783166984410">"Aktuálny používateľ je <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index bff5550..cdd8d11 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Če želite omogočiti pripomočke za ljudi s posebnimi potrebami, na zaslonu pridržite dva prsta."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Pripomočki za ljudi s posebnimi potrebami so omogočeni."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Omogočanje pripomočkov za ljudi s posebnimi potrebami preklicano."</string> <string name="user_switched" msgid="3768006783166984410">"Trenutni uporabnik <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 2ed84ce..bfeb021 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1418,7 +1418,8 @@ <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> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Желите да појачате звук изнад безбедног нивоа?"\n"Ако дуже време слушате гласну музику, може доћи до оштећења слуха."</string> - <string name="continue_to_enable_accessibility" msgid="2184747411804432885">"Држите са два прста да бисте омогућили приступачност."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Приступачност је омогућена."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Приступачност је отказана."</string> <string name="user_switched" msgid="3768006783166984410">"Актуелни корисник <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index c6fee48..428e3d6 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Fortsätt trycka med två fingrar om du vill aktivera tillgänglighetsläget."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Tillgänglighetsläget har aktiverats."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Byte till tillgänglighetsläge avbrutet."</string> <string name="user_switched" msgid="3768006783166984410">"Nuvarande användare: <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 65f429f..ddc4e04 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Endelea kufinyilia kwa vidole vyako viwili ili kuwezesha ufikivu."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Ufikivu umewezeshwa."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Ufikivu umeghairiwa."</string> <string name="user_switched" msgid="3768006783166984410">"Mtumiaji wa sasa <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-sw380dp-land/dimens.xml b/core/res/res/values-sw380dp-land/dimens.xml index d1a1bed..20eb1be 100644 --- a/core/res/res/values-sw380dp-land/dimens.xml +++ b/core/res/res/values-sw380dp-land/dimens.xml @@ -19,5 +19,5 @@ --> <resources> <!-- Top margin for the clock view --> - <dimen name="kg_clock_top_margin">67dp</dimen> + <dimen name="kg_clock_top_margin">48dp</dimen> </resources> diff --git a/core/res/res/values-sw600dp/bools.xml b/core/res/res/values-sw600dp/bools.xml index 2f65eab..355c52c 100644 --- a/core/res/res/values-sw600dp/bools.xml +++ b/core/res/res/values-sw600dp/bools.xml @@ -17,4 +17,6 @@ <resources> <bool name="target_honeycomb_needs_options_menu">false</bool> <bool name="show_ongoing_ime_switcher">true</bool> + <bool name="kg_share_status_area">false</bool> + <bool name="kg_sim_puk_full_screen">false</bool> </resources> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 2daf807..a619a36 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1418,7 +1418,8 @@ <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> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"เพิ่มระดับเสียงจนเกินระดับที่ปลอดภัยหรือไม่"\n"การฟังเสียงดังเป็นเวลานานอาจทำให้การได้ยินของคุณบกพร่องได้"</string> - <string name="continue_to_enable_accessibility" msgid="2184747411804432885">"ใช้สองนิ้วแตะค้างไว้เพื่อเปิดใช้งานการเข้าถึง"</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"เปิดใช้งานการเข้าถึงแล้ว"</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"ยกเลิกการเข้าถึงแล้ว"</string> <string name="user_switched" msgid="3768006783166984410">"ผู้ใช้ปัจจุบัน <xliff:g id="NAME">%1$s</xliff:g>"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index a25caed..cfe58c7 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Panatilihing nakapindot nang matagal ang iyong dalawang daliri upang paganahin ang pagiging naa-access."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Pinagana ang accessibility."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Nakansela ang pagiging naa-access."</string> <string name="user_switched" msgid="3768006783166984410">"Kasalukuyang user <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 289919a..2c9407b 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Erişilebilirliği etkinleştirmek için iki parmağınızı basılı tutmaya devam edin."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Erişilebilirlik etkinleştirildi."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Erişilebilirlik iptal edildi."</string> <string name="user_switched" msgid="3768006783166984410">"Geçerli kullanıcı: <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 730d7bd..3072cb9 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1418,7 +1418,8 @@ <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> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Збільшити гучність понад безпечний рівень?"\n"Надто гучне прослуховування впродовж тривалого періоду може пошкодити слух."</string> - <string name="continue_to_enable_accessibility" msgid="2184747411804432885">"Утримуйте двома пальцями, щоб увімкнути доступність."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Доступність увімкнено."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Доступність скасовано."</string> <string name="user_switched" msgid="3768006783166984410">"Поточний користувач: <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 495d056..3dbe71b 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1418,7 +1418,8 @@ <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> <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="2184747411804432885">"Tiếp tục giữ hai ngón tay để bật trợ năng."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Trợ năng đã được bật."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Đã hủy trợ năng."</string> <string name="user_switched" msgid="3768006783166984410">"Người dùng hiện tại <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index d98ea83..ea55480 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1418,7 +1418,8 @@ <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> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"将音量调高到安全级别以上?"\n"长时间聆听高音量可能会损伤听力。"</string> - <string name="continue_to_enable_accessibility" msgid="2184747411804432885">"持续按住双指即可启用辅助功能。"</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"辅助功能已启用。"</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"已取消辅助功能。"</string> <string name="user_switched" msgid="3768006783166984410">"当前用户是<xliff:g id="NAME">%1$s</xliff:g>。"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 8d00574..3301945 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -1418,7 +1418,8 @@ <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> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"要將音量調高到安全等級以上嗎?"\n"長時間聆聽偏高音量可能會損害您的聽力。"</string> - <string name="continue_to_enable_accessibility" msgid="2184747411804432885">"持續用兩指按住即可啟用協助工具。"</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"協助工具已啟用。"</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"協助工具已取消。"</string> <string name="user_switched" msgid="3768006783166984410">"目前的使用者是 <xliff:g id="NAME">%1$s</xliff:g>。"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index db7987d..ef48346 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -1418,7 +1418,8 @@ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Udwebe ngokungalungile iphathini yakho yokuvula izikhathi ezingu-<xliff:g id="NUMBER_0">%d</xliff:g>. Emva <xliff:g id="NUMBER_1">%d</xliff:g> kweminye imizamo engaphumelelanga, uzocelwa ukuvula ithebhulethi yakho usebenzisa ukungena ngemvume kwi-Google."\n\n" Sicela uzame futhi kwengu-<xliff:g id="NUMBER_2">%d</xliff:g> imizuzwana."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Ukulayisha ungenisa iphathini yakho yokuvula ngendlela engalungile izikhathi ezi-<xliff:g id="NUMBER_0">%d</xliff:g> Emva kweminye imizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g>, uzocelwa ukuvula ifoni yakho usebenzisa ukungena ngemvume ku-Google"\n\n" Zame futhi emumva kwengu- <xliff:g id="NUMBER_2">%d</xliff:g> imizuzwana."</string> <string name="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="2184747411804432885">"Gcina ucindezele iminwe yakho emibili ukuze unike amandla ukufinyelela."</string> + <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> + <skip /> <string name="accessibility_enabled" msgid="1381972048564547685">"Ukufinyelela kunikwe amandla."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Ukufinyelela kukhanseliwe."</string> <string name="user_switched" msgid="3768006783166984410">"Umsebenzisi wamanje <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 9ce7f8a..3550df9 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -1197,8 +1197,8 @@ <!-- A coordinate in the Y dimension. --> <attr name="y" format="dimension" /> - <!-- Specifies how to place the content of an object, both - on the x- and y-axis, within the object itself. --> + <!-- Specifies how an object should position its content, on both the X and Y axes, + within its own bounds. --> <attr name="gravity"> <!-- Push object to the top of its container, not changing its size. --> <flag name="top" value="0x30" /> @@ -1257,8 +1257,8 @@ <!-- Reference to an array resource that will populate a list/adapter. --> <attr name="entries" format="reference" /> - <!-- Standard gravity constant that a child can supply to its parent. - Defines how to place the view, both its x- and y-axis, within its parent view group. --> + <!-- Standard gravity constant that a child supplies to its parent. + Defines how the child view should be positioned, on both the X and Y axes, within its enclosing layout. --> <attr name="layout_gravity"> <!-- Push object to the top of its container, not changing its size. --> <flag name="top" value="0x30" /> @@ -5781,4 +5781,10 @@ <attr name="leftToRight" format="boolean" /> </declare-styleable> + <!-- Attributes that can be used with <code><FragmentBreadCrumbs></code> + tags. --> + <declare-styleable name="FragmentBreadCrumbs"> + <attr name="gravity" /> + </declare-styleable> + </resources> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 345175e..31d4ad7 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -255,13 +255,13 @@ <dimen name="kg_widget_view_height">0dp</dimen> <!-- Size of the clock font in keyguard's status view --> - <dimen name="kg_status_clock_font_size">94dp</dimen> + <dimen name="kg_status_clock_font_size">75dp</dimen> <!-- Size of the date font in keyguard's status view --> - <dimen name="kg_status_date_font_size">17dp</dimen> + <dimen name="kg_status_date_font_size">15dp</dimen> <!-- Size of the generic status lines keyguard's status view --> - <dimen name="kg_status_line_font_size">14sp</dimen> + <dimen name="kg_status_line_font_size">13dp</dimen> <!-- Size of margin on the right of keyguard's status view --> <dimen name="kg_status_line_font_right_margin">16dp</dimen> @@ -278,10 +278,6 @@ <!-- Horizontal gap between keys in PIN and SIM PIN numeric keyboards in keyguard --> <dimen name="kg_pin_key_height">60dp</dimen> - <!-- Shift emergency button from the left edge by this amount. Used by landscape layout on - phones --> - <dimen name="kg_emergency_button_shift">0dp</dimen> - <!-- Space reserved at the bottom of secure views (pin/pattern/password/SIM pin/SIM puk) --> <dimen name="kg_secure_padding_height">46dp</dimen> @@ -308,5 +304,5 @@ <dimen name="accessibility_touch_slop">80dip</dimen> <!-- Margin around the various security views --> - <dimen name="keyguard_security_view_margin">0dp</dimen> + <dimen name="keyguard_security_view_margin">8dp</dimen> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index b79348a..61838cc 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1191,6 +1191,8 @@ <java-symbol type="bool" name="config_lidControlsSleep" /> <java-symbol type="bool" name="config_reverseDefaultRotation" /> <java-symbol type="bool" name="config_showNavigationBar" /> + <java-symbol type="bool" name="kg_share_status_area" /> + <java-symbol type="bool" name="kg_sim_puk_full_screen" /> <java-symbol type="bool" name="target_honeycomb_needs_options_menu" /> <java-symbol type="color" name="kg_multi_user_text_active" /> <java-symbol type="color" name="kg_multi_user_text_inactive" /> @@ -1298,6 +1300,7 @@ <java-symbol type="id" name="keyguard_user_name" /> <java-symbol type="id" name="keyguard_transport_control" /> <java-symbol type="id" name="keyguard_status_view" /> + <java-symbol type="id" name="keyguard_status_view_face_palm" /> <java-symbol type="id" name="keyguard_users_grid" /> <java-symbol type="id" name="clock_text" /> <java-symbol type="id" name="clock_view" /> @@ -1305,6 +1308,7 @@ <java-symbol type="id" name="left_strip" /> <java-symbol type="id" name="right_strip" /> <java-symbol type="id" name="keyguard_multi_user_selector" /> + <java-symbol type="id" name="status_security_message" /> <java-symbol type="integer" name="config_carDockRotation" /> <java-symbol type="integer" name="config_defaultUiModeType" /> diff --git a/data/sounds/AudioPackage8.mk b/data/sounds/AudioPackage8.mk new file mode 100755 index 0000000..93c43da --- /dev/null +++ b/data/sounds/AudioPackage8.mk @@ -0,0 +1,70 @@ +# +# Audio Package 7 - Tuna +# +# Include this file in a product makefile to include these audio files +# +# + +LOCAL_PATH:= frameworks/base/data/sounds + +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/alarms/ogg/Cesium.ogg:system/media/audio/alarms/Cesium.ogg \ + $(LOCAL_PATH)/alarms/ogg/Fermium.ogg:system/media/audio/alarms/Fermium.ogg \ + $(LOCAL_PATH)/alarms/ogg/Hassium.ogg:system/media/audio/alarms/Hassium.ogg \ + $(LOCAL_PATH)/alarms/ogg/Neptunium.ogg:system/media/audio/alarms/Neptunium.ogg \ + $(LOCAL_PATH)/alarms/ogg/Nobelium.ogg:system/media/audio/alarms/Nobelium.ogg \ + $(LOCAL_PATH)/alarms/ogg/Osmium.ogg:system/media/audio/alarms/Osmium.ogg \ + $(LOCAL_PATH)/alarms/ogg/Plutonium.ogg:system/media/audio/alarms/Plutonium.ogg \ + $(LOCAL_PATH)/alarms/ogg/Promethium.ogg:system/media/audio/alarms/Promethium.ogg \ + $(LOCAL_PATH)/effects/ogg/Effect_Tick.ogg:system/media/audio/ui/Effect_Tick.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressStandard_120.ogg:system/media/audio/ui/KeypressStandard.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120.ogg:system/media/audio/ui/KeypressSpacebar.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressDelete_120.ogg:system/media/audio/ui/KeypressDelete.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressReturn_120.ogg:system/media/audio/ui/KeypressReturn.ogg \ + $(LOCAL_PATH)/effects/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \ + $(LOCAL_PATH)/effects/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \ + $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \ + $(LOCAL_PATH)/effects/ogg/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \ + $(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \ + $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg \ + $(LOCAL_PATH)/effects/ogg/Lock.ogg:system/media/audio/ui/Lock.ogg \ + $(LOCAL_PATH)/effects/ogg/Unlock.ogg:system/media/audio/ui/Unlock.ogg \ + $(LOCAL_PATH)/notifications/ogg/Adara.ogg:system/media/audio/notifications/Adara.ogg \ + $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:system/media/audio/notifications/Arcturus.ogg \ + $(LOCAL_PATH)/notifications/ogg/Bellatrix.ogg:system/media/audio/notifications/Bellatrix.ogg \ + $(LOCAL_PATH)/notifications/ogg/Capella.ogg:system/media/audio/notifications/Capella.ogg \ + $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:system/media/audio/notifications/CetiAlpha.ogg \ + $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:system/media/audio/notifications/Hojus.ogg \ + $(LOCAL_PATH)/notifications/ogg/Lalande.ogg:system/media/audio/notifications/Lalande.ogg \ + $(LOCAL_PATH)/notifications/ogg/Mira.ogg:system/media/audio/notifications/Mira.ogg \ + $(LOCAL_PATH)/notifications/ogg/Polaris.ogg:system/media/audio/notifications/Polaris.ogg \ + $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:system/media/audio/notifications/Pollux.ogg \ + $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:system/media/audio/notifications/Procyon.ogg \ + $(LOCAL_PATH)/notifications/ogg/Proxima.ogg:system/media/audio/notifications/Proxima.ogg \ + $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:system/media/audio/notifications/Shaula.ogg \ + $(LOCAL_PATH)/notifications/ogg/Spica.ogg:system/media/audio/notifications/Spica.ogg \ + $(LOCAL_PATH)/notifications/ogg/Tejat.ogg:system/media/audio/notifications/Tejat.ogg \ + $(LOCAL_PATH)/notifications/ogg/Upsilon.ogg:system/media/audio/notifications/Upsilon.ogg \ + $(LOCAL_PATH)/notifications/ogg/Vega.ogg:system/media/audio/notifications/Vega.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Andromeda.ogg:system/media/audio/ringtones/Andromeda.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Aquila.ogg:system/media/audio/ringtones/Aquila.ogg \ + $(LOCAL_PATH)/ringtones/ogg/ArgoNavis.ogg:system/media/audio/ringtones/ArgoNavis.ogg \ + $(LOCAL_PATH)/ringtones/ogg/CanisMajor.ogg:system/media/audio/ringtones/CanisMajor.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Carina.ogg:system/media/audio/ringtones/Carina.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Centaurus.ogg:system/media/audio/ringtones/Centaurus.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Cygnus.ogg:system/media/audio/ringtones/Cygnus.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Draco.ogg:system/media/audio/ringtones/Draco.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Girtab.ogg:system/media/audio/ringtones/Girtab.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Hydra.ogg:system/media/audio/ringtones/Hydra.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Machina.ogg:system/media/audio/ringtones/Machina.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Orion.ogg:system/media/audio/ringtones/Orion.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Pegasus.ogg:system/media/audio/ringtones/Pegasus.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Perseus.ogg:system/media/audio/ringtones/Perseus.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Pyxis.ogg:system/media/audio/ringtones/Pyxis.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Rigel.ogg:system/media/audio/ringtones/Rigel.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Scarabaeus.ogg:system/media/audio/ringtones/Scarabaeus.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Sceptrum.ogg:system/media/audio/ringtones/Sceptrum.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Solarium.ogg:system/media/audio/ringtones/Solarium.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:system/media/audio/ringtones/Themos.ogg \ + $(LOCAL_PATH)/ringtones/ogg/UrsaMinor.ogg:system/media/audio/ringtones/UrsaMinor.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Zeta.ogg:system/media/audio/ringtones/Zeta.ogg diff --git a/data/sounds/alarms/ogg/Fermium.ogg b/data/sounds/alarms/ogg/Fermium.ogg Binary files differindex fecc2ba..d8f6124 100644 --- a/data/sounds/alarms/ogg/Fermium.ogg +++ b/data/sounds/alarms/ogg/Fermium.ogg diff --git a/data/sounds/alarms/ogg/Hassium.ogg b/data/sounds/alarms/ogg/Hassium.ogg Binary files differindex 260bf7d..793c269 100644 --- a/data/sounds/alarms/ogg/Hassium.ogg +++ b/data/sounds/alarms/ogg/Hassium.ogg diff --git a/data/sounds/alarms/ogg/Neptunium.ogg b/data/sounds/alarms/ogg/Neptunium.ogg Binary files differindex b1ea741..d99f133 100644 --- a/data/sounds/alarms/ogg/Neptunium.ogg +++ b/data/sounds/alarms/ogg/Neptunium.ogg diff --git a/data/sounds/alarms/ogg/Osmium.ogg b/data/sounds/alarms/ogg/Osmium.ogg Binary files differnew file mode 100644 index 0000000..4c76080 --- /dev/null +++ b/data/sounds/alarms/ogg/Osmium.ogg diff --git a/data/sounds/alarms/ogg/Promethium.ogg b/data/sounds/alarms/ogg/Promethium.ogg Binary files differnew file mode 100644 index 0000000..2a195a3 --- /dev/null +++ b/data/sounds/alarms/ogg/Promethium.ogg diff --git a/data/sounds/alarms/wav/Fermium.wav b/data/sounds/alarms/wav/Fermium.wav Binary files differindex 0174884..56e57fc 100644 --- a/data/sounds/alarms/wav/Fermium.wav +++ b/data/sounds/alarms/wav/Fermium.wav diff --git a/data/sounds/alarms/wav/Hassium.wav b/data/sounds/alarms/wav/Hassium.wav Binary files differindex e3992cf..17710b0 100644 --- a/data/sounds/alarms/wav/Hassium.wav +++ b/data/sounds/alarms/wav/Hassium.wav diff --git a/data/sounds/alarms/wav/Neptunium.wav b/data/sounds/alarms/wav/Neptunium.wav Binary files differindex cf3684a..2b855e1 100644 --- a/data/sounds/alarms/wav/Neptunium.wav +++ b/data/sounds/alarms/wav/Neptunium.wav diff --git a/data/sounds/alarms/wav/Osmium.wav b/data/sounds/alarms/wav/Osmium.wav Binary files differnew file mode 100755 index 0000000..2dcc47f --- /dev/null +++ b/data/sounds/alarms/wav/Osmium.wav diff --git a/data/sounds/alarms/wav/Promethium.wav b/data/sounds/alarms/wav/Promethium.wav Binary files differnew file mode 100755 index 0000000..08ea03e --- /dev/null +++ b/data/sounds/alarms/wav/Promethium.wav diff --git a/docs/html/guide/topics/ui/notifiers/notifications.jd b/docs/html/guide/topics/ui/notifiers/notifications.jd index 273b5f7..fbff532 100644 --- a/docs/html/guide/topics/ui/notifiers/notifications.jd +++ b/docs/html/guide/topics/ui/notifiers/notifications.jd @@ -1,646 +1,902 @@ -page.title=Status Notifications -parent.title=Notifications -parent.link=index.html +page.title=Notifications @jd:body <div id="qv-wrapper"> - <div id="qv"> - <h2>Quickview</h2> - <ul> - <li>A status notification allows your application to notify the user of an event -without interupting their current activity</li> - <li>You can attach an intent to your notification that the system will initiate when the -user clicks it</li> - </ul> - - <h2>In this document</h2> +<div id="qv"> +<h2>In this document</h2> <ol> - <li><a href="#Basics">The Basics</a></li> - <li><a href="#HandlingNotifications">Responding to Notifications</a></li> - <li><a href="#ManageYourNotifications">Managing your Notifications</a></li> - <li><a href="#CreateANotification">Creating a Notification</a> - <ol> - <li><a href="#Updating">Updating the notification</a></li> - <li><a href="#Sound">Adding a sound</a></li> - <li><a href="#Vibration">Adding vibration</a></li> - <li><a href="#Lights">Adding flashing lights</a></li> - <li><a href="#More">More features</a></li> - </ol> - </li> - <li><a href="#CustomExpandedView">Creating a Custom Notification Layout</a></li> + <li> + <a href="#NotificationUI">Notification Display Elements</a> + </li> + <li> + <a href="#CreateNotification">Creating a Notification</a> + </li> + <li> + <a href="#Managing">Managing Notifications</a> + </li> + <li> + <a href="#NotificationResponse">Preserving Navigation when Starting an Activity</a> + </li> + <li> + <a href="#Progress">Displaying Progress in a Notification</a> + </li> + <li> + <a href="#CustomNotification">Custom Notification Layouts</a> + </li> </ol> <h2>Key classes</h2> <ol> - <li>{@link android.app.Notification}</li> - <li>{@link android.app.NotificationManager}</li> + <li>{@link android.app.NotificationManager}</li> + <li>{@link android.support.v4.app.NotificationCompat}</li> </ol> - - <h2>See also</h2> + <h2>Videos</h2> <ol> - <li><a href="{@docRoot}design/patterns/notifications.html">Android -Design: Notifications</a></li> + <li> + <a href="http://www.youtube.com/watch?v=Yc8YrVc47TI&feature=player_detailpage#t=1672s"> + Notifications in 4.1</a> + </li> </ol> - </div> +<h2>See also</h2> +<ol> + <li> + <a href="{@docRoot}design/patterns/notifications.html">Android Design: Notifications</a> + </li> +</ol> </div> - -<p>A status notification adds an icon to the system's status bar -(with an optional ticker-text message) and a notification message in the notifications window. -When the user selects the notification, Android fires an -{@link android.content.Intent} that is defined by the {@link android.app.Notification} (usually to -launch an {@link android.app.Activity}). -You can also configure the notification to alert the user with a sound, a vibration, and flashing -lights on the device.</p> - -<p>A status notification should be used for any case in -which a background service needs to alert the user about an event that requires a response. A -background service -<strong>should never</strong> launch an activity on its own in order to receive user interaction. -The service should instead create a status notification that will launch the activity -when selected by the user.</p> - -<p>Figure 1 shows the status bar with a notification icon on the left side.</p> -<img src="{@docRoot}images/status_bar.png" alt="" /> -<p class="img-caption"><strong>Figure 1.</strong> Status bar with a notification.</p> - -<p>Figure 2 shows the notification's message in the notifications window.</p> - -<img src="{@docRoot}images/notifications_window.png" alt="" /> -<p class="img-caption"><strong>Figure 2.</strong> The notifications window.</p> - - +</div> +<p> + A notification is a message you can display to the user outside of your application's + normal UI. When you tell the system to issue a notification, it first appears as an icon in the + <strong>notification area</strong>. To see the details of the notification, the user opens the + <strong>notification drawer</strong>. Both the notification area and the notification drawer + are system-controlled areas that the user can view at any time. +</p> +<img + id="figure1" + src="{@docRoot}images/ui/notifications/iconic_notification.png" + height="32" + alt="" /> +<p class="img-caption"> + <strong>Figure 1.</strong> Notifications in the notification area. +</p> +<img id="figure2" src="{@docRoot}images/ui/notifications/normal_notification.png" + height="240" alt="" /> +<p class="img-caption"> + <strong>Figure 2.</strong> Notifications in the notification drawer. +</p> <div class="note design"> -<p><strong>Notification Design</strong></p> - <p>For design guidelines, read Android Design's <a -href="{@docRoot}design/patterns/notifications.html">Notifications</a> guide.</p> + <p> + <strong>Notification Design</strong> + </p> + <p> + Notifications, as an important part of the Android UI, have their own design guidelines. To + learn how to design notifications and their interactions, read the Android Design Guide + <a href="{@docRoot}design/patterns/notifications.html">Notifications</a> topic. + </p> </div> - - - -<h2 id="Basics">The Basics</h2> - -<p>An {@link android.app.Activity} or {@link android.app.Service} can initiate a status -notification. Because an activity can perform actions only while it is -running in the foreground and its window has focus, you will usually create status notifications -from a -service. This way, the notification can be created from the background, -while the user is using another application or -while the device is asleep. To create a notification, you must use two -classes: {@link android.app.Notification} and {@link android.app.NotificationManager}.</p> - -<p>Use an instance of the {@link android.app.Notification} class to define the properties of your -status notification, such as the status icon, the notification message, and extra settings -such as a sound to play. The {@link android.app.NotificationManager} is an Android system service -that executes and manages all status notifications. You do not instantiate the -{@link android.app.NotificationManager} directly. In order -to give it your {@link android.app.Notification}, you must retrieve a reference to the -{@link android.app.NotificationManager} with -{@link android.app.Activity#getSystemService(String) getSystemService()} and -then, when you want to notify the user, pass it your {@link android.app.Notification} with -{@link android.app.NotificationManager#notify(int,Notification) notify()}. </p> - -<p>To create a status notification:</p> -<ol> - <li>Get a reference to the {@link android.app.NotificationManager}: -<pre> -String ns = Context.NOTIFICATION_SERVICE; -NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns); -</pre> - </li> - <!-- use Notification.Builder in 3.0 --> - <li>Instantiate the {@link android.app.Notification}: -<pre> -int icon = R.drawable.notification_icon; -CharSequence tickerText = "Hello"; -long when = System.currentTimeMillis(); - -Notification notification = new Notification(icon, tickerText, when); -</pre> - </li> - <li>Define the notification's message and {@link android.app.PendingIntent}: -<pre> -Context context = getApplicationContext(); -CharSequence contentTitle = "My notification"; -CharSequence contentText = "Hello World!"; -Intent notificationIntent = new Intent(this, MyClass.class); -PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); - -notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); -</pre> - </li> - <li>Pass the {@link android.app.Notification} to the {@link android.app.NotificationManager}: -<pre> -private static final int HELLO_ID = 1; - -mNotificationManager.notify(HELLO_ID, notification); -</pre> - <p>That's it. Your user has now been notified.</p> - </li> -</ol> - - -<h2 id="HandlingNotifications">Responding to Notifications</h2> - -<p>A central part of the user's experience with a notification revolves around -how it interacts with the application's UI flow. You must implement -this correctly to provide a consistent user experience within your app.</p> - -<p>Two typical examples of notifications are provided by Calendar, which can send out -notifications of upcoming events, and Email, which can send out notifications -when new messages arrive. These represent the two recommended patterns for handling -notifications: either launching into an activity that is separate from the -main application, or launching an entirely new instance of the application -showing the appropriate point for the notification.</p> - -<p>The following scenario shows how the activity stack should work -in these two typical notification flows, first handling a Calendar notification: +<p class="note"> + <strong>Note:</strong> This guide refers to the + {@link android.support.v4.app.NotificationCompat.Builder NotificationCompat.Builder} class + in the version 4 <a href="{@docRoot}tools/extras/support-library.html">Support Library</a>. + The class {@link android.app.Notification.Builder Notification.Builder} was added in API + level 11. +</p> +<!-- ------------------------------------------------------------------------------------------ --> +<!-- ------------------------------------------------------------------------------------------ --> +<h2 id="NotificationUI">Notification Display Elements</h2> +<p> + Notifications in the notification drawer appear in two main visual styles, normal view and + big view. +</p> +<!-- ------------------------------------------------------------------------------------------ --> +<h3 id="NormalNotify">Normal view</h3> +<p> + A notification in normal view appears in an area that's up to 64 dp tall. Even if you create a + notification with a big view style, it will appear in normal view until it's expanded. This + is an example of a normal view: +</p> +<img + src="{@docRoot}images/ui/notifications/normal_notification_callouts.png" + alt="" + height="204" + id="figure3" /> +<p class="img-caption"> + <strong>Figure 3.</strong> Notification in normal view. +</p> +<p> + The callouts in the illustration refer to the following: </p> - -<ol> - <li>User is creating a new event in Calendar. They realize they - need to copy part of an email message into this event. - </li> - <li> - The user chooses Home > Email. - </li> - <li> - While in Email, they receive a notification from Calendar for an upcoming - meeting. - </li> - <li> - So they choose that notification, which takes them to a - dedicated Calendar activity that displays brief details of the - upcoming meeting. - </li> - <li> - The user has seen enough to know they have a meeting coming up, - so they press the <em>Back</em> button. They are now returned to Email, which - is where they were when they took the notification. - </li> -</ol> - -<p>Handling an Email notification:</p> - <ol> - <li> - The user is currently in Email composing a message, and needs to - check a date in their calendar. - </li> - <li> - The user chooses Home > Calendar. - </li> - <li> - While in Calendar, they receive a notification from Email about a new - message. - </li> - <li> - They select the notification, which brings them to Email with the message - details displayed. This has replaced what they were previously doing - (writing an e-mail), but that message is still saved in their drafts. - </li> - <li> - The user presses <em>Back</em> once to go to the message list (the typical flow in the - Email app), and press <em>Back</em> again to return to Calendar as they left it. - </li> + <li>Content title</li> + <li>Large icon</li> + <li>Content text</li> + <li>Content info</li> + <li>Small icon</li> + <li> + Time that the notification was issued. You can set an explicit value with + {@link android.support.v4.app.NotificationCompat.Builder#setWhen setWhen()}; if you don't + it defaults to the time that the system received the notification. + </li> </ol> - -<p>In an Email style of notification, the UI launched by the notification -shows the main application in a state representing that notification. -For example, when the Email application comes to the foreground from its -notification, it displays either the conversion list or a specific -conversation depending on whether there are multiple or only one new -email. To achieve this, we want to completely replace whatever current -state the application is in with a new activity stack representing the -new notification state.</p> - -<p>The following code illustrates how to show this kind of notification. Of -most interest is the <code>makeMessageIntentStack()</code> method, which constructs -an array of intents representing the app's new activity stack for this state. -(If you are using fragments, you may need to initialize your fragment and -app state so that pressing <em>Back</em> will switch the UI back to its parent state.) -The core of this is the {@link android.content.Intent#makeRestartActivityTask -Intent.makeRestartActivityTask()} method, which constructs the root activity -of the stack with the appropriate flags, such as -{@link android.content.Intent#FLAG_ACTIVITY_CLEAR_TASK Intent.FLAG_ACTIVITY_CLEAR_TASK}.</p> - -{@sample development/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessage.java - app_notification} - -<p>In a Calendar style of notification, the UI launched by the notification -is a dedicated activity that is not part of the normal application flow. -For example, when the user receives a Calendar notification, choosing that -notification starts a special activity that displays a list -of upcoming calendar events — this view is available only -from the notification, not through the Calendar's normal user -interface.</p> - -<p>The code for posting this type of notification is very straight-forward; it -is like the above, but the {@link android.app.PendingIntent} is for just a single -activity, our dedicated notification activity.</p> - -{@sample development/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessage.java - interstitial_notification} - -<p>This is not enough, however. Normally Android considers all activities within -an application to be part of that application's UI flow, so simply launching the -activity like this can cause it to be mixed with your normal application back stack -in undesired ways. To make it behave correctly, in the manifest declaration -for the activity the attributes -<code>android:launchMode="singleTask"</code>, -<code>android:taskAffinity=""</code> and -<code>android:excludeFromRecents="true"</code> -must be set. The full activity declaration for this sample is:</p> - -{@sample development/samples/ApiDemos/AndroidManifest.xml interstitial_affinity} - -<p>You must be careful when launching other activities from this initial activity, -because this is not a top-level part of the application, does not appear in -recents, and needs to be relaunched at any point from the notification with new data -to show. This best approach is to make sure any activity launched from it is -launched in its own task. When doing this care must be taken to make sure this -new task interacts well with the current state of your exiting application's -task. This is essentially -the same as switching to the main application as described for the Email style -notification shown before. Given the <code>makeMessageIntentStack()</code> -method previously shown, handling a click then would look something like this:</p> - -{@sample development/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessageInterstitial.java - app_launch} - -<h2 id="ManageYourNotifications">Managing your Notifications</h2> - -<p>The {@link android.app.NotificationManager} is a system service that manages all -notifications. You must retrieve a reference to it with the -{@link android.app.Activity#getSystemService(String) getSystemService()} method. -For example:</p> -<pre> -String ns = Context.NOTIFICATION_SERVICE; -NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns); -</pre> - -<p>When you want to deliver your status notification, pass the {@link android.app.Notification} -to the {@link android.app.NotificationManager} with {@link -android.app.NotificationManager#notify(int,Notification)}. -The first parameter is the unique ID for the notification and the second is the {@link -android.app.Notification} object. -The ID uniquely identifies the notification from within your -application. The ID is necessary if you need to update the notification or (if -your application manages different kinds of notifications) select the appropriate action -when the user returns to your application via the intent defined in the notification.</p> - -<p>To clear the status notification when the user selects it from the notifications -window, add the "FLAG_AUTO_CANCEL" flag to your {@link android.app.Notification}. You can -also clear it manually with {@link android.app.NotificationManager#cancel(int)}, passing it the -notification ID, or clear all your notifications with {@link -android.app.NotificationManager#cancelAll()}.</p> - - -<h2 id="CreateANotification">Creating a Notification</h2> - -<p>A {@link android.app.Notification} object defines the details of the notification -message that is displayed in the status bar and notifications window, and any other -alert settings, such as sounds and blinking lights.</p> - -<p>A status notification <em>requires</em> all of the following:</p> -<ul> - <li>An icon for the status bar</li> - <li>A title and message, unless you define a - <a href="#CustomExpandedView">custom notification layout</a></li> - <li>A {@link android.app.PendingIntent}, to be fired when the notification is selected</li> -</ul> -<p>Optional settings for the status notification include:</p> +<!-- ------------------------------------------------------------------------------------------ --> +<h3 id="BigNotify">Big view</h3> +<p> + A notification's big view appears only when the notification is expanded, which happens when the + notification is at the top of the notification drawer, or when the user expands the + notification with a gesture. +</p> +<p> + The following screenshot shows an inbox-style notification: +</p> +<img src="{@docRoot}images/ui/notifications/bigpicture_notification_callouts.png" + alt="" + height="240" + id="figure4" /> +<p class="img-caption"> + <strong>Figure 4.</strong> Big view notification. +</p> +<p> + Notice that the big view shares most of its visual elements with the normal view. The + only difference is callout number 7, the details area. Each big view style sets this area in + a different way. The available styles are: +</p> +<dl> + <dt> + Big picture style + </dt> + <dd> + The details area contains a bitmap up to 256 dp tall in its detail section. + </dd> + <dt> + Big text style + </dt> + <dd> + Displays a large text block in the details section. + </dd> + <dt> + Inbox style + </dt> + <dd> + Displays lines of text in the details section. + </dd> +</dl> +<p> + All of the big view styles also have the following content options that aren't + available in normal view: +</p> +<dl> + <dt> + Big content title + </dt> + <dd> + Allows you to override the normal view's content title with a title that appears only in + the expanded view. + </dd> + <dt> + Summary text + </dt> + <dd> + Allows you to add a line of text below the details area. + </dd> +</dl> +<p> + Applying a big view style to a notification is described in the section + <a href="#ApplyStyle">Applying a big view style to a notification</a>. +</p> +<!-- ------------------------------------------------------------------------------------------ --> +<!-- ------------------------------------------------------------------------------------------ --> +<h2 id="CreateNotification">Creating a Notification</h2> +<p> + You specify the UI information and actions for a notification in a + {@link android.support.v4.app.NotificationCompat.Builder NotificationCompat.Builder} object. + To create the notification itself, you call + {@link android.support.v4.app.NotificationCompat.Builder#build + NotificationCompat.Builder.build()}, which returns a {@link android.app.Notification} object + containing your specifications. + To issue the notification, you pass the {@link android.app.Notification} object to the system + by calling {@link android.app.NotificationManager#notify NotificationManager.notify()}. +</p> +<!-- ------------------------------------------------------------------------------------------ --> +<h3 id="Required">Required notification contents</h3> +<p> + A {@link android.app.Notification} object <em>must</em> contain the following: +</p> <ul> - <li>A ticker-text message for the status bar</li> - <li>An alert sound</li> - <li>A vibrate setting</li> - <li>A flashing LED setting</li> + <li> + A small icon, set by + {@link android.support.v4.app.NotificationCompat.Builder#setSmallIcon setSmallIcon()} + </li> + <li> + A title, set by + {@link android.support.v4.app.NotificationCompat.Builder#setContentTitle setContentTitle()} + </li> + <li> + Detail text, set by + {@link android.support.v4.app.NotificationCompat.Builder#setContentText setContentText()} + </li> </ul> - -<p>The starter-kit for a new notification includes the -{@link android.app.Notification#Notification(int,CharSequence,long)} constructor and the -{@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent)} -method. These define all the required settings for a notification. -The following snippet demonstrates a basic notification setup:</p> -<pre> -int icon = R.drawable.notification_icon; // icon from resources -CharSequence tickerText = "Hello"; // ticker-text -long when = System.currentTimeMillis(); // notification time -Context context = getApplicationContext(); // application Context -CharSequence contentTitle = "My notification"; // message title -CharSequence contentText = "Hello World!"; // message text - -Intent notificationIntent = new Intent(this, MyClass.class); -PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); - -// the next two lines initialize the Notification, using the configurations above -Notification notification = new Notification(icon, tickerText, when); -notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); -</pre> - - -<h3 id="Updating">Updating the notification</h3> - -<p>You can update the information in your status notification as events -continue to occur in your application. For example, when a new SMS text message arrives -before previous messages have been read, the Messaging application updates the existing -notification to display the total number of new messages received. -This practice of updating an existing notification is much better than adding new -notifications, because it avoids clutter in the notifications window.</p> - -<p>Because each notification is uniquely identified -by the {@link android.app.NotificationManager} with an integer ID, you can revise the notification -by calling {@link -android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent) -setLatestEventInfo()} with new values, change some field values of the notification, and then call -{@link android.app.NotificationManager#notify(int,Notification) notify()} again.</p> - -<p>You can revise each property with the object member fields -(except for the {@link android.content.Context} and the notification title and text). You -should always revise the text message when you update the notification by calling -{@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent) -setLatestEventInfo()} with new values for <var>contentTitle</var> and <var>contentText</var>. -Then call {@link android.app.NotificationManager#notify(int,Notification) notify()} to update the -notification. (Of course, if you've created a <a href="#CustomExpandedView">custom notification -layout</a>, then updating these title and text values has no effect.)</p> - - -<h3 id="Sound">Adding a sound</h3> - -<p>You can alert the user with the default notification sound -(which is defined by the user) or with a sound specified by your application.</p> - -<p>To use the user's default sound, add "DEFAULT_SOUND" to the <var>defaults</var> field:</p> -<pre> -notification.defaults |= Notification.DEFAULT_SOUND; -</pre> - -<p>To use a different sound with your notifications, pass a Uri reference to the -<var>sound</var> field. -The following example uses a known audio file saved to the device SD card:</p> -<pre> -notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3"); -</pre> - -<p>In the next example, the audio file is chosen from the internal -{@link android.provider.MediaStore.Audio.Media MediaStore}'s {@link android.content.ContentProvider}:</p> +<h3 id="Optional">Optional notification contents and settings</h3> +<p> + All other notification settings and contents are optional. To learn more about them, + see the reference documentation for {@link android.support.v4.app.NotificationCompat.Builder}. +</p> +<!-- ------------------------------------------------------------------------------------------ --> +<h3 id="Actions">Notification actions</h3> +<p> + Although they're optional, you should add at least one action to your notification. + An action allows users to go directly from the notification to an + {@link android.app.Activity} in your application, where they can look at one or more events + or do further work. +</p> +<p> + A notification can provide multiple actions. You should always define the action that's + triggered when the user touches the notification; usually this action opens an + {@link android.app.Activity} in your application. You can also add buttons to the notification + that perform additional actions such as snoozing an alarm or responding immediately to a text + message. +</p> +<p> + Inside a {@link android.app.Notification}, the action itself is defined by a + {@link android.app.PendingIntent} containing an {@link android.content.Intent} that starts + an {@link android.app.Activity} in your application. To associate the + {@link android.app.PendingIntent} with a gesture, call the appropriate method of + {@link android.support.v4.app.NotificationCompat.Builder}. For example, if you want to start + {@link android.app.Activity} when the user touches the notification text in + the notification drawer, you add the {@link android.app.PendingIntent} by calling + {@link android.support.v4.app.NotificationCompat.Builder#setContentIntent setContentIntent()}. +</p> +<p> + Starting an {@link android.app.Activity} when the user touches the notification is the most + common action scenario. You can also start an {@link android.app.Activity} when the user + dismisses an {@link android.app.Activity}, and you can start an {@link android.app.Activity} + from an action button. To learn more, read the reference guide for + {@link android.support.v4.app.NotificationCompat.Builder}. +</p> +<!-- ------------------------------------------------------------------------------------------ --> +<h3 id="SimpleNotification">Creating a simple notification</h3> +<p> + The following snippet illustrates a simple notification that specifies an activity to open when + the user touches the notification. Notice that the code creates a + {@link android.support.v4.app.TaskStackBuilder} object and uses it to create the + {@link android.app.PendingIntent} for the action. This pattern is explained in more detail + in the section <a href="#NotificationResponse"> + Preserving Navigation when Starting an Activity</a>: +</p> <pre> -notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6"); +NotificationCompat.Builder mBuilder = + new NotificationCompat.Builder(this) + .setSmallIcon(R.drawable.notification_icon) + .setContentTitle("My notification") + .setContentText("Hello World!"); +// Creates an explicit intent for an Activity in your app +Intent resultIntent = new Intent(this, ResultActivity.class); + +// The stack builder object will contain an artificial back stack for the +// started Activity. +// This ensures that navigating backward from the Activity leads out of +// your application to the Home screen. +TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); +// Adds the back stack for the Intent (but not the Intent itself) +stackBuilder.addParentStack(ResultActivity.class); +// Adds the Intent that starts the Activity to the top of the stack +stackBuilder.addNextIntent(resultIntent); +PendingIntent resultPendingIntent = + stackBuilder.getPendingIntent( + 0, + PendingIntent.FLAG_UPDATE_CURRENT + ); +mBuilder.setContentIntent(resultPendingIntent); +NotificationManager mNotificationManager = + (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); +// mId allows you to update the notification later on. +mNotificationManager.notify(mId, mBuilder.build()); </pre> - -<p>In this case, the exact ID of the media file ("6") is known and appended to the content -{@link android.net.Uri}. If you don't know the exact ID, you must query all the -media available in the {@link android.provider.MediaStore} with a {@link -android.content.ContentResolver}. -See the <a href="{@docRoot}guide/topics/providers/content-providers.html">Content Providers</a> -documentation for more information on using a ContentResolver.</p> - -<p>If you want the sound to continuously repeat until the user responds to the notification -or the notification is cancelled, add {@link android.app.Notification#FLAG_INSISTENT} to the -<var>flags</var> field.</p> - -<p class="note"><strong>Note:</strong> If the <var>defaults</var> field includes -{@link android.app.Notification#DEFAULT_SOUND}, then the default sound overrides any sound defined -by the <var>sound</var> field.</p> - - -<h3 id="Vibration">Adding vibration</h3> - -<p>You can alert the user with the the default -vibration pattern or with a vibration pattern defined by your application.</p> - -<p>To use the default pattern, add {@link android.app.Notification#DEFAULT_VIBRATE} to the -<var>defaults</var> field:</p> +<p>That's it. Your user has now been notified.</p> +<!-- ------------------------------------------------------------------------------------------ --> +<h3 id="ApplyStyle">Applying a big view style to a notification</h3> +<p> + To have a notification appear in a big view when it's expanded, first create a + {@link android.support.v4.app.NotificationCompat.Builder} object with the normal view options + you want. Next, call {@link android.support.v4.app.NotificationCompat.Builder#setStyle + Builder.setStyle()} with a big view style object as its argument. +</p> +<p> + For example, the following code snippet demonstrates how to alter the notification created + in the previous snippet to use the Inbox big view style: +</p> <pre> -notification.defaults |= Notification.DEFAULT_VIBRATE; +NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) + .setSmallIcon(R.drawable.notification_icon) + .setContentTitle("Event tracker") + .setContentText("Events received") +NotificationCompat.InboxStyle inboxStyle = + new NotificationCompat.InboxStyle(); +String[] events = new String[6]; +// Sets a title for the Inbox style big view +inboxStyle.SetBigContentTitle("Event tracker details:"); +... +// Moves events into the big view +for (int i=0; i < events.length; i++) { + + inboxStyle.addLine(events[i]); +} +// Moves the big view style object into the notification object. +mBuilder.setStyle(inBoxStyle); +... +// Issue the notification here. </pre> - -<p>To define your own vibration pattern, pass an array of <em>long</em> values to the -<var>vibrate</var> field:</p> +<!-- ------------------------------------------------------------------------------------------ --> +<!-- ------------------------------------------------------------------------------------------ --> +<h2 id="Managing">Managing Notifications</h2> +<p> + When you need to issue a notification multiple times for the same type of event, you + should avoid making a completely new notification. Instead, you should consider updating a + previous notification, either by changing some of its values or by adding to it, or both. +</p> +<p> + For example, Gmail notifies the user that new emails have arrived by increasing its count of + unread messages and by adding a summary of each email to the notification. This is called + "stacking" the notification; it's described in more detail in the + <a href="{@docRoot}design/patterns/notifications.html">Notifications</a> Design guide. +</p> +<p> + The following section describes how to update notifications and also how to remove them. +</p> +<h3 id="Updating">Updating notifications</h3> +<p> + To set up a notification so it can be updated, issue it with a notification ID by + calling {@link android.app.NotificationManager#notify(int, Notification) + NotificationManager.notify(ID, notification)}. To update this notification once you've issued + it, update or create a {@link android.support.v4.app.NotificationCompat.Builder} object, + build a {@link android.app.Notification} object from it, and issue the + {@link android.app.Notification} with the same ID you used previously. If + the previous notification is still visible, the system updates it from the contents of + the {@link android.app.Notification} object. If the previous notification has been dismissed, a + new notification is created instead. +</p> +<p> + The following snippet demonstrates a notification that is updated to reflect the + number of events that have occurred. It stacks the notification, showing a summary: +</p> <pre> -long[] vibrate = {0,100,200,300}; -notification.vibrate = vibrate; +mNotificationManager = + (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); +// Sets an ID for the notification, so it can be updated +int notifyID = 1; +mNotifyBuilder = new NotificationCompat.Builder(this) + .setContentTitle("New Message") + .setContentText("You've received new messages.") + .setSmallIcon(R.drawable.ic_notify_status) +numMessages = 0; +// Start of a loop that processes data and then notifies the user +... + mNotifyBuilder.setContentText(currentText) + .setNumber(++numMessages); + // Because the ID remains unchanged, the existing notification is + // updated. + mNotificationManager.notify( + notifyID, + mNotifyBuilder.build()); +... </pre> - -<p>The long array defines the alternating pattern for the length of vibration off and on -(in milliseconds). The first value is how long to wait (off) before beginning, the second -value is the length of the first vibration, the third is the next length off, and so on. -The pattern can be as long as you like, but it can't be set to repeat. +<p> + This produces a notification that looks like this: </p> - -<p class="note"><strong>Note:</strong> If the <var>defaults</var> field includes -{@link android.app.Notification#DEFAULT_VIBRATE}, then the default vibration overrides any vibration -defined by the -<var>vibrate</var> field.</p> - - -<h3 id="Lights">Adding flashing lights</h3> - -<p>To alert the user by flashing LED lights, you can implement the default -light pattern (if available), or define your own color and pattern for the lights.</p> - -<p>To use the default light setting, add {@link android.app.Notification#DEFAULT_LIGHTS} to the -<var>defaults</var> field:</p> +<img + id="figure5" + src="{@docRoot}images/ui/notifications/updated_notification.png" + alt="" + height="118"/> +<p class="img-caption"> + <strong>Figure 5.</strong> Updated notification displayed in the notification drawer. +</p> +<!-- ------------------------------------------------------------------------------------------ --> +<h3 id="Removing">Removing notifications</h3> +<p> + Notifications remain visible until one of the following happens: +</p> +<ul> + <li> + The user dismisses the notification either individually or by using "Clear All" (if + the notification can be cleared). + </li> + <li> + The user touches the notification, and you called + {@link android.support.v4.app.NotificationCompat.Builder#setAutoCancel setAutoCancel()} when + you created the notification. + </li> + <li> + You call {@link android.app.NotificationManager#cancel(int) cancel()} for a specific + notification ID. This method also deletes ongoing notifications. + </li> + <li> + You call {@link android.app.NotificationManager#cancelAll() cancelAll()}, which removes + all of the notifications you previously issued. + </li> +</ul> +<!-- ------------------------------------------------------------------------------------------ --> +<!-- ------------------------------------------------------------------------------------------ --> +<h2 id="NotificationResponse">Preserving Navigation when Starting an Activity</h2> +<p> + When you start an {@link android.app.Activity} from a notification, you must preserve the + user's expected navigation experience. Clicking <i>Back</i> should take the user back through + the application's normal work flow to the Home screen, and clicking <i>Recents</i> should show + the {@link android.app.Activity} as a separate task. To preserve the navigation experience, you + should start the {@link android.app.Activity} in a fresh task. How you set up the + {@link android.app.PendingIntent} to give you a fresh task depends on the nature of the + {@link android.app.Activity} you're starting. There are two general situations: +</p> +<dl> + <dt> + Regular activity + </dt> + <dd> + You're starting an {@link android.app.Activity} that's part of the application's normal + workflow. In this situation, set up the {@link android.app.PendingIntent} to + start a fresh task, and provide the {@link android.app.PendingIntent} with a back stack + that reproduces the application's normal <i>Back</i> behavior. + <p> + Notifications from the Gmail app demonstrate this. When you touch a notification for + a single email message, you see the message itself. Touching <b>Back</b> takes you + backwards through Gmail to the Home screen, just as if you had entered Gmail from the + Home screen rather than entering it from a notification. + </p> + <p> + This happens regardless of the application you were in when you touched the + notification. For example, if you're in Gmail composing a message, and you click a + notification for a single email, you go immediately to that email. Touching <i>Back</i> + takes you to the inbox and then the Home screen, rather than taking you to the + message you were composing. + </p> + </dd> + <dt> + Special activity + </dt> + <dd> + The user only sees this {@link android.app.Activity} if it's started from a notification. + In a sense, the {@link android.app.Activity} extends the notification by providing + information that would be hard to display in the notification itself. For this situation, + set up the {@link android.app.PendingIntent} to start in a fresh task. There's no need to + create a back stack, though, because the started {@link android.app.Activity} isn't part of + the application's activity flow. Clicking <i>Back</i> will still take the user to the + Home screen. + </dd> +</dl> +<!-- ------------------------------------------------------------------------------------------ --> +<h3 id="DirectEntry">Setting up a regular activity PendingIntent</h3> +<p> + To set up a {@link android.app.PendingIntent} that starts a direct entry + {@link android.app.Activity}, follow these steps: +</p> +<ol> + <li> + Define your application's {@link android.app.Activity} hierarchy in the manifest. + <ol style="list-style-type: lower-alpha;"> + <li> + Add support for API versions 15 and earlier. To do this, specify the parent of the + {@link android.app.Activity} you're starting by adding a +<code><a href="{@docRoot}guide/topics/manifest/meta-data-element.html"><meta-data></a></code> + element as the child of the +<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code>. + <p> + For this element, set +<code><a href="{@docRoot}guide/topics/manifest/meta-data-element.html#nm">android:name</a>="android.support.PARENT_ACTIVITY"</code>. + Set +<code><a href="{@docRoot}/guide/topics/manifest/meta-data-element.html#val">android:value</a>="<parent_activity_name>"</code> + where <code><parent_activity_name></code> is the value of +<code><a href="{@docRoot}guide/topics/manifest/meta-data-element.html#nm">android:name</a></code> + for the parent +<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> + element. See the following XML for an example. + </p> + </li> + <li> + Also add support for API versions 16 and later. To do this, add the +<code><a href="{@docRoot}guide/topics/manifest/activity-element.html#parent">android:parentActivityName</a></code> + attribute to the +<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> + element of the {@link android.app.Activity} you're starting. + </li> + </ol> + <p> + The final XML should look like this: + </p> <pre> -notification.defaults |= Notification.DEFAULT_LIGHTS; +<activity + android:name=".MainActivity" + android:label="@string/app_name" > + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> +</activity> +<activity + android:name=".ResultActivity" + android:parentActivityName=".MainActivity"> + <meta-data + android:name="android.support.PARENT_ACTIVITY" + android:value=".MainActivity"/> +</activity> </pre> - -<p>To define your own color and pattern, define a value for the <var>ledARGB</var> field -(for the color), the <var>ledOffMS</var> field (length of time, in milliseconds, to -keep the light off), the <var>ledOnMS</var> (length of time, in milliseconds, to keep the light on), -and also add {@link android.app.Notification#FLAG_SHOW_LIGHTS} to the <var>flags</var> field:</p> + </li> + <li> + Create a back stack based on the {@link android.content.Intent} that starts the + {@link android.app.Activity}: + <ol style="list-style-type: lower-alpha;"> + <li> + Create the {@link android.content.Intent} to start the {@link android.app.Activity}. + </li> + <li> + Create a stack builder by calling {@link android.app.TaskStackBuilder#create + TaskStackBuilder.create()}. + </li> + <li> + Add the back stack to the stack builder by calling + {@link android.support.v4.app.TaskStackBuilder#addParentStack addParentStack()}. + For each {@link android.app.Activity} in the hierarchy you've defined in the + manifest, the back stack contains an {@link android.content.Intent} object that + starts the {@link android.app.Activity}. This method also adds flags that start the + stack in a fresh task. + <p class="note"> + <strong>Note:</strong> Although the argument to + {@link android.support.v4.app.TaskStackBuilder#addParentStack addParentStack()} + is a reference to the started {@link android.app.Activity}, the method call + doesn't add the {@link android.content.Intent} that starts the + {@link android.app.Activity}. Instead, that's taken care of in the next step. + </p> + </li> + <li> + Add the {@link android.content.Intent} that starts the {@link android.app.Activity} + from the notification, by calling + {@link android.support.v4.app.TaskStackBuilder#addNextIntent addNextIntent()}. + Pass the {@link android.content.Intent} you created in the first step as the + argument to + {@link android.support.v4.app.TaskStackBuilder#addNextIntent addNextIntent()}. + </li> + <li> + If you need to, add arguments to {@link android.content.Intent} objects on the + stack by calling {@link android.support.v4.app.TaskStackBuilder#editIntentAt + TaskStackBuilder.editIntentAt()}. This is sometimes necessary to ensure that the + target {@link android.app.Activity} displays meaningful data when the user navigates + to it using <i>Back</i>. + </li> + <li> + Get a {@link android.app.PendingIntent} for this back stack by calling + {@link android.support.v4.app.TaskStackBuilder#getPendingIntent getPendingIntent()}. + You can then use this {@link android.app.PendingIntent} as the argument to + {@link android.support.v4.app.NotificationCompat.Builder#setContentIntent + setContentIntent()}. + </li> + </ol> + </li> +</ol> +<p> + The following code snippet demonstrates the process: +</p> <pre> -notification.ledARGB = 0xff00ff00; -notification.ledOnMS = 300; -notification.ledOffMS = 1000; -notification.flags |= Notification.FLAG_SHOW_LIGHTS; +... +Intent resultIntent = new Intent(this, ResultActivity.class); +TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); +// Adds the back stack +stackBuilder.addParentStack(ResultActivity.class); +// Adds the Intent to the top of the stack +stackBuilder.addNextIntent(resultIntent); +// Gets a PendingIntent containing the entire back stack +PendingIntent resultPendingIntent = + stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); +... +NotificationCompat.Builder builder = new NotificationCompat.Builder(this); +builder.setContentIntent(resultPendingIntent); +NotificationManager mNotificationManager = + (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); +mNotificationManager.notify(id, builder.build()); </pre> - -<p>In this example, the green light repeatedly flashes on for 300 milliseconds and -turns off for one second. Not every color in the spectrum is supported by the -device LEDs, and not every device supports the same colors, so the hardware -estimates to the best of its ability. Green is the most common notification color.</p> - - -<h3 id="More">More features</h3> - -<p>You can add several more features to your notifications -using {@link android.app.Notification} fields and flags. Some useful features include the -following:</p> - -<dl> - <dt>{@link android.app.Notification#FLAG_AUTO_CANCEL} flag</dt> - <dd>Add this to the <var>flags</var> field to automatically cancel the notification - after it is selected from the notifications window.</dd> - <dt>{@link android.app.Notification#FLAG_INSISTENT} flag</dt> - <dd>Add this to the <var>flags</var> field to repeat the audio until the - user responds.</dd> - <dt>{@link android.app.Notification#FLAG_ONGOING_EVENT} flag</dt> - <dd>Add this to the <var>flags</var> field to group the notification under the "Ongoing" - title in the notifications window. This indicates that the application is on-going — - its processes are still running in the background, even when the application is not - visible (such as with music or a phone call).</dd> - <dt>{@link android.app.Notification#FLAG_NO_CLEAR} flag</dt> - <dd>Add this to the <var>flags</var> field to indicate that the notification should - <em>not</em> be cleared by the "Clear notifications" button. This is particularly useful if - your notification is on-going.</dd> - <dt>{@link android.app.Notification#number} field</dt> - <dd>This value indicates the current number of events represented by the notification. - The appropriate number is overlaid on top of the status icon. - If you intend to use this field, then you must start with "1" when the Notification is first - created. (If you change the value from zero to anything greater during an update, the number - is not shown.)</dd> - <dt>{@link android.app.Notification#iconLevel} field</dt> - <dd>This value indicates the current level of a - {@link android.graphics.drawable.LevelListDrawable} that is used for the notification icon. - You can animate the icon in the status bar by changing this value to correlate with the - drawable's defined in a LevelListDrawable. See the {@link android.graphics.drawable.LevelListDrawable} - reference for more information.</dd> -</dl> - -<p>See the {@link android.app.Notification} class reference for more information about additional -features that you can customize for your application.</p> - - -<h2 id="CustomExpandedView">Creating a Custom Notification Layout</h2> - -<div class="figure" style="width:200px;margin-top:0"> -<img src="{@docRoot}images/custom_message.png" alt="" /> -<p class="img-caption"><strong>Figure 3.</strong> Notification with a custom layout.</p> -</div> - -<p>By default, the notification that appears in the notifications window includes a title -and the message text. -These are defined by the <var>contentTitle</var> and <var>contentText</var> -parameters of the {@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent) -setLatestEventInfo()} method. However, you can also define a custom layout for the -notification using -{@link android.widget.RemoteViews}. Figure 3 shows an example of a -custom notification layout. It looks similar to the default notification, but is -actually created with a custom XML layout.</p> - -<p>To define your own layout for the notification, -instantiate a {@link android.widget.RemoteViews} object that inflates a custom layout file, then -pass the {@link android.widget.RemoteViews} to the <var>contentView</var> field of your -Notification.</p> - -<p>Creating a custom notification layout is best understood with an example:</p> - +<!-- ------------------------------------------------------------------------------------------ --> +<h3 id="ExtendedNotification">Setting up a special activity PendingIntent</h3> +<p> + The following section describes how to set up a special activity + {@link android.app.PendingIntent}. +</p> +<p> + A special {@link android.app.Activity} doesn't need a back stack, so you don't have to + define its {@link android.app.Activity} hierarchy in the manifest, and you don't have + to call + {@link android.support.v4.app.TaskStackBuilder#addParentStack addParentStack()} to build a + back stack. Instead, use the manifest to set up the {@link android.app.Activity} task options, + and create the {@link android.app.PendingIntent} by calling + {@link android.app.PendingIntent#getActivity getActivity()}: +</p> <ol> - <li>Create the XML layout for the notification. - For example, the following layout is called <code>custom_notification.xml</code>: + <li> + In your manifest, add the following attributes to the +<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> + element for the {@link android.app.Activity} + <dl> + <dt> +<code><a href="guide/topics/manifest/activity-element.html#nm">android:name</a>="<i>activityclass</i>"</code> + </dt> + <dd> + The activity's fully-qualified class name. + </dd> + <dt> +<code><a href="{@docRoot}guide/topics/manifest/activity-element.html#aff">android:taskAffinity</a>=""</code> + </dt> + <dd> + Combined with the + {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK FLAG_ACTIVITY_NEW_TASK} flag + that you set in code, this ensures that this {@link android.app.Activity} doesn't + go into the application's default task. Any existing tasks that have the + application's default affinity are not affected. + </dd> + <dt> +<code><a href="{@docRoot}guide/topics/manifest/activity-element.html#exclude">android:excludeFromRecents</a>="true"</code> + </dt> + <dd> + Excludes the new task from <i>Recents</i>, so that the user can't accidentally + navigate back to it. + </dd> + </dl> + <p> + This snippet shows the element: + </p> <pre> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/layout" - android:layout_width="fill_parent" - android:layout_height="fill_parent" - android:padding="10dp" > - <ImageView android:id="@+id/image" - android:layout_width="wrap_content" - android:layout_height="fill_parent" - android:layout_alignParentLeft="true" - android:layout_marginRight="10dp" /> - <TextView android:id="@+id/title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_toRightOf="@id/image" - style="@style/NotificationTitle" /> - <TextView android:id="@+id/text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_toRightOf="@id/image" - android:layout_below="@id/title" - style="@style/NotificationText" /> -</RelativeLayout> +<activity + android:name=".ResultActivity" +... + android:launchMode="singleTask" + android:taskAffinity="" + android:excludeFromRecents="true"> +</activity> +... </pre> - - <p>Notice that the two {@link android.widget.TextView} elements include the {@code style} -attribute. It's important that you use style resources for the text in your custom -notifications, because the background color of the notification can vary across different -devices and platform versions. Beginning with Android 2.3 (API level 9), the system defines a -style for the text it uses for the default notification layouts. Thus, you should apply -that style when running on Android 2.3 or higher to ensure that your text is visible against -the background.</p> - - <p>For example, to use the standard text colors on versions of Android lower than 2.3, you -should use the following styles for {@code res/values/styles.xml}:</p> + </li> + <li> + Build and issue the notification: + <ol style="list-style-type: lower-alpha;"> + <li> + Create an {@link android.content.Intent} that starts the + {@link android.app.Activity}. + </li> + <li> + Set the {@link android.app.Activity} to start in a new, empty task by calling + {@link android.content.Intent#setFlags setFlags()} with the flags + {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK FLAG_ACTIVITY_NEW_TASK} + and + {@link android.content.Intent#FLAG_ACTIVITY_CLEAR_TASK FLAG_ACTIVITY_CLEAR_TASK}. + </li> + <li> + Set any other options you need for the {@link android.content.Intent}. + </li> + <li> + Create a {@link android.app.PendingIntent} from the {@link android.content.Intent} + by calling {@link android.app.PendingIntent#getActivity getActivity()}. + You can then use this {@link android.app.PendingIntent} as the argument to + {@link android.support.v4.app.NotificationCompat.Builder#setContentIntent + setContentIntent()}. + </li> + </ol> + <p> + The following code snippet demonstrates the process: + </p> <pre> -<?xml version="1.0" encoding="utf-8"?> -<resources> - <style name="NotificationText"> - <item name="android:textColor">?android:attr/textColorPrimary</item> - </style> - <style name="NotificationTitle"> - <item name="android:textColor">?android:attr/textColorPrimary</item> - <item name="android:textStyle">bold</item> - </style> - <!-- If you want a slightly different color for some text, - consider using ?android:attr/textColorSecondary --> -</resources> +// Instantiate a Builder object. +NotificationCompat.Builder builder = new NotificationCompat.Builder(this); +// Creates an Intent for the Activity +Intent notifyIntent = + new Intent(new ComponentName(this, ResultActivity.class)); +// Sets the Activity to start in a new, empty task +notifyIntent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK); +// Creates the PendingIntent +PendingIntent notifyIntent = + PendingIntent.getActivity( + this, + 0, + notifyIntent + PendingIntent.FLAG_UPDATE_CURRENT +); + +// Puts the PendingIntent into the notification builder +builder.setContentIntent(notifyIntent); +// Notifications are issued by sending them to the +// NotificationManager system service. +NotificationManager mNotificationManager = + (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); +// Builds an anonymous Notification object from the builder, and +// passes it to the NotificationManager +mNotificationManager.notify(id, builder.build()); </pre> - <p>Then, to apply the system's default colors for notifications on Android -2.3 and higher, use the following styles for {@code res/values-v9/styles.xml}:</p> + </li> +</ol> +<!-- ------------------------------------------------------------------------------------------ --> +<!-- ------------------------------------------------------------------------------------------ --> +<h2 id="Progress">Displaying Progress in a Notification</h2> +<p> + Notifications can include an animated progress indicator that shows users the status + of an ongoing operation. If you can estimate how long the operation takes and how much of it + is complete at any time, use the "determinate" form of the indicator + (a progress bar). If you can't estimate the length of the operation, use the + "indeterminate" form of the indicator (an activity indicator). +</p> +<p> + Progress indicators are displayed with the platform's implementation of the + {@link android.widget.ProgressBar} class. +</p> +<p> + To use a progress indicator, call + {@link android.support.v4.app.NotificationCompat.Builder#setProgress setProgress()}. The + determinate and indeterminate forms are described in the following sections. +</p> +<!-- ------------------------------------------------------------------------------------------ --> +<h3 id="FixedProgress">Displaying a fixed-duration progress indicator</h3> +<p> + To display a determinate progress bar, add the bar to your notification by calling + {@link android.support.v4.app.NotificationCompat.Builder#setProgress setProgress() + setProgress(max, progress, false)} and then issue the notification. As your operation proceeds, + increment <code>progress</code>, and update the notification. At the end of the operation, + <code>progress</code> should equal <code>max</code>. A common way to call + {@link android.support.v4.app.NotificationCompat.Builder#setProgress setProgress()} + is to set <code>max</code> to 100 and then increment <code>progress</code> as a + "percent complete" value for the operation. +</p> +<p> + You can either leave the progress bar showing when the operation is done, or remove it. In + either case, remember to update the notification text to show that the operation is complete. + To remove the progress bar, call + {@link android.support.v4.app.NotificationCompat.Builder#setProgress setProgress() + setProgress(0, 0, false)}. For example: +</p> <pre> -<?xml version="1.0" encoding="utf-8"?> -<resources> - <style name="NotificationText" parent="android:TextAppearance.StatusBar.EventContent" /> - <style name="NotificationTitle" parent="android:TextAppearance.StatusBar.EventContent.Title" /> -</resources> +... +mNotifyManager = + (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); +mBuilder = new NotificationCompat.Builder(this); +mBuilder.setContentTitle("Picture Download") + .setContentText("Download in progress") + .setSmallIcon(R.drawable.ic_notification); +// Start a lengthy operation in a background thread +new Thread( + new Runnable() { + @Override + public void run() { + int incr; + // Do the "lengthy" operation 20 times + for (incr = 0; incr <= 100; incr+=5) { + // Sets the progress indicator to a max value, the + // current completion percentage, and "determinate" + // state + mBuilder.setProgress(100, incr, false); + // Displays the progress bar for the first time. + mNotifyManager.notify(0, mBuilder.build()); + // Sleeps the thread, simulating an operation + // that takes time + try { + // Sleep for 5 seconds + Thread.sleep(5*1000); + } catch (InterruptedException e) { + Log.d(TAG, "sleep failure"); + } + } + // When the loop is finished, updates the notification + mBuilder.setContentText("Download complete") + // Removes the progress bar + .setProgress(0,0,false); + mNotifyManager.notify(ID, mBuilder.build()); + } + } +// Starts the thread by calling the run() method in its Runnable +).start(); </pre> - <p>Now, when running on Android 2.3 (API level 9) or higher, the text in your custom view will -use the same colors that the system does for default notifications. This is important because later -versions of Android actually change the background color of the notifications to be dark. Inheriting -the system's styles ensures that your text will be light in such cases, but also if the background -is some other unexpected color, your text will also change as appropriate.</p> - </li> - - <li>Now, in the application code, use the RemoveViews - methods to define the image and text. Then pass the RemoteViews object to the <var>contentView</var> - field of the Notification, as shown in this example: +<p> + The resulting notifications are shown in figure 6. On the left side is a snapshot of the + notification during the operation; on the right side is a snapshot of it after the operation + has finished. +</p> +<img + id="figure6" + src="{@docRoot}images/ui/notifications/progress_bar_summary.png" + height="84" + alt="" /> +<p class="img-caption"> +<strong>Figure 6.</strong> The progress bar during and after the operation.</p> +<!-- ------------------------------------------------------------------------------------------ --> +<h3 id="ActivityIndicator">Displaying a continuing activity indicator</h3> +<p> + To display an indeterminate activity indicator, add it to your notification with + {@link android.support.v4.app.NotificationCompat.Builder#setProgress setProgress(0, 0, true)} + (the first two arguments are ignored), and issue the notification. The result is an indicator + that has the same style as a progress bar, except that its animation is ongoing. +</p> +<p> + Issue the notification at the beginning of the operation. The animation will run until you + modify your notification. When the operation is done, call + {@link android.support.v4.app.NotificationCompat.Builder#setProgress setProgress() + setProgress(0, 0, false)} and then update the notification to remove the activity indicator. + Always do this; otherwise, the animation will run even when the operation is complete. Also + remember to change the notification text to indicate that the operation is complete. +</p> +<p> + To see how activity indicators work, refer to the preceding snippet. Locate the following lines: +</p> <pre> -RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification_layout); -contentView.setImageViewResource(R.id.image, R.drawable.notification_image); -contentView.setTextViewText(R.id.title, "Custom notification"); -contentView.setTextViewText(R.id.text, "This is a custom layout"); -notification.contentView = contentView; +// Sets the progress indicator to a max value, the current completion +// percentage, and "determinate" state +mBuilder.setProgress(100, incr, false); +// Issues the notification +mNotifyManager.notify(0, mBuilder.build()); </pre> - - <p>As shown here, pass the application's package name and the layout - resource ID to the RemoteViews constructor. Then, define the content for the ImageView and TextView, - using the {@link android.widget.RemoteViews#setImageViewResource(int, int) setImageViewResource()} - and {@link android.widget.RemoteViews#setTextViewText(int, CharSequence) setTextViewText()}. - In each case, pass the reference ID of the appropriate View object that you want to set, along with - the value for that View. Finally, the RemoteViews object is passed to the Notification in the - <var>contentView</var> field.</p> - </li> - - <li>Because you don't need the - {@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent) - setLatestEventInfo()} method when using a custom view, you must define the Intent for the Notification - with the <var>contentIntent</var> field, as in this example: +<p> + Replace the lines you've found with the following lines: +</p> <pre> -Intent notificationIntent = new Intent(this, MyClass.class); -PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); -notification.contentIntent = contentIntent; + // Sets an activity indicator for an operation of indeterminate length +mBuilder.setProgress(0, 0, false); +// Issues the notification +mNotifyManager.notify(0, mBuilder.build()); </pre> - </li> - - <li>The notification can now be sent as usual: - <pre>mNotificationManager.notify(CUSTOM_VIEW_ID, notification);</pre> - </li> +<p> + The resulting indicator is shown in figure 7: +</p> +<img + id="figure7" + src="{@docRoot}images/ui/notifications/activity_indicator.png" + height="99" + alt="" /> +<p class="img-caption"><strong>Figure 7.</strong> An ongoing activity indicator.</p> + +<!-- ------------------------------------------------------------------------------------------ --> +<!-- ------------------------------------------------------------------------------------------ --> +<!-- ------------------------------------------------------------------------------------------ --> + +<!-- ------------------------------------------------------------------------------------------ --> +<h2 id="CustomNotification">Custom Notification Layouts</h2> +<p> + The notifications framework allows you to define a custom notification layout, which + defines the notification's appearance in a {@link android.widget.RemoteViews} object. + Custom layout notifications are similar to normal notifications, but they're based on a + {@link android.widget.RemoteViews} defined in a XML layout file. +</p> +<p> + To define a custom notification layout, start by instantiating a + {@link android.widget.RemoteViews} object that inflates an XML layout file. Then, + instead of calling methods such as + {@link android.support.v4.app.NotificationCompat.Builder#setContentTitle setContentTitle()}, + call {@link android.support.v4.app.NotificationCompat.Builder#setContent setContent()}. To set + content details in the custom notification, use the methods in + {@link android.widget.RemoteViews} to set the values of the view's children: +</p> +<ol> + <li> + Create an XML layout for the notification in a separate file. You can use any file name + you wish, but you must use the extension <code>.xml</code> + </li> + <li> + In your app, use {@link android.widget.RemoteViews} methods to define your notification's + icons and text. Put this {@link android.widget.RemoteViews} object into your + {@link android.support.v4.app.NotificationCompat.Builder} by calling + {@link android.support.v4.app.NotificationCompat.Builder#setContent setContent()}. Avoid + setting a background {@link android.graphics.drawable.Drawable} on your + {@link android.widget.RemoteViews} object, because your text color may become unreadable. + </li> </ol> - - -<p>The {@link android.widget.RemoteViews} class also includes methods that you can use to easily add -a {@link android.widget.Chronometer} or {@link android.widget.ProgressBar} -in your notification's layout. For more information about creating custom layouts for your -notification, refer to the {@link android.widget.RemoteViews} class reference.</p> - -<p class="caution"><strong>Caution:</strong> -When creating a custom notification layout, you must take special care to ensure that your -custom layout functions properly in different device orientations and resolutions. While this -advice applies to all View layouts created on Android, it is especially important in this case -because your layout real estate is very restricted. So don't make your custom layout too -complex and be sure to test it in various configurations.</p> - - - - +<p> + The {@link android.widget.RemoteViews} class also includes methods that you can use to easily + add a {@link android.widget.Chronometer} or {@link android.widget.ProgressBar} + to your notification's layout. For more information about creating custom layouts for your + notification, refer to the {@link android.widget.RemoteViews} reference documentation. +</p> +<p class="caution"> + <strong>Caution:</strong> When you use a custom notification layout, take special care to + ensure that your custom layout works with different device orientations and resolutions. While + this advice applies to all View layouts, it's especially important for notifications because + the space in the notification drawer is very restricted. Don't make your custom layout too + complex, and be sure to test it in various configurations. +</p> +<!-- ------------------------------------------------------------------------------------------ --> +<h4>Using style resources for custom notification text</h4> +<p> + Always use style resources for the text of a custom notification. The background color of the + notification can vary across different devices and platform versions, and using style resources + helps you account for this. Starting in API level 9, the system defined a style for the + standard notification layout text. If you use the same style in applications that target API + level 9 or higher, you'll ensure that your text is visible against the display background. +</p> diff --git a/docs/html/images/ui/notifications/activity_indicator.png b/docs/html/images/ui/notifications/activity_indicator.png Binary files differnew file mode 100644 index 0000000..e21fae2 --- /dev/null +++ b/docs/html/images/ui/notifications/activity_indicator.png diff --git a/docs/html/images/ui/notifications/bigpicture_notification.png b/docs/html/images/ui/notifications/bigpicture_notification.png Binary files differnew file mode 100644 index 0000000..ced6380 --- /dev/null +++ b/docs/html/images/ui/notifications/bigpicture_notification.png diff --git a/docs/html/images/ui/notifications/bigpicture_notification_callouts.png b/docs/html/images/ui/notifications/bigpicture_notification_callouts.png Binary files differnew file mode 100644 index 0000000..e2d313a --- /dev/null +++ b/docs/html/images/ui/notifications/bigpicture_notification_callouts.png diff --git a/docs/html/images/ui/notifications/bigtext_notification.png b/docs/html/images/ui/notifications/bigtext_notification.png Binary files differnew file mode 100644 index 0000000..cd6e764 --- /dev/null +++ b/docs/html/images/ui/notifications/bigtext_notification.png diff --git a/docs/html/images/ui/notifications/bigtext_notification_callouts.png b/docs/html/images/ui/notifications/bigtext_notification_callouts.png Binary files differnew file mode 100644 index 0000000..4cfa403 --- /dev/null +++ b/docs/html/images/ui/notifications/bigtext_notification_callouts.png diff --git a/docs/html/images/ui/notifications/custom_message.png b/docs/html/images/ui/notifications/custom_message.png Binary files differnew file mode 100755 index 0000000..00b7632 --- /dev/null +++ b/docs/html/images/ui/notifications/custom_message.png diff --git a/docs/html/images/ui/notifications/iconic_notification.png b/docs/html/images/ui/notifications/iconic_notification.png Binary files differnew file mode 100644 index 0000000..4cabfdb --- /dev/null +++ b/docs/html/images/ui/notifications/iconic_notification.png diff --git a/docs/html/images/ui/notifications/inbox_notification.png b/docs/html/images/ui/notifications/inbox_notification.png Binary files differnew file mode 100644 index 0000000..fb182d5 --- /dev/null +++ b/docs/html/images/ui/notifications/inbox_notification.png diff --git a/docs/html/images/ui/notifications/inbox_notification_callouts.png b/docs/html/images/ui/notifications/inbox_notification_callouts.png Binary files differnew file mode 100644 index 0000000..2ec818e --- /dev/null +++ b/docs/html/images/ui/notifications/inbox_notification_callouts.png diff --git a/docs/html/images/ui/notifications/normal_notification.png b/docs/html/images/ui/notifications/normal_notification.png Binary files differnew file mode 100644 index 0000000..3cf0231 --- /dev/null +++ b/docs/html/images/ui/notifications/normal_notification.png diff --git a/docs/html/images/ui/notifications/normal_notification_callouts.png b/docs/html/images/ui/notifications/normal_notification_callouts.png Binary files differnew file mode 100644 index 0000000..db57daf --- /dev/null +++ b/docs/html/images/ui/notifications/normal_notification_callouts.png diff --git a/docs/html/images/ui/notifications/notifications_window.png b/docs/html/images/ui/notifications/notifications_window.png Binary files differnew file mode 100755 index 0000000..0354ee9 --- /dev/null +++ b/docs/html/images/ui/notifications/notifications_window.png diff --git a/docs/html/images/ui/notifications/progress_bar_summary.png b/docs/html/images/ui/notifications/progress_bar_summary.png Binary files differnew file mode 100644 index 0000000..073e697 --- /dev/null +++ b/docs/html/images/ui/notifications/progress_bar_summary.png diff --git a/docs/html/images/ui/notifications/progress_indicator_1.png b/docs/html/images/ui/notifications/progress_indicator_1.png Binary files differnew file mode 100644 index 0000000..f4c2365 --- /dev/null +++ b/docs/html/images/ui/notifications/progress_indicator_1.png diff --git a/docs/html/images/ui/notifications/progress_indicator_2.png b/docs/html/images/ui/notifications/progress_indicator_2.png Binary files differnew file mode 100644 index 0000000..975c90e --- /dev/null +++ b/docs/html/images/ui/notifications/progress_indicator_2.png diff --git a/docs/html/images/ui/notifications/status_bar.png b/docs/html/images/ui/notifications/status_bar.png Binary files differnew file mode 100755 index 0000000..f0240a5 --- /dev/null +++ b/docs/html/images/ui/notifications/status_bar.png diff --git a/docs/html/images/ui/notifications/updated_notification.png b/docs/html/images/ui/notifications/updated_notification.png Binary files differnew file mode 100644 index 0000000..f69fa4b --- /dev/null +++ b/docs/html/images/ui/notifications/updated_notification.png diff --git a/docs/html/tools/building/building-cmdline.jd b/docs/html/tools/building/building-cmdline.jd index 6154d96..e0d0d3f 100644 --- a/docs/html/tools/building/building-cmdline.jd +++ b/docs/html/tools/building/building-cmdline.jd @@ -261,8 +261,18 @@ adb -s emulator-5554 install <em>path/to/your/app</em>.apk device:</p> <ul> - <li>Enable USB Debugging on your device. You can find the setting on most Android devices by - going to <strong>Settings > Applications > Development > USB debugging</strong>.</li> + <li>Enable <strong>USB debugging</strong> on your device. + <ul> + <li>On most devices running Android 3.2 or older, you can find the option under + <strong>Settings > Applications > Development</strong>.</li> + <li>On Android 4.0 and newer, it's in <strong>Settings > Developer options</strong>. + <p class="note"><strong>Note:</strong> On Android 4.2 and newer, <strong>Developer + options</strong> is hidden by default. To make it available, go + to <strong>Settings > About phone</strong> and tap <strong>Build number</strong> + seven times. Return to the previous screen to find <strong>Developer options</strong>.</p> + </li> + </ul> + </li> <li>Ensure that your development computer can detect your device when connected via USB</li> </ul> diff --git a/docs/html/tools/building/building-eclipse.jd b/docs/html/tools/building/building-eclipse.jd index c73fe97..304aa7e 100644 --- a/docs/html/tools/building/building-eclipse.jd +++ b/docs/html/tools/building/building-eclipse.jd @@ -84,8 +84,18 @@ parent.link=index.html <code>android:debuggable</code> attribute of the <code><application></code> element to <code>true</code>. As of ADT 8.0, this is done by default when you build in debug mode.</li> - <li>Enable USB Debugging on your device. You can find the setting on most Android devices by - going to <strong>Settings > Applications > Development > USB debugging</strong>.</li> + <li>Enable <strong>USB debugging</strong> on your device. + <ul> + <li>On most devices running Android 3.2 or older, you can find the option under + <strong>Settings > Applications > Development</strong>.</li> + <li>On Android 4.0 and newer, it's in <strong>Settings > Developer options</strong>. + <p class="note"><strong>Note:</strong> On Android 4.2 and newer, <strong>Developer + options</strong> is hidden by default. To make it available, go + to <strong>Settings > About phone</strong> and tap <strong>Build number</strong> + seven times. Return to the previous screen to find <strong>Developer options</strong>.</p> + </li> + </ul> + </li> <li>Ensure that your development computer can detect your device when connected via USB</li> </ul> diff --git a/docs/html/tools/device.jd b/docs/html/tools/device.jd index d5fd581..61cd08a 100644 --- a/docs/html/tools/device.jd +++ b/docs/html/tools/device.jd @@ -58,11 +58,17 @@ the <code><application></code> element.</p> <p class="note"><strong>Note:</strong> If you manually enable debugging in the manifest file, be sure to disable it before you build for release (your published application should usually <em>not</em> be debuggable).</p></li> - <li>Turn on "USB Debugging" on your device. - <p>On the device, go to <strong>Settings > Applications > Development</strong> - and enable <strong>USB debugging</strong> - (on an Android 4.0 device, the setting is -located in <strong>Settings > Developer options</strong>).</p> + <li>Enable <strong>USB debugging</strong> on your device. + <ul> + <li>On most devices running Android 3.2 or older, you can find the option under + <strong>Settings > Applications > Development</strong>.</li> + <li>On Android 4.0 and newer, it's in <strong>Settings > Developer options</strong>. + <p class="note"><strong>Note:</strong> On Android 4.2 and newer, <strong>Developer + options</strong> is hidden by default. To make it available, go + to <strong>Settings > About phone</strong> and tap <strong>Build number</strong> + seven times. Return to the previous screen to find <strong>Developer options</strong>.</p> + </li> + </ul> </li> <li>Set up your system to detect your device. <ul> diff --git a/docs/html/training/basics/firstapp/running-app.jd b/docs/html/training/basics/firstapp/running-app.jd index 0c428e7..80603b2 100644 --- a/docs/html/training/basics/firstapp/running-app.jd +++ b/docs/html/training/basics/firstapp/running-app.jd @@ -40,7 +40,7 @@ Android project, it includes a default set of "Hello World" source files that al immediately run the app.</p> <p>How you run your app depends on two things: whether you have a real Android-powered device and -whether you’re using Eclipse. This lesson shows you how to install and run your app on a +whether you're using Eclipse. This lesson shows you how to install and run your app on a real device and on the Android emulator, and in both cases with either Eclipse or the command line tools.</p> @@ -85,12 +85,21 @@ important that you understand how to run your app before you start developing.</ <ol> <li>Plug in your device to your development machine with a USB cable. -If you’re developing on Windows, you might need to install the appropriate USB driver for your +If you're developing on Windows, you might need to install the appropriate USB driver for your device. For help installing drivers, see the <a href="{@docRoot}tools/extras/oem-usb.html">OEM USB -Drivers</a> document.</li> - <li>Ensure that <strong>USB debugging</strong> is enabled in the device Settings (open Settings -and navitage to <strong>Applications > Development</strong> on most devices, or click -<strong>Developer options</strong> on Android 4.0 and higher).</li> +Drivers</a> document.</li> + <li>Enable <strong>USB debugging</strong> on your device. + <ul> + <li>On most devices running Android 3.2 or older, you can find the option under + <strong>Settings > Applications > Development</strong>.</li> + <li>On Android 4.0 and newer, it's in <strong>Settings > Developer options</strong>. + <p class="note"><strong>Note:</strong> On Android 4.2 and newer, <strong>Developer + options</strong> is hidden by default. To make it available, go + to <strong>Settings > About phone</strong> and tap <strong>Build number</strong> + seven times. Return to the previous screen to find <strong>Developer options</strong>.</p> + </li> + </ul> + </li> </ol> <p>To run the app from Eclipse, open one of your project's files and click @@ -118,7 +127,7 @@ lesson</a>.</p> <h2 id="Emulator">Run on the Emulator</h2> -<p>Whether you’re using Eclipse or the command line, to run your app on the emulator you need to +<p>Whether you're using Eclipse or the command line, to run your app on the emulator you need to first create an <a href="{@docRoot}tools/devices/index.html">Android Virtual Device</a> (AVD). An AVD is a device configuration for the Android emulator that allows you to model different devices.</p> diff --git a/libs/hwui/PathRenderer.cpp b/libs/hwui/PathRenderer.cpp index 5b55c2b..58d6cb8 100644 --- a/libs/hwui/PathRenderer.cpp +++ b/libs/hwui/PathRenderer.cpp @@ -215,7 +215,7 @@ void getStrokeVerticesFromPerimeterAA(const Vector<Vertex>& perimeter, float hal // alpha value (TODO: support different X/Y scale) float maxAlpha = 1.0f; if (halfStrokeWidth != 0 && inverseScaleX == inverseScaleY && - halfStrokeWidth * inverseScaleX < 1.0f) { + halfStrokeWidth * inverseScaleX < 0.5f) { maxAlpha *= (2 * halfStrokeWidth) / inverseScaleX; halfStrokeWidth = 0.0f; } diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 9b1a892..1460996 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -153,9 +153,9 @@ <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuario <xliff:g id="USER">%s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string> - <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Celular <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> + <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Móvil <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Batería <xliff:g id="STATE">%s</xliff:g>"</string> - <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Modo avión <xliff:g id="STATE">%s</xliff:g>"</string> + <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Modo de avión <xliff:g id="STATE">%s</xliff:g>"</string> <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>"</string> <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarma: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Datos de 2G-3G inhabilitados"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 9a7e56d..9f0fbda 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -175,7 +175,7 @@ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"La pantalla está bloqueada en modo horizontal."</string> <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"La pantalla está bloqueada en modo vertical."</string> <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string> - <string name="start_dreams" msgid="6170089063982549905">"Activar suspensión"</string> + <string name="start_dreams" msgid="6170089063982549905">"Suspender"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Modo avión"</string> <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Cargando (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 58c9dec..468375f 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -203,5 +203,5 @@ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Độ sáng"</string> <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"TỰ ĐỘNG"</string> <string name="status_bar_help_title" msgid="1199237744086469217">"Thông báo xuất hiện tại đây"</string> - <string name="status_bar_help_text" msgid="7874607155052076323">"Truy cập vào chúng bất kỳ lúc nào bằng cách trượt xuống."\n"Trượt lại xuống để có các điều khiển hệ thống."</string> + <string name="status_bar_help_text" msgid="7874607155052076323">"Truy cập vào chúng bất kỳ lúc nào bằng cách vuốt xuống."\n"Vuốt lại xuống để hiển thị các điều khiển hệ thống."</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 29b682d..d0323f0 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -204,6 +204,6 @@ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"無線螢幕分享"</string> <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"亮度"</string> <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"自動"</string> - <string name="status_bar_help_title" msgid="1199237744086469217">"通知會顯示在這裡"</string> + <string name="status_bar_help_title" msgid="1199237744086469217">"系統會在這裡顯示通知"</string> <string name="status_bar_help_text" msgid="7874607155052076323">"向下滑動即可隨時存取通知。"\n"再次向下滑動即可使用系統控制項。"</string> </resources> diff --git a/policy/src/com/android/internal/policy/impl/GlobalActions.java b/policy/src/com/android/internal/policy/impl/GlobalActions.java index 11b58bc..9ea47f9 100644 --- a/policy/src/com/android/internal/policy/impl/GlobalActions.java +++ b/policy/src/com/android/internal/policy/impl/GlobalActions.java @@ -314,7 +314,8 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac } // one more thing: optionally add a list of users to switch to - if (SystemProperties.getBoolean("fw.power_user_switcher", false)) { + // temporarily enable this by default + if (true || SystemProperties.getBoolean("fw.power_user_switcher", false)) { addUsersToMenu(mItems); } 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 1e73c5b..57239c3 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardAccountView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardAccountView.java @@ -60,7 +60,7 @@ public class KeyguardAccountView extends LinearLayout implements KeyguardSecurit private EditText mPassword; private Button mOk; public boolean mEnableFallback; - private KeyguardNavigationManager mNavigationManager; + private SecurityMessageDisplay mSecurityMessageDisplay; /** * Shown while making asynchronous check of password. @@ -83,7 +83,6 @@ public class KeyguardAccountView extends LinearLayout implements KeyguardSecurit @Override protected void onFinishInflate() { super.onFinishInflate(); - mNavigationManager = new KeyguardNavigationManager(this); mLogin = (EditText) findViewById(R.id.login); mLogin.setFilters(new InputFilter[] { new LoginFilter.UsernameFilterGeneric() } ); @@ -138,7 +137,7 @@ public class KeyguardAccountView extends LinearLayout implements KeyguardSecurit mLogin.setText(""); mPassword.setText(""); mLogin.requestFocus(); - mNavigationManager.setMessage(mLockPatternUtils.isPermanentlyLocked() ? + mSecurityMessageDisplay.setMessage(mLockPatternUtils.isPermanentlyLocked() ? R.string.kg_login_too_many_attempts : R.string.kg_login_instructions); } @@ -179,7 +178,7 @@ public class KeyguardAccountView extends LinearLayout implements KeyguardSecurit // dismiss keyguard mCallback.dismiss(true); } else { - mNavigationManager.setMessage(R.string.kg_login_invalid_input); + mSecurityMessageDisplay.setMessage(R.string.kg_login_invalid_input); mPassword.setText(""); mCallback.reportFailedUnlockAttempt(); } @@ -313,5 +312,9 @@ public class KeyguardAccountView extends LinearLayout implements KeyguardSecurit reset(); } + @Override + public void setSecurityMessageDisplay(SecurityMessageDisplay display) { + mSecurityMessageDisplay = display; + } } 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 d059e36..78fdda3 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.os.PowerManager; import android.telephony.TelephonyManager; import android.util.AttributeSet; import android.util.Log; @@ -29,12 +30,12 @@ import com.android.internal.widget.LockPatternUtils; public class KeyguardFaceUnlockView extends LinearLayout implements KeyguardSecurityView { - private static final String TAG = "KeyguardFaceUnlockView"; + private static final String TAG = "FULKeyguardFaceUnlockView"; private static final boolean DEBUG = false; private KeyguardSecurityCallback mKeyguardSecurityCallback; private LockPatternUtils mLockPatternUtils; private BiometricSensorUnlock mBiometricUnlock; - private KeyguardNavigationManager mNavigationManager; + private SecurityMessageDisplay mSecurityMessageDisplay; private View mFaceUnlockAreaView; private ImageButton mCancelButton; @@ -49,7 +50,6 @@ public class KeyguardFaceUnlockView extends LinearLayout implements KeyguardSecu @Override protected void onFinishInflate() { super.onFinishInflate(); - mNavigationManager = new KeyguardNavigationManager(this); initializeBiometricUnlockView(); } @@ -140,11 +140,14 @@ public class KeyguardFaceUnlockView extends LinearLayout implements KeyguardSecu final boolean backupIsTimedOut = ( monitor.getFailedUnlockAttempts() >= LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT); - // TODO: These max attempts checks are also checked in KeyguardSecurityModel so they - // might not be necessary here anymore. - if (monitor.getPhoneState() != TelephonyManager.CALL_STATE_RINGING + PowerManager powerManager = (PowerManager) mContext.getSystemService( + Context.POWER_SERVICE); + // TODO: Some of these conditions are handled in KeyguardSecurityModel and may not be + // necessary here. + if (monitor.getPhoneState() == TelephonyManager.CALL_STATE_IDLE && !monitor.getMaxBiometricUnlockAttemptsReached() - && !backupIsTimedOut) { + && !backupIsTimedOut + && powerManager.isScreenOn()) { mBiometricUnlock.start(); } else { mBiometricUnlock.stopAndShowBackup(); @@ -173,4 +176,8 @@ public class KeyguardFaceUnlockView extends LinearLayout implements KeyguardSecu } }; + @Override + public void setSecurityMessageDisplay(SecurityMessageDisplay display) { + mSecurityMessageDisplay = display; + } } 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 460f3c6..4987020 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java @@ -43,11 +43,10 @@ import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup; import android.view.WindowManager; -import android.view.View.BaseSavedState; import android.view.animation.AnimationUtils; import android.widget.RemoteViews.OnClickHandler; +import android.widget.TextView; import android.widget.ViewFlipper; import com.android.internal.R; @@ -65,8 +64,8 @@ public class KeyguardHostView extends KeyguardViewBase { // also referenced in SecuritySettings.java static final int APPWIDGET_HOST_ID = 0x4B455947; - private static final String KEYGUARD_WIDGET_PREFS = "keyguard_widget_prefs"; + // transport control states private static final int TRANSPORT_GONE = 0; private static final int TRANSPORT_INVISIBLE = 1; private static final int TRANSPORT_VISIBLE = 2; @@ -163,6 +162,10 @@ public class KeyguardHostView extends KeyguardViewBase { addDefaultWidgets(); updateSecurityViews(); setSystemUiVisibility(getSystemUiVisibility() | View.STATUS_BAR_DISABLE_BACK); + + if (KeyguardUpdateMonitor.getInstance(mContext).getIsFirstBoot()) { + showPrimarySecurityScreen(false); + } } private void updateSecurityViews() { @@ -257,9 +260,6 @@ public class KeyguardHostView extends KeyguardViewBase { } public void dismiss(boolean authenticated) { - // If the biometric unlock was suppressed due to a user switch, it can now be safely - // unsuppressed because the user has left the unlock screen. - KeyguardUpdateMonitor.getInstance(mContext).clearBiometricUnlockUserSwitched(); showNextSecurityScreenOrFinish(authenticated); } @@ -286,7 +286,7 @@ public class KeyguardHostView extends KeyguardViewBase { @Override public void showBackupSecurity() { - KeyguardHostView.this.showBackupSecurity(); + KeyguardHostView.this.showBackupSecurityScreen(); } @Override @@ -410,11 +410,27 @@ public class KeyguardHostView extends KeyguardViewBase { } /** + * Shows the primary security screen for the user. This will be either the multi-selector + * or the user's security method. + * @param turningOff true if the device is being turned off + */ + void showPrimarySecurityScreen(boolean turningOff) { + SecurityMode securityMode = mSecurityModel.getSecurityMode(); + if (DEBUG) Log.v(TAG, "showPrimarySecurityScreen(turningOff=" + turningOff + ")"); + if (!turningOff && KeyguardUpdateMonitor.getInstance(mContext).isAlternateUnlockEnabled()) { + // If we're not turning off, then allow biometric alternate. + // We'll reload it when the device comes back on. + securityMode = mSecurityModel.getAlternateFor(securityMode); + } + showSecurityScreen(securityMode); + } + + /** * Shows the backup security screen for the current security mode. This could be used for * password recovery screens but is currently only used for pattern unlock to show the * account unlock screen and biometric unlock to show the user's normal unlock. */ - private void showBackupSecurity() { + private void showBackupSecurityScreen() { if (DEBUG) Log.d(TAG, "showBackupSecurity()"); showSecurityScreen(mSecurityModel.getBackupSecurityMode()); } @@ -464,14 +480,19 @@ public class KeyguardHostView extends KeyguardViewBase { break; default: - showSecurityScreen(SecurityMode.None); + Log.v(TAG, "Bad security screen " + mCurrentSecuritySelection + ", fail safe"); + showPrimarySecurityScreen(false); break; } } else { - // Not authenticated but we were asked to dismiss so go back to selector screen. - showSecurityScreen(SecurityMode.None); + showPrimarySecurityScreen(false); } if (finish) { + // If the alternate unlock was suppressed, it can now be safely + // enabled because the user has left keyguard. + KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true); + KeyguardUpdateMonitor.getInstance(mContext).setIsFirstBoot(false); + // If there's a pending runnable because the user interacted with a widget // and we're leaving keyguard, then run it. if (mLaunchRunnable != null) { @@ -519,11 +540,12 @@ public class KeyguardHostView extends KeyguardViewBase { }; }; + private KeyguardStatusViewManager mKeyguardStatusViewManager; + @Override public void reset() { mIsVerifyUnlockOnly = false; mAppWidgetContainer.setCurrentPage(getWidgetPosition(R.id.keyguard_status_view)); - requestFocus(); } /** @@ -544,13 +566,37 @@ public class KeyguardHostView extends KeyguardViewBase { break; } } + boolean simPukFullScreen = getResources().getBoolean(R.bool.kg_sim_puk_full_screen); if (view == null) { final LayoutInflater inflater = LayoutInflater.from(mContext); View v = inflater.inflate(getLayoutIdFor(securityMode), this, false); mSecurityViewContainer.addView(v); updateSecurityView(v); + view = (KeyguardSecurityView) v; + TextView navigationText = ((TextView) findViewById(R.id.keyguard_message_area)); + + // Some devices can fit a navigation area, others cannot. On devices that cannot, + // we display the security message in status area. + if (navigationText != null) { + view.setSecurityMessageDisplay(new KeyguardNavigationManager(navigationText)); + } else { + view.setSecurityMessageDisplay(mKeyguardStatusViewManager); + } + } + + if (securityMode == SecurityMode.SimPin || securityMode == SecurityMode.SimPuk) { + if (simPukFullScreen) { + mAppWidgetRegion.setVisibility(View.GONE); + } } + + if (view instanceof KeyguardSelectorView) { + KeyguardSelectorView selectorView = (KeyguardSelectorView) view; + View carrierText = selectorView.findViewById(R.id.keyguard_selector_fade_container); + selectorView.setCarrierArea(carrierText); + } + return view; } @@ -562,6 +608,7 @@ public class KeyguardHostView extends KeyguardViewBase { */ private void showSecurityScreen(SecurityMode securityMode) { if (DEBUG) Log.d(TAG, "showSecurityScreen"); + if (securityMode == mCurrentSecuritySelection) return; KeyguardSecurityView oldView = getSecurityView(mCurrentSecuritySelection); @@ -607,7 +654,7 @@ public class KeyguardHostView extends KeyguardViewBase { @Override public void onScreenTurnedOn() { if (DEBUG) Log.d(TAG, "screen on"); - showSecurityScreen(mCurrentSecuritySelection); + showPrimarySecurityScreen(false); getSecurityView(mCurrentSecuritySelection).onResume(); // This is a an attempt to fix bug 7137389 where the device comes back on but the entire @@ -619,7 +666,7 @@ public class KeyguardHostView extends KeyguardViewBase { @Override public void onScreenTurnedOff() { if (DEBUG) Log.d(TAG, "screen off"); - showSecurityScreen(SecurityMode.None); + showPrimarySecurityScreen(true); getSecurityView(mCurrentSecuritySelection).onPause(); } @@ -769,6 +816,10 @@ public class KeyguardHostView extends KeyguardViewBase { } }); } + + mKeyguardStatusViewManager = ((KeyguardStatusView) + findViewById(R.id.keyguard_status_view_face_palm)).getManager(); + } private void maybePopulateWidgets() { @@ -920,7 +971,9 @@ public class KeyguardHostView extends KeyguardViewBase { @Override public void showUnlockHint() { - mKeyguardSelectorView.ping(); + if (mKeyguardSelectorView != null) { + mKeyguardSelectorView.ping(); + } } }; diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardNavigationManager.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardNavigationManager.java index 646ab92..74b244d 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardNavigationManager.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardNavigationManager.java @@ -21,23 +21,13 @@ import android.widget.TextView; import com.android.internal.R; -public class KeyguardNavigationManager { +public class KeyguardNavigationManager implements SecurityMessageDisplay { private TextView mMessageArea; - private KeyguardSecurityView mKeyguardSecurityView; - private View mClickArea; - public KeyguardNavigationManager(KeyguardSecurityView view) { - mKeyguardSecurityView = view; - mMessageArea = (TextView) ((View) view).findViewById(R.id.keyguard_message_area); + public KeyguardNavigationManager(TextView messageArea) { + mMessageArea = messageArea; mMessageArea.setSelected(true); // Make marquee work - - mClickArea = ((View) view).findViewById(R.id.keyguard_click_area); - mClickArea.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - mKeyguardSecurityView.getCallback().dismiss(false); - } - }); } public void setMessage(CharSequence msg) { 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 a4e8ea4..5a1c30f 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPasswordView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPasswordView.java @@ -61,7 +61,7 @@ public class KeyguardPasswordView extends LinearLayout private PasswordEntryKeyboardView mKeyboardView; private PasswordEntryKeyboardHelper mKeyboardHelper; private boolean mIsAlpha; - private KeyguardNavigationManager mNavigationManager; + private SecurityMessageDisplay mSecurityMessageDisplay; // To avoid accidental lockout due to events while the device in in the pocket, ignore // any passwords with length less than or equal to this length. @@ -101,7 +101,7 @@ public class KeyguardPasswordView extends LinearLayout } private void resetState() { - mNavigationManager.setMessage( + mSecurityMessageDisplay.setMessage( mIsAlpha ? R.string.kg_password_instructions : R.string.kg_pin_instructions); mPasswordEntry.setEnabled(true); mKeyboardView.setEnabled(true); @@ -111,8 +111,6 @@ public class KeyguardPasswordView extends LinearLayout protected void onFinishInflate() { mLockPatternUtils = new LockPatternUtils(mContext); // TODO: use common one - mNavigationManager = new KeyguardNavigationManager(this); - final int quality = mLockPatternUtils.getKeyguardStoredPasswordQuality(); mIsAlpha = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC == quality || DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == quality @@ -288,7 +286,7 @@ public class KeyguardPasswordView extends LinearLayout long deadline = mLockPatternUtils.setLockoutAttemptDeadline(); handleAttemptLockout(deadline); } - mNavigationManager.setMessage( + mSecurityMessageDisplay.setMessage( mIsAlpha ? R.string.kg_wrong_password : R.string.kg_wrong_pin); } mPasswordEntry.setText(""); @@ -304,7 +302,7 @@ public class KeyguardPasswordView extends LinearLayout @Override public void onTick(long millisUntilFinished) { int secondsRemaining = (int) (millisUntilFinished / 1000); - mNavigationManager.setMessage( + mSecurityMessageDisplay.setMessage( R.string.kg_too_many_failed_attempts_countdown, secondsRemaining); } @@ -367,5 +365,10 @@ public class KeyguardPasswordView extends LinearLayout public void afterTextChanged(Editable s) { } + + @Override + public void setSecurityMessageDisplay(SecurityMessageDisplay display) { + mSecurityMessageDisplay = display; + } } 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 e4b7798..d8d7990 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPatternView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPatternView.java @@ -65,7 +65,6 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit private Button mForgotPatternButton; private KeyguardSecurityCallback mCallback; private boolean mEnableFallback; - private KeyguardNavigationManager mNavigationManager; /** * Keeps track of the last time we poked the wake lock during dispatching of the touch event. @@ -84,6 +83,7 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit } }; private Rect mTempRect = new Rect(); + private SecurityMessageDisplay mSecurityMessageDisplay; enum FooterMode { Normal, @@ -111,7 +111,6 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit protected void onFinishInflate() { super.onFinishInflate(); - mNavigationManager = new KeyguardNavigationManager(this); mLockPatternUtils = mLockPatternUtils == null ? new LockPatternUtils(mContext) : mLockPatternUtils; @@ -183,7 +182,7 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit if (deadline != 0) { handleAttemptLockout(deadline); } else { - mNavigationManager.setMessage(R.string.kg_pattern_instructions); + mSecurityMessageDisplay.setMessage(R.string.kg_pattern_instructions); } // the footer depends on how many total attempts the user has failed @@ -255,7 +254,7 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit long deadline = mLockPatternUtils.setLockoutAttemptDeadline(); handleAttemptLockout(deadline); } else { - mNavigationManager.setMessage(R.string.kg_wrong_pattern); + mSecurityMessageDisplay.setMessage(R.string.kg_wrong_pattern); mLockPatternView.postDelayed(mCancelPatternRunnable, PATTERN_CLEAR_TIMEOUT_MS); } } @@ -327,14 +326,14 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit @Override public void onTick(long millisUntilFinished) { final int secondsRemaining = (int) (millisUntilFinished / 1000); - mNavigationManager.setMessage( + mSecurityMessageDisplay.setMessage( R.string.kg_too_many_failed_attempts_countdown, secondsRemaining); } @Override public void onFinish() { mLockPatternView.setEnabled(true); - mNavigationManager.setMessage(R.string.kg_pattern_instructions); + mSecurityMessageDisplay.setMessage(R.string.kg_pattern_instructions); // TODO mUnlockIcon.setVisibility(View.VISIBLE); mFailedPatternAttemptsSinceLastTimeout = 0; if (mEnableFallback) { @@ -370,6 +369,10 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit return mCallback; } + @Override + public void setSecurityMessageDisplay(SecurityMessageDisplay display) { + mSecurityMessageDisplay = display; + } } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityModel.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityModel.java index e573072..80282c1 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityModel.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityModel.java @@ -17,6 +17,7 @@ package com.android.internal.policy.impl.keyguard; import android.app.admin.DevicePolicyManager; import android.content.Context; +import android.telephony.TelephonyManager; import com.android.internal.telephony.IccCardConstants; import com.android.internal.widget.LockPatternUtils; @@ -66,7 +67,8 @@ public class KeyguardSecurityModel { final boolean backupIsTimedOut = monitor.getFailedUnlockAttempts() >= LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT; return monitor.getMaxBiometricUnlockAttemptsReached() || backupIsTimedOut - || monitor.didBiometricUnlockUserSwitch(); + || !monitor.isAlternateUnlockEnabled() + || monitor.getPhoneState() != TelephonyManager.CALL_STATE_IDLE; } SecurityMode getSecurityMode() { 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 d80c1db..19bcae9 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityView.java @@ -61,4 +61,5 @@ public interface KeyguardSecurityView { */ KeyguardSecurityCallback getCallback(); + void setSecurityMessageDisplay(SecurityMessageDisplay display); } 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 b6b731e..1d26def 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java @@ -172,10 +172,13 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri super.onFinishInflate(); mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view); mGlowPadView.setOnTriggerListener(mOnTriggerListener); - mFadeView = (View) findViewById(R.id.keyguard_selector_fade_container); updateTargets(); } + public void setCarrierArea(View carrierArea) { + mFadeView = carrierArea; + } + public boolean isTargetPresent(int resId) { return mGlowPadView.getTargetPosition(resId) != -1; } @@ -324,4 +327,7 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri return mCallback; } + @Override + public void setSecurityMessageDisplay(SecurityMessageDisplay display) { + } } 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 5a9ffcf..3516af9 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSimPinView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSimPinView.java @@ -55,7 +55,7 @@ public class KeyguardSimPinView extends LinearLayout private PasswordEntryKeyboardView mKeyboardView; private PasswordEntryKeyboardHelper mKeyboardHelper; private LockPatternUtils mLockPatternUtils; - private KeyguardNavigationManager mNavigationManager; + private SecurityMessageDisplay mSecurityMessageDisplay; private volatile boolean mSimCheckInProgress; @@ -76,8 +76,6 @@ public class KeyguardSimPinView extends LinearLayout protected void onFinishInflate() { super.onFinishInflate(); - mNavigationManager = new KeyguardNavigationManager(this); - mPinEntry = (EditText) findViewById(R.id.sim_pin_entry); mPinEntry.setOnEditorActionListener(this); mPinEntry.addTextChangedListener(this); @@ -112,7 +110,9 @@ public class KeyguardSimPinView extends LinearLayout public void reset() { // start fresh - mNavigationManager.setMessage(R.string.kg_sim_pin_instructions); + if (mSecurityMessageDisplay != null) { + mSecurityMessageDisplay.setMessage(R.string.kg_sim_pin_instructions); + } // make sure that the number of entered digits is consistent when we // erase the SIM unlock code, including orientation changes. @@ -193,7 +193,7 @@ public class KeyguardSimPinView extends LinearLayout private void checkPin() { if (mPinEntry.getText().length() < 4) { // otherwise, display a message to the user, and don't submit. - mNavigationManager.setMessage(R.string.kg_invalid_sim_pin_hint); + mSecurityMessageDisplay.setMessage(R.string.kg_invalid_sim_pin_hint); mPinEntry.setText(""); mCallback.userActivity(0); return; @@ -216,7 +216,7 @@ public class KeyguardSimPinView extends LinearLayout KeyguardUpdateMonitor.getInstance(getContext()).reportSimUnlocked(); mCallback.dismiss(true); } else { - mNavigationManager.setMessage(R.string.kg_password_wrong_pin_code); + mSecurityMessageDisplay.setMessage(R.string.kg_password_wrong_pin_code); mPinEntry.setText(""); } mCallback.userActivity(0); @@ -263,4 +263,9 @@ public class KeyguardSimPinView extends LinearLayout public void afterTextChanged(Editable s) { } + @Override + public void setSecurityMessageDisplay(SecurityMessageDisplay display) { + mSecurityMessageDisplay = display; + reset(); + } } 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 2cdb52d..2194c80 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSimPukView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSimPukView.java @@ -48,7 +48,7 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList private ProgressDialog mSimUnlockProgressDialog = null; private KeyguardSecurityCallback mCallback; - private KeyguardNavigationManager mNavigationManager; + private SecurityMessageDisplay mSecurityMessageDisplay; private PasswordEntryKeyboardView mKeyboardView; @@ -99,7 +99,7 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList } mSimPinEntry.setText(null); if (msg != 0) { - mNavigationManager.setMessage(msg); + mSecurityMessageDisplay.setMessage(msg); } } @@ -107,7 +107,9 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList mPinText=""; mPukText=""; state = ENTER_PUK; - mNavigationManager.setMessage(R.string.kg_puk_enter_puk_hint); + if (mSecurityMessageDisplay != null) { + mSecurityMessageDisplay.setMessage(R.string.kg_puk_enter_puk_hint); + } mSimPinEntry.requestFocus(); } } @@ -130,8 +132,6 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList protected void onFinishInflate() { super.onFinishInflate(); - mNavigationManager = new KeyguardNavigationManager(this); - mSimPinEntry = (TextView) findViewById(R.id.sim_pin_entry); mSimPinEntry.setOnEditorActionListener(this); mSimPinEntry.addTextChangedListener(this); @@ -279,7 +279,7 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList mCallback.dismiss(true); } else { mStateMachine.reset(); - mNavigationManager.setMessage(R.string.kg_invalid_puk); + mSecurityMessageDisplay.setMessage(R.string.kg_invalid_puk); } mCheckInProgress = false; } @@ -333,4 +333,9 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList public void afterTextChanged(Editable s) { } + @Override + public void setSecurityMessageDisplay(SecurityMessageDisplay display) { + mSecurityMessageDisplay = display; + reset(); + } } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java index 5704425..00cd5b9 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java @@ -44,4 +44,7 @@ public class KeyguardStatusView extends GridLayout { mStatusViewManager = new KeyguardStatusViewManager(this); } + KeyguardStatusViewManager getManager() { + return mStatusViewManager; + } } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java index f97d67d..ab2e170 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java @@ -27,7 +27,10 @@ import libcore.util.MutableInt; import android.content.ContentResolver; import android.content.Context; +import android.content.res.Resources; import android.graphics.Typeface; +import android.os.Handler; +import android.os.Looper; import android.os.UserHandle; import android.provider.Settings; import android.text.TextUtils; @@ -36,10 +39,14 @@ import android.util.Log; import android.view.View; import android.widget.TextView; +import java.util.Date; + +import libcore.util.MutableInt; + /*** * Manages a number of views inside of the given layout. See below for a list of widgets. */ -class KeyguardStatusViewManager { +class KeyguardStatusViewManager implements SecurityMessageDisplay { private static final boolean DEBUG = false; private static final String TAG = "KeyguardStatusView"; @@ -55,6 +62,9 @@ class KeyguardStatusViewManager { private TextView mStatus1View; private TextView mOwnerInfoView; private TextView mAlarmStatusView; + private TextView mSecurityMessage; + private static final int SECURITY_MESSAGE_DURATION = 5000; + private static final boolean SECURITY_MESSAGE_TIMES_OUT = false; // Top-level container view for above views private View mContainer; @@ -65,6 +75,10 @@ class KeyguardStatusViewManager { // last known plugged in state private boolean mPluggedIn = false; + // Whether to use the last line as a combined line to either display owner info / charging. + // If false, each item will be given a dedicated space. + private boolean mShareStatusRegion = false; + // last known battery level private int mBatteryLevel = 100; @@ -79,6 +93,10 @@ class KeyguardStatusViewManager { protected boolean mBatteryCharged; protected boolean mBatteryIsLow; + private Handler mHandler; + private Runnable mClearSecurityMessageRunnable; + private CharSequence mSecurityMessageContents = ""; + private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() { @Override public void onRefreshBatteryInfo(KeyguardUpdateMonitor.BatteryStatus status) { @@ -102,8 +120,10 @@ class KeyguardStatusViewManager { public KeyguardStatusViewManager(View view) { if (DEBUG) Log.v(TAG, "KeyguardStatusViewManager()"); mContainer = view; - mDateFormatString = getContext().getResources().getText( - com.android.internal.R.string.abbrev_wday_month_day_no_year); + Resources res = getContext().getResources(); + mDateFormatString = + res.getText(com.android.internal.R.string.abbrev_wday_month_day_no_year); + mShareStatusRegion = res.getBoolean(R.bool.kg_share_status_area); mLockPatternUtils = new LockPatternUtils(view.getContext()); mUpdateMonitor = KeyguardUpdateMonitor.getInstance(view.getContext()); @@ -112,6 +132,12 @@ class KeyguardStatusViewManager { mAlarmStatusView = (TextView) view.findViewById(R.id.alarm_status); mOwnerInfoView = (TextView) view.findViewById(R.id.owner_info); mClockView = (ClockView) view.findViewById(R.id.clock_view); + mSecurityMessage = (TextView) view.findViewById(R.id.status_security_message); + + // This is required to ensure marquee works + if (mSecurityMessage != null) { + mSecurityMessage.setSelected(true); + } // Use custom font in mDateView mDateView.setTypeface(Typeface.SANS_SERIF, Typeface.BOLD); @@ -129,9 +155,17 @@ class KeyguardStatusViewManager { // Registering this callback immediately updates the battery state, among other things. mUpdateMonitor.registerCallback(mInfoCallback); - resetStatusInfo(); refreshDate(); - updateOwnerInfo(); + resetStatusInfo(); + + mHandler = new Handler(Looper.myLooper()); + mClearSecurityMessageRunnable = new Runnable() { + @Override + public void run() { + mSecurityMessageContents = ""; + updateStatusLines(); + } + }; } public void onPause() { @@ -154,6 +188,37 @@ class KeyguardStatusViewManager { updateStatusLines(); } + public void setMessage(CharSequence msg) { + mSecurityMessageContents = msg; + securityMessageChanged(); + } + + public void setMessage(int resId) { + if (resId != 0) { + mSecurityMessageContents = getContext().getResources().getText(resId); + } else { + mSecurityMessageContents = ""; + } + securityMessageChanged(); + } + + public void setMessage(int resId, Object... formatArgs) { + if (resId != 0) { + mSecurityMessageContents = getContext().getString(resId, formatArgs); + } else { + mSecurityMessageContents = ""; + } + securityMessageChanged(); + } + + public void securityMessageChanged() { + updateStatusLines(); + if (SECURITY_MESSAGE_TIMES_OUT) { + mHandler.removeCallbacks(mClearSecurityMessageRunnable); + mHandler.postDelayed(mClearSecurityMessageRunnable, SECURITY_MESSAGE_DURATION); + } + } + /** * Update the status lines based on these rules: * AlarmStatus: Alarm state always gets it's own line. @@ -163,8 +228,21 @@ class KeyguardStatusViewManager { */ void updateStatusLines() { updateAlarmInfo(); - updateOwnerInfo(); - updateStatus1(); + boolean statusAreaUsed = updateSecurityMessage(); + statusAreaUsed = updateStatus1(statusAreaUsed) || statusAreaUsed; + updateOwnerInfo(statusAreaUsed); + } + + private boolean updateSecurityMessage() { + if (mSecurityMessage == null) return false; + if (!TextUtils.isEmpty(mSecurityMessageContents)) { + mSecurityMessage.setText(mSecurityMessageContents); + mSecurityMessage.setVisibility(View.VISIBLE); + return true; + } else { + mSecurityMessage.setVisibility(View.GONE); + return false; + } } private void updateAlarmInfo() { @@ -178,13 +256,31 @@ class KeyguardStatusViewManager { } } - private void updateOwnerInfo() { + private boolean updateStatus1(boolean statusAreaUsed) { + MutableInt icon = new MutableInt(0); + CharSequence string = getPriorityTextMessage(icon); + + boolean dontShow = statusAreaUsed && mShareStatusRegion; + if (!dontShow && !TextUtils.isEmpty(string)) { + maybeSetUpperCaseText(mStatus1View, string); + mStatus1View.setCompoundDrawablesWithIntrinsicBounds(icon.value, 0, 0, 0); + mStatus1View.setVisibility(View.VISIBLE); + return true; + } else { + mStatus1View.setVisibility(View.GONE); + return false; + } + } + + private void updateOwnerInfo(boolean statusAreaUsed) { final ContentResolver res = getContext().getContentResolver(); final boolean ownerInfoEnabled = Settings.Secure.getIntForUser(res, Settings.Secure.LOCK_SCREEN_OWNER_INFO_ENABLED, 1, UserHandle.USER_CURRENT) != 0; String text = Settings.Secure.getStringForUser(res, Settings.Secure.LOCK_SCREEN_OWNER_INFO, UserHandle.USER_CURRENT); - if (ownerInfoEnabled && !TextUtils.isEmpty(text)) { + + boolean dontShow = statusAreaUsed && mShareStatusRegion; + if (!dontShow && ownerInfoEnabled && !TextUtils.isEmpty(text)) { text = text.trim(); // Remove trailing newlines maybeSetUpperCaseText(mOwnerInfoView, text); mOwnerInfoView.setVisibility(View.VISIBLE); @@ -193,18 +289,6 @@ class KeyguardStatusViewManager { } } - private void updateStatus1() { - MutableInt icon = new MutableInt(0); - CharSequence string = getPriorityTextMessage(icon); - if (!TextUtils.isEmpty(string)) { - maybeSetUpperCaseText(mStatus1View, string); - mStatus1View.setCompoundDrawablesWithIntrinsicBounds(icon.value, 0, 0, 0); - mStatus1View.setVisibility(View.VISIBLE); - } else { - mStatus1View.setVisibility(View.GONE); - } - } - private CharSequence getPriorityTextMessage(MutableInt icon) { CharSequence string = null; if (mShowingBatteryInfo) { diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitor.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitor.java index 63a074a..d8e1c1a 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitor.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitor.java @@ -102,7 +102,7 @@ public class KeyguardUpdateMonitor { private int mFailedAttempts = 0; private int mFailedBiometricUnlockAttempts = 0; - private boolean mBiometricUnlockUserSwitched; + private boolean mAlternateUnlockEnabled; private boolean mClockVisible; @@ -195,6 +195,7 @@ public class KeyguardUpdateMonitor { } } }; + private boolean mIsFirstBoot; /** * When we receive a @@ -406,7 +407,7 @@ public class KeyguardUpdateMonitor { cb.onUserSwitched(userId); } } - mBiometricUnlockUserSwitched = true; + setAlternateUnlockEnabled(false); try { reply.sendResult(null); } catch (RemoteException e) { @@ -724,12 +725,12 @@ public class KeyguardUpdateMonitor { return mFailedBiometricUnlockAttempts >= FAILED_BIOMETRIC_UNLOCK_ATTEMPTS_BEFORE_BACKUP; } - public boolean didBiometricUnlockUserSwitch() { - return mBiometricUnlockUserSwitched; + public boolean isAlternateUnlockEnabled() { + return mAlternateUnlockEnabled; } - public void clearBiometricUnlockUserSwitched() { - mBiometricUnlockUserSwitched = false; + public void setAlternateUnlockEnabled(boolean enabled) { + mAlternateUnlockEnabled = enabled; } public boolean isSimLocked() { @@ -752,4 +753,12 @@ public class KeyguardUpdateMonitor { || simState == IccCardConstants.State.PUK_REQUIRED || simState == IccCardConstants.State.PERM_DISABLED); } + + public void setIsFirstBoot(boolean b) { + mIsFirstBoot = b; + } + + public boolean getIsFirstBoot() { + return mIsFirstBoot; + } } 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 1754f7f..1ec4176 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewManager.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewManager.java @@ -210,14 +210,13 @@ public class KeyguardViewManager { mKeyguardView.setLockPatternUtils(mLockPatternUtils); mKeyguardView.setViewMediatorCallback(mViewMediatorCallback); - if (options != null && options.getBoolean(LockPatternUtils.KEYGUARD_SHOW_USER_SWITCHER)) { - mKeyguardView.goToUserSwitcher(); - mKeyguardView.showNextSecurityScreenIfPresent(); - } - - if (options != null && - options.getBoolean(LockPatternUtils.KEYGUARD_SHOW_SECURITY_CHALLENGE)) { - mKeyguardView.showNextSecurityScreenIfPresent(); + if (options != null) { + if (options.getBoolean(LockPatternUtils.KEYGUARD_SHOW_USER_SWITCHER)) { + mKeyguardView.goToUserSwitcher(); + } + if (options.getBoolean(LockPatternUtils.KEYGUARD_SHOW_SECURITY_CHALLENGE)) { + mKeyguardView.showNextSecurityScreenIfPresent(); + } } if (mScreenOn) { 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 3ed952c..92f9dfd 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java @@ -309,8 +309,9 @@ public class KeyguardViewMediator { options.putBoolean(LockPatternUtils.KEYGUARD_SHOW_USER_SWITCHER, true); options.putBoolean(LockPatternUtils.KEYGUARD_SHOW_SECURITY_CHALLENGE, true); resetStateLocked(options); - adjustStatusBarLocked(); + // Disable face unlock when the user switches. + KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(false); } } @@ -519,6 +520,11 @@ public class KeyguardViewMediator { if (DEBUG) Log.d(TAG, "onSystemReady"); mSystemReady = true; mUpdateMonitor.registerCallback(mUpdateCallback); + + // Disable alternate unlock right after boot until things have settled. + mUpdateMonitor.setAlternateUnlockEnabled(false); + mUpdateMonitor.setIsFirstBoot(true); + doKeyguardLocked(); } // Most services aren't available until the system reaches the ready state, so we 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 fc7c90f..d834741 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/PagedView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/PagedView.java @@ -90,6 +90,8 @@ public class PagedView extends ViewGroup implements ViewGroup.OnHierarchyChangeL protected boolean mFirstLayout = true; protected int mCurrentPage; + protected int mChildCountOnLastMeasure; + protected int mNextPage = INVALID_PAGE; protected int mMaxScrollX; protected Scroller mScroller; @@ -498,6 +500,11 @@ public class PagedView extends ViewGroup implements ViewGroup.OnHierarchyChangeL // ensure that the cache is filled with good values. invalidateCachedOffsets(); + if (mChildCountOnLastMeasure != getChildCount()) { + setCurrentPage(mCurrentPage); + } + mChildCountOnLastMeasure = getChildCount(); + if (childCount > 0) { if (DEBUG) Log.d(TAG, "getRelativeChildOffset(): " + getMeasuredWidth() + ", " + getChildWidth(0)); @@ -595,10 +602,7 @@ public class PagedView extends ViewGroup implements ViewGroup.OnHierarchyChangeL @Override public void onChildViewRemoved(View parent, View child) { - invalidate(); - invalidateCachedOffsets(); - // This prevents a crash when a child is removed that was the current page. - mCurrentPage = Math.min(mCurrentPage, getChildCount() - 1); + // TODO Auto-generated method stub } protected void invalidateCachedOffsets() { @@ -621,6 +625,8 @@ public class PagedView extends ViewGroup implements ViewGroup.OnHierarchyChangeL } protected int getChildOffset(int index) { + if (index < 0 || index > getChildCount() - 1) return 0; + int[] childOffsets = Float.compare(mLayoutScale, 1f) == 0 ? mChildOffsets : mChildOffsetsWithLayoutScale; @@ -642,6 +648,8 @@ public class PagedView extends ViewGroup implements ViewGroup.OnHierarchyChangeL } protected int getRelativeChildOffset(int index) { + if (index < 0 || index > getChildCount() - 1) return 0; + if (mChildRelativeOffsets != null && mChildRelativeOffsets[index] != -1) { return mChildRelativeOffsets[index]; } else { diff --git a/policy/src/com/android/internal/policy/impl/keyguard/SecurityMessageDisplay.java b/policy/src/com/android/internal/policy/impl/keyguard/SecurityMessageDisplay.java new file mode 100644 index 0000000..98fd11e --- /dev/null +++ b/policy/src/com/android/internal/policy/impl/keyguard/SecurityMessageDisplay.java @@ -0,0 +1,25 @@ +/* + * 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; + +public interface SecurityMessageDisplay { + public void setMessage(CharSequence msg); + + public void setMessage(int resId); + + public void setMessage(int resId, Object... formatArgs); +} |