diff options
192 files changed, 4981 insertions, 1396 deletions
@@ -395,6 +395,8 @@ web_docs_sample_code_flags := \ resources/samples/AccessibilityService "Accessibility Service" \ -samplecode $(sample_dir)/ApiDemos \ resources/samples/ApiDemos "API Demos" \ + -samplecode $(sample_dir)/AccelerometerPlay \ + resources/samples/AccelerometerPlay "Accelerometer Play" \ -samplecode $(sample_dir)/BackupRestore \ resources/samples/BackupRestore "Backup and Restore" \ -samplecode $(sample_dir)/BluetoothChat \ @@ -407,8 +409,6 @@ web_docs_sample_code_flags := \ resources/samples/CubeLiveWallpaper "Live Wallpaper" \ -samplecode $(sample_dir)/Home \ resources/samples/Home "Home" \ - -samplecode $(sample_dir)/HeavyWeight \ - resources/samples/HeavyWeight "Heavy Weight App" \ -samplecode $(sample_dir)/JetBoy \ resources/samples/JetBoy "JetBoy" \ -samplecode $(sample_dir)/LunarLander \ @@ -449,12 +449,12 @@ web_docs_sample_code_flags := \ framework_docs_SDK_VERSION:=2.3 # release version (ie "Release x") (full releases only) framework_docs_SDK_REL_ID:=1 - # flag to build offline docs for a preview release -framework_docs_SDK_PREVIEW:=0 framework_docs_LOCAL_DROIDDOC_OPTIONS += \ -hdf sdk.version $(framework_docs_SDK_VERSION) \ - -hdf sdk.rel.id $(framework_docs_SDK_REL_ID) + -hdf sdk.rel.id $(framework_docs_SDK_REL_ID) \ + -hdf sdk.preview true \ + -hdf sdk.preview.version Honeycomb # ==== the api stubs and current.xml =========================== include $(CLEAR_VARS) @@ -540,9 +540,6 @@ LOCAL_DROIDDOC_OPTIONS:=\ -sdkvalues $(OUT_DOCS) \ -hdf android.whichdoc offline -ifeq ($(framework_docs_SDK_PREVIEW),true) - LOCAL_DROIDDOC_OPTIONS += -hdf sdk.preview true -endif LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk diff --git a/api/current.xml b/api/current.xml index b62c689..6dabecf 100644 --- a/api/current.xml +++ b/api/current.xml @@ -61579,6 +61579,19 @@ <parameter name="that" type="android.content.res.Configuration"> </parameter> </method> +<method name="isLayoutSizeAtLeast" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="size" type="int"> +</parameter> +</method> <method name="needNewResources" return="boolean" abstract="false" diff --git a/cmds/rawbu/backup.cpp b/cmds/rawbu/backup.cpp index c4fa765..9ea046d 100644 --- a/cmds/rawbu/backup.cpp +++ b/cmds/rawbu/backup.cpp @@ -14,6 +14,7 @@ #include <utime.h> #include <sys/stat.h> #include <sys/types.h> +#include <stdint.h> #include <cutils/properties.h> diff --git a/core/java/android/app/TimePickerDialog.java b/core/java/android/app/TimePickerDialog.java index 381143c..26af4eb 100644 --- a/core/java/android/app/TimePickerDialog.java +++ b/core/java/android/app/TimePickerDialog.java @@ -16,29 +16,26 @@ package android.app; +import com.android.internal.R; + import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Build; import android.os.Bundle; -import android.text.format.DateFormat; import android.view.LayoutInflater; import android.view.View; import android.widget.TimePicker; import android.widget.TimePicker.OnTimeChangedListener; -import com.android.internal.R; - -import java.util.Calendar; - /** * A dialog that prompts the user for the time of day using a {@link TimePicker}. * * <p>See the <a href="{@docRoot}resources/tutorials/views/hello-timepicker.html">Time Picker * tutorial</a>.</p> */ -public class TimePickerDialog extends AlertDialog implements OnClickListener, - OnTimeChangedListener { +public class TimePickerDialog extends AlertDialog + implements OnClickListener, OnTimeChangedListener { /** * The callback interface used to indicate the user is done filling in @@ -60,8 +57,6 @@ public class TimePickerDialog extends AlertDialog implements OnClickListener, private final TimePicker mTimePicker; private final OnTimeSetListener mCallback; - private final Calendar mCalendar; - private final java.text.DateFormat mDateFormat; int mInitialHourOfDay; int mInitialMinute; @@ -102,14 +97,13 @@ public class TimePickerDialog extends AlertDialog implements OnClickListener, mInitialMinute = minute; mIs24HourView = is24HourView; - mDateFormat = DateFormat.getTimeFormat(context); - mCalendar = Calendar.getInstance(); - updateTitle(mInitialHourOfDay, mInitialMinute); + setCanceledOnTouchOutside(false); + setIcon(0); + setTitle(R.string.time_picker_dialog_title); setButton(BUTTON_POSITIVE, context.getText(R.string.date_time_set), this); setButton(BUTTON_NEGATIVE, context.getText(R.string.cancel), (OnClickListener) null); - setIcon(R.drawable.ic_dialog_time); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); @@ -132,19 +126,13 @@ public class TimePickerDialog extends AlertDialog implements OnClickListener, } } - public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { - updateTitle(hourOfDay, minute); - } - public void updateTime(int hourOfDay, int minutOfHour) { mTimePicker.setCurrentHour(hourOfDay); mTimePicker.setCurrentMinute(minutOfHour); } - private void updateTitle(int hour, int minute) { - mCalendar.set(Calendar.HOUR_OF_DAY, hour); - mCalendar.set(Calendar.MINUTE, minute); - setTitle(mDateFormat.format(mCalendar.getTime())); + public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { + /* do nothing */ } @Override @@ -164,7 +152,5 @@ public class TimePickerDialog extends AlertDialog implements OnClickListener, mTimePicker.setCurrentHour(hour); mTimePicker.setCurrentMinute(minute); mTimePicker.setIs24HourView(savedInstanceState.getBoolean(IS_24_HOUR)); - mTimePicker.setOnTimeChangedListener(this); - updateTitle(hour, minute); } } diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java index 2f110f0..31119d7 100644 --- a/core/java/android/content/res/Configuration.java +++ b/core/java/android/content/res/Configuration.java @@ -91,6 +91,22 @@ public final class Configuration implements Parcelable, Comparable<Configuration */ public int screenLayout; + /** + * Check if the Configuration's current {@link #screenLayout} is at + * least the given size. + * + * @param size The desired size, either {@link #SCREENLAYOUT_SIZE_SMALL}, + * {@link #SCREENLAYOUT_SIZE_NORMAL}, {@link #SCREENLAYOUT_SIZE_LARGE}, or + * {@link #SCREENLAYOUT_SIZE_XLARGE}. + * @return Returns true if the current screen layout size is at least + * the given size. + */ + public boolean isLayoutSizeAtLeast(int size) { + int cur = screenLayout&SCREENLAYOUT_SIZE_MASK; + if (cur == SCREENLAYOUT_SIZE_UNDEFINED) return false; + return cur >= size; + } + public static final int TOUCHSCREEN_UNDEFINED = 0; public static final int TOUCHSCREEN_NOTOUCH = 1; public static final int TOUCHSCREEN_STYLUS = 2; diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java index 7efb7fd..184988b 100644 --- a/core/java/android/database/sqlite/SQLiteDatabase.java +++ b/core/java/android/database/sqlite/SQLiteDatabase.java @@ -1122,11 +1122,11 @@ public class SQLiteDatabase extends SQLiteClosable { Map.Entry<SQLiteClosable, Object> entry = iter.next(); SQLiteClosable program = entry.getKey(); if (program != null && program instanceof SQLiteProgram) { - SQLiteCompiledSql compiledSql = ((SQLiteProgram)program).mCompiledSql; - if (compiledSql.nStatement == stmtId) { - msg = compiledSql.toString(); - found = true; - } + SQLiteCompiledSql compiledSql = ((SQLiteProgram)program).mCompiledSql; + if (compiledSql.nStatement == stmtId) { + msg = compiledSql.toString(); + found = true; + } } } if (!found) { @@ -1140,8 +1140,9 @@ public class SQLiteDatabase extends SQLiteClosable { } } else { // the statement is not yet closed. most probably programming error in the app. - Log.w(TAG, "dbclose failed due to un-close()d SQL statements: " + msg); - throw e; + throw new SQLiteUnfinalizedObjectsException( + "close() on database: " + getPath() + + " failed due to un-close()d SQL statements: " + msg); } } } diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java index 1972692..cb7d0e2 100644 --- a/core/java/android/view/ViewRoot.java +++ b/core/java/android/view/ViewRoot.java @@ -53,7 +53,7 @@ import android.util.EventLog; import android.util.Log; import android.util.Slog; import android.util.SparseArray; -import android.view.InputQueue.FinishedCallback; +import android.util.TypedValue; import android.view.View.MeasureSpec; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; @@ -87,7 +87,7 @@ public final class ViewRoot extends Handler implements ViewParent, View.AttachIn /** @noinspection PointlessBooleanExpression*/ private static final boolean DEBUG_DRAW = false || LOCAL_LOGV; private static final boolean DEBUG_LAYOUT = false || LOCAL_LOGV; - private static final boolean DEBUG_INPUT = true || LOCAL_LOGV; + private static final boolean DEBUG_DIALOG = false || LOCAL_LOGV; private static final boolean DEBUG_INPUT_RESIZE = false || LOCAL_LOGV; private static final boolean DEBUG_ORIENTATION = false || LOCAL_LOGV; private static final boolean DEBUG_TRACKBALL = false || LOCAL_LOGV; @@ -125,6 +125,8 @@ public final class ViewRoot extends Handler implements ViewParent, View.AttachIn final int[] mTmpLocation = new int[2]; + final TypedValue mTmpValue = new TypedValue(); + final InputMethodCallback mInputMethodCallback; final SparseArray<Object> mPendingEvents = new SparseArray<Object>(); int mPendingEventSeq = 0; @@ -405,7 +407,7 @@ public final class ViewRoot extends Handler implements ViewParent, View.AttachIn } mPendingContentInsets.set(mAttachInfo.mContentInsets); mPendingVisibleInsets.set(0, 0, 0, 0); - if (Config.LOGV) Log.v(TAG, "Added window " + mWindow); + if (DEBUG_LAYOUT) Log.v(TAG, "Added window " + mWindow); if (res < WindowManagerImpl.ADD_OKAY) { mView = null; mAttachInfo.mRootView = null; @@ -639,7 +641,7 @@ public final class ViewRoot extends Handler implements ViewParent, View.AttachIn mTraversalScheduled = false; mWillDrawSoon = true; - boolean windowResizesToFitContent = false; + boolean windowSizeMayChange = false; boolean fullRedrawNeeded = mFullRedrawNeeded; boolean newSurface = false; boolean surfaceChanged = false; @@ -696,7 +698,7 @@ public final class ViewRoot extends Handler implements ViewParent, View.AttachIn "View " + host + " resized to: " + frame); fullRedrawNeeded = true; mLayoutRequested = true; - windowResizesToFitContent = true; + windowSizeMayChange = true; } } @@ -722,6 +724,8 @@ public final class ViewRoot extends Handler implements ViewParent, View.AttachIn // enqueued an action after being detached getRunQueue().executeActions(attachInfo.mHandler); + final Resources res = mView.getContext().getResources(); + if (mFirst) { host.fitSystemWindows(mAttachInfo.mContentInsets); // make sure touch mode code executes by setting cached value @@ -743,23 +747,69 @@ public final class ViewRoot extends Handler implements ViewParent, View.AttachIn } if (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT || lp.height == ViewGroup.LayoutParams.WRAP_CONTENT) { - windowResizesToFitContent = true; + windowSizeMayChange = true; - DisplayMetrics packageMetrics = - mView.getContext().getResources().getDisplayMetrics(); + DisplayMetrics packageMetrics = res.getDisplayMetrics(); desiredWindowWidth = packageMetrics.widthPixels; desiredWindowHeight = packageMetrics.heightPixels; } } - childWidthMeasureSpec = getRootMeasureSpec(desiredWindowWidth, lp.width); - childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height); - // Ask host how big it wants to be if (DEBUG_ORIENTATION || DEBUG_LAYOUT) Log.v(TAG, "Measuring " + host + " in display " + desiredWindowWidth + "x" + desiredWindowHeight + "..."); - host.measure(childWidthMeasureSpec, childHeightMeasureSpec); + + boolean goodMeasure = false; + if (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT + || lp.height == ViewGroup.LayoutParams.WRAP_CONTENT) { + // On large screens, we don't want to allow dialogs to just + // stretch to fill the entire width of the screen to display + // one line of text. First try doing the layout at a smaller + // size to see if it will fit. + final DisplayMetrics packageMetrics = res.getDisplayMetrics(); + res.getValue(com.android.internal.R.dimen.config_prefDialogWidth, mTmpValue, true); + int baseSize = 0; + if (mTmpValue.type == TypedValue.TYPE_DIMENSION) { + baseSize = (int)mTmpValue.getDimension(packageMetrics); + } + if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": baseSize=" + baseSize); + if (baseSize != 0 && desiredWindowWidth > baseSize) { + int maxHeight = (desiredWindowHeight*2)/3; + childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width); + childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height); + host.measure(childWidthMeasureSpec, childHeightMeasureSpec); + if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": measured (" + + host.getWidth() + "," + host.getHeight() + ")"); + // Note: for now we are not taking into account height, since we + // can't distinguish between places where it would be useful to + // increase the width (text) vs. where it would not (a list). + // Maybe we can just try the next size up, and see if that reduces + // the height? + if (host.getWidth() <= baseSize /*&& host.getHeight() <= maxHeight*/) { + Log.v(TAG, "Good!"); + goodMeasure = true; + } else { + // Didn't fit in that size... try expanding a bit. + baseSize = (baseSize+desiredWindowWidth)/2; + if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": next baseSize=" + + baseSize); + host.measure(childWidthMeasureSpec, childHeightMeasureSpec); + if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": measured (" + + host.getWidth() + "," + host.getHeight() + ")"); + if (host.getWidth() <= baseSize /*&& host.getHeight() <= maxHeight*/) { + if (DEBUG_DIALOG) Log.v(TAG, "Good!"); + goodMeasure = true; + } + } + } + } + + if (!goodMeasure) { + childWidthMeasureSpec = getRootMeasureSpec(desiredWindowWidth, lp.width); + childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height); + host.measure(childWidthMeasureSpec, childHeightMeasureSpec); + } if (DBG) { System.out.println("======================================"); @@ -812,7 +862,7 @@ public final class ViewRoot extends Handler implements ViewParent, View.AttachIn } } - boolean windowShouldResize = mLayoutRequested && windowResizesToFitContent + boolean windowShouldResize = mLayoutRequested && windowSizeMayChange && ((mWidth != host.mMeasuredWidth || mHeight != host.mMeasuredHeight) || (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT && frame.width() < desiredWindowWidth && frame.width() != mWidth) diff --git a/core/java/android/view/inputmethod/InputMethodSubtype.java b/core/java/android/view/inputmethod/InputMethodSubtype.java index 0925940..39a0c19 100644 --- a/core/java/android/view/inputmethod/InputMethodSubtype.java +++ b/core/java/android/view/inputmethod/InputMethodSubtype.java @@ -49,19 +49,23 @@ public final class InputMethodSubtype implements Parcelable { InputMethodSubtype(int nameId, int iconId, String locale, String mode, String extraValue) { mSubtypeNameResId = nameId; mSubtypeIconResId = iconId; - mSubtypeLocale = locale; - mSubtypeMode = mode; - mSubtypeExtraValue = extraValue; + mSubtypeLocale = locale != null ? locale : ""; + mSubtypeMode = mode != null ? mode : ""; + mSubtypeExtraValue = extraValue != null ? extraValue : ""; mSubtypeHashCode = hashCodeInternal(mSubtypeNameResId, mSubtypeIconResId, mSubtypeLocale, mSubtypeMode, mSubtypeExtraValue); } InputMethodSubtype(Parcel source) { + String s; mSubtypeNameResId = source.readInt(); mSubtypeIconResId = source.readInt(); - mSubtypeLocale = source.readString(); - mSubtypeMode = source.readString(); - mSubtypeExtraValue = source.readString(); + s = source.readString(); + mSubtypeLocale = s != null ? s : ""; + s = source.readString(); + mSubtypeMode = s != null ? s : ""; + s = source.readString(); + mSubtypeExtraValue = s != null ? s : ""; mSubtypeHashCode = hashCodeInternal(mSubtypeNameResId, mSubtypeIconResId, mSubtypeLocale, mSubtypeMode, mSubtypeExtraValue); } @@ -110,8 +114,9 @@ public final class InputMethodSubtype implements Parcelable { public boolean equals(Object o) { if (o instanceof InputMethodSubtype) { InputMethodSubtype subtype = (InputMethodSubtype) o; - return (subtype.getNameResId() == getNameResId()) - && (subtype.getMode() == getMode()) + return (subtype.hashCode() == hashCode()) + && (subtype.getNameResId() == getNameResId()) + && (subtype.getMode().equals(getMode())) && (subtype.getIconResId() == getIconResId()) && (subtype.getLocale().equals(getLocale())) && (subtype.getExtraValue().equals(getExtraValue())); @@ -146,4 +151,4 @@ public final class InputMethodSubtype implements Parcelable { String mode, String extraValue) { return Arrays.hashCode(new Object[] {nameResId, iconResId, locale, mode, extraValue}); } -}
\ No newline at end of file +} diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index 4482b5b..0c298b0 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -18,80 +18,134 @@ package android.widget; import com.android.internal.R; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; import android.annotation.Widget; import android.content.Context; -import android.os.Handler; +import android.content.res.ColorStateList; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Paint.Align; import android.text.InputFilter; import android.text.InputType; import android.text.Spanned; +import android.text.TextUtils; import android.text.method.NumberKeyListener; import android.util.AttributeSet; +import android.util.SparseArray; +import android.view.KeyEvent; import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.VelocityTracker; import android.view.View; +import android.view.ViewConfiguration; +import android.view.LayoutInflater.Filter; +import android.view.animation.OvershootInterpolator; +import android.view.inputmethod.InputMethodManager; /** - * A view for selecting a number + * A view for selecting a number For a dialog using this view, see + * {@link android.app.TimePickerDialog}. * - * For a dialog using this view, see {@link android.app.TimePickerDialog}. * @hide */ @Widget public class NumberPicker extends LinearLayout { /** - * The callback interface used to indicate the number value has been adjusted. + * The index of the middle selector item. */ - public interface OnChangedListener { - /** - * @param picker The NumberPicker associated with this listener. - * @param oldVal The previous value. - * @param newVal The new value. - */ - void onChanged(NumberPicker picker, int oldVal, int newVal); - } + private static final int SELECTOR_MIDDLE_ITEM_INDEX = 2; /** - * Interface used to format the number into a string for presentation + * The coefficient by which to adjust (divide) the max fling velocity. */ - public interface Formatter { - String toString(int value); - } + private static final int SELECTOR_MAX_FLING_VELOCITY_ADJUSTMENT = 8; - /* - * Use a custom NumberPicker formatting callback to use two-digit - * minutes strings like "01". Keeping a static formatter etc. is the - * most efficient way to do this; it avoids creating temporary objects - * on every call to format(). - */ - public static final NumberPicker.Formatter TWO_DIGIT_FORMATTER = - new NumberPicker.Formatter() { - final StringBuilder mBuilder = new StringBuilder(); - final java.util.Formatter mFmt = new java.util.Formatter(mBuilder); - final Object[] mArgs = new Object[1]; - public String toString(int value) { - mArgs[0] = value; - mBuilder.delete(0, mBuilder.length()); - mFmt.format("%02d", mArgs); - return mFmt.toString(); - } - }; + /** + * The the duration for adjusting the selector wheel. + */ + private static final int SELECTOR_ADJUSTMENT_DURATION_MILLIS = 800; - private final Handler mHandler; - private final Runnable mRunnable = new Runnable() { - public void run() { - if (mIncrement) { - changeCurrent(mCurrent + 1); - mHandler.postDelayed(this, mSpeed); - } else if (mDecrement) { - changeCurrent(mCurrent - 1); - mHandler.postDelayed(this, mSpeed); - } + /** + * The the delay for showing the input controls after a single tap on the + * input text. + */ + private static final int SHOW_INPUT_CONTROLS_DELAY_MILLIS = ViewConfiguration + .getDoubleTapTimeout(); + + /** + * The update step for incrementing the current value. + */ + private static final int UPDATE_STEP_INCREMENT = 1; + + /** + * The update step for decrementing the current value. + */ + private static final int UPDATE_STEP_DECREMENT = -1; + + /** + * The strength of fading in the top and bottom while drawing the selector. + */ + private static final float TOP_AND_BOTTOM_FADING_EDGE_STRENGTH = 0.9f; + + /** + * The numbers accepted by the input text's {@link Filter} + */ + private static final char[] DIGIT_CHARACTERS = new char[] { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' + }; + + /** + * Use a custom NumberPicker formatting callback to use two-digit minutes + * strings like "01". Keeping a static formatter etc. is the most efficient + * way to do this; it avoids creating temporary objects on every call to + * format(). + */ + public static final NumberPicker.Formatter TWO_DIGIT_FORMATTER = new NumberPicker.Formatter() { + final StringBuilder mBuilder = new StringBuilder(); + + final java.util.Formatter mFmt = new java.util.Formatter(mBuilder); + + final Object[] mArgs = new Object[1]; + + public String toString(int value) { + mArgs[0] = value; + mBuilder.delete(0, mBuilder.length()); + mFmt.format("%02d", mArgs); + return mFmt.toString(); } }; - private final EditText mText; - private final InputFilter mNumberInputFilter; + /** + * The increment button. + */ + private final ImageButton mIncrementButton; + + /** + * The decrement button. + */ + private final ImageButton mDecrementButton; + + /** + * The text for showing the current value. + */ + private final EditText mInputText; + + /** + * The height of the text. + */ + private final int mTextSize; + /** + * The values to be displayed instead the indices. + */ private String[] mDisplayedValues; /** @@ -110,104 +164,466 @@ public class NumberPicker extends LinearLayout { private int mCurrent; /** - * Previous value of this NumberPicker. + * Listener to be notified upon current value change. */ - private int mPrevious; private OnChangedListener mListener; + + /** + * Formatter for for displaying the current value. + */ private Formatter mFormatter; - private long mSpeed = 300; - private boolean mIncrement; - private boolean mDecrement; + /** + * The speed for updating the value form long press. + */ + private long mLongPressUpdateSpeed = 300; /** - * Create a new number picker - * @param context the application environment + * Cache for the string representation of selector indices. + */ + private final SparseArray<String> mSelectorIndexToStringCache = new SparseArray<String>(); + + /** + * The selector indices whose value are show by the selector. + */ + private final int[] mSelectorIndices = new int[] { + Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE, + Integer.MIN_VALUE + }; + + /** + * The {@link Paint} for drawing the selector. + */ + private final Paint mSelectorPaint; + + /** + * The height of a selector element (text + gap). + */ + private int mSelectorElementHeight; + + /** + * The initial offset of the scroll selector. + */ + private int mInitialScrollOffset = Integer.MIN_VALUE; + + /** + * The current offset of the scroll selector. + */ + private int mCurrentScrollOffset; + + /** + * The {@link Scroller} responsible for flinging the selector. + */ + private final Scroller mFlingScroller; + + /** + * The {@link Scroller} responsible for adjusting the selector. + */ + private final Scroller mAdjustScroller; + + /** + * The previous Y coordinate while scrolling the selector. + */ + private int mPreviousScrollerY; + + /** + * Handle to the reusable command for setting the input text selection. + */ + private SetSelectionCommand mSetSelectionCommand; + + /** + * Handle to the reusable command for adjusting the scroller. + */ + private AdjustScrollerCommand mAdjustScrollerCommand; + + /** + * Handle to the reusable command for updating the current value from long + * press. + */ + private UpdateValueFromLongPressCommand mUpdateFromLongPressCommand; + + /** + * {@link Animator} for showing the up/down arrows. + */ + private final AnimatorSet mShowInputControlsAnimator; + + /** + * The Y position of the last down event. + */ + private float mLastDownEventY; + + /** + * The Y position of the last motion event. + */ + private float mLastMotionEventY; + + /** + * Flag if to begin edit on next up event. + */ + private boolean mBeginEditOnUpEvent; + + /** + * Flag if to adjust the selector wheel on next up event. + */ + private boolean mAdjustScrollerOnUpEvent; + + /** + * Flag if to draw the selector wheel. + */ + private boolean mDrawSelectorWheel; + + /** + * Determines speed during touch scrolling. + */ + private VelocityTracker mVelocityTracker; + + /** + * @see ViewConfiguration#getScaledTouchSlop() + */ + private int mTouchSlop; + + /** + * @see ViewConfiguration#getScaledMinimumFlingVelocity() + */ + private int mMinimumFlingVelocity; + + /** + * @see ViewConfiguration#getScaledMaximumFlingVelocity() + */ + private int mMaximumFlingVelocity; + + /** + * Flag whether the selector should wrap around. + */ + private boolean mWrapSelector; + + /** + * The back ground color used to optimize scroller fading. */ - public NumberPicker(Context context) { - this(context, null); + private final int mSolidColor; + + /** + * Reusable {@link Rect} instance. + */ + private final Rect mTempRect = new Rect(); + + /** + * The callback interface used to indicate the number value has changed. + */ + public interface OnChangedListener { + /** + * @param picker The NumberPicker associated with this listener. + * @param oldVal The previous value. + * @param newVal The new value. + */ + void onChanged(NumberPicker picker, int oldVal, int newVal); + } + + /** + * Interface used to format the number into a string for presentation + */ + public interface Formatter { + String toString(int value); } /** * Create a new number picker - * @param context the application environment - * @param attrs a collection of attributes + * + * @param context The application environment. + * @param attrs A collection of attributes. */ public NumberPicker(Context context, AttributeSet attrs) { - super(context, attrs); - setOrientation(VERTICAL); - LayoutInflater inflater = - (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + this(context, attrs, R.attr.numberPickerStyle); + } + + /** + * Create a new number picker + * + * @param context the application environment. + * @param attrs a collection of attributes. + * @param defStyle The default style to apply to this view. + */ + public NumberPicker(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + // process style attributes + TypedArray attributesArray = context.obtainStyledAttributes(attrs, + R.styleable.NumberPicker, defStyle, 0); + int orientation = attributesArray.getInt(R.styleable.NumberPicker_orientation, VERTICAL); + setOrientation(orientation); + mSolidColor = attributesArray.getColor(R.styleable.NumberPicker_solidColor, 0); + attributesArray.recycle(); + + // By default Linearlayout that we extend is not drawn. This is + // its draw() method is not called but dispatchDraw() is called + // directly (see ViewGroup.drawChild()). However, this class uses + // the fading edge effect implemented by View and we need our + // draw() method to be called. Therefore, we declare we will draw. + setWillNotDraw(false); + setDrawSelectorWheel(false); + + LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( + Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.number_picker, this, true); - mHandler = new Handler(); - OnClickListener clickListener = new OnClickListener() { + OnClickListener onClickListener = new OnClickListener() { public void onClick(View v) { - validateInput(mText); - if (!mText.hasFocus()) mText.requestFocus(); - - // now perform the increment/decrement - if (R.id.increment == v.getId()) { + mInputText.clearFocus(); + if (v.getId() == R.id.increment) { changeCurrent(mCurrent + 1); - } else if (R.id.decrement == v.getId()) { + } else { changeCurrent(mCurrent - 1); } } }; - OnFocusChangeListener focusListener = new OnFocusChangeListener() { - public void onFocusChange(View v, boolean hasFocus) { + OnLongClickListener onLongClickListener = new OnLongClickListener() { + public boolean onLongClick(View v) { + mInputText.clearFocus(); + if (v.getId() == R.id.increment) { + postUpdateValueFromLongPress(UPDATE_STEP_INCREMENT); + } else { + postUpdateValueFromLongPress(UPDATE_STEP_DECREMENT); + } + return true; + } + }; - /* When focus is lost check that the text field - * has valid values. - */ + // increment button + mIncrementButton = (ImageButton) findViewById(R.id.increment); + mIncrementButton.setOnClickListener(onClickListener); + mIncrementButton.setOnLongClickListener(onLongClickListener); + + // decrement button + mDecrementButton = (ImageButton) findViewById(R.id.decrement); + mDecrementButton.setOnClickListener(onClickListener); + mDecrementButton.setOnLongClickListener(onLongClickListener); + + // input text + mInputText = (EditText) findViewById(R.id.timepicker_input); + mInputText.setOnFocusChangeListener(new OnFocusChangeListener() { + public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { - validateInput(v); + validateInputTextView(v); } } - }; + }); + mInputText.setFilters(new InputFilter[] { + new InputTextFilter() + }); - OnLongClickListener longClickListener = new OnLongClickListener() { - /** - * We start the long click here but rely on the {@link NumberPickerButton} - * to inform us when the long click has ended. - */ - public boolean onLongClick(View v) { - /* The text view may still have focus so clear it's focus which will - * trigger the on focus changed and any typed values to be pulled. - */ - mText.clearFocus(); - - if (R.id.increment == v.getId()) { - mIncrement = true; - mHandler.post(mRunnable); - } else if (R.id.decrement == v.getId()) { - mDecrement = true; - mHandler.post(mRunnable); + mInputText.setRawInputType(InputType.TYPE_CLASS_NUMBER); + + // initialize constants + mTouchSlop = ViewConfiguration.getTapTimeout(); + ViewConfiguration configuration = ViewConfiguration.get(context); + mTouchSlop = configuration.getScaledTouchSlop(); + mMinimumFlingVelocity = configuration.getScaledMinimumFlingVelocity(); + mMaximumFlingVelocity = configuration.getScaledMaximumFlingVelocity() + / SELECTOR_MAX_FLING_VELOCITY_ADJUSTMENT; + mTextSize = (int) mInputText.getTextSize(); + + // create the selector wheel paint + Paint paint = new Paint(); + paint.setAntiAlias(true); + paint.setTextAlign(Align.CENTER); + paint.setTextSize(mTextSize); + paint.setTypeface(mInputText.getTypeface()); + ColorStateList colors = mInputText.getTextColors(); + int color = colors.getColorForState(ENABLED_STATE_SET, Color.WHITE); + paint.setColor(color); + mSelectorPaint = paint; + + // create the animator for showing the input controls + final ValueAnimator fadeScroller = ObjectAnimator.ofInt(this, "selectorPaintAlpha", 255, 0); + final ObjectAnimator showIncrementButton = ObjectAnimator.ofFloat(mIncrementButton, + "alpha", 0, 1); + final ObjectAnimator showDecrementButton = ObjectAnimator.ofFloat(mDecrementButton, + "alpha", 0, 1); + mShowInputControlsAnimator = new AnimatorSet(); + mShowInputControlsAnimator.playTogether(fadeScroller, showIncrementButton, + showDecrementButton); + mShowInputControlsAnimator.setDuration(getResources().getInteger( + R.integer.config_longAnimTime)); + mShowInputControlsAnimator.addListener(new AnimatorListenerAdapter() { + private boolean mCanceled = false; + + @Override + public void onAnimationEnd(Animator animation) { + if (!mCanceled) { + // if canceled => we still want the wheel drawn + setDrawSelectorWheel(false); } - return true; + mCanceled = false; + mSelectorPaint.setAlpha(255); + invalidate(); } - }; - InputFilter inputFilter = new NumberPickerInputFilter(); - mNumberInputFilter = new NumberRangeKeyListener(); - mIncrementButton = (NumberPickerButton) findViewById(R.id.increment); - mIncrementButton.setOnClickListener(clickListener); - mIncrementButton.setOnLongClickListener(longClickListener); - mIncrementButton.setNumberPicker(this); + @Override + public void onAnimationCancel(Animator animation) { + if (mShowInputControlsAnimator.isRunning()) { + mCanceled = true; + } + } + }); - mDecrementButton = (NumberPickerButton) findViewById(R.id.decrement); - mDecrementButton.setOnClickListener(clickListener); - mDecrementButton.setOnLongClickListener(longClickListener); - mDecrementButton.setNumberPicker(this); + // create the fling and adjust scrollers + mFlingScroller = new Scroller(getContext()); + mAdjustScroller = new Scroller(getContext(), new OvershootInterpolator()); - mText = (EditText) findViewById(R.id.timepicker_input); - mText.setOnFocusChangeListener(focusListener); - mText.setFilters(new InputFilter[] {inputFilter}); - mText.setRawInputType(InputType.TYPE_CLASS_NUMBER); + updateInputTextView(); + updateIncrementAndDecrementButtonsVisibilityState(); + } + + @Override + public void onWindowFocusChanged(boolean hasWindowFocus) { + super.onWindowFocusChanged(hasWindowFocus); + if (!hasWindowFocus) { + removeAllCallbacks(); + } + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent event) { + switch (event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + mLastMotionEventY = mLastDownEventY = event.getY(); + removeAllCallbacks(); + mBeginEditOnUpEvent = false; + mAdjustScrollerOnUpEvent = true; + if (mDrawSelectorWheel) { + mBeginEditOnUpEvent = mFlingScroller.isFinished() + && mAdjustScroller.isFinished(); + mAdjustScrollerOnUpEvent = true; + mFlingScroller.forceFinished(true); + mAdjustScroller.forceFinished(true); + hideInputControls(); + return true; + } + if (isEventInInputText(event)) { + mAdjustScrollerOnUpEvent = false; + setDrawSelectorWheel(true); + hideInputControls(); + return true; + } + break; + case MotionEvent.ACTION_MOVE: + float currentMoveY = event.getY(); + int deltaDownY = (int) Math.abs(currentMoveY - mLastDownEventY); + if (deltaDownY > mTouchSlop) { + mBeginEditOnUpEvent = false; + setDrawSelectorWheel(true); + hideInputControls(); + return true; + } + break; + } + return false; + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + if (mVelocityTracker == null) { + mVelocityTracker = VelocityTracker.obtain(); + } + mVelocityTracker.addMovement(ev); + int action = ev.getActionMasked(); + switch (action) { + case MotionEvent.ACTION_MOVE: + float currentMoveY = ev.getY(); + if (mBeginEditOnUpEvent) { + int deltaDownY = (int) Math.abs(currentMoveY - mLastDownEventY); + if (deltaDownY > mTouchSlop) { + mBeginEditOnUpEvent = false; + } + } + int deltaMoveY = (int) (currentMoveY - mLastMotionEventY); + scrollBy(0, deltaMoveY); + invalidate(); + mLastMotionEventY = currentMoveY; + break; + case MotionEvent.ACTION_UP: + if (mBeginEditOnUpEvent) { + setDrawSelectorWheel(false); + showInputControls(); + mInputText.requestFocus(); + InputMethodManager imm = (InputMethodManager) getContext().getSystemService( + Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(mInputText, 0); + return true; + } + VelocityTracker velocityTracker = mVelocityTracker; + velocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity); + int initialVelocity = (int) velocityTracker.getYVelocity(); + if (Math.abs(initialVelocity) > mMinimumFlingVelocity) { + fling(initialVelocity); + } else { + if (mAdjustScrollerOnUpEvent) { + if (mFlingScroller.isFinished() && mAdjustScroller.isFinished()) { + postAdjustScrollerCommand(0); + } + } else { + postAdjustScrollerCommand(SHOW_INPUT_CONTROLS_DELAY_MILLIS); + } + } + mVelocityTracker.recycle(); + mVelocityTracker = null; + break; + } + return true; + } + + @Override + public boolean dispatchTouchEvent(MotionEvent event) { + int action = event.getActionMasked(); + if ((action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) + && !isEventInInputText(event)) { + removeAllCallbacks(); + } + return super.dispatchTouchEvent(event); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + int keyCode = event.getKeyCode(); + if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) { + removeAllCallbacks(); + } + return super.dispatchKeyEvent(event); + } + + @Override + public boolean dispatchTrackballEvent(MotionEvent event) { + int action = event.getActionMasked(); + if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) { + removeAllCallbacks(); + } + return super.dispatchTrackballEvent(event); + } - if (!isEnabled()) { - setEnabled(false); + @Override + public void computeScroll() { + if (!mDrawSelectorWheel) { + return; + } + Scroller scroller = mFlingScroller; + if (scroller.isFinished()) { + scroller = mAdjustScroller; + if (scroller.isFinished()) { + return; + } + } + scroller.computeScrollOffset(); + int currentScrollerY = scroller.getCurrY(); + if (mPreviousScrollerY == 0) { + mPreviousScrollerY = scroller.getStartY(); + } + scrollBy(0, currentScrollerY - mPreviousScrollerY); + mPreviousScrollerY = currentScrollerY; + if (scroller.isFinished()) { + onScrollerFinished(scroller); + } else { + invalidate(); } } @@ -222,11 +638,57 @@ public class NumberPicker extends LinearLayout { super.setEnabled(enabled); mIncrementButton.setEnabled(enabled); mDecrementButton.setEnabled(enabled); - mText.setEnabled(enabled); + mInputText.setEnabled(enabled); + } + + /** + * Scrolls the selector with the given <code>vertical offset</code>. + */ + @Override + public void scrollBy(int x, int y) { + int[] selectorIndices = getSelectorIndices(); + if (mInitialScrollOffset == Integer.MIN_VALUE) { + int totalTextHeight = selectorIndices.length * mTextSize; + int totalTextGapHeight = (mBottom - mTop) - totalTextHeight; + int textGapCount = selectorIndices.length - 1; + int selectorTextGapHeight = totalTextGapHeight / textGapCount; + // compensate for integer division loss of the components used to + // calculate the text gap + int integerDivisionLoss = (mTextSize + mBottom - mTop) % textGapCount; + mInitialScrollOffset = mCurrentScrollOffset = mTextSize - integerDivisionLoss / 2; + mSelectorElementHeight = mTextSize + selectorTextGapHeight; + } + + if (!mWrapSelector && y > 0 && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mStart) { + mCurrentScrollOffset = mInitialScrollOffset; + return; + } + if (!mWrapSelector && y < 0 && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] >= mEnd) { + mCurrentScrollOffset = mInitialScrollOffset; + return; + } + mCurrentScrollOffset += y; + while (mCurrentScrollOffset - mInitialScrollOffset > mSelectorElementHeight) { + mCurrentScrollOffset -= mSelectorElementHeight; + decrementSelectorIndices(selectorIndices); + changeCurrent(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX]); + if (selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mStart) { + mCurrentScrollOffset = mInitialScrollOffset; + } + } + while (mCurrentScrollOffset - mInitialScrollOffset < -mSelectorElementHeight) { + mCurrentScrollOffset += mSelectorElementHeight; + incrementScrollSelectorIndices(selectorIndices); + changeCurrent(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX]); + if (selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] >= mEnd) { + mCurrentScrollOffset = mInitialScrollOffset; + } + } } /** * Set the callback that indicates the number has been adjusted by the user. + * * @param listener the callback, should not be null. */ public void setOnChangeListener(OnChangedListener listener) { @@ -235,292 +697,678 @@ public class NumberPicker extends LinearLayout { /** * Set the formatter that will be used to format the number for presentation - * @param formatter the formatter object. If formatter is null, String.valueOf() - * will be used + * + * @param formatter the formatter object. If formatter is null, + * String.valueOf() will be used */ public void setFormatter(Formatter formatter) { mFormatter = formatter; } /** - * Set the range of numbers allowed for the number picker. The current - * value will be automatically set to the start. + * Set the range of numbers allowed for the number picker. The current value + * will be automatically set to the start. * * @param start the start of the range (inclusive) * @param end the end of the range (inclusive) */ public void setRange(int start, int end) { - setRange(start, end, null/*displayedValues*/); + setRange(start, end, null); } /** - * Set the range of numbers allowed for the number picker. The current - * value will be automatically set to the start. Also provide a mapping - * for values used to display to the user. + * Set the range of numbers allowed for the number picker. The current value + * will be automatically set to the start. Also provide a mapping for values + * used to display to the user. * * @param start the start of the range (inclusive) * @param end the end of the range (inclusive) * @param displayedValues the values displayed to the user. */ public void setRange(int start, int end, String[] displayedValues) { + boolean wrapSelector = (end - start) >= mSelectorIndices.length; + setRange(start, end, displayedValues, wrapSelector); + } + + /** + * Set the range of numbers allowed for the number picker. The current value + * will be automatically set to the start. Also provide a mapping for values + * used to display to the user. + * + * @param start the start of the range (inclusive) + * @param end the end of the range (inclusive) + * @param displayedValues the values displayed to the user. + */ + public void setRange(int start, int end, String[] displayedValues, boolean wrapSelector) { + if (start < 0 || end < 0) { + throw new IllegalArgumentException("start and end must be > 0"); + } + mDisplayedValues = displayedValues; mStart = start; mEnd = end; mCurrent = start; - updateView(); + + setWrapSelector(wrapSelector); + updateInputTextView(); if (displayedValues != null) { // Allow text entry rather than strictly numeric entry. - mText.setRawInputType(InputType.TYPE_CLASS_TEXT | - InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + mInputText.setRawInputType(InputType.TYPE_CLASS_TEXT + | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + } else { + mInputText.setRawInputType(InputType.TYPE_CLASS_NUMBER); } + + // make sure cached string representations are dropped + mSelectorIndexToStringCache.clear(); } /** * Set the current value for the number picker. * * @param current the current value the start of the range (inclusive) - * @throws IllegalArgumentException when current is not within the range - * of of the number picker + * @throws IllegalArgumentException when current is not within the range of + * of the number picker */ public void setCurrent(int current) { if (current < mStart || current > mEnd) { - throw new IllegalArgumentException( - "current should be >= start and <= end"); + throw new IllegalArgumentException("current should be >= start and <= end"); } mCurrent = current; - updateView(); + updateInputTextView(); + updateIncrementAndDecrementButtonsVisibilityState(); + } + + /** + * Sets whether the selector shown during flinging/scrolling should wrap + * around the beginning and end values. + * + * @param wrapSelector Whether to wrap. + */ + public void setWrapSelector(boolean wrapSelector) { + if (wrapSelector && (mEnd - mStart) < mSelectorIndices.length) { + throw new IllegalStateException("Range less than selector items count."); + } + if (wrapSelector != mWrapSelector) { + // force the selector indices array to be reinitialized + mSelectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] = Integer.MAX_VALUE; + mWrapSelector = wrapSelector; + } } /** - * Sets the speed at which the numbers will scroll when the +/- - * buttons are longpressed + * Sets the speed at which the numbers will scroll when the +/- buttons are + * longpressed * * @param speed The speed (in milliseconds) at which the numbers will scroll - * default 300ms + * default 300ms */ public void setSpeed(long speed) { - mSpeed = speed; + mLongPressUpdateSpeed = speed; } - private String formatNumber(int value) { - return (mFormatter != null) - ? mFormatter.toString(value) - : String.valueOf(value); + /** + * Returns the current value of the NumberPicker + * + * @return the current value. + */ + public int getCurrent() { + return mCurrent; + } + + @Override + public int getSolidColor() { + return mSolidColor; + } + + @Override + protected float getTopFadingEdgeStrength() { + return TOP_AND_BOTTOM_FADING_EDGE_STRENGTH; + } + + @Override + protected float getBottomFadingEdgeStrength() { + return TOP_AND_BOTTOM_FADING_EDGE_STRENGTH; + } + + @Override + protected void onDetachedFromWindow() { + removeAllCallbacks(); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + // There is a good reason for doing this. See comments in draw(). + } + + @Override + public void draw(Canvas canvas) { + // Dispatch draw to our children only if we are not currently running + // the animation for simultaneously fading out the scroll wheel and + // showing in the buttons. This class takes advantage of the View + // implementation of fading edges effect to draw the selector wheel. + // However, in View.draw(), the fading is applied after all the children + // have been drawn and we do not want this fading to be applied to the + // buttons which are currently showing in. Therefore, we draw our + // children + // after we have completed drawing ourselves. + + // Draw the selector wheel if needed + if (mDrawSelectorWheel) { + super.draw(canvas); + } + + // Draw our children if we are not showing the selector wheel of fading + // it out + if (mShowInputControlsAnimator.isRunning() || !mDrawSelectorWheel) { + long drawTime = getDrawingTime(); + for (int i = 0, count = getChildCount(); i < count; i++) { + View child = getChildAt(i); + if (!child.isShown()) { + continue; + } + drawChild(canvas, getChildAt(i), drawTime); + } + } + } + + @Override + protected void onDraw(Canvas canvas) { + // we only draw the selector wheel + if (!mDrawSelectorWheel) { + return; + } + float x = (mRight - mLeft) / 2; + float y = mCurrentScrollOffset; + + int[] selectorIndices = getSelectorIndices(); + for (int i = 0; i < selectorIndices.length; i++) { + int selectorIndex = selectorIndices[i]; + String scrollSelectorValue = mSelectorIndexToStringCache.get(selectorIndex); + canvas.drawText(scrollSelectorValue, x, y, mSelectorPaint); + y += mSelectorElementHeight; + } } /** - * Sets the current value of this NumberPicker, and sets mPrevious to the previous - * value. If current is greater than mEnd less than mStart, the value of mCurrent - * is wrapped around. + * Returns the upper value of the range of the NumberPicker * - * Subclasses can override this to change the wrapping behavior + * @return the uppper number of the range. + */ + protected int getEndRange() { + return mEnd; + } + + /** + * Returns the lower value of the range of the NumberPicker + * + * @return the lower number of the range. + */ + protected int getBeginRange() { + return mStart; + } + + /** + * Sets the current value of this NumberPicker, and sets mPrevious to the + * previous value. If current is greater than mEnd less than mStart, the + * value of mCurrent is wrapped around. Subclasses can override this to + * change the wrapping behavior * * @param current the new value of the NumberPicker */ - protected void changeCurrent(int current) { + private void changeCurrent(int current) { + if (mCurrent == current) { + return; + } // Wrap around the values if we go past the start or end - if (current > mEnd) { - current = mStart; - } else if (current < mStart) { - current = mEnd; + if (mWrapSelector) { + current = getWrappedSelectorIndex(current); } - mPrevious = mCurrent; - mCurrent = current; - notifyChange(); - updateView(); + int previous = mCurrent; + setCurrent(current); + notifyChange(previous, current); } /** - * Notifies the listener, if registered, of a change of the value of this - * NumberPicker. + * Sets the <code>alpha</code> of the {@link Paint} for drawing the selector + * wheel. */ - private void notifyChange() { - if (mListener != null) { - mListener.onChanged(this, mPrevious, mCurrent); + @SuppressWarnings("unused") + // Called by ShowInputControlsAnimator via reflection + private void setSelectorPaintAlpha(int alpha) { + mSelectorPaint.setAlpha(alpha); + if (mDrawSelectorWheel) { + invalidate(); } } /** - * Updates the view of this NumberPicker. If displayValues were specified - * in {@link #setRange}, the string corresponding to the index specified by - * the current value will be returned. Otherwise, the formatter specified - * in {@link setFormatter} will be used to format the number. + * @return If the <code>event</code> is in the input text. */ - private void updateView() { - /* If we don't have displayed values then use the - * current number else find the correct value in the - * displayed values for the current number. - */ - if (mDisplayedValues == null) { - mText.setText(formatNumber(mCurrent)); + private boolean isEventInInputText(MotionEvent event) { + mInputText.getHitRect(mTempRect); + return mTempRect.contains((int) event.getX(), (int) event.getY()); + } + + /** + * Sets if to <code>drawSelectionWheel</code>. + */ + private void setDrawSelectorWheel(boolean drawSelectorWheel) { + mDrawSelectorWheel = drawSelectorWheel; + // do not fade if the selector wheel not shown + setVerticalFadingEdgeEnabled(drawSelectorWheel); + } + + /** + * Callback invoked upon completion of a given <code>scroller</code>. + */ + private void onScrollerFinished(Scroller scroller) { + if (scroller == mFlingScroller) { + postAdjustScrollerCommand(0); } else { - mText.setText(mDisplayedValues[mCurrent - mStart]); + showInputControls(); + updateInputTextView(); } - mText.setSelection(mText.getText().length()); } - private void validateCurrentView(CharSequence str) { - int val = getSelectedPos(str.toString()); - if ((val >= mStart) && (val <= mEnd)) { - if (mCurrent != val) { - mPrevious = mCurrent; - mCurrent = val; - notifyChange(); + /** + * Flings the selector with the given <code>velocityY</code>. + */ + private void fling(int velocityY) { + mPreviousScrollerY = 0; + Scroller flingScroller = mFlingScroller; + + if (mWrapSelector) { + if (velocityY > 0) { + flingScroller.fling(0, 0, 0, velocityY, 0, 0, 0, Integer.MAX_VALUE); + } else { + flingScroller.fling(0, Integer.MAX_VALUE, 0, velocityY, 0, 0, 0, Integer.MAX_VALUE); + } + } else { + if (velocityY > 0) { + int maxY = mTextSize * (mCurrent - mStart); + flingScroller.fling(0, 0, 0, velocityY, 0, 0, 0, maxY); + } else { + int startY = mTextSize * (mEnd - mCurrent); + int maxY = startY; + flingScroller.fling(0, startY, 0, velocityY, 0, 0, 0, maxY); } } - updateView(); + + postAdjustScrollerCommand(flingScroller.getDuration()); + invalidate(); } - private void validateInput(View v) { - String str = String.valueOf(((TextView) v).getText()); - if ("".equals(str)) { + /** + * Hides the input controls which is the up/down arrows and the text field. + */ + private void hideInputControls() { + mShowInputControlsAnimator.cancel(); + mIncrementButton.setVisibility(INVISIBLE); + mDecrementButton.setVisibility(INVISIBLE); + mInputText.setVisibility(INVISIBLE); + } - // Restore to the old value as we don't allow empty values - updateView(); - } else { + /** + * Show the input controls by making them visible and animating the alpha + * property up/down arrows. + */ + private void showInputControls() { + updateIncrementAndDecrementButtonsVisibilityState(); + mInputText.setVisibility(VISIBLE); + mShowInputControlsAnimator.start(); + } - // Check the new value and ensure it's in range - validateCurrentView(str); + /** + * Updates the visibility state of the increment and decrement buttons. + */ + private void updateIncrementAndDecrementButtonsVisibilityState() { + if (mWrapSelector || mCurrent < mEnd) { + mIncrementButton.setVisibility(VISIBLE); + } else { + mIncrementButton.setVisibility(INVISIBLE); + } + if (mWrapSelector || mCurrent > mStart) { + mDecrementButton.setVisibility(VISIBLE); + } else { + mDecrementButton.setVisibility(INVISIBLE); } } /** - * @hide + * @return The selector indices array with proper values with the current as + * the middle one. */ - public void cancelIncrement() { - mIncrement = false; + private int[] getSelectorIndices() { + int current = getCurrent(); + if (mSelectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] != current) { + for (int i = 0; i < mSelectorIndices.length; i++) { + int selectorIndex = current + (i - SELECTOR_MIDDLE_ITEM_INDEX); + if (mWrapSelector) { + selectorIndex = getWrappedSelectorIndex(selectorIndex); + } + mSelectorIndices[i] = selectorIndex; + ensureCachedScrollSelectorValue(mSelectorIndices[i]); + } + } + return mSelectorIndices; } /** - * @hide + * @return The wrapped index <code>selectorIndex</code> value. + * <p> + * Note: The absolute value of the argument is never larger than + * mEnd - mStart. + * </p> */ - public void cancelDecrement() { - mDecrement = false; + private int getWrappedSelectorIndex(int selectorIndex) { + if (selectorIndex > mEnd) { + return (Math.abs(selectorIndex) - mEnd); + } else if (selectorIndex < mStart) { + return (mEnd - Math.abs(selectorIndex)); + } + return selectorIndex; } - private static final char[] DIGIT_CHARACTERS = new char[] { - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' - }; + /** + * Increments the <code>selectorIndices</code> whose string representations + * will be displayed in the selector. + */ + private void incrementScrollSelectorIndices(int[] selectorIndices) { + for (int i = 0; i < selectorIndices.length - 1; i++) { + selectorIndices[i] = selectorIndices[i + 1]; + } + int nextScrollSelectorIndex = selectorIndices[selectorIndices.length - 2] + 1; + if (mWrapSelector && nextScrollSelectorIndex > mEnd) { + nextScrollSelectorIndex = mStart; + } + selectorIndices[selectorIndices.length - 1] = nextScrollSelectorIndex; + ensureCachedScrollSelectorValue(nextScrollSelectorIndex); + } - private NumberPickerButton mIncrementButton; - private NumberPickerButton mDecrementButton; + /** + * Decrements the <code>selectorIndices</code> whose string representations + * will be displayed in the selector. + */ + private void decrementSelectorIndices(int[] selectorIndices) { + for (int i = selectorIndices.length - 1; i > 0; i--) { + selectorIndices[i] = selectorIndices[i - 1]; + } + int nextScrollSelectorIndex = selectorIndices[1] - 1; + if (mWrapSelector && nextScrollSelectorIndex < mStart) { + nextScrollSelectorIndex = mEnd; + } + selectorIndices[0] = nextScrollSelectorIndex; + ensureCachedScrollSelectorValue(nextScrollSelectorIndex); + } - private class NumberPickerInputFilter implements InputFilter { - public CharSequence filter(CharSequence source, int start, int end, - Spanned dest, int dstart, int dend) { - if (mDisplayedValues == null) { - return mNumberInputFilter.filter(source, start, end, dest, dstart, dend); - } - CharSequence filtered = String.valueOf(source.subSequence(start, end)); - String result = String.valueOf(dest.subSequence(0, dstart)) - + filtered - + dest.subSequence(dend, dest.length()); - String str = String.valueOf(result).toLowerCase(); - for (String val : mDisplayedValues) { - val = val.toLowerCase(); - if (val.startsWith(str)) { - return filtered; - } + /** + * Ensures we have a cached string representation of the given <code> + * selectorIndex</code> + * to avoid multiple instantiations of the same string. + */ + private void ensureCachedScrollSelectorValue(int selectorIndex) { + SparseArray<String> cache = mSelectorIndexToStringCache; + String scrollSelectorValue = cache.get(selectorIndex); + if (scrollSelectorValue != null) { + return; + } + if (selectorIndex < mStart || selectorIndex > mEnd) { + scrollSelectorValue = ""; + } else { + if (mDisplayedValues != null) { + scrollSelectorValue = mDisplayedValues[selectorIndex]; + } else { + scrollSelectorValue = formatNumber(selectorIndex); } - return ""; } + cache.put(selectorIndex, scrollSelectorValue); } - private class NumberRangeKeyListener extends NumberKeyListener { + private String formatNumber(int value) { + return (mFormatter != null) ? mFormatter.toString(value) : String.valueOf(value); + } - // XXX This doesn't allow for range limits when controlled by a - // soft input method! - public int getInputType() { - return InputType.TYPE_CLASS_NUMBER; + private void validateInputTextView(View v) { + String str = String.valueOf(((TextView) v).getText()); + if (TextUtils.isEmpty(str)) { + // Restore to the old value as we don't allow empty values + updateInputTextView(); + } else { + // Check the new value and ensure it's in range + int current = getSelectedPos(str.toString()); + changeCurrent(current); } + } - @Override - protected char[] getAcceptedChars() { - return DIGIT_CHARACTERS; + /** + * Updates the view of this NumberPicker. If displayValues were specified in + * {@link #setRange}, the string corresponding to the index specified by the + * current value will be returned. Otherwise, the formatter specified in + * {@link #setFormatter} will be used to format the number. + */ + private void updateInputTextView() { + /* + * If we don't have displayed values then use the current number else + * find the correct value in the displayed values for the current + * number. + */ + if (mDisplayedValues == null) { + mInputText.setText(formatNumber(mCurrent)); + } else { + mInputText.setText(mDisplayedValues[mCurrent - mStart]); } + mInputText.setSelection(mInputText.getText().length()); + } - @Override - public CharSequence filter(CharSequence source, int start, int end, - Spanned dest, int dstart, int dend) { - - CharSequence filtered = super.filter(source, start, end, dest, dstart, dend); - if (filtered == null) { - filtered = source.subSequence(start, end); - } - - String result = String.valueOf(dest.subSequence(0, dstart)) - + filtered - + dest.subSequence(dend, dest.length()); + /** + * Notifies the listener, if registered, of a change of the value of this + * NumberPicker. + */ + private void notifyChange(int previous, int current) { + if (mListener != null) { + mListener.onChanged(this, previous, mCurrent); + } + } - if ("".equals(result)) { - return result; - } - int val = getSelectedPos(result); + /** + * Posts a command for updating the current value every <code>updateMillis + * </code>. + */ + private void postUpdateValueFromLongPress(int updateMillis) { + mInputText.clearFocus(); + removeAllCallbacks(); + if (mUpdateFromLongPressCommand == null) { + mUpdateFromLongPressCommand = new UpdateValueFromLongPressCommand(); + } + mUpdateFromLongPressCommand.setUpdateStep(updateMillis); + post(mUpdateFromLongPressCommand); + } - /* Ensure the user can't type in a value greater - * than the max allowed. We have to allow less than min - * as the user might want to delete some numbers - * and then type a new number. - */ - if (val > mEnd) { - return ""; - } else { - return filtered; - } + /** + * Removes all pending callback from the message queue. + */ + private void removeAllCallbacks() { + if (mUpdateFromLongPressCommand != null) { + removeCallbacks(mUpdateFromLongPressCommand); + } + if (mAdjustScrollerCommand != null) { + removeCallbacks(mAdjustScrollerCommand); + } + if (mSetSelectionCommand != null) { + removeCallbacks(mSetSelectionCommand); } } - private int getSelectedPos(String str) { + /** + * @return The selected index given its displayed <code>value</code>. + */ + private int getSelectedPos(String value) { if (mDisplayedValues == null) { try { - return Integer.parseInt(str); + return Integer.parseInt(value); } catch (NumberFormatException e) { - /* Ignore as if it's not a number we don't care */ + // Ignore as if it's not a number we don't care } } else { for (int i = 0; i < mDisplayedValues.length; i++) { - /* Don't force the user to type in jan when ja will do */ - str = str.toLowerCase(); - if (mDisplayedValues[i].toLowerCase().startsWith(str)) { + // Don't force the user to type in jan when ja will do + value = value.toLowerCase(); + if (mDisplayedValues[i].toLowerCase().startsWith(value)) { return mStart + i; } } - /* The user might have typed in a number into the month field i.e. + /* + * The user might have typed in a number into the month field i.e. * 10 instead of OCT so support that too. */ try { - return Integer.parseInt(str); + return Integer.parseInt(value); } catch (NumberFormatException e) { - /* Ignore as if it's not a number we don't care */ + // Ignore as if it's not a number we don't care } } return mStart; } /** - * Returns the current value of the NumberPicker - * @return the current value. + * Posts an {@link SetSelectionCommand} from the given <code>selectionStart + * </code> to + * <code>selectionEnd</code>. */ - public int getCurrent() { - return mCurrent; + private void postSetSelectionCommand(int selectionStart, int selectionEnd) { + if (mSetSelectionCommand == null) { + mSetSelectionCommand = new SetSelectionCommand(); + } else { + removeCallbacks(mSetSelectionCommand); + } + mSetSelectionCommand.mSelectionStart = selectionStart; + mSetSelectionCommand.mSelectionEnd = selectionEnd; + post(mSetSelectionCommand); } /** - * Returns the upper value of the range of the NumberPicker - * @return the uppper number of the range. + * Posts an {@link AdjustScrollerCommand} within the given <code> + * delayMillis</code> + * . */ - protected int getEndRange() { - return mEnd; + private void postAdjustScrollerCommand(int delayMillis) { + if (mAdjustScrollerCommand == null) { + mAdjustScrollerCommand = new AdjustScrollerCommand(); + } else { + removeCallbacks(mAdjustScrollerCommand); + } + postDelayed(mAdjustScrollerCommand, delayMillis); } /** - * Returns the lower value of the range of the NumberPicker - * @return the lower number of the range. + * Filter for accepting only valid indices or prefixes of the string + * representation of valid indices. */ - protected int getBeginRange() { - return mStart; + class InputTextFilter extends NumberKeyListener { + + // XXX This doesn't allow for range limits when controlled by a + // soft input method! + public int getInputType() { + return InputType.TYPE_CLASS_TEXT; + } + + @Override + protected char[] getAcceptedChars() { + return DIGIT_CHARACTERS; + } + + @Override + public CharSequence filter(CharSequence source, int start, int end, Spanned dest, + int dstart, int dend) { + if (mDisplayedValues == null) { + CharSequence filtered = super.filter(source, start, end, dest, dstart, dend); + if (filtered == null) { + filtered = source.subSequence(start, end); + } + + String result = String.valueOf(dest.subSequence(0, dstart)) + filtered + + dest.subSequence(dend, dest.length()); + + if ("".equals(result)) { + return result; + } + int val = getSelectedPos(result); + + /* + * Ensure the user can't type in a value greater than the max + * allowed. We have to allow less than min as the user might + * want to delete some numbers and then type a new number. + */ + if (val > mEnd) { + return ""; + } else { + return filtered; + } + } else { + CharSequence filtered = String.valueOf(source.subSequence(start, end)); + if (TextUtils.isEmpty(filtered)) { + return ""; + } + String result = String.valueOf(dest.subSequence(0, dstart)) + filtered + + dest.subSequence(dend, dest.length()); + String str = String.valueOf(result).toLowerCase(); + for (String val : mDisplayedValues) { + String valLowerCase = val.toLowerCase(); + if (valLowerCase.startsWith(str)) { + postSetSelectionCommand(result.length(), val.length()); + return val.subSequence(dstart, val.length()); + } + } + return ""; + } + } + } + + /** + * Command for setting the input text selection. + */ + class SetSelectionCommand implements Runnable { + private int mSelectionStart; + + private int mSelectionEnd; + + public void run() { + mInputText.setSelection(mSelectionStart, mSelectionEnd); + } + } + + /** + * Command for adjusting the scroller to show in its center the closest of + * the displayed items. + */ + class AdjustScrollerCommand implements Runnable { + public void run() { + mPreviousScrollerY = 0; + int deltaY = mInitialScrollOffset - mCurrentScrollOffset; + float delayCoef = (float) Math.abs(deltaY) / (float) mTextSize; + int duration = (int) (delayCoef * SELECTOR_ADJUSTMENT_DURATION_MILLIS); + mAdjustScroller.startScroll(0, 0, 0, deltaY, duration); + invalidate(); + } + } + + /** + * Command for updating the current value from a long press. + */ + class UpdateValueFromLongPressCommand implements Runnable { + private int mUpdateStep = 0; + + private void setUpdateStep(int updateStep) { + mUpdateStep = updateStep; + } + + public void run() { + changeCurrent(mCurrent + mUpdateStep); + postDelayed(this, mLongPressUpdateSpeed); + } } } diff --git a/core/java/android/widget/NumberPickerButton.java b/core/java/android/widget/NumberPickerButton.java deleted file mode 100644 index 292b668..0000000 --- a/core/java/android/widget/NumberPickerButton.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) 2008 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 android.widget; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.widget.ImageButton; -import android.widget.NumberPicker; - -import com.android.internal.R; - -/** - * This class exists purely to cancel long click events, that got - * started in NumberPicker - */ -class NumberPickerButton extends ImageButton { - - private NumberPicker mNumberPicker; - - public NumberPickerButton(Context context, AttributeSet attrs, - int defStyle) { - super(context, attrs, defStyle); - } - - public NumberPickerButton(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public NumberPickerButton(Context context) { - super(context); - } - - public void setNumberPicker(NumberPicker picker) { - mNumberPicker = picker; - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - cancelLongpressIfRequired(event); - return super.onTouchEvent(event); - } - - @Override - public boolean onTrackballEvent(MotionEvent event) { - cancelLongpressIfRequired(event); - return super.onTrackballEvent(event); - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER) - || (keyCode == KeyEvent.KEYCODE_ENTER)) { - cancelLongpress(); - } - return super.onKeyUp(keyCode, event); - } - - private void cancelLongpressIfRequired(MotionEvent event) { - if ((event.getAction() == MotionEvent.ACTION_CANCEL) - || (event.getAction() == MotionEvent.ACTION_UP)) { - cancelLongpress(); - } - } - - private void cancelLongpress() { - if (R.id.increment == getId()) { - mNumberPicker.cancelIncrement(); - } else if (R.id.decrement == getId()) { - mNumberPicker.cancelDecrement(); - } - } - - public void onWindowFocusChanged(boolean hasWindowFocus) { - super.onWindowFocusChanged(hasWindowFocus); - if (!hasWindowFocus) { - cancelLongpress(); - } - } - -} diff --git a/core/java/android/widget/Switch.java b/core/java/android/widget/Switch.java new file mode 100644 index 0000000..73a8c66 --- /dev/null +++ b/core/java/android/widget/Switch.java @@ -0,0 +1,631 @@ +/* + * Copyright (C) 2010 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 android.widget; + +import com.android.internal.R; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.text.Layout; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.VelocityTracker; +import android.view.ViewConfiguration; + +/** + * A Switch is a two-state toggle switch widget that can select between two + * options. The user may drag the "thumb" back and forth to choose the selected option, + * or simply tap to toggle as if it were a checkbox. + * + * @hide + */ +public class Switch extends CompoundButton { + private static final int TOUCH_MODE_IDLE = 0; + private static final int TOUCH_MODE_DOWN = 1; + private static final int TOUCH_MODE_DRAGGING = 2; + + // Enum for the "typeface" XML parameter. + private static final int SANS = 1; + private static final int SERIF = 2; + private static final int MONOSPACE = 3; + + private Drawable mThumbDrawable; + private Drawable mTrackDrawable; + private int mThumbTextPadding; + private int mSwitchMinWidth; + private int mSwitchPadding; + private CharSequence mTextOn; + private CharSequence mTextOff; + + private int mTouchMode; + private int mTouchSlop; + private float mTouchX; + private float mTouchY; + private VelocityTracker mVelocityTracker = VelocityTracker.obtain(); + private int mMinFlingVelocity; + + private float mThumbPosition; + private int mSwitchWidth; + private int mSwitchHeight; + private int mThumbWidth; // Does not include padding + + private int mSwitchLeft; + private int mSwitchTop; + private int mSwitchRight; + private int mSwitchBottom; + + private TextPaint mTextPaint; + private ColorStateList mTextColors; + private Layout mOnLayout; + private Layout mOffLayout; + + private final Rect mTempRect = new Rect(); + + private static final int[] CHECKED_STATE_SET = { + R.attr.state_checked + }; + + /** + * Construct a new Switch with default styling. + * + * @param context The Context that will determine this widget's theming. + */ + public Switch(Context context) { + this(context, null); + } + + /** + * Construct a new Switch with default styling, overriding specific style + * attributes as requested. + * + * @param context The Context that will determine this widget's theming. + * @param attrs Specification of attributes that should deviate from default styling. + */ + public Switch(Context context, AttributeSet attrs) { + this(context, attrs, com.android.internal.R.attr.switchStyle); + } + + /** + * Construct a new Switch with a default style determined by the given theme attribute, + * overriding specific style attributes as requested. + * + * @param context The Context that will determine this widget's theming. + * @param attrs Specification of attributes that should deviate from the default styling. + * @param defStyle An attribute ID within the active theme containing a reference to the + * default style for this widget. e.g. android.R.attr.switchStyle. + */ + public Switch(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + Resources res = getResources(); + mTextPaint.density = res.getDisplayMetrics().density; + mTextPaint.setCompatibilityScaling(res.getCompatibilityInfo().applicationScale); + + TypedArray a = context.obtainStyledAttributes(attrs, + com.android.internal.R.styleable.Switch, defStyle, 0); + + mThumbDrawable = a.getDrawable(com.android.internal.R.styleable.Switch_switchThumb); + mTrackDrawable = a.getDrawable(com.android.internal.R.styleable.Switch_switchTrack); + mTextOn = a.getText(com.android.internal.R.styleable.Switch_textOn); + mTextOff = a.getText(com.android.internal.R.styleable.Switch_textOff); + mThumbTextPadding = a.getDimensionPixelSize( + com.android.internal.R.styleable.Switch_thumbTextPadding, 0); + mSwitchMinWidth = a.getDimensionPixelSize( + com.android.internal.R.styleable.Switch_switchMinWidth, 0); + mSwitchPadding = a.getDimensionPixelSize( + com.android.internal.R.styleable.Switch_switchPadding, 0); + + int appearance = a.getResourceId( + com.android.internal.R.styleable.Switch_switchTextAppearance, 0); + if (appearance != 0) { + setSwitchTextAppearance(appearance); + } + a.recycle(); + + ViewConfiguration config = ViewConfiguration.get(context); + mTouchSlop = config.getScaledTouchSlop(); + mMinFlingVelocity = config.getScaledMinimumFlingVelocity(); + + // Refresh display with current params + setChecked(isChecked()); + } + + /** + * Sets the switch text color, size, style, hint color, and highlight color + * from the specified TextAppearance resource. + */ + public void setSwitchTextAppearance(int resid) { + TypedArray appearance = + getContext().obtainStyledAttributes(resid, + com.android.internal.R.styleable.TextAppearance); + + ColorStateList colors; + int ts; + + colors = appearance.getColorStateList(com.android.internal.R.styleable. + TextAppearance_textColor); + if (colors != null) { + mTextColors = colors; + } + + ts = appearance.getDimensionPixelSize(com.android.internal.R.styleable. + TextAppearance_textSize, 0); + if (ts != 0) { + if (ts != mTextPaint.getTextSize()) { + mTextPaint.setTextSize(ts); + requestLayout(); + } + } + + int typefaceIndex, styleIndex; + + typefaceIndex = appearance.getInt(com.android.internal.R.styleable. + TextAppearance_typeface, -1); + styleIndex = appearance.getInt(com.android.internal.R.styleable. + TextAppearance_textStyle, -1); + + setSwitchTypefaceByIndex(typefaceIndex, styleIndex); + + int lineHeight = appearance.getDimensionPixelSize( + com.android.internal.R.styleable.TextAppearance_textLineHeight, 0); + if (lineHeight != 0) { + setLineHeight(lineHeight); + } + + appearance.recycle(); + } + + private void setSwitchTypefaceByIndex(int typefaceIndex, int styleIndex) { + Typeface tf = null; + switch (typefaceIndex) { + case SANS: + tf = Typeface.SANS_SERIF; + break; + + case SERIF: + tf = Typeface.SERIF; + break; + + case MONOSPACE: + tf = Typeface.MONOSPACE; + break; + } + + setSwitchTypeface(tf, styleIndex); + } + + /** + * Sets the typeface and style in which the text should be displayed on the + * switch, and turns on the fake bold and italic bits in the Paint if the + * Typeface that you provided does not have all the bits in the + * style that you specified. + */ + public void setSwitchTypeface(Typeface tf, int style) { + if (style > 0) { + if (tf == null) { + tf = Typeface.defaultFromStyle(style); + } else { + tf = Typeface.create(tf, style); + } + + setSwitchTypeface(tf); + // now compute what (if any) algorithmic styling is needed + int typefaceStyle = tf != null ? tf.getStyle() : 0; + int need = style & ~typefaceStyle; + mTextPaint.setFakeBoldText((need & Typeface.BOLD) != 0); + mTextPaint.setTextSkewX((need & Typeface.ITALIC) != 0 ? -0.25f : 0); + } else { + mTextPaint.setFakeBoldText(false); + mTextPaint.setTextSkewX(0); + setSwitchTypeface(tf); + } + } + + /** + * Sets the typeface and style in which the text should be displayed on the switch. + * Note that not all Typeface families actually have bold and italic + * variants, so you may need to use + * {@link #setSwitchTypeface(Typeface, int)} to get the appearance + * that you actually want. + * + * @attr ref android.R.styleable#TextView_typeface + * @attr ref android.R.styleable#TextView_textStyle + */ + public void setSwitchTypeface(Typeface tf) { + if (mTextPaint.getTypeface() != tf) { + mTextPaint.setTypeface(tf); + + requestLayout(); + invalidate(); + } + } + + /** + * Returns the text for when the button is in the checked state. + * + * @return The text. + */ + public CharSequence getTextOn() { + return mTextOn; + } + + /** + * Sets the text for when the button is in the checked state. + * + * @param textOn The text. + */ + public void setTextOn(CharSequence textOn) { + mTextOn = textOn; + requestLayout(); + } + + /** + * Returns the text for when the button is not in the checked state. + * + * @return The text. + */ + public CharSequence getTextOff() { + return mTextOff; + } + + /** + * Sets the text for when the button is not in the checked state. + * + * @param textOff The text. + */ + public void setTextOff(CharSequence textOff) { + mTextOff = textOff; + requestLayout(); + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final int widthMode = MeasureSpec.getMode(widthMeasureSpec); + final int heightMode = MeasureSpec.getMode(heightMeasureSpec); + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + int heightSize = MeasureSpec.getSize(heightMeasureSpec); + + + if (mOnLayout == null) { + mOnLayout = makeLayout(mTextOn); + } + if (mOffLayout == null) { + mOffLayout = makeLayout(mTextOff); + } + + mTrackDrawable.getPadding(mTempRect); + final int maxTextWidth = Math.max(mOnLayout.getWidth(), mOffLayout.getWidth()); + final int switchWidth = Math.max(mSwitchMinWidth, + maxTextWidth * 2 + mThumbTextPadding * 4 + mTempRect.left + mTempRect.right); + final int switchHeight = mTrackDrawable.getIntrinsicHeight(); + + mThumbWidth = maxTextWidth + mThumbTextPadding * 2; + + switch (widthMode) { + case MeasureSpec.AT_MOST: + widthSize = Math.min(widthSize, switchWidth); + break; + + case MeasureSpec.UNSPECIFIED: + widthSize = switchWidth; + break; + + case MeasureSpec.EXACTLY: + // Just use what we were given + break; + } + + switch (heightMode) { + case MeasureSpec.AT_MOST: + heightSize = Math.min(heightSize, switchHeight); + break; + + case MeasureSpec.UNSPECIFIED: + heightSize = switchHeight; + break; + + case MeasureSpec.EXACTLY: + // Just use what we were given + break; + } + + mSwitchWidth = switchWidth; + mSwitchHeight = switchHeight; + + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + final int measuredWidth = getMeasuredWidth(); + final int measuredHeight = getMeasuredHeight(); + if (measuredHeight < switchHeight) { + setMeasuredDimension(measuredWidth, switchHeight); + } + } + + private Layout makeLayout(CharSequence text) { + return new StaticLayout(text, mTextPaint, + (int) Math.ceil(Layout.getDesiredWidth(text, mTextPaint)), + Layout.Alignment.ALIGN_NORMAL, 1.f, 0, true); + } + + /** + * @return true if (x, y) is within the target area of the switch thumb + */ + private boolean hitThumb(float x, float y) { + mThumbDrawable.getPadding(mTempRect); + final int thumbTop = mSwitchTop - mTouchSlop; + final int thumbLeft = mSwitchLeft + (int) (mThumbPosition + 0.5f) - mTouchSlop; + final int thumbRight = thumbLeft + mThumbWidth + + mTempRect.left + mTempRect.right + mTouchSlop; + final int thumbBottom = mSwitchBottom + mTouchSlop; + return x > thumbLeft && x < thumbRight && y > thumbTop && y < thumbBottom; + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + mVelocityTracker.addMovement(ev); + final int action = ev.getActionMasked(); + switch (action) { + case MotionEvent.ACTION_DOWN: { + final float x = ev.getX(); + final float y = ev.getY(); + if (hitThumb(x, y)) { + mTouchMode = TOUCH_MODE_DOWN; + mTouchX = x; + mTouchY = y; + } + break; + } + + case MotionEvent.ACTION_MOVE: { + switch (mTouchMode) { + case TOUCH_MODE_IDLE: + // Didn't target the thumb, treat normally. + break; + + case TOUCH_MODE_DOWN: { + final float x = ev.getX(); + final float y = ev.getY(); + if (Math.abs(x - mTouchX) > mTouchSlop || + Math.abs(y - mTouchY) > mTouchSlop) { + mTouchMode = TOUCH_MODE_DRAGGING; + getParent().requestDisallowInterceptTouchEvent(true); + mTouchX = x; + mTouchY = y; + return true; + } + break; + } + + case TOUCH_MODE_DRAGGING: { + final float x = ev.getX(); + final float dx = x - mTouchX; + float newPos = Math.max(0, + Math.min(mThumbPosition + dx, getThumbScrollRange())); + if (newPos != mThumbPosition) { + mThumbPosition = newPos; + mTouchX = x; + invalidate(); + } + return true; + } + } + break; + } + + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: { + if (mTouchMode == TOUCH_MODE_DRAGGING) { + stopDrag(ev); + return true; + } + mTouchMode = TOUCH_MODE_IDLE; + mVelocityTracker.clear(); + break; + } + } + + return super.onTouchEvent(ev); + } + + private void cancelSuperTouch(MotionEvent ev) { + MotionEvent cancel = MotionEvent.obtain(ev); + cancel.setAction(MotionEvent.ACTION_CANCEL); + super.onTouchEvent(cancel); + cancel.recycle(); + } + + /** + * Called from onTouchEvent to end a drag operation. + * + * @param ev Event that triggered the end of drag mode - ACTION_UP or ACTION_CANCEL + */ + private void stopDrag(MotionEvent ev) { + mTouchMode = TOUCH_MODE_IDLE; + boolean commitChange = ev.getAction() == MotionEvent.ACTION_UP; + + cancelSuperTouch(ev); + + if (commitChange) { + boolean newState; + mVelocityTracker.computeCurrentVelocity(1000); + float xvel = mVelocityTracker.getXVelocity(); + if (Math.abs(xvel) > mMinFlingVelocity) { + newState = xvel < 0; + } else { + newState = getTargetCheckedState(); + } + animateThumbToCheckedState(newState); + } else { + animateThumbToCheckedState(isChecked()); + } + } + + private void animateThumbToCheckedState(boolean newCheckedState) { + float targetPos = newCheckedState ? 0 : getThumbScrollRange(); + // TODO animate! + mThumbPosition = targetPos; + setChecked(newCheckedState); + } + + private boolean getTargetCheckedState() { + return mThumbPosition <= getThumbScrollRange() / 2; + } + + @Override + public void setChecked(boolean checked) { + super.setChecked(checked); + mThumbPosition = checked ? 0 : getThumbScrollRange(); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + + int switchRight = getWidth() - getPaddingRight(); + int switchLeft = switchRight - mSwitchWidth; + int switchTop = 0; + int switchBottom = 0; + switch (getGravity() & Gravity.VERTICAL_GRAVITY_MASK) { + default: + case Gravity.TOP: + switchTop = getPaddingTop(); + switchBottom = switchTop + mSwitchHeight; + break; + + case Gravity.CENTER_VERTICAL: + switchTop = (getPaddingTop() + getHeight() - getPaddingBottom()) / 2 - + mSwitchHeight / 2; + switchBottom = switchTop + mSwitchHeight; + break; + + case Gravity.BOTTOM: + switchBottom = getHeight() - getPaddingBottom(); + switchTop = switchBottom - mSwitchHeight; + break; + } + + mSwitchLeft = switchLeft; + mSwitchTop = switchTop; + mSwitchBottom = switchBottom; + mSwitchRight = switchRight; + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + // Draw the switch + int switchLeft = mSwitchLeft; + int switchTop = mSwitchTop; + int switchRight = mSwitchRight; + int switchBottom = mSwitchBottom; + + mTrackDrawable.setBounds(switchLeft, switchTop, switchRight, switchBottom); + mTrackDrawable.draw(canvas); + + canvas.save(); + + mTrackDrawable.getPadding(mTempRect); + int switchInnerLeft = switchLeft + mTempRect.left; + int switchInnerTop = switchTop + mTempRect.top; + int switchInnerRight = switchRight - mTempRect.right; + int switchInnerBottom = switchBottom - mTempRect.bottom; + canvas.clipRect(switchInnerLeft, switchTop, switchInnerRight, switchBottom); + + mThumbDrawable.getPadding(mTempRect); + final int thumbPos = (int) (mThumbPosition + 0.5f); + int thumbLeft = switchInnerLeft - mTempRect.left + thumbPos; + int thumbRight = switchInnerLeft + thumbPos + mThumbWidth + mTempRect.right; + + mThumbDrawable.setBounds(thumbLeft, switchTop, thumbRight, switchBottom); + mThumbDrawable.draw(canvas); + + mTextPaint.setColor(mTextColors.getColorForState(getDrawableState(), + mTextColors.getDefaultColor())); + mTextPaint.drawableState = getDrawableState(); + + Layout switchText = getTargetCheckedState() ? mOnLayout : mOffLayout; + + canvas.translate((thumbLeft + thumbRight) / 2 - switchText.getWidth() / 2, + (switchInnerTop + switchInnerBottom) / 2 - switchText.getHeight() / 2); + switchText.draw(canvas); + + canvas.restore(); + } + + @Override + public int getCompoundPaddingRight() { + int padding = super.getCompoundPaddingRight() + mSwitchWidth; + if (!TextUtils.isEmpty(getText())) { + padding += mSwitchPadding; + } + return padding; + } + + private int getThumbScrollRange() { + if (mTrackDrawable == null) { + return 0; + } + mTrackDrawable.getPadding(mTempRect); + return mSwitchWidth - mThumbWidth - mTempRect.left - mTempRect.right; + } + + @Override + protected int[] onCreateDrawableState(int extraSpace) { + final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); + if (isChecked()) { + mergeDrawableStates(drawableState, CHECKED_STATE_SET); + } + return drawableState; + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + + int[] myDrawableState = getDrawableState(); + + // Set the state of the Drawable + mThumbDrawable.setState(myDrawableState); + mTrackDrawable.setState(myDrawableState); + + invalidate(); + } + + @Override + protected boolean verifyDrawable(Drawable who) { + return super.verifyDrawable(who) || who == mThumbDrawable || who == mTrackDrawable; + } + + @Override + public void jumpDrawablesToCurrentState() { + super.jumpDrawablesToCurrentState(); + mThumbDrawable.jumpToCurrentState(); + mTrackDrawable.jumpToCurrentState(); + } +} diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 45c46db..c49deaa 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -7024,8 +7024,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener getInsertionController().show(); } } - } else if (hasSelection() && hasSelectionController()) { - getSelectionController().show(); } } @@ -7763,14 +7761,16 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener /** * Prepare text so that there are not zero or two spaces at beginning and end of region defined * by [min, max] when replacing this region by paste. + * Note that if there was two spaces (or more) at that position before, they are kept. We just + * make sure we do not add an extra one from the paste content. */ private long prepareSpacesAroundPaste(int min, int max, CharSequence paste) { // Paste adds/removes spaces before or after insertion as needed. - if (Character.isSpaceChar(paste.charAt(0))) { + if (paste.length() > 0 && Character.isSpaceChar(paste.charAt(0))) { if (min > 0 && Character.isSpaceChar(mTransformed.charAt(min - 1))) { // Two spaces at beginning of paste: remove one final int originalLength = mText.length(); - ((Editable) mText).replace(min - 1, min, ""); + ((Editable) mText).delete(min - 1, min); // Due to filters, there is no guarantee that exactly one character was // removed. Count instead. final int delta = mText.length() - originalLength; @@ -7789,10 +7789,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } - if (Character.isSpaceChar(paste.charAt(paste.length() - 1))) { + if (paste.length() > 0 && Character.isSpaceChar(paste.charAt(paste.length() - 1))) { if (max < mText.length() && Character.isSpaceChar(mTransformed.charAt(max))) { // Two spaces at end of paste: remove one - ((Editable) mText).replace(max, max + 1, ""); + ((Editable) mText).delete(max, max + 1); } } else { if (max < mText.length() && !Character.isSpaceChar(mTransformed.charAt(max))) { @@ -7800,6 +7800,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener ((Editable) mText).replace(max, max, " "); } } + return packRangeInLong(min, max); } @@ -7856,6 +7857,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener CharSequence selectedText = mTransformed.subSequence(start, end); ClipData data = ClipData.newPlainText(null, null, selectedText); startDrag(data, getTextThumbnailBuilder(selectedText), false); + mDragSourcePositions = packRangeInLong(start, end); stopSelectionActionMode(); } else { selectCurrentWord(); @@ -8991,17 +8993,58 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener Item item = clipData.getItem(i); content.append(item.coerceToText(TextView.this.mContext)); } + final int offset = getOffset((int) event.getX(), (int) event.getY()); + + if (mDragSourcePositions != -1) { + final int dragSourceStart = extractRangeStartFromLong(mDragSourcePositions); + final int dragSourceEnd = extractRangeEndFromLong(mDragSourcePositions); + if (offset >= dragSourceStart && offset < dragSourceEnd) { + // A drop inside the original selection discards the drop. + return true; + } + } + + final int originalLength = mText.length(); long minMax = prepareSpacesAroundPaste(offset, offset, content); int min = extractRangeStartFromLong(minMax); int max = extractRangeEndFromLong(minMax); + Selection.setSelection((Spannable) mText, max); ((Editable) mText).replace(min, max, content); + + if (mDragSourcePositions != -1) { + int dragSourceStart = extractRangeStartFromLong(mDragSourcePositions); + int dragSourceEnd = extractRangeEndFromLong(mDragSourcePositions); + if (max <= dragSourceStart) { + // Inserting text before selection has shifted positions + final int shift = mText.length() - originalLength; + dragSourceStart += shift; + dragSourceEnd += shift; + } + + // Delete original selection + ((Editable) mText).delete(dragSourceStart, dragSourceEnd); + + // Make sure we do not leave two adjacent spaces. + if ((dragSourceStart == 0 || + Character.isSpaceChar(mTransformed.charAt(dragSourceStart - 1))) && + (dragSourceStart == mText.length() || + Character.isSpaceChar(mTransformed.charAt(dragSourceStart)))) { + final int pos = dragSourceStart == mText.length() ? + dragSourceStart - 1 : dragSourceStart; + ((Editable) mText).delete(pos, pos + 1); + } + } + return true; } - case DragEvent.ACTION_DRAG_EXITED: case DragEvent.ACTION_DRAG_ENDED: + mDragSourcePositions = -1; + return true; + + case DragEvent.ACTION_DRAG_EXITED: default: return true; } @@ -9063,6 +9106,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return mInBatchEditControllers; } + @ViewDebug.ExportedProperty(category = "text") private CharSequence mText; private CharSequence mTransformed; private BufferType mBufferType = BufferType.NORMAL; @@ -9167,6 +9211,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private InputFilter[] mFilters = NO_FILTERS; private static final Spanned EMPTY_SPANNED = new SpannedString(""); private static int DRAG_THUMBNAIL_MAX_TEXT_LENGTH = 20; + // A packed range containing the drag source if it occured in that TextView. -1 otherwise. + private long mDragSourcePositions = -1; // System wide time for last cut or copy action. private static long sLastCutOrCopyTime; } diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java index e61fac3..6cf1387 100644 --- a/core/java/android/widget/TimePicker.java +++ b/core/java/android/widget/TimePicker.java @@ -16,6 +16,8 @@ package android.widget; +import com.android.internal.R; + import android.annotation.Widget; import android.content.Context; import android.os.Parcel; @@ -23,9 +25,7 @@ import android.os.Parcelable; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; -import android.widget.NumberPicker; - -import com.android.internal.R; +import android.widget.NumberPicker.OnChangedListener; import java.text.DateFormatSymbols; import java.util.Calendar; @@ -51,7 +51,7 @@ import java.util.Calendar; */ @Widget public class TimePicker extends FrameLayout { - + /** * A no-op callback used in the constructor to avoid null checks * later in the code. @@ -70,10 +70,11 @@ public class TimePicker extends FrameLayout { // ui components private final NumberPicker mHourPicker; private final NumberPicker mMinutePicker; - private final Button mAmPmButton; - private final String mAmText; - private final String mPmText; - + private final NumberPicker mAmPmPicker; + private final TextView mDivider; + + private final String[] mAmPmStrings; + // callbacks private OnTimeChangedListener mOnTimeChangedListener; @@ -127,6 +128,10 @@ public class TimePicker extends FrameLayout { } }); + // divider + mDivider = (TextView) findViewById(R.id.divider); + mDivider.setText(R.string.time_picker_separator); + // digits of minute mMinutePicker = (NumberPicker) findViewById(R.id.minute); mMinutePicker.setRange(0, 59); @@ -140,50 +145,41 @@ public class TimePicker extends FrameLayout { }); // am/pm - mAmPmButton = (Button) findViewById(R.id.amPm); - - // now that the hour/minute picker objects have been initialized, set - // the hour range properly based on the 12/24 hour display mode. - configurePickerRanges(); - - // initialize to current time - Calendar cal = Calendar.getInstance(); - setOnTimeChangedListener(NO_OP_CHANGE_LISTENER); - - // by default we're not in 24 hour mode - setCurrentHour(cal.get(Calendar.HOUR_OF_DAY)); - setCurrentMinute(cal.get(Calendar.MINUTE)); - - mIsAm = (mCurrentHour < 12); - - /* Get the localized am/pm strings and use them in the spinner */ - DateFormatSymbols dfs = new DateFormatSymbols(); - String[] dfsAmPm = dfs.getAmPmStrings(); - mAmText = dfsAmPm[Calendar.AM]; - mPmText = dfsAmPm[Calendar.PM]; - mAmPmButton.setText(mIsAm ? mAmText : mPmText); - mAmPmButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - requestFocus(); + mAmPmPicker = (NumberPicker) findViewById(R.id.amPm); + mAmPmPicker.setOnChangeListener(new OnChangedListener() { + public void onChanged(NumberPicker picker, int oldVal, int newVal) { + picker.requestFocus(); if (mIsAm) { - // Currently AM switching to PM if (mCurrentHour < 12) { mCurrentHour += 12; - } + } } else { - // Currently PM switching to AM if (mCurrentHour >= 12) { mCurrentHour -= 12; } } mIsAm = !mIsAm; - mAmPmButton.setText(mIsAm ? mAmText : mPmText); onTimeChanged(); } }); - + + /* Get the localized am/pm strings and use them in the spinner */ + mAmPmStrings = new DateFormatSymbols().getAmPmStrings(); + + // now that the hour/minute picker objects have been initialized, set + // the hour range properly based on the 12/24 hour display mode. + configurePickerRanges(); + + // initialize to current time + Calendar cal = Calendar.getInstance(); + setOnTimeChangedListener(NO_OP_CHANGE_LISTENER); + + // by default we're not in 24 hour mode + setCurrentHour(cal.get(Calendar.HOUR_OF_DAY)); + setCurrentMinute(cal.get(Calendar.MINUTE)); + if (!isEnabled()) { setEnabled(false); } @@ -194,7 +190,7 @@ public class TimePicker extends FrameLayout { super.setEnabled(enabled); mMinutePicker.setEnabled(enabled); mHourPicker.setEnabled(enabled); - mAmPmButton.setEnabled(enabled); + mAmPmPicker.setEnabled(enabled); } /** @@ -327,12 +323,15 @@ public class TimePicker extends FrameLayout { int currentHour = mCurrentHour; if (!mIs24HourView) { // convert [0,23] ordinal to wall clock display - if (currentHour > 12) currentHour -= 12; - else if (currentHour == 0) currentHour = 12; + if (currentHour > 12) { + currentHour -= 12; + } else if (currentHour == 0) { + currentHour = 12; + } } mHourPicker.setCurrent(currentHour); mIsAm = mCurrentHour < 12; - mAmPmButton.setText(mIsAm ? mAmText : mPmText); + mAmPmPicker.setCurrent(mIsAm ? Calendar.AM : Calendar.PM); onTimeChanged(); } @@ -340,16 +339,19 @@ public class TimePicker extends FrameLayout { if (mIs24HourView) { mHourPicker.setRange(0, 23); mHourPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); - mAmPmButton.setVisibility(View.GONE); + mAmPmPicker.setVisibility(View.GONE); } else { mHourPicker.setRange(1, 12); mHourPicker.setFormatter(null); - mAmPmButton.setVisibility(View.VISIBLE); + mAmPmPicker.setVisibility(View.VISIBLE); + mAmPmPicker.setRange(0, 1, mAmPmStrings); } } private void onTimeChanged() { - mOnTimeChangedListener.onTimeChanged(this, getCurrentHour(), getCurrentMinute()); + if (mOnTimeChangedListener != null) { + mOnTimeChangedListener.onTimeChanged(this, getCurrentHour(), getCurrentMinute()); + } } /** @@ -357,6 +359,6 @@ public class TimePicker extends FrameLayout { */ private void updateMinuteDisplay() { mMinutePicker.setCurrent(mCurrentMinute); - mOnTimeChangedListener.onTimeChanged(this, getCurrentHour(), getCurrentMinute()); + onTimeChanged(); } } diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index 90423be..bf59753 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -95,6 +95,7 @@ public class LockPatternUtils { private final static String PATTERN_EVER_CHOSEN_KEY = "lockscreen.patterneverchosen"; public final static String PASSWORD_TYPE_KEY = "lockscreen.password_type"; private final static String LOCK_PASSWORD_SALT_KEY = "lockscreen.password_salt"; + private final static String DISABLE_LOCKSCREEN_KEY = "lockscreen.disabled"; private final static String PASSWORD_HISTORY_KEY = "lockscreen.passwordhistory"; @@ -355,6 +356,26 @@ public class LockPatternUtils { } /** + * Disable showing lock screen at all when the DevicePolicyManager allows it. + * This is only meaningful if pattern, pin or password are not set. + * + * @param disable Disables lock screen when true + */ + public void setLockScreenDisabled(boolean disable) { + setLong(DISABLE_LOCKSCREEN_KEY, disable ? 1 : 0); + } + + /** + * Determine if LockScreen can be disabled. This is used, for example, to tell if we should + * show LockScreen or go straight to the home screen. + * + * @return true if lock screen is can be disabled + */ + public boolean isLockScreenDisabled() { + return !isSecure() && getLong(DISABLE_LOCKSCREEN_KEY, 0) != 0; + } + + /** * Save a lock pattern. * @param pattern The new pattern to save. */ diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp index c4056a4..2528db1 100644 --- a/core/jni/android_util_AssetManager.cpp +++ b/core/jni/android_util_AssetManager.cpp @@ -1296,7 +1296,7 @@ static jint android_content_AssetManager_getArraySize(JNIEnv* env, jobject clazz { AssetManager* am = assetManagerForJavaObject(env, clazz); if (am == NULL) { - return NULL; + return 0; } const ResTable& res(am->getResources()); diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index 9a85edc..206e320 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -32,6 +32,7 @@ #include <SkCanvas.h> #include <SkBitmap.h> #include <SkRegion.h> +#include <SkPixelRef.h> #include "jni.h" #include <android_runtime/AndroidRuntime.h> @@ -437,9 +438,15 @@ static void Surface_unfreezeDisplay( } } -class ScreenshotBitmap : public SkBitmap { +class ScreenshotPixelRef : public SkPixelRef { public: - ScreenshotBitmap() { + ScreenshotPixelRef(SkColorTable* ctable) { + fCTable = ctable; + ctable->safeRef(); + setImmutable(); + } + virtual ~ScreenshotPixelRef() { + SkSafeUnref(fCTable); } status_t update(int width, int height) { @@ -450,40 +457,71 @@ public: return res; } - void const* base = mScreenshot.getPixels(); - uint32_t w = mScreenshot.getWidth(); - uint32_t h = mScreenshot.getHeight(); - uint32_t s = mScreenshot.getStride(); - uint32_t f = mScreenshot.getFormat(); + return NO_ERROR; + } - ssize_t bpr = s * android::bytesPerPixel(f); - setConfig(convertPixelFormat(f), w, h, bpr); - if (f == PIXEL_FORMAT_RGBX_8888) { - setIsOpaque(true); - } - if (w > 0 && h > 0) { - setPixels((void*)base); - } else { - // be safe with an empty bitmap. - setPixels(NULL); - } + uint32_t getWidth() const { + return mScreenshot.getWidth(); + } - return NO_ERROR; + uint32_t getHeight() const { + return mScreenshot.getHeight(); + } + + uint32_t getStride() const { + return mScreenshot.getStride(); + } + + uint32_t getFormat() const { + return mScreenshot.getFormat(); + } + +protected: + // overrides from SkPixelRef + virtual void* onLockPixels(SkColorTable** ct) { + *ct = fCTable; + return (void*)mScreenshot.getPixels(); + } + + virtual void onUnlockPixels() { } private: ScreenshotClient mScreenshot; + SkColorTable* fCTable; + + typedef SkPixelRef INHERITED; }; static jobject Surface_screenshot(JNIEnv* env, jobject clazz, jint width, jint height) { - ScreenshotBitmap* bitmap = new ScreenshotBitmap(); - - if (bitmap->update(width, height) != NO_ERROR) { - delete bitmap; + ScreenshotPixelRef* pixels = new ScreenshotPixelRef(NULL); + if (pixels->update(width, height) != NO_ERROR) { + delete pixels; return 0; } + uint32_t w = pixels->getWidth(); + uint32_t h = pixels->getHeight(); + uint32_t s = pixels->getStride(); + uint32_t f = pixels->getFormat(); + ssize_t bpr = s * android::bytesPerPixel(f); + + SkBitmap* bitmap = new SkBitmap(); + bitmap->setConfig(convertPixelFormat(f), w, h, bpr); + if (f == PIXEL_FORMAT_RGBX_8888) { + bitmap->setIsOpaque(true); + } + + if (w > 0 && h > 0) { + bitmap->setPixelRef(pixels)->unref(); + bitmap->lockPixels(); + } else { + // be safe with an empty bitmap. + delete pixels; + bitmap->setPixels(NULL); + } + return GraphicsJNI::createBitmap(env, bitmap, false, NULL); } diff --git a/core/res/res/drawable-hdpi/switch_bg_disabled_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_bg_disabled_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..df435e4 --- /dev/null +++ b/core/res/res/drawable-hdpi/switch_bg_disabled_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/switch_bg_disabled_holo_light.9.png b/core/res/res/drawable-hdpi/switch_bg_disabled_holo_light.9.png Binary files differnew file mode 100644 index 0000000..4c8cc86 --- /dev/null +++ b/core/res/res/drawable-hdpi/switch_bg_disabled_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/switch_bg_focused_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_bg_focused_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..a4ec766 --- /dev/null +++ b/core/res/res/drawable-hdpi/switch_bg_focused_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/switch_bg_focused_holo_light.9.png b/core/res/res/drawable-hdpi/switch_bg_focused_holo_light.9.png Binary files differnew file mode 100644 index 0000000..a571aa8 --- /dev/null +++ b/core/res/res/drawable-hdpi/switch_bg_focused_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/switch_bg_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_bg_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..f86e7e4 --- /dev/null +++ b/core/res/res/drawable-hdpi/switch_bg_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/switch_bg_holo_light.9.png b/core/res/res/drawable-hdpi/switch_bg_holo_light.9.png Binary files differnew file mode 100644 index 0000000..b4584a7 --- /dev/null +++ b/core/res/res/drawable-hdpi/switch_bg_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..c01ad87 --- /dev/null +++ b/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_light.9.png b/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_light.9.png Binary files differnew file mode 100644 index 0000000..b3e428d --- /dev/null +++ b/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/switch_thumb_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_thumb_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..4d3d5b7 --- /dev/null +++ b/core/res/res/drawable-hdpi/switch_thumb_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/switch_thumb_holo_light.9.png b/core/res/res/drawable-hdpi/switch_thumb_holo_light.9.png Binary files differnew file mode 100644 index 0000000..16e11b6 --- /dev/null +++ b/core/res/res/drawable-hdpi/switch_thumb_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..3900997 --- /dev/null +++ b/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_light.9.png b/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_light.9.png Binary files differnew file mode 100644 index 0000000..ab4fd8d --- /dev/null +++ b/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/switch_bg_disabled_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_bg_disabled_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..c75612c --- /dev/null +++ b/core/res/res/drawable-mdpi/switch_bg_disabled_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/switch_bg_disabled_holo_light.9.png b/core/res/res/drawable-mdpi/switch_bg_disabled_holo_light.9.png Binary files differnew file mode 100644 index 0000000..67adadc --- /dev/null +++ b/core/res/res/drawable-mdpi/switch_bg_disabled_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/switch_bg_focused_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_bg_focused_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..9a05f84 --- /dev/null +++ b/core/res/res/drawable-mdpi/switch_bg_focused_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/switch_bg_focused_holo_light.9.png b/core/res/res/drawable-mdpi/switch_bg_focused_holo_light.9.png Binary files differnew file mode 100644 index 0000000..58d65ad --- /dev/null +++ b/core/res/res/drawable-mdpi/switch_bg_focused_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/switch_bg_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_bg_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..172030d --- /dev/null +++ b/core/res/res/drawable-mdpi/switch_bg_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/switch_bg_holo_light.9.png b/core/res/res/drawable-mdpi/switch_bg_holo_light.9.png Binary files differnew file mode 100644 index 0000000..4ae089b --- /dev/null +++ b/core/res/res/drawable-mdpi/switch_bg_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..7e205ac --- /dev/null +++ b/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_light.9.png b/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_light.9.png Binary files differnew file mode 100644 index 0000000..b4e7cf5 --- /dev/null +++ b/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/switch_thumb_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_thumb_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..7003318 --- /dev/null +++ b/core/res/res/drawable-mdpi/switch_thumb_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/switch_thumb_holo_light.9.png b/core/res/res/drawable-mdpi/switch_thumb_holo_light.9.png Binary files differnew file mode 100644 index 0000000..97afcbf --- /dev/null +++ b/core/res/res/drawable-mdpi/switch_thumb_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..1adc9ee --- /dev/null +++ b/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_light.9.png b/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_light.9.png Binary files differnew file mode 100644 index 0000000..29c6328 --- /dev/null +++ b/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_light.9.png diff --git a/core/res/res/drawable/switch_inner_holo_dark.xml b/core/res/res/drawable/switch_inner_holo_dark.xml new file mode 100644 index 0000000..3eb55ee --- /dev/null +++ b/core/res/res/drawable/switch_inner_holo_dark.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 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. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="false" android:drawable="@drawable/switch_thumb_disabled_holo_dark" /> + <item android:state_pressed="true" android:drawable="@drawable/switch_thumb_pressed_holo_dark" /> + <item android:drawable="@drawable/switch_thumb_holo_dark" /> +</selector> diff --git a/core/res/res/drawable/switch_inner_holo_light.xml b/core/res/res/drawable/switch_inner_holo_light.xml new file mode 100644 index 0000000..9b287cf --- /dev/null +++ b/core/res/res/drawable/switch_inner_holo_light.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 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. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="false" android:drawable="@drawable/switch_thumb_disabled_holo_light" /> + <item android:state_pressed="true" android:drawable="@drawable/switch_thumb_pressed_holo_light" /> + <item android:drawable="@drawable/switch_thumb_holo_light" /> +</selector> diff --git a/core/res/res/drawable/switch_track_holo_dark.xml b/core/res/res/drawable/switch_track_holo_dark.xml new file mode 100644 index 0000000..c9a940d --- /dev/null +++ b/core/res/res/drawable/switch_track_holo_dark.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 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. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="false" android:drawable="@drawable/switch_bg_disabled_holo_dark" /> + <item android:state_focused="true" android:drawable="@drawable/switch_bg_focused_holo_dark" /> + <item android:drawable="@drawable/switch_bg_holo_dark" /> +</selector> diff --git a/core/res/res/drawable/switch_track_holo_light.xml b/core/res/res/drawable/switch_track_holo_light.xml new file mode 100644 index 0000000..98e53b5 --- /dev/null +++ b/core/res/res/drawable/switch_track_holo_light.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 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. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="false" android:drawable="@drawable/switch_bg_disabled_holo_light" /> + <item android:state_focused="true" android:drawable="@drawable/switch_bg_focused_holo_light" /> + <item android:drawable="@drawable/switch_bg_holo_light" /> +</selector> diff --git a/core/res/res/drawable/timepicker_down_btn.xml b/core/res/res/drawable/timepicker_down_btn.xml index 61a252a..d4908cb 100644 --- a/core/res/res/drawable/timepicker_down_btn.xml +++ b/core/res/res/drawable/timepicker_down_btn.xml @@ -16,15 +16,28 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_pressed="false" android:state_enabled="true" - android:state_focused="false" android:drawable="@drawable/timepicker_down_normal" /> - <item android:state_pressed="true" android:state_enabled="true" + <item android:state_pressed="false" + android:state_enabled="true" + android:state_focused="false" + android:drawable="@drawable/timepicker_down_normal" /> + + <item android:state_pressed="true" + android:state_enabled="true" android:drawable="@drawable/timepicker_down_pressed" /> - <item android:state_pressed="false" android:state_enabled="true" - android:state_focused="true" android:drawable="@drawable/timepicker_down_selected" /> - <item android:state_pressed="false" android:state_enabled="false" - android:state_focused="false" android:drawable="@drawable/timepicker_down_disabled" /> - <item android:state_pressed="false" android:state_enabled="false" - android:state_focused="true" android:drawable="@drawable/timepicker_down_disabled_focused" /> + + <item android:state_pressed="false" + android:state_enabled="true" + android:state_focused="true" + android:drawable="@drawable/timepicker_down_selected" /> + + <item android:state_pressed="false" + android:state_enabled="false" + android:state_focused="false" + android:drawable="@drawable/timepicker_down_disabled" /> + + <item android:state_pressed="false" + android:state_enabled="false" + android:state_focused="true" + android:drawable="@drawable/timepicker_down_disabled_focused" /> </selector> diff --git a/core/res/res/drawable/timepicker_down_btn_holo_dark.xml b/core/res/res/drawable/timepicker_down_btn_holo_dark.xml new file mode 100644 index 0000000..b4b824d --- /dev/null +++ b/core/res/res/drawable/timepicker_down_btn_holo_dark.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 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. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + + <item android:state_pressed="false" + android:state_enabled="true" + android:state_focused="false" + android:drawable="@drawable/timepicker_down_normal_holo_dark" /> + + <item android:state_pressed="true" + android:state_enabled="true" + android:drawable="@drawable/timepicker_down_pressed_holo_dark" /> + + <item android:state_pressed="false" + android:state_enabled="true" + android:state_focused="true" + android:drawable="@drawable/timepicker_down_focused_holo_dark" /> + + <item android:state_pressed="false" + android:state_enabled="false" + android:state_focused="false" + android:drawable="@drawable/timepicker_down_disabled_holo_dark" /> + + <item android:state_pressed="false" + android:state_enabled="false" + android:state_focused="true" + android:drawable="@drawable/timepicker_down_disabled_focused_holo_dark" /> + +</selector> diff --git a/core/res/res/drawable/timepicker_down_btn_holo_light.xml b/core/res/res/drawable/timepicker_down_btn_holo_light.xml new file mode 100644 index 0000000..7ae5e53 --- /dev/null +++ b/core/res/res/drawable/timepicker_down_btn_holo_light.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 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. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + + <item android:state_pressed="false" + android:state_enabled="true" + android:state_focused="false" + android:drawable="@drawable/timepicker_down_normal_holo_light" /> + + <item android:state_pressed="true" + android:state_enabled="true" + android:drawable="@drawable/timepicker_down_pressed_holo_light" /> + + <item android:state_pressed="false" + android:state_enabled="true" + android:state_focused="true" + android:drawable="@drawable/timepicker_down_focused_holo_light" /> + + <item android:state_pressed="false" + android:state_enabled="false" + android:state_focused="false" + android:drawable="@drawable/timepicker_down_disabled_holo_light" /> + + <item android:state_pressed="false" + android:state_enabled="false" + android:state_focused="true" + android:drawable="@drawable/timepicker_down_disabled_focused_holo_light" /> + +</selector> diff --git a/core/res/res/drawable/timepicker_input.xml b/core/res/res/drawable/timepicker_input.xml index b811d4e..1768673 100644 --- a/core/res/res/drawable/timepicker_input.xml +++ b/core/res/res/drawable/timepicker_input.xml @@ -16,15 +16,28 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_pressed="false" android:state_enabled="true" - android:state_focused="false" android:drawable="@drawable/timepicker_input_normal" /> - <item android:state_pressed="true" android:state_enabled="true" + <item android:state_pressed="false" + android:state_enabled="true" + android:state_focused="false" + android:drawable="@drawable/timepicker_input_normal" /> + + <item android:state_pressed="true" + android:state_enabled="true" android:drawable="@drawable/timepicker_input_pressed" /> - <item android:state_pressed="false" android:state_enabled="true" - android:state_focused="true" android:drawable="@drawable/timepicker_input_selected" /> - <item android:state_pressed="false" android:state_enabled="false" - android:state_focused="false" android:drawable="@drawable/timepicker_input_disabled" /> - <item android:state_pressed="false" android:state_enabled="false" - android:state_focused="true" android:drawable="@drawable/timepicker_input_normal" /> + + <item android:state_pressed="false" + android:state_enabled="true" + android:state_focused="true" + android:drawable="@drawable/timepicker_input_selected" /> + + <item android:state_pressed="false" + android:state_enabled="false" + android:state_focused="false" + android:drawable="@drawable/timepicker_input_disabled" /> + + <item android:state_pressed="false" + android:state_enabled="false" + android:state_focused="true" + android:drawable="@drawable/timepicker_input_normal" /> </selector> diff --git a/core/res/res/drawable/timepicker_up_btn.xml b/core/res/res/drawable/timepicker_up_btn.xml index 5428aee..fbaed08 100644 --- a/core/res/res/drawable/timepicker_up_btn.xml +++ b/core/res/res/drawable/timepicker_up_btn.xml @@ -16,15 +16,28 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_pressed="false" android:state_enabled="true" - android:state_focused="false" android:drawable="@drawable/timepicker_up_normal" /> - <item android:state_pressed="true" android:state_enabled="true" + <item android:state_pressed="false" + android:state_enabled="true" + android:state_focused="false" + android:drawable="@drawable/timepicker_up_normal" /> + + <item android:state_pressed="true" + android:state_enabled="true" android:drawable="@drawable/timepicker_up_pressed" /> - <item android:state_pressed="false" android:state_enabled="true" - android:state_focused="true" android:drawable="@drawable/timepicker_up_selected" /> - <item android:state_pressed="false" android:state_enabled="false" - android:state_focused="false" android:drawable="@drawable/timepicker_up_disabled" /> - <item android:state_pressed="false" android:state_enabled="false" - android:state_focused="true" android:drawable="@drawable/timepicker_up_disabled_focused" /> + + <item android:state_pressed="false" + android:state_enabled="true" + android:state_focused="true" + android:drawable="@drawable/timepicker_up_selected" /> + + <item android:state_pressed="false" + android:state_enabled="false" + android:state_focused="false" + android:drawable="@drawable/timepicker_up_disabled" /> + + <item android:state_pressed="false" + android:state_enabled="false" + android:state_focused="true" + android:drawable="@drawable/timepicker_up_disabled_focused" /> </selector> diff --git a/core/res/res/drawable/timepicker_up_btn_holo_dark.xml b/core/res/res/drawable/timepicker_up_btn_holo_dark.xml new file mode 100644 index 0000000..af5f6eb --- /dev/null +++ b/core/res/res/drawable/timepicker_up_btn_holo_dark.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 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. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + + <item android:state_pressed="false" + android:state_enabled="true" + android:state_focused="false" + android:drawable="@drawable/timepicker_up_normal_holo_dark" /> + + <item android:state_pressed="true" + android:state_enabled="true" + android:drawable="@drawable/timepicker_up_pressed_holo_dark" /> + + <item android:state_pressed="false" + android:state_enabled="true" + android:state_focused="true" + android:drawable="@drawable/timepicker_up_focused_holo_dark" /> + + <item android:state_pressed="false" + android:state_enabled="false" + android:state_focused="false" + android:drawable="@drawable/timepicker_up_disabled_holo_dark" /> + + <item android:state_pressed="false" + android:state_enabled="false" + android:state_focused="true" + android:drawable="@drawable/timepicker_up_disabled_focused_holo_dark" /> + +</selector> diff --git a/core/res/res/drawable/timepicker_up_btn_holo_light.xml b/core/res/res/drawable/timepicker_up_btn_holo_light.xml new file mode 100644 index 0000000..6025d3a --- /dev/null +++ b/core/res/res/drawable/timepicker_up_btn_holo_light.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 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. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + + <item android:state_pressed="false" + android:state_enabled="true" + android:state_focused="false" + android:drawable="@drawable/timepicker_up_normal_holo_light" /> + + <item android:state_pressed="true" + android:state_enabled="true" + android:drawable="@drawable/timepicker_up_pressed_holo_light" /> + + <item android:state_pressed="false" + android:state_enabled="true" + android:state_focused="true" + android:drawable="@drawable/timepicker_up_focused_holo_light" /> + + <item android:state_pressed="false" + android:state_enabled="false" + android:state_focused="false" + android:drawable="@drawable/timepicker_up_focused_holo_light" /> + + <item android:state_pressed="false" + android:state_enabled="false" + android:state_focused="true" + android:drawable="@drawable/timepicker_up_disabled_focused_holo_light" /> + +</selector> diff --git a/core/res/res/layout-xlarge/alert_dialog.xml b/core/res/res/layout-xlarge/alert_dialog.xml index 82b4509..291e1c2 100644 --- a/core/res/res/layout-xlarge/alert_dialog.xml +++ b/core/res/res/layout-xlarge/alert_dialog.xml @@ -29,9 +29,7 @@ android:paddingLeft="3dip" android:paddingRight="1dip" android:majorWeightMin="0.45" - android:minorWeightMin="0.72" - android:majorWeightMax="0.45" - android:minorWeightMax="0.72"> + android:minorWeightMin="0.72"> <LinearLayout android:id="@+id/topPanel" android:layout_width="match_parent" diff --git a/core/res/res/layout-xlarge/alert_dialog_holo.xml b/core/res/res/layout-xlarge/alert_dialog_holo.xml index a01e03a..72b1e31 100644 --- a/core/res/res/layout-xlarge/alert_dialog_holo.xml +++ b/core/res/res/layout-xlarge/alert_dialog_holo.xml @@ -28,9 +28,7 @@ android:paddingLeft="3dip" android:paddingRight="1dip" android:majorWeightMin="0.45" - android:minorWeightMin="0.72" - android:majorWeightMax="0.45" - android:minorWeightMax="0.72"> + android:minorWeightMin="0.72"> <LinearLayout android:id="@+id/topPanel" android:layout_width="match_parent" diff --git a/core/res/res/layout/alert_dialog.xml b/core/res/res/layout/alert_dialog.xml index e3ba634..fd20bd1 100644 --- a/core/res/res/layout/alert_dialog.xml +++ b/core/res/res/layout/alert_dialog.xml @@ -29,8 +29,7 @@ android:paddingLeft="3dip" android:paddingRight="1dip" android:majorWeightMin="0.65" - android:minorWeightMin="0.9" - android:majorWeightMax="0.65"> + android:minorWeightMin="0.9"> <LinearLayout android:id="@+id/topPanel" android:layout_width="match_parent" diff --git a/core/res/res/layout/number_picker.xml b/core/res/res/layout/number_picker.xml index 9241708..44c99cf 100644 --- a/core/res/res/layout/number_picker.xml +++ b/core/res/res/layout/number_picker.xml @@ -19,24 +19,19 @@ <merge xmlns:android="http://schemas.android.com/apk/res/android"> - <NumberPickerButton android:id="@+id/increment" - android:layout_width="match_parent" + <ImageButton android:id="@+id/increment" + android:layout_width="fill_parent" android:layout_height="wrap_content" - android:background="@drawable/timepicker_up_btn" /> + style="?android:attr/numberPickerUpButtonStyle" /> <EditText android:id="@+id/timepicker_input" - android:layout_width="match_parent" + android:layout_width="fill_parent" android:layout_height="wrap_content" - android:gravity="center" - android:singleLine="true" - style="?android:attr/textAppearanceLargeInverse" - android:textColor="@android:color/primary_text_light" - android:textSize="30sp" - android:background="@drawable/timepicker_input" /> + style="?android:attr/numberPickerInputTextStyle" /> - <NumberPickerButton android:id="@+id/decrement" - android:layout_width="match_parent" + <ImageButton android:id="@+id/decrement" + android:layout_width="fill_parent" android:layout_height="wrap_content" - android:background="@drawable/timepicker_down_btn" /> + style="?android:attr/numberPickerDownButtonStyle" /> </merge> diff --git a/core/res/res/layout/time_picker.xml b/core/res/res/layout/time_picker.xml index 6124ea8..fa28842 100644 --- a/core/res/res/layout/time_picker.xml +++ b/core/res/res/layout/time_picker.xml @@ -28,32 +28,46 @@ <!-- hour --> <NumberPicker android:id="@+id/hour" - android:layout_width="70dip" + android:layout_width="48dip" android:layout_height="wrap_content" + android:layout_marginRight="20dip" + android:layout_marginTop="35dip" + android:layout_marginBottom="35dip" android:focusable="true" android:focusableInTouchMode="true" /> - + + <!-- divider --> + <TextView + android:id="@+id/divider" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + /> + <!-- minute --> <NumberPicker android:id="@+id/minute" - android:layout_width="70dip" + android:layout_width="48dip" android:layout_height="wrap_content" - android:layout_marginLeft="5dip" + android:layout_marginLeft="20dip" + android:layout_marginRight="22dip" + android:layout_marginTop="35dip" + android:layout_marginBottom="35dip" android:focusable="true" android:focusableInTouchMode="true" /> - + <!-- AM / PM --> - <Button + <NumberPicker android:id="@+id/amPm" - android:layout_width="wrap_content" + android:layout_width="48dip" android:layout_height="wrap_content" - android:layout_marginTop="43dip" - android:layout_marginLeft="5dip" - android:paddingLeft="20dip" - android:paddingRight="20dip" - style="?android:attr/textAppearanceLargeInverse" - android:textColor="@android:color/primary_text_light_nodisable" + android:layout_marginLeft="22dip" + android:layout_marginTop="35dip" + android:layout_marginBottom="35dip" + android:focusable="true" + android:focusableInTouchMode="true" /> + </LinearLayout> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 006e36a..fd4b32c 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"لقد رسمت نقش إلغاء التأمين بشكل غير صحيح <xliff:g id="NUMBER_0">%d</xliff:g> مرة. بعد <xliff:g id="NUMBER_1">%d</xliff:g> من المحاولات غير الناجحة الأخرى، ستُطالب بإلغاء تأمين الهاتف باستخدام معلومات تسجيل الدخول إلى Google."\n\n" الرجاء المحاولة مرة أخرى خلال <xliff:g id="NUMBER_2">%d</xliff:g> ثانية."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"لقد رسمت نقش إلغاء التأمين بشكل غير صحيح <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="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثانية."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"هل نسيت النمط؟"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"نصيحة: اضغط مرتين للتكبير والتصغير."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 2c7dbeb..e01bb9b 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Нарисувахте неправилно фигурата си за отключване <xliff:g id="NUMBER_0">%d</xliff:g> пъти. След още <xliff:g id="NUMBER_1">%d</xliff:g> неуспешни опита ще ви бъде поискано да отключите телефона, използвайки данните си за вход в Google."\n\n" Моля, опитайте отново след <xliff:g id="NUMBER_2">%d</xliff:g> секунди."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Нарисувахте неправилно фигурата си за отключване <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="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Опитайте отново след <xliff:g id="NUMBER">%d</xliff:g> секунди."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Забравили сте фигурата?"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"Съвет: докоснете двукратно, за да увеличите или намалите мащаба."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 222be36..c32c95a 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Heu 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 us demanarà que desbloquegeu el telèfon amb l\'inici de sessió de Google."\n\n" Torneu-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%d</xliff:g> segons."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Heu 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 us demanarà que desbloquegeu el telèfon amb l\'inici de sessió de Google."\n\n" Torneu-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%d</xliff:g> segons."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Torneu-ho a provar d\'aquí a <xliff:g id="NUMBER">%d</xliff:g> segons."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Heu oblidat el patró?"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"Consell: Piqueu dos cops per ampliar i reduir."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 666032c..f65f585 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"<xliff:g id="NUMBER_0">%d</xliff:g>krát jste nakreslili nesprávné bezpečnostní gesto. "\n\n"Opakujte prosím akci za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Vícekrát (<xliff:g id="NUMBER_0">%d</xliff:g>) jste nesprávně zadali heslo. "\n\n"Zkuste to znovu za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Vícekrát (<xliff:g id="NUMBER_0">%d</xliff:g>) jste nesprávně zadali kód PIN. "\n\n"Zkuste to znovu za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"<xliff:g id="NUMBER_0">%d</xliff:g>krát jste nesprávně nakreslili své bezpečnostní gesto. Po dalších neúspěšných pokusech (<xliff:g id="NUMBER_1">%d</xliff:g>) budete požádáni o odemčení telefonu pomocí přihlášení do účtu Google."\n\n" Akci prosím opakujte za několik sekund (<xliff:g id="NUMBER_2">%d</xliff:g>)."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"<xliff:g id="NUMBER_0">%d</xliff:g>krát jste nesprávně nakreslili své bezpečnostní gesto. Po dalších neúspěšných pokusech (<xliff:g id="NUMBER_1">%d</xliff:g>) budete požádáni o odemčení telefonu pomocí přihlášení do účtu Google."\n\n" Akci prosím opakujte za několik sekund (<xliff:g id="NUMBER_2">%d</xliff:g>)."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Sekundy zbývající do dalšího pokusu: <xliff:g id="NUMBER">%d</xliff:g>."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Zapomněli jste gesto?"</string> @@ -662,6 +663,8 @@ <string name="save_password_label" msgid="6860261758665825069">"Potvrdit"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Tip: Dvojitým klepnutím můžete zobrazení přiblížit nebo oddálit."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Automaticky vyplnit tento formulář"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 36eb27a..8bb762b 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Du har tegnet dit oplåsningsmønster forkert <xliff:g id="NUMBER_0">%d</xliff:g> gange. "\n\n"Prøv igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Du har indtastet din adgangskode forkert <xliff:g id="NUMBER_0">%d</xliff:g> gange. "\n\n"Prøv igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Du har indtastet din pinkode forkert <xliff:g id="NUMBER_0">%d</xliff:g> gange. "\n\n"Prøv igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"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> forsøg mere vil du blive bedt om at låse din telefon op ved hjælp af dit Google-login"\n\n" Prøv igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"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> forsøg mere vil du blive bedt om at låse din telefon op ved hjælp af dit Google-login"\n\n" Prøv igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Prøv igen om <xliff:g id="NUMBER">%d</xliff:g> sekunder."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Har du glemt mønstret?"</string> @@ -662,6 +663,8 @@ <string name="save_password_label" msgid="6860261758665825069">"Bekræft"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Tip: Dobbeltklik for at zoome ind eller ud."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Autofuldfør denne formular"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index fe7ddc7..87e57ce 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Sie haben Ihr Entsperrungsmuster <xliff:g id="NUMBER_0">%d</xliff:g>-mal falsch gezeichnet. "\n\n"Versuchen Sie es in <xliff:g id="NUMBER_1">%d</xliff:g> Sekunden erneut."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Sie haben Ihr Passwort <xliff:g id="NUMBER_0">%d</xliff:g> Mal falsch eingegeben. "\n\n"Versuchen Sie es in <xliff:g id="NUMBER_1">%d</xliff:g> Sekunden erneut."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Sie haben Ihre PIN <xliff:g id="NUMBER_0">%d</xliff:g> Mal falsch eingegeben. "\n\n"Versuchen Sie es in <xliff:g id="NUMBER_1">%d</xliff:g> Sekunden erneut."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"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 Ihrer Google-Anmeldeinformationen zu entsperren. "\n\n"Versuchen Sie es in <xliff:g id="NUMBER_2">%d</xliff:g> Sekunden erneut."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"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 Ihrer Google-Anmeldeinformationen zu entsperren. "\n\n"Versuchen Sie es in <xliff:g id="NUMBER_2">%d</xliff:g> Sekunden erneut."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Versuchen Sie es in <xliff:g id="NUMBER">%d</xliff:g> Sekunden erneut."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Muster vergessen?"</string> @@ -662,6 +663,8 @@ <string name="save_password_label" msgid="6860261758665825069">"Bestätigen"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Tipp: Zum Heranzoomen und Vergrößern zweimal tippen"</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Dieses Formular automatisch ausfüllen"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 2103aef..bbd02f2 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Σχεδιάσατε εσφαλμένα το μοτίβο ξεκλειδώματος<xliff:g id="NUMBER_0">%d</xliff:g> φορές. "\n\n"Προσπαθήστε ξανά σε <xliff:g id="NUMBER_1">%d</xliff:g> δευτερόλεπτα."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Καταχωρίσατε εσφαλμένα τον κωδικό πρόσβασης <xliff:g id="NUMBER_0">%d</xliff:g> φορές. "\n\n"Προσπαθήστε ξανά σε <xliff:g id="NUMBER_1">%d</xliff:g> δευτερόλεπτα."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Καταχωρίσατε εσφαλμένα το PIN σας<xliff:g id="NUMBER_0">%d</xliff:g> φορές. "\n\n"Προσπαθήστε ξανά σε <xliff:g id="NUMBER_1">%d</xliff:g> δευτερόλεπτα."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Σχεδιάσατε το μοτίβο ξεκλειδώματος εσφαλμένα <xliff:g id="NUMBER_0">%d</xliff:g> φορές. Μετά από <xliff:g id="NUMBER_1">%d</xliff:g> ανεπιτυχείς προσπάθειες ακόμη, θα σας ζητηθεί να ξεκλειδώσετε το τηλέφωνό σας με τη χρήση της σύνδεσής σας Google."\n\n" Προσπαθήστε ξανά σε <xliff:g id="NUMBER_2">%d</xliff:g> δευτερόλεπτα."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Σχεδιάσατε το μοτίβο ξεκλειδώματος εσφαλμένα <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="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Προσπαθήστε ξανά σε <xliff:g id="NUMBER">%d</xliff:g> δευτερόλεπτα."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Ξεχάσατε το μοτίβο;"</string> @@ -662,6 +663,8 @@ <string name="save_password_label" msgid="6860261758665825069">"Επιβεβαίωση"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Συμβουλή: διπλό άγγιγμα για μεγέθυνση και σμίκρυνση."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Να γίνει αυτόματη συμπλήρωση αυτής της φόρμας"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index ce642aa..eab891f 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -658,7 +658,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"You have drawn your unlock pattern incorrectly <xliff:g id="NUMBER_0">%d</xliff:g> times. "\n\n"Please try again in <xliff:g id="NUMBER_1">%d</xliff:g> seconds."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"You have entered your password incorrectly <xliff:g id="NUMBER_0">%d</xliff:g> times. "\n\n"Please try again in <xliff:g id="NUMBER_1">%d</xliff:g> seconds."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"You have entered your PIN incorrectly <xliff:g id="NUMBER_0">%d</xliff:g> times. "\n\n"Please try again in <xliff:g id="NUMBER_1">%d</xliff:g> seconds."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"You have drawn your unlock pattern incorrectly <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 your Google sign-in."\n\n" Please try again in <xliff:g id="NUMBER_2">%d</xliff:g> seconds."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"You have drawn your unlock pattern incorrectly <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 your Google sign-in."\n\n" Please try again in <xliff:g id="NUMBER_2">%d</xliff:g> seconds."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Forgotten pattern?"</string> @@ -689,6 +690,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"Tip: double-tap to zoom in and out."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index bd5371f..7fc79b1 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -631,7 +631,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Has extraído incorrectamente tu patrón de desbloqueo <xliff:g id="NUMBER_0">%d</xliff:g> veces. "\n\n"Vuelve a intentarlo en <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Has ingresado tu contraseña de manera incorrecta <xliff:g id="NUMBER_0">%d</xliff:g> veces. "\n\n"Vuelve a intentarlo en <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Has ingresado tu PIN de manera incorrecta <xliff:g id="NUMBER_0">%d</xliff:g> veces. "\n\n"Vuelve a intentarlo en <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Has extraído 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, se te solicitará que desbloquees tu teléfono al iniciar sesión en Google. "\n\n" Vuelve a intentarlo en <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Has extraído 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, se te solicitará que desbloquees tu teléfono al iniciar sesión en Google. "\n\n" Vuelve a intentarlo en <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Vuelve a intentarlo en <xliff:g id="NUMBER">%d</xliff:g> segundos."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"¿Olvidaste el patrón?"</string> @@ -661,6 +662,8 @@ <string name="save_password_label" msgid="6860261758665825069">"Confirmar"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Sugerencia: presiona dos veces para acercar y alejar"</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Autocompletar este formulario"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 5de5c9f..1b28dca 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Has realizado <xliff:g id="NUMBER_0">%d</xliff:g> intentos fallidos de creación de un patrón de desbloqueo. "\n\n"Inténtalo de nuevo dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Has introducido una contraseña incorrecta <xliff:g id="NUMBER_0">%d</xliff:g> veces. "\n\n"Inténtalo de nuevo dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Has introducido un PIN incorrecto <xliff:g id="NUMBER_0">%d</xliff:g> veces. "\n\n"Inténtalo de nuevo dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Has realizado <xliff:g id="NUMBER_0">%d</xliff:g> intentos fallidos de creación del patrón de desbloqueo. Si realizas <xliff:g id="NUMBER_1">%d</xliff:g> intentos fallidos más, se te pedirá que desbloquees el teléfono con tus credenciales de acceso de Google."\n\n" Espera <xliff:g id="NUMBER_2">%d</xliff:g> segundos e inténtalo de nuevo."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Has realizado <xliff:g id="NUMBER_0">%d</xliff:g> intentos fallidos de creación del patrón de desbloqueo. Si realizas <xliff:g id="NUMBER_1">%d</xliff:g> intentos fallidos más, se te pedirá que desbloquees el teléfono con tus credenciales de acceso de Google."\n\n" Espera <xliff:g id="NUMBER_2">%d</xliff:g> segundos e inténtalo de nuevo."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Espera <xliff:g id="NUMBER">%d</xliff:g> segundos y vuelve a intentarlo."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"¿Has olvidado el patrón?"</string> @@ -662,6 +663,8 @@ <string name="save_password_label" msgid="6860261758665825069">"Confirmar"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Sugerencia: toca dos veces para ampliar o reducir."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Autocompletar este formulario"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index cd67c09..cbb5fe3 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"شما الگوی بازگشایی قفل خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه کشیده اید. <xliff:g id="NUMBER_1">%d</xliff:g> تلاش های ناموفق بیشتر سبب می شود از شما خواسته شود که برای بازگشایی قفل گوشی خود به برنامه Google وارد شوید."\n\n" لطفاً پس از <xliff:g id="NUMBER_2">%d</xliff:g> ثانیه دوباره امتحان کنید."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"شما الگوی بازگشایی قفل خود را <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="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"در <xliff:g id="NUMBER">%d</xliff:g> ثانیه دوباره امتحان کنید."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"الگو را فراموش کرده اید؟"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"نکته: برای انجام بزرگنمایی مثبت و منفی، دو بار ضربه بزنید."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 7329bed..3390669 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"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 Google-sisäänkirjautumisen avulla."\n\n" Yritä uudelleen <xliff:g id="NUMBER_2">%d</xliff:g> sekunnin kuluttua."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"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 Google-sisäänkirjautumisen avulla."\n\n" Yritä uudelleen <xliff:g id="NUMBER_2">%d</xliff:g> sekunnin kuluttua."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Yritä uudelleen <xliff:g id="NUMBER">%d</xliff:g> sekunnin kuluttua."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Unohditko mallin?"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"Vinkki: lähennä ja loitonna kaksoisnapauttamalla"</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index fa97fc0..f618070 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Vous avez mal reproduit le schéma de déverrouillage <xliff:g id="NUMBER_0">%d</xliff:g> fois. "\n\n"Veuillez réessayer dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Vous avez saisi un mot de passe incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. "\n\n"Veuillez réessayer dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Vous avez saisi un code PIN incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. "\n\n"Veuillez réessayer dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Vous avez mal saisi le schéma de déverrouillage <xliff:g id="NUMBER_0">%d</xliff:g> fois. Au bout de <xliff:g id="NUMBER_1">%d</xliff:g> tentatives supplémentaires, vous devrez débloquer votre téléphone à l\'aide de votre identifiant Google."\n\n"Merci de réessayer dans <xliff:g id="NUMBER_2">%d</xliff:g> secondes."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Vous avez mal saisi le schéma de déverrouillage <xliff:g id="NUMBER_0">%d</xliff:g> fois. Au bout de <xliff:g id="NUMBER_1">%d</xliff:g> tentatives supplémentaires, vous devrez débloquer votre téléphone à l\'aide de votre identifiant Google."\n\n"Merci de réessayer dans <xliff:g id="NUMBER_2">%d</xliff:g> secondes."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> secondes."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Schéma oublié ?"</string> @@ -662,6 +663,8 @@ <string name="save_password_label" msgid="6860261758665825069">"Confirmer"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Conseil : Appuyez deux fois pour effectuer un zoom avant ou arrière."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Permettre le remplissage automatique du formulaire"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-he/strings.xml b/core/res/res/values-he/strings.xml index 9792bd9..c5d945c 100644 --- a/core/res/res/values-he/strings.xml +++ b/core/res/res/values-he/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"ציירת את קו ביטול הנעילה באופן שגוי <xliff:g id="NUMBER_0">%d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות כושלים נוספים, תתבקש לבטל את נעילה הטלפון באמצעות פרטי הכניסה שלך ב-Google."\n\n" נסה שוב בעוד <xliff:g id="NUMBER_2">%d</xliff:g> שניות."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"ציירת את קו ביטול הנעילה באופן שגוי <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="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"נסה שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"שכחת את הקו?"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"טיפש: הקש פעמיים כדי להתקרב ולהתרחק."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 1116841..bc6d451 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Netočno ste iscrtali uzorak za otključavanje <xliff:g id="NUMBER_0">%d</xliff:g> puta. Nakon još <xliff:g id="NUMBER_1">%d</xliff:g> neuspješna pokušaja, morat ćete otključati telefon pomoću Google prijave."\n\n" Pokušajte ponovo za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Netočno ste iscrtali uzorak za otključavanje <xliff:g id="NUMBER_0">%d</xliff:g> puta. Nakon još <xliff:g id="NUMBER_1">%d</xliff:g> neuspješna pokušaja, morat ćete otključati telefon pomoću Google prijave."\n\n" Pokušajte ponovo za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Pokušajte ponovno za <xliff:g id="NUMBER">%d</xliff:g> s."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Zaboravili ste uzorak?"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"Savjet: Dvaput dotaknite za povećanje i smanjivanje."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 5f6dddd..36aea65 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Helytelenül rajzolta le a feloldási mintát <xliff:g id="NUMBER_0">%d</xliff:g> alkalommal. További <xliff:g id="NUMBER_1">%d</xliff:g> sikertelen kísérlet után a Google rendszerében használt bejelentkezési adataival kell feloldania a telefonját."\n\n" Kérjük, próbálja újra <xliff:g id="NUMBER_2">%d</xliff:g> másodperc múlva."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Helytelenül rajzolta le a feloldási mintát <xliff:g id="NUMBER_0">%d</xliff:g> alkalommal. További <xliff:g id="NUMBER_1">%d</xliff:g> sikertelen kísérlet után a Google rendszerében használt bejelentkezési adataival 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="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Próbálkozzon újra <xliff:g id="NUMBER">%d</xliff:g> másodperc múlva."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Elfelejtette a mintát?"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"Tipp: érintse meg kétszer a nagyításhoz és kicsinyítéshez."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-id/strings.xml b/core/res/res/values-id/strings.xml index 1de0f41..2d07b33 100644 --- a/core/res/res/values-id/strings.xml +++ b/core/res/res/values-id/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Anda telah salah menggambar pola pembuka kunci sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. Setelah <xliff:g id="NUMBER_1">%d</xliff:g> upaya gagal lagi, Anda akan diminta membuka kunci ponsel menggunakan info masuk Google."\n\n" Harap coba lagi dalam <xliff:g id="NUMBER_2">%d</xliff:g> detik."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Anda telah salah menggambar pola pembuka kunci sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. Setelah <xliff:g id="NUMBER_1">%d</xliff:g> upaya gagal lagi, Anda akan diminta membuka kunci ponsel menggunakan info masuk Google."\n\n" Harap coba lagi dalam <xliff:g id="NUMBER_2">%d</xliff:g> detik."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Coba lagi dalam <xliff:g id="NUMBER">%d</xliff:g> detik."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Lupa pola?"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"Kiat: ketuk dua kali untuk memperbesar dan memperkecil."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 89d0a32..238a748 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"<xliff:g id="NUMBER_0">%d</xliff:g> tentativi di inserimento della sequenza di sblocco. "\n\n"Riprova fra <xliff:g id="NUMBER_1">%d</xliff:g> secondi."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"<xliff:g id="NUMBER_0">%d</xliff:g> tentativi errati di inserimento della password. "\n\n"Riprova tra <xliff:g id="NUMBER_1">%d</xliff:g> secondi."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"<xliff:g id="NUMBER_0">%d</xliff:g> tentativi errati di inserimento del PIN. "\n\n"Riprova tra <xliff:g id="NUMBER_1">%d</xliff:g> secondi."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"<xliff:g id="NUMBER_0">%d</xliff:g> tentativi 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 tramite i dati di accesso di Google."\n\n"Riprova fra <xliff:g id="NUMBER_2">%d</xliff:g> secondi."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"<xliff:g id="NUMBER_0">%d</xliff:g> tentativi 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 tramite i dati di accesso di Google."\n\n"Riprova fra <xliff:g id="NUMBER_2">%d</xliff:g> secondi."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Riprova fra <xliff:g id="NUMBER">%d</xliff:g> secondi."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Hai dimenticato la sequenza?"</string> @@ -662,6 +663,8 @@ <string name="save_password_label" msgid="6860261758665825069">"Conferma"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Suggerimento. Tocca due volte per aumentare/ridurre lo zoom."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Compila automaticamente il modulo"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index dcbcdc2..75d3722 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"ロック解除のパターンは<xliff:g id="NUMBER_0">%d</xliff:g>回とも正しく指定されていません。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒後にもう一度指定してください。"</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"入力したパスワードは<xliff:g id="NUMBER_0">%d</xliff:g>回とも正しくありませんでした。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒後にもう一度入力してください。"</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"入力したPINは<xliff:g id="NUMBER_0">%d</xliff:g>回とも正しくありませんでした。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒後にもう一度入力してください。"</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"指定したパターンは<xliff:g id="NUMBER_0">%d</xliff:g>回とも正しくありません。あと<xliff:g id="NUMBER_1">%d</xliff:g>回指定に失敗すると、携帯電話のロックの解除にGoogleへのログインが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒後にもう一度指定してください。"</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"指定したパターンは<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="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"<xliff:g id="NUMBER">%d</xliff:g>秒後にやり直してください。"</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"パターンを忘れた場合"</string> @@ -662,6 +663,8 @@ <string name="save_password_label" msgid="6860261758665825069">"確認"</string> <string name="double_tap_toast" msgid="1068216937244567247">"ヒント: ダブルタップで拡大/縮小できます。"</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"このフォームを自動入力"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 8fe117f..1ed8492 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"잠금해제 패턴을 <xliff:g id="NUMBER_0">%d</xliff:g>회 잘못 그렸습니다. "\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>초 후에 다시 시도하세요."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"비밀번호를 <xliff:g id="NUMBER_0">%d</xliff:g>회 잘못 입력했습니다. "\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>초 후에 다시 시도해 주세요."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"PIN을 <xliff:g id="NUMBER_0">%d</xliff:g>회 잘못 입력했습니다. "\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>초 후에 다시 시도해 주세요."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"잠금해제 패턴을 <xliff:g id="NUMBER_0">%d</xliff:g>회 잘못 그렸습니다. <xliff:g id="NUMBER_1">%d</xliff:g>회 더 실패하면 Google 로그인을 통해 휴대전화를 잠금해제하도록 요청됩니다. "\n\n" <xliff:g id="NUMBER_2">%d</xliff:g>초 후에 다시 시도하세요."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"잠금해제 패턴을 <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="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"<xliff:g id="NUMBER">%d</xliff:g>초 후에 다시 시도하세요."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"패턴을 잊으셨나요?"</string> @@ -662,6 +663,8 @@ <string name="save_password_label" msgid="6860261758665825069">"확인"</string> <string name="double_tap_toast" msgid="1068216937244567247">"도움말: 축소/확대하려면 두 번 누릅니다."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"양식 자동완성"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-large/config.xml b/core/res/res/values-large/config.xml new file mode 100644 index 0000000..05dd050 --- /dev/null +++ b/core/res/res/values-large/config.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2010, 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. +*/ +--> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- see comment in values/config.xml --> + <dimen name="config_prefDialogWidth">440dp</dimen> +</resources> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 6378c62..41d9fbd 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Neteisingai nurodėte savo atrakinimo modelį <xliff:g id="NUMBER_0">%d</xliff:g> kartus (-ų). Po dar <xliff:g id="NUMBER_1">%d</xliff:g> nesėkmingų bandymų būsite paprašyti atrakinti telefoną naudojant „Google“ prisijungimo duomenis."\n\n" Bandykite dar kartą po <xliff:g id="NUMBER_2">%d</xliff:g> sek."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Neteisingai nurodėte savo atrakinimo modelį <xliff:g id="NUMBER_0">%d</xliff:g> kartus (-ų). Po dar <xliff:g id="NUMBER_1">%d</xliff:g> nesėkmingų bandymų būsite paprašyti atrakinti telefoną naudojant „Google“ prisijungimo duomenis."\n\n" Bandykite dar kartą po <xliff:g id="NUMBER_2">%d</xliff:g> sek."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Bandyti dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sek."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Pamiršote modelį?"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"Patarimas: bakstelėkite du kartus, kad padidintumėte ar sumažintumėte mastelį."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 35118ec..d706ed5 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Atbloķēšanas kombinācija tika nepareizi uzzīmēta <xliff:g id="NUMBER_0">%d</xliff:g> reizi(-es). Pēc vēl <xliff:g id="NUMBER_1">%d</xliff:g> neveiksmīgiem mēģinājumiem tālrunis būs jāatbloķē, izmantojot Google pierakstīšanos."\n\n" Lūdzu, mēģiniet vēlreiz pēc <xliff:g id="NUMBER_2">%d</xliff:g> sekundes(-ēm)."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Atbloķēšanas kombinācija tika nepareizi uzzīmēta <xliff:g id="NUMBER_0">%d</xliff:g> reizi(-es). Pēc vēl <xliff:g id="NUMBER_1">%d</xliff:g> neveiksmīgiem mēģinājumiem tālrunis būs jāatbloķē, izmantojot Google pierakstīšanos."\n\n" Lūdzu, mēģiniet vēlreiz pēc <xliff:g id="NUMBER_2">%d</xliff:g> sekundes(-ēm)."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Mēģiniet vēlreiz pēc <xliff:g id="NUMBER">%d</xliff:g> sekundes(-ēm)."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Vai aizmirsāt kombināciju?"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"Padoms: divreiz pieskarieties, lai tuvinātu un tālinātu."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index cdc3f0a..96d9c32 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%d</xliff:g> times. "\n\n"Please try again in <xliff:g id="NUMBER_1">%d</xliff:g> seconds."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Du har oppgitt feil passord <xliff:g id="NUMBER_0">%d</xliff:g> ganger. "\n\n"Prøv igjen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Du har oppgitt feil personlig kode <xliff:g id="NUMBER_0">%d</xliff:g> ganger. "\n\n"Prøv igjen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"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 your Google sign-in."\n\n" Please try again in <xliff:g id="NUMBER_2">%d</xliff:g> seconds."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"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 your Google sign-in."\n\n" Please try again in <xliff:g id="NUMBER_2">%d</xliff:g> seconds."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Prøv igjen om <xliff:g id="NUMBER">%d</xliff:g> sekunder."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Glemt mønsteret?"</string> @@ -662,6 +663,8 @@ <string name="save_password_label" msgid="6860261758665825069">"Bekreft"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Dobbelttrykk for å zoome inn og ut."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Fyll ut dette skjemaet automatisk"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 12034f2..8998fba 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"U heeft uw ontgrendelingspatroon <xliff:g id="NUMBER_0">%d</xliff:g> keer onjuist getekend. "\n\n"Probeer het over <xliff:g id="NUMBER_1">%d</xliff:g> seconden opnieuw."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"U heeft uw wachtwoord <xliff:g id="NUMBER_0">%d</xliff:g> keer onjuist ingevoerd. "\n\n"Probeer het over <xliff:g id="NUMBER_1">%d</xliff:g> seconden opnieuw."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"U heeft uw PIN-code <xliff:g id="NUMBER_0">%d</xliff:g> keer onjuist ingevoerd. "\n\n"Probeer het over <xliff:g id="NUMBER_1">%d</xliff:g> seconden opnieuw."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"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 om uw telefoon te ontgrendelen met uw Google aanmelding."\n\n" Probeer het over <xliff:g id="NUMBER_2">%d</xliff:g> seconden opnieuw."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"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 om uw telefoon te ontgrendelen met uw Google aanmelding."\n\n" Probeer het over <xliff:g id="NUMBER_2">%d</xliff:g> seconden opnieuw."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Probeer het over <xliff:g id="NUMBER">%d</xliff:g> seconden opnieuw."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Patroon vergeten?"</string> @@ -662,6 +663,8 @@ <string name="save_password_label" msgid="6860261758665825069">"Bevestigen"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Tip: tik tweemaal om in of uit te zoomen."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Dit formulier automatisch aanvullen"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 089026f..ec80f83 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Wzór odblokowania został nieprawidłowo narysowany <xliff:g id="NUMBER_0">%d</xliff:g> razy. "\n\n"Spróbuj ponownie za <xliff:g id="NUMBER_1">%d</xliff:g> sekund."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Hasło zostało nieprawidłowo wprowadzone <xliff:g id="NUMBER_0">%d</xliff:g> razy. "\n\n"Spróbuj ponownie za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Niepoprawnie wprowadzono kod PIN <xliff:g id="NUMBER_0">%d</xliff:g> razy. "\n\n"Spróbuj ponownie za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Wzór odblokowania został narysowany nieprawidłowo <xliff:g id="NUMBER_0">%d</xliff:g> razy. Po kolejnych <xliff:g id="NUMBER_1">%d</xliff:g> nieudanych próbach telefon trzeba będzie odblokować przez zalogowanie na koncie Google."\n\n" Spróbuj ponownie za <xliff:g id="NUMBER_2">%d</xliff:g> sekund."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Wzór odblokowania został narysowany nieprawidłowo <xliff:g id="NUMBER_0">%d</xliff:g> razy. Po kolejnych <xliff:g id="NUMBER_1">%d</xliff:g> nieudanych próbach telefon trzeba będzie odblokować przez zalogowanie na koncie Google."\n\n" Spróbuj ponownie za <xliff:g id="NUMBER_2">%d</xliff:g> sekund."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Spróbuj ponownie za <xliff:g id="NUMBER">%d</xliff:g> sekund."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Zapomniałeś wzoru?"</string> @@ -662,6 +663,8 @@ <string name="save_password_label" msgid="6860261758665825069">"Potwierdź"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Wskazówka: dotknij dwukrotnie, aby powiększyć lub pomniejszyć."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Wypełnij ten formularz automatycznie"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 3f270a0..5e9b0a4 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Efectuou incorrectamente o seu padrão de desbloqueio <xliff:g id="NUMBER_0">%d</xliff:g> vezes. "\n\n"Tente novamente dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Introduziu incorrectamente a palavra-passe <xliff:g id="NUMBER_0">%d</xliff:g> vezes. "\n\n"Tente novamente dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Introduziu incorrectamente o PIN <xliff:g id="NUMBER_0">%d</xliff:g> vezes. "\n\n"Tente novamente dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Efectuou incorrectamente o seu padrão de desbloqueio <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Após outras <xliff:g id="NUMBER_1">%d</xliff:g> tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telefone utilizando o seu início de sessão no Google."\n\n" Tente novamente dentro de <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Efectuou incorrectamente o seu padrão de desbloqueio <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Após outras <xliff:g id="NUMBER_1">%d</xliff:g> tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telefone utilizando o seu início de sessão no Google."\n\n" Tente novamente dentro de <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Tente novamente dentro de <xliff:g id="NUMBER">%d</xliff:g> segundos."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Esqueceu-se do padrão?"</string> @@ -662,6 +663,8 @@ <string name="save_password_label" msgid="6860261758665825069">"Confirmar"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Sugestão: toque duas vezes para aumentar ou diminuir o zoom."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Preenchimento automático deste formulário"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 368132e..ad8f64a 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Você desenhou incorretamente o seu padrão de desbloqueio <xliff:g id="NUMBER_0">%d</xliff:g> vezes. "\n\n"Tente novamente em <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Você inseriu incorretamente a sua senha <xliff:g id="NUMBER_0">%d</xliff:g> vezes. "\n\n"Tente novamente em <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Você digitou incorretamente o seu PIN <xliff:g id="NUMBER_0">%d</xliff:g> vezes. "\n\n"Tente novamente em <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Você desenhou o seu padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas incorretas e você receberá uma solicitação para desbloquear o seu telefone usando o seu login do Google."\n\n" Tente novamente em <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Você desenhou o seu padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas incorretas e você receberá uma solicitação para desbloquear o seu telefone usando o seu login do Google."\n\n" Tente novamente em <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundos."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Esqueceu o padrão?"</string> @@ -662,6 +663,8 @@ <string name="save_password_label" msgid="6860261758665825069">"Confirmar"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Dica: toque duas vezes para aumentar e diminuir o zoom."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Preencher automaticamente este formulário"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml index e8f7298..527e4e1 100644 --- a/core/res/res/values-rm/strings.xml +++ b/core/res/res/values-rm/strings.xml @@ -659,7 +659,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Vus avais dissegnà fallà <xliff:g id="NUMBER_0">%d</xliff:g> giadas Voss schema da debloccaziun. "\n\n"Empruvai anc ina giada en <xliff:g id="NUMBER_1">%d</xliff:g> secundas."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Vus avais endatà <xliff:g id="NUMBER_0">%d</xliff:g> giadas in pled-clav nuncorrect. "\n\n"Empruvai anc ina giada en <xliff:g id="NUMBER_1">%d</xliff:g> secundas."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Vus avais endatà <xliff:g id="NUMBER_0">%d</xliff:g> giadas in code PIN nuncorrect. "\n\n"Empruvai anc ina giada en <xliff:g id="NUMBER_1">%d</xliff:g> secundas."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Vus avais dissegnà <xliff:g id="NUMBER_0">%d</xliff:g> giadas in schema da debloccaziun nuncorrect. Suenter <xliff:g id="NUMBER_1">%d</xliff:g> ulteriuras emprovas senza success As dumonda il sistem da debloccar il telefonin cun agid da Vossas infurmaziuns d\'annunzia da Google."\n\n"Empruvai per plaschair anc ina giada en <xliff:g id="NUMBER_2">%d</xliff:g> secundas."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Vus avais dissegnà <xliff:g id="NUMBER_0">%d</xliff:g> giadas in schema da debloccaziun nuncorrect. Suenter <xliff:g id="NUMBER_1">%d</xliff:g> ulteriuras emprovas senza success As dumonda il sistem da debloccar il telefonin cun agid da Vossas infurmaziuns d\'annunzia da Google."\n\n"Empruvai per plaschair anc ina giada en <xliff:g id="NUMBER_2">%d</xliff:g> secundas."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Empruvar anc ina giada en <xliff:g id="NUMBER">%d</xliff:g> secundas."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Emblidà il schema?"</string> @@ -690,6 +691,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"Tip: Smatgar duas giadas per zoomar pli datiers u zoomar pli lontan."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index e1a31f0..486591c 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Aţi desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%d</xliff:g> de ori. După <xliff:g id="NUMBER_1">%d</xliff:g> încercări nereuşite, vi se va solicita să deblocaţi telefonul cu ajutorul datelor de conectare la Google."\n\n" Încercaţi din nou în <xliff:g id="NUMBER_2">%d</xliff:g> (de) secunde."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Aţi desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%d</xliff:g> de ori. După <xliff:g id="NUMBER_1">%d</xliff:g> încercări nereuşite, vi se va solicita să deblocaţi telefonul cu ajutorul datelor de conectare la Google."\n\n" Încercaţi din nou în <xliff:g id="NUMBER_2">%d</xliff:g> (de) secunde."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Încercaţi din nou peste <xliff:g id="NUMBER">%d</xliff:g> (de) secunde."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Aţi uitat modelul?"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"Sfat: apăsaţi de două ori pentru a mări şi a micşora."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 0ef23ee..976a006 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Количество неудачных попыток ввода графического ключа разблокировки: <xliff:g id="NUMBER_0">%d</xliff:g>. "\n\n"Повторите попытку через <xliff:g id="NUMBER_1">%d</xliff:g> с."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Количество неудачных попыток ввода пароля: <xliff:g id="NUMBER_0">%d</xliff:g>. "\n\n"Повторите попытку через <xliff:g id="NUMBER_1">%d</xliff:g> с."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Количество неудачных попыток ввода PIN-кода: <xliff:g id="NUMBER_0">%d</xliff:g>. "\n\n"Повторите попытку через <xliff:g id="NUMBER_1">%d</xliff:g> с."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Количество неудачных попыток ввода графического ключа разблокировки: <xliff:g id="NUMBER_0">%d</xliff:g>. После <xliff:g id="NUMBER_1">%d</xliff:g> неудачных попыток вам будет предложено разблокировать телефон с помощью учетных данных Google. "\n\n" Повторите попытку через <xliff:g id="NUMBER_2">%d</xliff:g> с."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Количество неудачных попыток ввода графического ключа разблокировки: <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="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> с."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Забыли графический ключ?"</string> @@ -656,12 +657,14 @@ <string name="factorytest_not_system" msgid="4435201656767276723">"Действие FACTORY_TEST поддерживается только для пакетов, установленных в /system/app."</string> <string name="factorytest_no_action" msgid="872991874799998561">"Пакет, обеспечивающий действие FACTORY_TEST, не найден."</string> <string name="factorytest_reboot" msgid="6320168203050791643">"Перезагрузка"</string> - <string name="js_dialog_title" msgid="8143918455087008109">"На странице по адресу \"<xliff:g id="TITLE">%s</xliff:g>\" сказано:"</string> + <string name="js_dialog_title" msgid="8143918455087008109">"Подтвердите действие на <xliff:g id="TITLE">%s</xliff:g>"</string> <string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string> <string name="js_dialog_before_unload" msgid="1901675448179653089">"Перейти с этой страницы?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Нажмите \"ОК\", чтобы продолжить, или \"Отмена\", чтобы остаться на текущей странице."</string> <string name="save_password_label" msgid="6860261758665825069">"Подтвердите"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Совет: нажмите дважды, чтобы увеличить и уменьшить масштаб."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Заполнить форму автоматически"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 77dc235..7e21ae5 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"<xliff:g id="NUMBER_0">%d</xliff:g>-krát ste nesprávne nakreslili svoj bezpečnostný vzor. Po ďalších neúspešných pokusoch (<xliff:g id="NUMBER_1">%d</xliff:g>) budete požiadaní o odblokovanie telefónu pomocou prihlásenia do služby Google."\n\n" Skúste to znova o niekoľko sekúnd (<xliff:g id="NUMBER_2">%d</xliff:g>)."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"<xliff:g id="NUMBER_0">%d</xliff:g>-krát ste nesprávne nakreslili svoj bezpečnostný vzor. Po ďalších neúspešných pokusoch (<xliff:g id="NUMBER_1">%d</xliff:g>) budete požiadaní o odblokovanie telefónu pomocou prihlásenia do služby Google."\n\n" Skúste to znova o niekoľko sekúnd (<xliff:g id="NUMBER_2">%d</xliff:g>)."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Počet sekúnd zostávajúcich do ďalšieho pokusu: <xliff:g id="NUMBER">%d</xliff:g>."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Zabudli ste vzor?"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"Tip: Dvojitým klepnutím môžete zobrazenie priblížiť alebo oddialiť."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index fba50c0..68eb899 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Vzorec za odklepanje ste nepravilno vnesli <xliff:g id="NUMBER_0">%d</xliff:g>-krat. Po <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> sekund."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Vzorec za odklepanje ste nepravilno vnesli <xliff:g id="NUMBER_0">%d</xliff:g>-krat. Po <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> sekund."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> sekund."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Ali ste pozabili vzorec?"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"Namig: tapnite dvakrat, če želite povečati ali pomanjšati."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 58e4700..5cf7223 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"<xliff:g id="NUMBER_0">%d</xliff:g> пута сте нетачно унели шаблон за откључавање. Након још <xliff:g id="NUMBER_1">%d</xliff:g> неуспешна(их) покушаја, од вас ће бити затражено да откључате телефон помоћу података за пријављивање на Google."\n\n" Покушајте поново за <xliff:g id="NUMBER_2">%d</xliff:g> секунде(и)."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"<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="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Покушајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунде(и)."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Заборавили сте шаблон?"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"Савет: Додирните двапут да бисте увећали и умањили приказ."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 8ac9273..e5de6ad 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%d</xliff:g> gånger. "\n\n"Försök igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Du har angett fel lösenord <xliff:g id="NUMBER_0">%d</xliff:g> gånger. "\n\n"Försök igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Du har angett din PIN-kod fel <xliff:g id="NUMBER_0">%d</xliff:g> gånger. "\n\n"Försök igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%d</xliff:g> gånger. Efter <xliff:g id="NUMBER_1">%d</xliff:g> försök till kommer du att uppmanas att låsa upp telefonen med din Google-inloggning."\n\n" Försök igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%d</xliff:g> gånger. Efter <xliff:g id="NUMBER_1">%d</xliff:g> försök till kommer du att uppmanas att låsa upp telefonen med din Google-inloggning."\n\n" Försök igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Försök igen om <xliff:g id="NUMBER">%d</xliff:g> sekunder."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Glömt ditt grafiska lösenord?"</string> @@ -662,6 +663,8 @@ <string name="save_password_label" msgid="6860261758665825069">"Bekräfta"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Tips! Dubbelklicka om du vill zooma in eller ut."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Autofyll formuläret"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index ec7df1e..0113275 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"คุณวาดรูปแบบการปลดล็อกไม่ถูกต้อง <xliff:g id="NUMBER_0">%d</xliff:g> ครั้งหากทำไม่สำเร็จอีก <xliff:g id="NUMBER_1">%d</xliff:g> ครั้ง ระบบจะขอให้คุณปลดล็อกโทรศัพท์โดยใช้การลงชื่อเข้าใช้ Google"\n\n"โปรดลองอีกครั้งในอีก <xliff:g id="NUMBER_2">%d</xliff:g> วินาที"</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"คุณวาดรูปแบบการปลดล็อกไม่ถูกต้อง <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="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"ลองใหม่อีกครั้งใน <xliff:g id="NUMBER">%d</xliff:g> วินาที"</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"ลืมรูปแบบหรือ"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"เคล็ดลับ: แตะสองครั้งเพื่อขยายและย่อ"</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 12581ed..0e28a1a 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Naguhit mo nang mali 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> higit pang hindi matagumpay na pagtatangka, hihingin sa iyong i-unlock ang iyong telepono gamit ang iyong pag-sign-in sa Google."\n\n" Pakisubukang muli sa loob ng <xliff:g id="NUMBER_2">%d</xliff:g> (na) segundo."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Naguhit mo nang mali 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> higit pang hindi matagumpay na pagtatangka, hihingin sa iyong i-unlock ang iyong telepono gamit ang iyong pag-sign-in sa Google."\n\n" Pakisubukang muli sa loob ng <xliff:g id="NUMBER_2">%d</xliff:g> (na) segundo."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Subukang muli sa loob ng <xliff:g id="NUMBER">%d</xliff:g> (na) segundo."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Nakalimutan ang pattern?"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"Tip: mag-double-tap upang mag-zoom in at out."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 90dd16d..a1abbeb 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Kilit açma deseninizi <xliff:g id="NUMBER_0">%d</xliff:g> kez yanlış çizdiniz. "\n\n"Lütfen <xliff:g id="NUMBER_1">%d</xliff:g> saniye içinde yeniden deneyin."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Şifrenizi <xliff:g id="NUMBER_0">%d</xliff:g> kez yanlış girdiniz. "\n\n"Lütfen <xliff:g id="NUMBER_1">%d</xliff:g> saniye içinde yeniden deneyin."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"PIN\'inizi <xliff:g id="NUMBER_0">%d</xliff:g> kez yanlış girdiniz. "\n\n"Lütfen <xliff:g id="NUMBER_1">%d</xliff:g> saniye içinde yeniden deneyin."</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"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 Google oturum açma bilgilerinizi kullanarak açmanız istenir."\n\n" Lütfen <xliff:g id="NUMBER_2">%d</xliff:g> saniye içinde yeniden deneyin."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"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 Google oturum açma bilgilerinizi kullanarak açmanız istenir."\n\n" Lütfen <xliff:g id="NUMBER_2">%d</xliff:g> saniye içinde yeniden deneyin."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"<xliff:g id="NUMBER">%d</xliff:g> saniye içinde yeniden deneyin."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Deseni unuttunuz mu?"</string> @@ -662,6 +663,8 @@ <string name="save_password_label" msgid="6860261758665825069">"Onayla"</string> <string name="double_tap_toast" msgid="1068216937244567247">"İpucu: Yakınlaştırmak ve uzaklaştırmak için iki kez hafifçe vurun."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Bu formu otomatik doldur"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index a70f082..f9eacb9 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Неправильно намал. ключ розблокування стільки разів: <xliff:g id="NUMBER_0">%d</xliff:g>. Ваш телефон потрібно буде розблок-ти за допомогою входу в Google після стількох додатк. неуспішних спроб: <xliff:g id="NUMBER_1">%d</xliff:g>."\n\n" Спробуйте ще через <xliff:g id="NUMBER_2">%d</xliff:g> сек."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Неправильно намал. ключ розблокування стільки разів: <xliff:g id="NUMBER_0">%d</xliff:g>. Ваш телефон потрібно буде розблок-ти за допомогою входу в Google після стількох додатк. неуспішних спроб: <xliff:g id="NUMBER_1">%d</xliff:g>."\n\n" Спробуйте ще через <xliff:g id="NUMBER_2">%d</xliff:g> сек."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Спробуйте ще через <xliff:g id="NUMBER">%d</xliff:g> сек."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Забули ключ?"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"Порада: двічі нат. для збіл. або змен."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 57d5ea1..e33b7be 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -667,7 +667,8 @@ <skip /> <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) --> <skip /> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Bạn đã vẽ không chính xác hình mở khoá của mình <xliff:g id="NUMBER_0">%d</xliff:g> lần. Sau <xliff:g id="NUMBER_1">%d</xliff:g> lần thử không thành công khác, bạn sẽ được yêu cầu mở khoá điện thoại bằng thông tin đăng nhập Google của mình."\n\n" Vui lòng thử lại trong <xliff:g id="NUMBER_2">%d</xliff:g> giây."</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Bạn đã vẽ không chính xác hình mở khoá của mình <xliff:g id="NUMBER_0">%d</xliff:g> lần. Sau <xliff:g id="NUMBER_1">%d</xliff:g> lần thử không thành công khác, bạn sẽ được yêu cầu mở khoá điện thoại bằng thông tin đăng nhập Google của mình."\n\n" Vui lòng thử lại trong <xliff:g id="NUMBER_2">%d</xliff:g> giây."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Hãy thử lại sau <xliff:g id="NUMBER">%d</xliff:g> giây."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Đã quên hình?"</string> @@ -698,6 +699,8 @@ <string name="double_tap_toast" msgid="1068216937244567247">"Mẹo: nhấn đúp để phóng to và thu nhỏ."</string> <!-- no translation found for autofill_this_form (1272247532604569872) --> <skip /> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> <skip /> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> diff --git a/core/res/res/values-xlarge/config.xml b/core/res/res/values-xlarge/config.xml index 8ed1c3e..4c8bbe6 100644 --- a/core/res/res/values-xlarge/config.xml +++ b/core/res/res/values-xlarge/config.xml @@ -33,5 +33,8 @@ <!-- see comment in values/config.xml --> <integer name="config_longPressOnHomeBehavior">0</integer> + <!-- see comment in values/config.xml --> + <dimen name="config_prefDialogWidth">580dp</dimen> + </resources> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 9dc64a4..031d488 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"您已经 <xliff:g id="NUMBER_0">%d</xliff:g> 次绘错了自己的解锁图案。"\n\n"请在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒后重试。"</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"您已经 <xliff:g id="NUMBER_0">%d</xliff:g> 次错误地输入了密码。"\n\n"请在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒后重试。"</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"您已经 <xliff:g id="NUMBER_0">%d</xliff:g> 次错误地输入了 PIN。"\n\n"请在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒后重试。"</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"您已经 <xliff:g id="NUMBER_0">%d</xliff:g> 次绘错了自己的解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次后仍不成功,系统会要求您使用自己的 Google 登录信息解锁手机。"\n\n"请在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒后重试。"</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"您已经 <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="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"<xliff:g id="NUMBER">%d</xliff:g> 秒后重试。"</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"忘记了图案?"</string> @@ -662,6 +663,8 @@ <string name="save_password_label" msgid="6860261758665825069">"确认"</string> <string name="double_tap_toast" msgid="1068216937244567247">"提示:点按两次可放大和缩小。"</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"自动填充此表单"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 37f9d58..c7cfe8e 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -632,7 +632,8 @@ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"畫出解鎖圖形已錯誤 <xliff:g id="NUMBER_0">%d</xliff:g> 次。"\n\n" 請在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後再嘗試。"</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"您已 <xliff:g id="NUMBER_0">%d</xliff:g> 次輸入不正確的密碼。"\n\n"請於 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後再試一次。"</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"您已 <xliff:g id="NUMBER_0">%d</xliff:g> 次輸入不正確的 PIN。"\n\n"請於 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後再試一次。"</string> - <!-- outdated translation 3351013842320127827 --> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"畫出解鎖圖形已錯誤 <xliff:g id="NUMBER_0">%d</xliff:g> 次。再錯誤 <xliff:g id="NUMBER_1">%d</xliff:g> 次後,系統會要求使用 Google 登入來解鎖。"\n\n" 請在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒後再試一次。"</string> + <!-- no translation found for lockscreen_failed_attempts_almost_glogin (8687762517114904651) --> + <skip /> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"畫出解鎖圖形已錯誤 <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="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"<xliff:g id="NUMBER">%d</xliff:g> 秒後再試一次。"</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"忘記解鎖圖形?"</string> @@ -662,6 +663,8 @@ <string name="save_password_label" msgid="6860261758665825069">"確認"</string> <string name="double_tap_toast" msgid="1068216937244567247">"提示:輕按兩下可放大縮小。"</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"自動填寫此表單"</string> + <!-- no translation found for setup_autofill (8154593408885654044) --> + <skip /> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index a8099e3..dfbcafc0a 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -503,6 +503,15 @@ <attr name="listPopupWindowStyle" format="reference" /> <!-- Default PopupMenu style. --> <attr name="popupMenuStyle" format="reference" /> + <!-- NumberPicker up button style --> + <attr name="numberPickerUpButtonStyle" format="reference" /> + <!-- NumberPicker down button style --> + <attr name="numberPickerDownButtonStyle" format="reference" /> + <!-- NumberPicker input text style --> + <attr name="numberPickerInputTextStyle" format="reference" /> + + <!-- NumberPicker the fading edge length of the selector wheel --> + <attr name="numberPickerStyle" format="reference" /> <!-- =================== --> <!-- Action bar styles --> @@ -625,6 +634,10 @@ <!-- Preference frame layout styles. --> <attr name="preferenceFrameLayoutStyle" format="reference" /> + + <!-- Default style for the Switch widget. --> + <attr name="switchStyle" format="reference" /> + </declare-styleable> <!-- **************************************************************** --> @@ -2856,6 +2869,12 @@ <attr name="minorWeightMax" format="float" /> </declare-styleable> + <!-- @hide --> + <declare-styleable name="NumberPicker"> + <attr name="orientation" /> + <attr name="solidColor" format="color|reference" /> + </declare-styleable> + <!-- ========================= --> <!-- Drawable class attributes --> <!-- ========================= --> @@ -4497,4 +4516,23 @@ <declare-styleable name="ActionBar_LayoutParams"> <attr name="layout_gravity" /> </declare-styleable> + + <declare-styleable name="Switch"> + <!-- Drawable to use as the "thumb" that switches back and forth. --> + <attr name="switchThumb" format="reference" /> + <!-- Drawable to use as the "track" that the switch thumb slides within. --> + <attr name="switchTrack" format="reference" /> + <!-- Text to use when the switch is in the checked/"on" state. --> + <attr name="textOn" /> + <!-- Text to use when the switch is in the unchecked/"off" state. --> + <attr name="textOff" /> + <!-- Amount of padding on either side of text within the switch thumb. --> + <attr name="thumbTextPadding" format="dimension" /> + <!-- TextAppearance style for text displayed on the switch thumb. --> + <attr name="switchTextAppearance" format="reference" /> + <!-- Minimum width for the switch component --> + <attr name="switchMinWidth" format="dimension" /> + <!-- Minimum space between the switch and caption text --> + <attr name="switchPadding" format="dimension" /> + </declare-styleable> </resources> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 03d581f..e655192 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -76,6 +76,11 @@ be an integer for a constant duration. --> <fraction name="config_dimBehindFadeDuration">100%</fraction> + <!-- The maximum width we would prefer dialogs to be. 0 if there is no + maximum (let them grow as large as the screen). Actual values are + specified for -large and -xlarge configurations. --> + <dimen name="config_prefDialogWidth">0px</dimen> + <!-- The duration (in milliseconds) that the radio will scan for a signal when there's no network connection. If the scan doesn't timeout, use zero --> <integer name="config_radioScanningTimeout">0</integer> diff --git a/core/res/res/values/donottranslate.xml b/core/res/res/values/donottranslate.xml index d6d5dbb..bdcab39 100644 --- a/core/res/res/values/donottranslate.xml +++ b/core/res/res/values/donottranslate.xml @@ -24,4 +24,6 @@ <bool name="lockscreen_isPortrait">true</bool> <!-- @hide DO NOT TRANSLATE. Control aspect ratio of lock pattern --> <string name="lock_pattern_view_aspect">square</string> + <!-- @hide DO NOT TRANSLATE. Separator between the hour and minute elements in a TimePicker widget --> + <string name="time_picker_separator">:</string> </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 0c3361d..eafa9b6 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -2291,6 +2291,10 @@ <!-- See SMS_DIALOG. This is a button choice to disallow sending the SMSes.. --> <string name="sms_control_no">Cancel</string> + <!-- Date/Time picker dialogs strings --> + + <!-- The title of the time picker dialog. [CHAR LIMIT=NONE] --> + <string name="time_picker_dialog_title">Set time</string> <!-- Name of the button in the date/time picker to accept the date/time change --> <string name="date_time_set">Set</string> diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index 2754e73..b3c3e0d 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -460,6 +460,28 @@ <item name="android:background">@android:drawable/btn_default</item> </style> + <style name="Widget.NumberPicker"> + <item name="android:orientation">vertical</item> + <item name="android:fadingEdge">vertical</item> + <item name="android:fadingEdgeLength">50dip</item> + <item name="android:solidColor">?android:attr/colorBackground</item> + </style> + + <style name="Widget.ImageButton.NumberPickerUpButton"> + <item name="android:background">@android:drawable/timepicker_up_btn</item> + </style> + + <style name="Widget.ImageButton.NumberPickerDownButton"> + <item name="android:background">@android:drawable/timepicker_down_btn</item> + </style> + + <style name="Widget.EditText.NumberPickerInputText"> + <item name="android:textAppearance">@style/TextAppearance.Large.Inverse.NumberPickerInputText</item> + <item name="android:gravity">center</item> + <item name="android:singleLine">true</item> + <item name="android:background">@drawable/timepicker_input</item> + </style> + <style name="Widget.AutoCompleteTextView" parent="Widget.EditText"> <item name="android:completionHintView">@android:layout/simple_dropdown_hint</item> <item name="android:completionThreshold">2</item> @@ -761,7 +783,7 @@ <style name="TextAppearance.Widget.TextView.SpinnerItem"> <item name="android:textColor">@android:color/primary_text_light_disable_only</item> </style> - + <!-- @hide --> <style name="TextAppearance.SlidingTabNormal" parent="@android:attr/textAppearanceMedium"> @@ -804,6 +826,11 @@ <item name="android:textStyle">bold</item> </style> + <style name="TextAppearance.Large.Inverse.NumberPickerInputText"> + <item name="android:textColor">@android:color/primary_text_light</item> + <item name="android:textSize">30sp</item> + </style> + <!-- Preference Styles --> <style name="Preference"> @@ -1150,6 +1177,9 @@ <item name="android:textColor">?android:attr/textColorSecondary</item> </style> + <style name="TextAppearance.Holo.Widget.Switch" parent="TextAppearance.Holo.Small"> + </style> + <style name="TextAppearance.Holo.WindowTitle"> <item name="android:textColor">#fff</item> <item name="android:textSize">14sp</item> @@ -1326,6 +1356,9 @@ <item name="android:popupBackground">@android:drawable/menu_dropdown_panel_holo_dark</item> </style> + <style name="Widget.Holo.CompoundButton" parent="Widget.CompoundButton"> + </style> + <style name="Widget.Holo.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox"> </style> @@ -1353,6 +1386,27 @@ <style name="Widget.Holo.ImageButton" parent="Widget.ImageButton"> </style> + <style name="Widget.Holo.ImageButton.NumberPickerUpButton"> + <item name="android:background">@null</item> + <item name="android:paddingBottom">26sp</item> + <item name="android:src">@android:drawable/timepicker_up_btn_holo_dark</item> + </style> + + <style name="Widget.Holo.ImageButton.NumberPickerDownButton"> + <item name="android:background">@null</item> + <item name="android:paddingTop">26sp</item> + <item name="android:src">@android:drawable/timepicker_down_btn_holo_dark</item> + </style> + + <style name="Widget.Holo.EditText.NumberPickerInputText"> + <item name="android:paddingTop">13sp</item> + <item name="android:paddingBottom">13sp</item> + <item name="android:gravity">center</item> + <item name="android:singleLine">true</item> + <item name="android:textSize">18sp</item> + <item name="android:background">@null</item> + </style> + <style name="Widget.Holo.ImageWell" parent="Widget.ImageWell"> </style> @@ -1562,6 +1616,17 @@ <item name="android:progressBarPadding">32dip</item> </style> + <style name="Widget.Holo.CompoundButton.Switch"> + <item name="android:switchTrack">@android:drawable/switch_track_holo_dark</item> + <item name="android:switchThumb">@android:drawable/switch_inner_holo_dark</item> + <item name="android:switchTextAppearance">@android:style/TextAppearance.Holo.Widget.Switch</item> + <item name="android:textOn">@android:string/capital_on</item> + <item name="android:textOff">@android:string/capital_off</item> + <item name="android:thumbTextPadding">12dip</item> + <item name="android:switchMinWidth">96dip</item> + <item name="android:switchPadding">16dip</item> + </style> + <!-- Light widget styles --> <style name="Widget.Holo.Light"> @@ -1655,6 +1720,17 @@ <style name="Widget.Holo.Light.ImageButton" parent="Widget.ImageButton"> </style> + <style name="Widget.Holo.Light.ImageButton.NumberPickerUpButton" parent="Widget.Holo.Light.ImageButton.NumberPickerUpButton"> + <item name="android:background">@android:drawable/timepicker_up_btn_holo_light</item> + </style> + + <style name="Widget.Holo.Light.ImageButton.NumberPickerDownButton" parent="Widget.Holo.ImageButton.NumberPickerDownButton"> + <item name="android:background">@android:drawable/timepicker_down_btn_holo_light</item> + </style> + + <style name="Widget.Holo.Light.EditText.NumberPickerInputText" parent="Widget.Holo.EditText.NumberPickerInputText"> + </style> + <style name="Widget.Holo.Light.ImageWell" parent="Widget.ImageWell"> </style> diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml index 0eec0df..e1040d9 100644 --- a/core/res/res/values/themes.xml +++ b/core/res/res/values/themes.xml @@ -267,8 +267,16 @@ <item name="searchViewGoIcon">@android:drawable/ic_go</item> <item name="searchViewVoiceIcon">@android:drawable/ic_voice_search</item> + <!-- PreferenceFrameLayout attributes --> <item name="preferenceFrameLayoutStyle">@android:style/Widget.PreferenceFrameLayout</item> + + <!-- NumberPicker styles--> + <item name="numberPickerUpButtonStyle">@style/Widget.ImageButton.NumberPickerUpButton</item> + <item name="numberPickerDownButtonStyle">@style/Widget.ImageButton.NumberPickerDownButton</item> + <item name="numberPickerInputTextStyle">@style/Widget.EditText.NumberPickerInputText</item> + <item name="numberPickerStyle">@style/Widget.NumberPicker</item> + </style> <!-- Variant of the default (dark) theme with no title bar --> @@ -711,6 +719,7 @@ <item name="buttonStyleInset">@android:style/Widget.Holo.Button.Inset</item> <item name="buttonStyleToggle">@android:style/Widget.Holo.Button.Toggle</item> + <item name="switchStyle">@android:style/Widget.Holo.CompoundButton.Switch</item> <item name="groupButtonBackground">@android:drawable/group_button_background_holo_dark</item> <item name="selectableItemBackground">@android:drawable/item_background_holo_dark</item> @@ -881,6 +890,12 @@ <!-- PreferenceFrameLayout attributes --> <item name="preferenceFrameLayoutStyle">@android:style/Widget.Holo.PreferenceFrameLayout</item> + + <!-- NumberPicker styles--> + <item name="numberPickerUpButtonStyle">@style/Widget.Holo.ImageButton.NumberPickerUpButton</item> + <item name="numberPickerDownButtonStyle">@style/Widget.Holo.ImageButton.NumberPickerDownButton</item> + <item name="numberPickerInputTextStyle">@style/Widget.Holo.EditText.NumberPickerInputText</item> + </style> <!-- New Honeycomb holographic theme. Light version. The widgets in the @@ -1117,6 +1132,12 @@ <!-- SearchView attributes --> <item name="searchDropdownBackground">@android:drawable/search_dropdown_light</item> + + <!-- NumberPicker attributes and styles--> + <item name="numberPickerUpButtonStyle">@style/Widget.Holo.Light.ImageButton.NumberPickerUpButton</item> + <item name="numberPickerDownButtonStyle">@style/Widget.Holo.Light.ImageButton.NumberPickerDownButton</item> + <item name="numberPickerInputTextStyle">@style/Widget.Holo.Light.EditText.NumberPickerInputText</item> + </style> <!-- Development legacy name; if you're using this, switch. --> diff --git a/docs/html/images/preview_hc/actionbar.png b/docs/html/images/preview_hc/actionbar.png Binary files differnew file mode 100644 index 0000000..31df2b2 --- /dev/null +++ b/docs/html/images/preview_hc/actionbar.png diff --git a/docs/html/images/preview_hc/fragments_layout.png b/docs/html/images/preview_hc/fragments_layout.png Binary files differnew file mode 100644 index 0000000..91c8929 --- /dev/null +++ b/docs/html/images/preview_hc/fragments_layout.png diff --git a/docs/html/sdk/index.jd b/docs/html/sdk/index.jd index 8b77303..4153951 100644 --- a/docs/html/sdk/index.jd +++ b/docs/html/sdk/index.jd @@ -19,6 +19,7 @@ sdk.linux_checksum=TODO @jd:body +<div class="non-preview"> <p>Here's an overview of the steps you must follow to set up the Android SDK:</p> <ol> @@ -32,3 +33,4 @@ installer for help with the initial setup.)</li> <p>To get started, download the appropriate package from the table above, then read the guide to <a href="installing.html">Installing the SDK</a>.</p> +</div> diff --git a/docs/html/sdk/preview/features.jd b/docs/html/sdk/preview/features.jd index 81b4ff6..55d0f8d 100644 --- a/docs/html/sdk/preview/features.jd +++ b/docs/html/sdk/preview/features.jd @@ -1,4 +1,185 @@ -sdk.redirect=true - +page.title=Introduction to Honeycomb @jd:body +<p>Welcome to the Honeycomb preview SDK. Honeycomb is the next major release of the Android +platform and is optimized for tablet devices. This document provides an introduction to the new +platform features and APIs available in Honeycomb.</p> + + +<h2>Fragments</h2> + +<div class="figure" style="width:400px"> + <img src="{@docRoot}images/preview_hc/fragments_layout.png" alt="" /> + <p class="img-caption"><strong>Fragment Layout.</strong> An activity with two +fragments: one with a list view, on the left, and one that displays selected content on the +right. This demo is available in the samples package.</p> +</div> + + +<p>A new framework component that allows you to separate distinct elements of an activity into +self-contained modules that define their own UI and lifecycle—defining what may be +considered "sub-activities".</p> +<ul> + <li>Multiple fragments can be combined in a single activity to build a multi-pane UI in which +each pane manages its own lifecycle and user inputs</li> + <li>Fragments are self-contained and can be reused in multiple activities</li> + <li>Fragments can be added, removed, replaced and animated inside the activity</li> + <li>Fragment can be added to a back stack managed by the activity, preserving the state of +fragments as they are changed and allowing the user to navigate backward through the different +states</li> + <li>By <a +href="{@docRoot}guide/topics/resources/providing-resources.html#AlternativeResources">providing +alternative resources</a>, you can mix and match fragments, based +on the screen size and orientation</li> + <li>Fragments have direct access to their container activity and can contribute items to the +activity's Options Menu</li> +</ul> + +<p>For more information, see the <a +href="{@docRoot}guide/topics/fragments/index.html">Fragments</a> developer guide.</p> + + +<h2>Action Bar</h2> + +<p>A replacement for the traditional title bar, which provides users quick access to global +actions and different navigation modes.</p> +<ul> + <li>Provides quick access to items from the Options Menu ("action items") and interactive +widgets ("action views")</li> + <li>Includes the application logo in the left corner, which can perform actions when tapped +and can be replaced with a custom logo</li> + <li>Provides breadcumbs for navigating backward through fragments</li> + <li>Offers built in navigation modes, including tabs and a drop-down list</li> + <li>Can be customized with themes and custom backgrounds</li> + <li>And more</li> +</ul> + +<img src="{@docRoot}images/preview_hc/actionbar.png" alt="" /> +<p class="img-caption"><strong>Action Bar.</strong> An action bar with a custom logo, +tabs, and Options Menu. This demo is available in the samples package.</p> + +<p>For more information, see the <a +href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a> developer guide.</p> + + +<h2>System Clipboard</h2> + +<p>Applications can copy and paste data (beyond mere text) to and from the system-wide +clipboard.</p> + +<ul> + <li>Clipped data can be plain text, a URI, or an intent</li> + <li>The new {@link android.content.ClipData} class represents a complex data type for the +clipboard</li> + <li>The new {@link android.content.ClipboardManager} class allows apps to add {@link +android.content.ClipData} to the clipboard (copy) and read {@link +android.content.ClipData} from the clipboard (paste)</li> + <li>The {@link android.content.ContentProvider} class has been extended to generate byte +streams based on data types added to the clipboard and point to data hosted in a +content provider</li> +</ul> + +<p>See {@link android.content.ClipData} and {@link android.content.ClipboardManager} +for more information. You can also see an example implementation of copy/paste in an updated +version of the NotePad application (available in the samples package).</p> + + +<h2>Drag and Drop</h2> + +<p>New APIs to perform drag and drop operations, leveraging the system clipboard APIs to +transport data.</p> + +<ul> + <li>Any {@link android.view.View} can be used for a drag and drop event and a thumbnail of that +view is generated and used during the drag</li> + <li>{@link android.view.ViewGroup}s that can receive the object are notified during hover and drop +events</li> + <li>The new {@link android.view.DragEvent} class describes a drag event relating to a view, +including the item's current coordinates, the type of action (whether the drag has entered the +view, exited the view, started, dropped, etc.), and provides access to the {@link +android.content.ClipData} being carried</li> + <li>The new {@link android.view.View.OnDragListener} interface defines a callback that views +can register in order to be notified of drag events being dispatched to the view; view's can +register a drag listener with {@link android.view.View#setOnDragListener setOnDragListener()}</li> +</ul> + +<p>See {@link android.view.DragEvent} and {@link android.view.View.OnDragListener} for more +information.</p> + + +<h2>New Animations</h2> + +<p>An all new animation framework.</p> + +<ul> + <li>A flexible animation system that allows you to animate the properties of any object (View, +Drawable, Fragment, Object, anything)</li> +</ul> + +<p>See the {@link android.animation} package.</p> + + +<h2>Extended App Widgets</h2> + +<p>App widgets can now be more interactive and accept finger gestures.</p> + +<ul> + <li>The complete list of supported widgets for an app widget is now: {@link +android.widget.AnalogClock}, {@link android.widget.Button}, {@link android.widget.Chronometer}, +{@link android.widget.ImageButton}, {@link android.widget.ImageView}, {@link +android.widget.ProgressBar}, {@link android.widget.TextView}, {@link +android.widget.ViewFlipper}, {@link android.widget.AdapterViewFlipper}, {@link +android.widget.StackView}, {@link android.widget.ListView}, and {@link +android.widget.GridView}.</li> +</ul> + + +<h2>Extended Status Bar Notifications</h2> + +<p>The {@link android.app.Notification} class has been extended to support more content-rich +status bar notifications when on xlarge screens.</p> + +<ul> + <li>New {@link android.app.Notification.Builder} class helps you easily create new {@link +android.app.Notification} objects</li> + <li>Support for a title in the status bar ticker (in addition to the normal ticker text)</li> + <li>Support for a large "sender" icon in the notification—a second icon intended for +social applications to show the contact photo of the person who is the source of the +notification</li> + <li>Support for custom layouts in the status bar ticker</li> + <li>Support for buttons in the expanded notification that deliver custom intents +(such as to control ongoing music in the background)</li> +</ul> + + +<h2>Plus Android 2.3</h2> + +<p>Honeycomb includes all platform changes introduced for Android 2.3.</p> + +<p>To take full advantage of Honeycomb, you should also be aware of the new features +and APIs introduced for Android 2.3. To learn more, read the <a +href="{@docRoot}sdk/android-2.3.html">Android 2.3 release notes</a>.</p> + +<div class="special"> +<p>To set up your preview SDK and start developing apps for Honeycomb, see the <a +href="{@docRoot}sdk/preview/installing.html">Getting Started</a> guide.</p> +</div> + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/sdk/preview/installing.jd b/docs/html/sdk/preview/installing.jd index 1e6b26b..c835c49 100644 --- a/docs/html/sdk/preview/installing.jd +++ b/docs/html/sdk/preview/installing.jd @@ -1,5 +1,62 @@ -sdk.redirect=true - +page.title=Getting Started with Honeycomb @jd:body +<p>First, you need to set up your development environment with the new SDK Tools and preview +platform:</p> + +<ol> + <li>Unpack the SDK Tools r8 package you've received. + <p>If you have an existing Android SDK directory, simply replace your existing {@code +tools/} directory with the one from the new package and add the {@code platform-tools/} +directory along side it (at the root of the SDK directory).</p></li> + <li>Unpack the platform package ({@code android-Froyo}) and place it in your SDK's {@code +platforms/} directory.</li> + <li>If you're using Eclipse, also update your Eclipse plugin using the provided archive file. + <ol> + <li>Select <strong>Help > Install new software</strong>.</li> + <li>Click <strong>Add</strong>.</li> + <li>Click <strong>Archive</strong>.</li> + <li>Locate and select the archive file. Click <strong>OK</strong>. + <p>Developer Tools now appear in the Available Software window and you can proceed +to install the plugin.</p> + </li> + </ol> + </li> +</ol> + +<p class="note"><strong>Note:</strong> Beginning with SDK Tools r8 (the version you've received), +the {@code adb} tool is now located in the {@code <sdk>/platform-tools/} directory (instead +of in {@code <sdk>/tools/}). Be sure to update your {@code PATH} environment variable and any +build/debugging scripts you have.</p> + + + +<h2 id="Setup">Set Up Your AVD and Application</h2> + +<p>With your SDK now set up, follow these steps to start developing an application for +Honeycomb.</p> + +<ol> + + <li>Create a new AVD targeted to "Android Froyo (Preview)" and with a custom skin resolution of +1280 x 800.</li> + + <li>Set the build target of your application to "Android Froyo (Preview)".</li> + <li>Set your manifest file's {@code <uses-sdk>} element to use {@code +android:minSdkVersion="Froyo"}. For example: +<pre> +<manifest> + <uses-sdk android:minSdkVersion="Froyo" /> + ... +</manifest> +</pre> +<p>"Froyo" is a provisional API Level for the Honeycomb release, used only during the preview +period. When the APIs are +finalized and the SDK is released publicly, you must update this with the appropriate API Level +integer.</p> +<p class="note"><strong>Note:</strong> By providing your {@code <uses-sdk>} element in the +manifest file <em>before</em> the {@code <application>} element, your application will +automatically apply the new Holographic theme.</p> +</li> +</ol> diff --git a/docs/html/sdk/sdk_toc.cs b/docs/html/sdk/sdk_toc.cs index 057d9e0..0b74bd6 100644 --- a/docs/html/sdk/sdk_toc.cs +++ b/docs/html/sdk/sdk_toc.cs @@ -37,6 +37,17 @@ </ul> </li><?cs /if ?> + <?cs + if:sdk.preview ?> + <li><h2>Android Preview SDK</h2></li> + <ul> + <li><a href="<?cs var:toroot ?>sdk/preview/features.html">Introduction +to Honeycomb</a></li> + <li><a href="<?cs var:toroot ?>sdk/preview/installing.html">Getting +Started</a></li> + </ul> + </li><?cs + /if ?> <li> <h2> <span class="en">Downloadable SDK Components</span> diff --git a/media/java/android/media/MtpDatabase.java b/media/java/android/media/MtpDatabase.java index 250ec44..0387989 100644 --- a/media/java/android/media/MtpDatabase.java +++ b/media/java/android/media/MtpDatabase.java @@ -169,11 +169,6 @@ public class MtpDatabase { // handle abstract playlists separately // they do not exist in the file system so don't use the media scanner here if (format == MtpConstants.FORMAT_ABSTRACT_AV_PLAYLIST) { - // Strip Windows Media Player file extension - if (path.endsWith(".pla")) { - path = path.substring(0, path.length() - 4); - } - // extract name from path String name = path; int lastSlash = name.lastIndexOf('/'); @@ -1005,7 +1000,7 @@ public class MtpDatabase { valuesList[i] = values; } try { - if (count == mMediaProvider.bulkInsert(uri, valuesList)) { + if (mMediaProvider.bulkInsert(uri, valuesList) > 0) { return MtpConstants.RESPONSE_OK; } } catch (RemoteException e) { diff --git a/media/mtp/MtpDataPacket.cpp b/media/mtp/MtpDataPacket.cpp index e1d1a92..eac1f7e 100644 --- a/media/mtp/MtpDataPacket.cpp +++ b/media/mtp/MtpDataPacket.cpp @@ -351,6 +351,7 @@ int MtpDataPacket::read(int fd) { return -1; // then the following data int total = MtpPacket::getUInt32(MTP_CONTAINER_LENGTH_OFFSET); + allocate(total); int remaining = total - MTP_CONTAINER_HEADER_SIZE; ret = ::read(fd, &mBuffer[0] + MTP_CONTAINER_HEADER_SIZE, remaining); if (ret != remaining) diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaMetadataRetrieverTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaMetadataRetrieverTest.java index 7174e2b..484f6e7 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaMetadataRetrieverTest.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaMetadataRetrieverTest.java @@ -25,11 +25,6 @@ import com.android.mediaframeworktest.MediaNames; import com.android.mediaframeworktest.MediaProfileReader; import android.test.suitebuilder.annotation.*; -/** - * WARNING: - * Currently, captureFrame() does not work, due to hardware access permission problem. - * We are currently only testing the metadata/album art retrieval features. - */ public class MediaMetadataRetrieverTest extends AndroidTestCase { private static final String TAG = "MediaMetadataRetrieverTest"; @@ -101,6 +96,7 @@ public class MediaMetadataRetrieverTest extends AndroidTestCase { } catch (Exception e) { Log.e(TAG, "Fails to convert the bitmap to a JPEG file for " + MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i]); hasFailed = true; + Log.e(TAG, e.toString()); } } catch(Exception e) { Log.e(TAG, "Fails to setDataSource for file " + MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i]); @@ -148,11 +144,8 @@ public class MediaMetadataRetrieverTest extends AndroidTestCase { public static void testBasicNormalMethodCallSequence() throws Exception { boolean hasFailed = false; MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - retriever.setMode(MediaMetadataRetriever.MODE_GET_METADATA_ONLY); try { retriever.setDataSource(MediaNames.TEST_PATH_1); - /* - * captureFrame() fails due to lack of permission to access hardware decoder devices Bitmap bitmap = retriever.captureFrame(); assertTrue(bitmap != null); try { @@ -162,7 +155,6 @@ public class MediaMetadataRetrieverTest extends AndroidTestCase { } catch (Exception e) { throw new Exception("Fails to convert the bitmap to a JPEG file for " + MediaNames.TEST_PATH_1, e); } - */ extractAllSupportedMetadataValues(retriever); } catch(Exception e) { Log.e(TAG, "Fails to setDataSource for " + MediaNames.TEST_PATH_1, e); @@ -251,17 +243,14 @@ public class MediaMetadataRetrieverTest extends AndroidTestCase { assertTrue(!hasFailed); } - // Due to the lack of permission to access hardware decoder, any calls - // attempting to capture a frame will fail. These are commented out for now - // until we find a solution to this access permission problem. @MediumTest public static void testIntendedUsage() { // By default, capture frame and retrieve metadata MediaMetadataRetriever retriever = new MediaMetadataRetriever(); boolean hasFailed = false; - // retriever.setDataSource(MediaNames.TEST_PATH_1); - // assertTrue(retriever.captureFrame() != null); - // assertTrue(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) != null); + retriever.setDataSource(MediaNames.TEST_PATH_1); + assertTrue(retriever.captureFrame() != null); + assertTrue(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) != null); // Do not capture frame or retrieve metadata retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY & MediaMetadataRetriever.MODE_GET_METADATA_ONLY); @@ -276,9 +265,9 @@ public class MediaMetadataRetrieverTest extends AndroidTestCase { } // Capture frame only - // retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY); - // retriever.setDataSource(MediaNames.TEST_PATH_1); - // assertTrue(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) == null); + retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY); + retriever.setDataSource(MediaNames.TEST_PATH_1); + assertTrue(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) == null); // Retriever metadata only retriever.setMode(MediaMetadataRetriever.MODE_GET_METADATA_ONLY); @@ -289,10 +278,10 @@ public class MediaMetadataRetrieverTest extends AndroidTestCase { } // Capture frame and retrieve metadata - // retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY | MediaMetadataRetriever.MODE_GET_METADATA_ONLY); - // retriever.setDataSource(MediaNames.TEST_PATH_1); - // assertTrue(retriever.captureFrame() != null); - // assertTrue(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) != null); + retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY | MediaMetadataRetriever.MODE_GET_METADATA_ONLY); + retriever.setDataSource(MediaNames.TEST_PATH_1); + assertTrue(retriever.captureFrame() != null); + assertTrue(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) != null); retriever.release(); assertTrue(!hasFailed); } diff --git a/opengl/tests/hwc/Android.mk b/opengl/tests/hwc/Android.mk new file mode 100644 index 0000000..743dbf1 --- /dev/null +++ b/opengl/tests/hwc/Android.mk @@ -0,0 +1,27 @@ +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_SRC_FILES:= hwc_stress.cpp + +LOCAL_SHARED_LIBRARIES := \ + libcutils \ + libEGL \ + libGLESv2 \ + libui \ + libhardware \ + +LOCAL_STATIC_LIBRARIES := \ + libtestUtil \ + +LOCAL_C_INCLUDES += \ + system/extras/tests/include \ + hardware/libhardware/include \ + +LOCAL_MODULE:= hwc_stress +LOCAL_MODULE_PATH := $(TARGET_OUT_DATA)/nativestresstest + +LOCAL_MODULE_TAGS := tests + +LOCAL_CFLAGS := -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES + +include $(BUILD_NATIVE_TEST) diff --git a/opengl/tests/hwc/hwc_stress.cpp b/opengl/tests/hwc/hwc_stress.cpp new file mode 100644 index 0000000..d119734 --- /dev/null +++ b/opengl/tests/hwc/hwc_stress.cpp @@ -0,0 +1,1193 @@ +/* + * Copyright (C) 2010 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. + * + */ + +/* + * Hardware Composer stress test + * + * Performs a pseudo-random (prandom) sequence of operations to the + * Hardware Composer (HWC), for a specified number of passes or for + * a specified period of time. By default the period of time is FLT_MAX, + * so that the number of passes will take precedence. + * + * The passes are grouped together, where (pass / passesPerGroup) specifies + * which group a particular pass is in. This causes every passesPerGroup + * worth of sequential passes to be within the same group. Computationally + * intensive operations are performed just once at the beginning of a group + * of passes and then used by all the passes in that group. This is done + * so as to increase both the average and peak rate of graphic operations, + * by moving computationally intensive operations to the beginning of a group. + * In particular, at the start of each group of passes a set of + * graphic buffers are created, then used by the first and remaining + * passes of that group of passes. + * + * The per-group initialization of the graphic buffers is performed + * by a function called initFrames. This function creates an array + * of smart pointers to the graphic buffers, in the form of a vector + * of vectors. The array is accessed in row major order, so each + * row is a vector of smart pointers. All the pointers of a single + * row point to graphic buffers which use the same pixel format and + * have the same dimension, although it is likely that each one is + * filled with a different color. This is done so that after doing + * the first HWC prepare then set call, subsequent set calls can + * be made with each of the layer handles changed to a different + * graphic buffer within the same row. Since the graphic buffers + * in a particular row have the same pixel format and dimension, + * additional HWC set calls can be made, without having to perform + * an HWC prepare call. + * + * This test supports the following command-line options: + * + * -v Verbose + * -s num Starting pass + * -e num Ending pass + * -p num Execute the single pass specified by num + * -n num Number of set operations to perform after each prepare operation + * -t float Maximum time in seconds to execute the test + * -d float Delay in seconds performed after each set operation + * -D float Delay in seconds performed after the last pass is executed + * + * Typically the test is executed for a large range of passes. By default + * passes 0 through 99999 (100,000 passes) are executed. Although this test + * does not validate the generated image, at times it is useful to reexecute + * a particular pass and leave the displayed image on the screen for an + * extended period of time. This can be done either by setting the -s + * and -e options to the desired pass, along with a large value for -D. + * This can also be done via the -p option, again with a large value for + * the -D options. + * + * So far this test only contains code to create graphic buffers with + * a continuous solid color. Although this test is unable to validate the + * image produced, any image that contains other than rectangles of a solid + * color are incorrect. Note that the rectangles may use a transparent + * color and have a blending operation that causes the color in overlapping + * rectangles to be mixed. In such cases the overlapping portions may have + * a different color from the rest of the rectangle. + */ + +#include <algorithm> +#include <assert.h> +#include <cerrno> +#include <cmath> +#include <cstdlib> +#include <ctime> +#include <libgen.h> +#include <sched.h> +#include <sstream> +#include <stdint.h> +#include <string.h> +#include <unistd.h> +#include <vector> + +#include <arpa/inet.h> // For ntohl() and htonl() + +#include <sys/syscall.h> +#include <sys/types.h> +#include <sys/wait.h> + +#include <EGL/egl.h> +#include <EGL/eglext.h> +#include <GLES2/gl2.h> +#include <GLES2/gl2ext.h> + +#include <ui/FramebufferNativeWindow.h> +#include <ui/GraphicBuffer.h> +#include <ui/EGLUtils.h> + +#define LOG_TAG "hwcStressTest" +#include <utils/Log.h> +#include <testUtil.h> + +#include <hardware/hwcomposer.h> + +using namespace std; +using namespace android; + +const float maxSizeRatio = 1.3; // Graphic buffers can be upto this munch + // larger than the default screen size +const unsigned int passesPerGroup = 10; // A group of passes all use the same + // graphic buffers +const float rareRatio = 0.1; // Ratio at which rare conditions are produced. + +// Defaults for command-line options +const bool defaultVerbose = false; +const unsigned int defaultStartPass = 0; +const unsigned int defaultEndPass = 99999; +const unsigned int defaultPerPassNumSet = 10; +const float defaultPerPassDelay = 0.1; +const float defaultEndDelay = 2.0; // Default delay between completion of + // final pass and restart of framework +const float defaultDuration = FLT_MAX; // A fairly long time, so that + // range of passes will have + // precedence + +// Command-line option settings +static bool verbose = defaultVerbose; +static unsigned int startPass = defaultStartPass; +static unsigned int endPass = defaultEndPass; +static unsigned int numSet = defaultPerPassNumSet; +static float perSetDelay = defaultPerPassDelay; +static float endDelay = defaultEndDelay; +static float duration = defaultDuration; + +// Command-line mutual exclusion detection flags. +// Corresponding flag set true once an option is used. +bool eFlag, sFlag, pFlag; + +#define MAXSTR 100 +#define MAXCMD 200 +#define BITSPERBYTE 8 // TODO: Obtain from <values.h>, once + // it has been added + +#define CMD_STOP_FRAMEWORK "stop 2>&1" +#define CMD_START_FRAMEWORK "start 2>&1" + +#define NUMA(a) (sizeof(a) / sizeof(a [0])) +#define MEMCLR(addr, size) do { \ + memset((addr), 0, (size)); \ + } while (0) + +// Represent RGB color as fraction of color components. +// Each of the color components are expected in the range [0.0, 1.0] +class RGBColor { + public: + RGBColor(): _r(0.0), _g(0.0), _b(0.0) {}; + RGBColor(float f): _r(f), _g(f), _b(f) {}; // Gray + RGBColor(float r, float g, float b): _r(r), _g(g), _b(b) {}; + float r(void) const { return _r; } + float g(void) const { return _g; } + float b(void) const { return _b; } + + private: + float _r; + float _g; + float _b; +}; + +// Represent YUV color as fraction of color components. +// Each of the color components are expected in the range [0.0, 1.0] +class YUVColor { + public: + YUVColor(): _y(0.0), _u(0.0), _v(0.0) {}; + YUVColor(float f): _y(f), _u(0.0), _v(0.0) {}; // Gray + YUVColor(float y, float u, float v): _y(y), _u(u), _v(v) {}; + float y(void) const { return _y; } + float u(void) const { return _u; } + float v(void) const { return _v; } + + private: + float _y; + float _u; + float _v; +}; + +// File scope constants +static const struct { + unsigned int format; + const char *desc; +} graphicFormat[] = { + {HAL_PIXEL_FORMAT_RGBA_8888, "RGBA8888"}, + {HAL_PIXEL_FORMAT_RGBX_8888, "RGBX8888"}, +// {HAL_PIXEL_FORMAT_RGB_888, "RGB888"}, // Known issue: 3198458 + {HAL_PIXEL_FORMAT_RGB_565, "RGB565"}, + {HAL_PIXEL_FORMAT_BGRA_8888, "BGRA8888"}, + {HAL_PIXEL_FORMAT_RGBA_5551, "RGBA5551"}, + {HAL_PIXEL_FORMAT_RGBA_4444, "RGBA4444"}, +// {HAL_PIXEL_FORMAT_YV12, "YV12"}, // Currently not supported by HWC +}; +const unsigned int blendingOps[] = { + HWC_BLENDING_NONE, + HWC_BLENDING_PREMULT, + HWC_BLENDING_COVERAGE, +}; +const unsigned int layerFlags[] = { + HWC_SKIP_LAYER, +}; +const vector<unsigned int> vecLayerFlags(layerFlags, + layerFlags + NUMA(layerFlags)); + +const unsigned int transformFlags[] = { + HWC_TRANSFORM_FLIP_H, + HWC_TRANSFORM_FLIP_V, + HWC_TRANSFORM_ROT_90, + // ROT_180 & ROT_270 intentionally not listed, because they + // they are formed from combinations of the flags already listed. +}; +const vector<unsigned int> vecTransformFlags(transformFlags, + transformFlags + NUMA(transformFlags)); + +// File scope globals +static const int texUsage = GraphicBuffer::USAGE_HW_TEXTURE | + GraphicBuffer::USAGE_SW_WRITE_RARELY; +static hw_module_t const *hwcModule; +static hwc_composer_device_t *hwcDevice; +static vector <vector <sp<GraphicBuffer> > > frames; +static EGLDisplay dpy; +static EGLContext context; +static EGLSurface surface; +static EGLint width, height; + +// File scope prototypes +static void execCmd(const char *cmd); +static void checkEglError(const char* op, EGLBoolean returnVal = EGL_TRUE); +static void checkGlError(const char* op); +static void printEGLConfiguration(EGLDisplay dpy, EGLConfig config); +static void printGLString(const char *name, GLenum s); +static hwc_layer_list_t *createLayerList(size_t numLayers); +static void freeLayerList(hwc_layer_list_t *list); +static void fillColor(GraphicBuffer *gBuf, RGBColor color, float trans); +static void fillColor(GraphicBuffer *gBuf, YUVColor color, float trans); +void init(void); +void initFrames(unsigned int seed); +void displayList(hwc_layer_list_t *list); +void displayListPrepareModifiable(hwc_layer_list_t *list); +void displayListHandles(hwc_layer_list_t *list); +const char *graphicFormat2str(unsigned int format); +template <class T> vector<T> vectorRandSelect(const vector<T>& vec, size_t num); +template <class T> T vectorOr(const vector<T>& vec); + +/* + * Main + * + * Performs the following high-level sequence of operations: + * + * 1. Command-line parsing + * + * 2. Initialization + * + * 3. For each pass: + * + * a. If pass is first pass or in a different group from the + * previous pass, initialize the array of graphic buffers. + * + * b. Create a HWC list with room to specify a prandomly + * selected number of layers. + * + * c. Select a subset of the rows from the graphic buffer array, + * such that there is a unique row to be used for each + * of the layers in the HWC list. + * + * d. Prandomly fill in the HWC list with handles + * selected from any of the columns of the selected row. + * + * e. Pass the populated list to the HWC prepare call. + * + * f. Pass the populated list to the HWC set call. + * + * g. If additional set calls are to be made, then for each + * additional set call, select a new set of handles and + * perform the set call. + */ +int +main(int argc, char *argv[]) +{ + int rv, opt; + char *chptr; + unsigned int pass; + char cmd[MAXCMD]; + struct timeval startTime, currentTime, delta; + + testSetLogCatTag(LOG_TAG); + + // Parse command line arguments + while ((opt = getopt(argc, argv, "vp:d:D:n:s:e:t:?h")) != -1) { + switch (opt) { + case 'd': // Delay after each set operation + perSetDelay = strtod(optarg, &chptr); + if ((*chptr != '\0') || (perSetDelay < 0.0)) { + testPrintE("Invalid command-line specified per pass delay of: " + "%s", optarg); + exit(1); + } + break; + + case 'D': // End of test delay + // Delay between completion of final pass and restart + // of framework + endDelay = strtod(optarg, &chptr); + if ((*chptr != '\0') || (endDelay < 0.0)) { + testPrintE("Invalid command-line specified end of test delay " + "of: %s", optarg); + exit(2); + } + break; + + case 't': // Duration + duration = strtod(optarg, &chptr); + if ((*chptr != '\0') || (duration < 0.0)) { + testPrintE("Invalid command-line specified duration of: %s", + optarg); + exit(3); + } + break; + + case 'n': // Num set operations per pass + numSet = strtoul(optarg, &chptr, 10); + if (*chptr != '\0') { + testPrintE("Invalid command-line specified num set per pass " + "of: %s", optarg); + exit(4); + } + break; + + case 's': // Starting Pass + sFlag = true; + if (pFlag) { + testPrintE("Invalid combination of command-line options."); + testPrintE(" The -p option is mutually exclusive from the"); + testPrintE(" -s and -e options."); + exit(5); + } + startPass = strtoul(optarg, &chptr, 10); + if (*chptr != '\0') { + testPrintE("Invalid command-line specified starting pass " + "of: %s", optarg); + exit(6); + } + break; + + case 'e': // Ending Pass + eFlag = true; + if (pFlag) { + testPrintE("Invalid combination of command-line options."); + testPrintE(" The -p option is mutually exclusive from the"); + testPrintE(" -s and -e options."); + exit(7); + } + endPass = strtoul(optarg, &chptr, 10); + if (*chptr != '\0') { + testPrintE("Invalid command-line specified ending pass " + "of: %s", optarg); + exit(8); + } + break; + + case 'p': // Run a single specified pass + pFlag = true; + if (sFlag || eFlag) { + testPrintE("Invalid combination of command-line options."); + testPrintE(" The -p option is mutually exclusive from the"); + testPrintE(" -s and -e options."); + exit(9); + } + startPass = endPass = strtoul(optarg, &chptr, 10); + if (*chptr != '\0') { + testPrintE("Invalid command-line specified pass of: %s", + optarg); + exit(10); + } + break; + + case 'v': // Verbose + verbose = true; + break; + + case 'h': // Help + case '?': + default: + testPrintE(" %s [options]", basename(argv[0])); + testPrintE(" options:"); + testPrintE(" -p Execute specified pass"); + testPrintE(" -s Starting pass"); + testPrintE(" -e Ending pass"); + testPrintE(" -t Duration"); + testPrintE(" -d Delay after each set operation"); + testPrintE(" -D End of test delay"); + testPrintE(" -n Num set operations per pass"); + testPrintE(" -v Verbose"); + exit(((optopt == 0) || (optopt == '?')) ? 0 : 11); + } + } + if (endPass < startPass) { + testPrintE("Unexpected ending pass before starting pass"); + testPrintE(" startPass: %u endPass: %u", startPass, endPass); + exit(12); + } + if (argc != optind) { + testPrintE("Unexpected command-line postional argument"); + testPrintE(" %s [-s start_pass] [-e end_pass] [-t duration]", + basename(argv[0])); + exit(13); + } + testPrintI("duration: %g", duration); + testPrintI("startPass: %u", startPass); + testPrintI("endPass: %u", endPass); + testPrintI("numSet: %u", numSet); + + // Stop framework + rv = snprintf(cmd, sizeof(cmd), "%s", CMD_STOP_FRAMEWORK); + if (rv >= (signed) sizeof(cmd) - 1) { + testPrintE("Command too long for: %s", CMD_STOP_FRAMEWORK); + exit(14); + } + execCmd(cmd); + testDelay(1.0); // TODO - needs means to query whether asyncronous stop + // framework operation has completed. For now, just wait + // a long time. + + init(); + + // For each pass + gettimeofday(&startTime, NULL); + for (pass = startPass; pass <= endPass; pass++) { + // Stop if duration of work has already been performed + gettimeofday(¤tTime, NULL); + delta = tvDelta(&startTime, ¤tTime); + if (tv2double(&delta) > duration) { break; } + + // Regenerate a new set of test frames when this pass is + // either the first pass or is in a different group then + // the previous pass. A group of passes are passes that + // all have the same quotient when their pass number is + // divided by passesPerGroup. + if ((pass == startPass) + || ((pass / passesPerGroup) != ((pass - 1) / passesPerGroup))) { + initFrames(pass / passesPerGroup); + } + + testPrintI("==== Starting pass: %u", pass); + + // Cause deterministic sequence of prandom numbers to be + // generated for this pass. + srand48(pass); + + hwc_layer_list_t *list; + list = createLayerList(testRandMod(frames.size()) + 1); + if (list == NULL) { + testPrintE("createLayerList failed"); + exit(20); + } + + // Prandomly select a subset of frames to be used by this pass. + vector <vector <sp<GraphicBuffer> > > selectedFrames; + selectedFrames = vectorRandSelect(frames, list->numHwLayers); + + // Any transform tends to create a layer that the hardware + // composer is unable to support and thus has to leave for + // SurfaceFlinger. Place heavy bias on specifying no transforms. + bool noTransform = testRandFract() > rareRatio; + + for (unsigned int n1 = 0; n1 < list->numHwLayers; n1++) { + unsigned int idx = testRandMod(selectedFrames[n1].size()); + sp<GraphicBuffer> gBuf = selectedFrames[n1][idx]; + hwc_layer_t *layer = &list->hwLayers[n1]; + layer->handle = gBuf->handle; + + layer->blending = blendingOps[testRandMod(NUMA(blendingOps))]; + layer->flags = (testRandFract() > rareRatio) ? 0 + : vectorOr(vectorRandSelect(vecLayerFlags, + testRandMod(vecLayerFlags.size() + 1))); + layer->transform = (noTransform || testRandFract() > rareRatio) ? 0 + : vectorOr(vectorRandSelect(vecTransformFlags, + testRandMod(vecTransformFlags.size() + 1))); + layer->sourceCrop.left = testRandMod(gBuf->getWidth()); + layer->sourceCrop.top = testRandMod(gBuf->getHeight()); + layer->sourceCrop.right = layer->sourceCrop.left + + testRandMod(gBuf->getWidth() - layer->sourceCrop.left) + 1; + layer->sourceCrop.bottom = layer->sourceCrop.top + + testRandMod(gBuf->getHeight() - layer->sourceCrop.top) + 1; + layer->displayFrame.left = testRandMod(width); + layer->displayFrame.top = testRandMod(height); + layer->displayFrame.right = layer->displayFrame.left + + testRandMod(width - layer->displayFrame.left) + 1; + layer->displayFrame.bottom = layer->displayFrame.top + + testRandMod(height - layer->displayFrame.top) + 1; + layer->visibleRegionScreen.numRects = 1; + layer->visibleRegionScreen.rects = &layer->displayFrame; + } + + // Perform prepare operation + if (verbose) { testPrintI("Prepare:"); displayList(list); } + hwcDevice->prepare(hwcDevice, list); + if (verbose) { + testPrintI("Post Prepare:"); + displayListPrepareModifiable(list); + } + + // Turn off the geometry changed flag + list->flags &= ~HWC_GEOMETRY_CHANGED; + + // Perform the set operation(s) + if (verbose) {testPrintI("Set:"); } + for (unsigned int n1 = 0; n1 < numSet; n1++) { + if (verbose) {displayListHandles(list); } + hwcDevice->set(hwcDevice, dpy, surface, list); + + // Prandomly select a new set of handles + for (unsigned int n1 = 0; n1 < list->numHwLayers; n1++) { + unsigned int idx = testRandMod(selectedFrames[n1].size()); + sp<GraphicBuffer> gBuf = selectedFrames[n1][idx]; + hwc_layer_t *layer = &list->hwLayers[n1]; + layer->handle = (native_handle_t *) gBuf->handle; + } + + testDelay(perSetDelay); + } + + + freeLayerList(list); + testPrintI("==== Completed pass: %u", pass); + } + + testDelay(endDelay); + + // Start framework + rv = snprintf(cmd, sizeof(cmd), "%s", CMD_START_FRAMEWORK); + if (rv >= (signed) sizeof(cmd) - 1) { + testPrintE("Command too long for: %s", CMD_START_FRAMEWORK); + exit(21); + } + execCmd(cmd); + + testPrintI("Successfully completed %u passes", pass - startPass); + + return 0; +} + +/* + * Execute Command + * + * Executes the command pointed to by cmd. Output from the + * executed command is captured and sent to LogCat Info. Once + * the command has finished execution, it's exit status is captured + * and checked for an exit status of zero. Any other exit status + * causes diagnostic information to be printed and an immediate + * testcase failure. + */ +static void execCmd(const char *cmd) +{ + FILE *fp; + int rv; + int status; + char str[MAXSTR]; + + // Display command to be executed + testPrintI("cmd: %s", cmd); + + // Execute the command + fflush(stdout); + if ((fp = popen(cmd, "r")) == NULL) { + testPrintE("execCmd popen failed, errno: %i", errno); + exit(30); + } + + // Obtain and display each line of output from the executed command + while (fgets(str, sizeof(str), fp) != NULL) { + if ((strlen(str) > 1) && (str[strlen(str) - 1] == '\n')) { + str[strlen(str) - 1] = '\0'; + } + testPrintI(" out: %s", str); + } + + // Obtain and check return status of executed command. + // Fail on non-zero exit status + status = pclose(fp); + if (!(WIFEXITED(status) && (WEXITSTATUS(status) == 0))) { + testPrintE("Unexpected command failure"); + testPrintE(" status: %#x", status); + if (WIFEXITED(status)) { + testPrintE("WEXITSTATUS: %i", WEXITSTATUS(status)); + } + if (WIFSIGNALED(status)) { + testPrintE("WTERMSIG: %i", WTERMSIG(status)); + } + exit(31); + } +} + +static void checkEglError(const char* op, EGLBoolean returnVal) { + if (returnVal != EGL_TRUE) { + testPrintE("%s() returned %d", op, returnVal); + } + + for (EGLint error = eglGetError(); error != EGL_SUCCESS; error + = eglGetError()) { + testPrintE("after %s() eglError %s (0x%x)", + op, EGLUtils::strerror(error), error); + } +} + +static void checkGlError(const char* op) { + for (GLint error = glGetError(); error; error + = glGetError()) { + testPrintE("after %s() glError (0x%x)", op, error); + } +} + +static void printEGLConfiguration(EGLDisplay dpy, EGLConfig config) { + +#define X(VAL) {VAL, #VAL} + struct {EGLint attribute; const char* name;} names[] = { + X(EGL_BUFFER_SIZE), + X(EGL_ALPHA_SIZE), + X(EGL_BLUE_SIZE), + X(EGL_GREEN_SIZE), + X(EGL_RED_SIZE), + X(EGL_DEPTH_SIZE), + X(EGL_STENCIL_SIZE), + X(EGL_CONFIG_CAVEAT), + X(EGL_CONFIG_ID), + X(EGL_LEVEL), + X(EGL_MAX_PBUFFER_HEIGHT), + X(EGL_MAX_PBUFFER_PIXELS), + X(EGL_MAX_PBUFFER_WIDTH), + X(EGL_NATIVE_RENDERABLE), + X(EGL_NATIVE_VISUAL_ID), + X(EGL_NATIVE_VISUAL_TYPE), + X(EGL_SAMPLES), + X(EGL_SAMPLE_BUFFERS), + X(EGL_SURFACE_TYPE), + X(EGL_TRANSPARENT_TYPE), + X(EGL_TRANSPARENT_RED_VALUE), + X(EGL_TRANSPARENT_GREEN_VALUE), + X(EGL_TRANSPARENT_BLUE_VALUE), + X(EGL_BIND_TO_TEXTURE_RGB), + X(EGL_BIND_TO_TEXTURE_RGBA), + X(EGL_MIN_SWAP_INTERVAL), + X(EGL_MAX_SWAP_INTERVAL), + X(EGL_LUMINANCE_SIZE), + X(EGL_ALPHA_MASK_SIZE), + X(EGL_COLOR_BUFFER_TYPE), + X(EGL_RENDERABLE_TYPE), + X(EGL_CONFORMANT), + }; +#undef X + + for (size_t j = 0; j < sizeof(names) / sizeof(names[0]); j++) { + EGLint value = -1; + EGLint returnVal = eglGetConfigAttrib(dpy, config, names[j].attribute, &value); + EGLint error = eglGetError(); + if (returnVal && error == EGL_SUCCESS) { + testPrintI(" %s: %d (%#x)", names[j].name, value, value); + } + } + testPrintI(""); +} + +static void printGLString(const char *name, GLenum s) +{ + const char *v = (const char *) glGetString(s); + + if (v == NULL) { + testPrintI("GL %s unknown", name); + } else { + testPrintI("GL %s = %s", name, v); + } +} + +/* + * createLayerList + * dynamically creates layer list with numLayers worth + * of hwLayers entries. + */ +static hwc_layer_list_t *createLayerList(size_t numLayers) +{ + hwc_layer_list_t *list; + + size_t size = sizeof(hwc_layer_list) + numLayers * sizeof(hwc_layer_t); + if ((list = (hwc_layer_list_t *) calloc(1, size)) == NULL) { + return NULL; + } + list->flags = HWC_GEOMETRY_CHANGED; + list->numHwLayers = numLayers; + + return list; +} + +/* + * freeLayerList + * Frees memory previous allocated via createLayerList(). + */ +static void freeLayerList(hwc_layer_list_t *list) +{ + free(list); +} + +static void fillColor(GraphicBuffer *gBuf, RGBColor color, float trans) +{ + unsigned char* buf = NULL; + status_t err; + unsigned int numPixels = gBuf->getWidth() * gBuf->getHeight(); + uint32_t pixel; + + // RGB 2 YUV conversion ratios + const struct rgb2yuvRatios { + int format; + float weightRed; + float weightBlu; + float weightGrn; + } rgb2yuvRatios[] = { + { HAL_PIXEL_FORMAT_YV12, 0.299, 0.114, 0.587 }, + }; + + const struct rgbAttrib { + int format; + bool hostByteOrder; + size_t bytes; + size_t rOffset; + size_t rSize; + size_t gOffset; + size_t gSize; + size_t bOffset; + size_t bSize; + size_t aOffset; + size_t aSize; + } rgbAttributes[] = { + {HAL_PIXEL_FORMAT_RGBA_8888, false, 4, 0, 8, 8, 8, 16, 8, 24, 8}, + {HAL_PIXEL_FORMAT_RGBX_8888, false, 4, 0, 8, 8, 8, 16, 8, 0, 0}, + {HAL_PIXEL_FORMAT_RGB_888, false, 3, 0, 8, 8, 8, 16, 8, 0, 0}, + {HAL_PIXEL_FORMAT_RGB_565, true, 2, 0, 5, 5, 6, 11, 5, 0, 0}, + {HAL_PIXEL_FORMAT_BGRA_8888, false, 4, 16, 8, 8, 8, 0, 8, 24, 8}, + {HAL_PIXEL_FORMAT_RGBA_5551, true , 2, 0, 5, 5, 5, 10, 5, 15, 1}, + {HAL_PIXEL_FORMAT_RGBA_4444, false, 2, 12, 4, 0, 4, 4, 4, 8, 4}, + }; + + // If YUV format, convert color and pass work to YUV color fill + for (unsigned int n1 = 0; n1 < NUMA(rgb2yuvRatios); n1++) { + if (gBuf->getPixelFormat() == rgb2yuvRatios[n1].format) { + float wr = rgb2yuvRatios[n1].weightRed; + float wb = rgb2yuvRatios[n1].weightBlu; + float wg = rgb2yuvRatios[n1].weightGrn; + float y = wr * color.r() + wb * color.b() + wg * color.g(); + float u = 0.5 * ((color.b() - y) / (1 - wb)) + 0.5; + float v = 0.5 * ((color.r() - y) / (1 - wr)) + 0.5; + YUVColor yuvColor(y, u, v); + fillColor(gBuf, yuvColor, trans); + return; + } + } + + const struct rgbAttrib *attrib; + for (attrib = rgbAttributes; attrib < rgbAttributes + NUMA(rgbAttributes); + attrib++) { + if (attrib->format == gBuf->getPixelFormat()) { break; } + } + if (attrib >= rgbAttributes + NUMA(rgbAttributes)) { + testPrintE("fillColor rgb unsupported format of: %u", + gBuf->getPixelFormat()); + exit(50); + } + + pixel = htonl((uint32_t) (((1 << attrib->rSize) - 1) * color.r()) + << ((sizeof(pixel) * BITSPERBYTE) + - (attrib->rOffset + attrib->rSize))); + pixel |= htonl((uint32_t) (((1 << attrib->gSize) - 1) * color.g()) + << ((sizeof(pixel) * BITSPERBYTE) + - (attrib->gOffset + attrib->gSize))); + pixel |= htonl((uint32_t) (((1 << attrib->bSize) - 1) * color.b()) + << ((sizeof(pixel) * BITSPERBYTE) + - (attrib->bOffset + attrib->bSize))); + if (attrib->aSize) { + pixel |= htonl((uint32_t) (((1 << attrib->aSize) - 1) * trans) + << ((sizeof(pixel) * BITSPERBYTE) + - (attrib->aOffset + attrib->aSize))); + } + if (attrib->hostByteOrder) { + pixel = ntohl(pixel); + pixel >>= sizeof(pixel) * BITSPERBYTE - attrib->bytes * BITSPERBYTE; + } + + err = gBuf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&buf)); + if (err != 0) { + testPrintE("fillColor rgb lock failed: %d", err); + exit(51); + } + + for (unsigned int n1 = 0; n1 < numPixels; n1++) { + memmove(buf, &pixel, attrib->bytes); + buf += attrib->bytes; + } + + err = gBuf->unlock(); + if (err != 0) { + testPrintE("fillColor rgb unlock failed: %d", err); + exit(52); + } +} + +static void fillColor(GraphicBuffer *gBuf, YUVColor color, float trans) +{ + unsigned char* buf = NULL; + status_t err; + unsigned int width = gBuf->getWidth(); + unsigned int height = gBuf->getHeight(); + + const struct yuvAttrib { + int format; + size_t padWidth; + bool planar; + unsigned int uSubSampX; + unsigned int uSubSampY; + unsigned int vSubSampX; + unsigned int vSubSampY; + } yuvAttributes[] = { + { HAL_PIXEL_FORMAT_YV12, 16, true, 2, 2, 2, 2}, + }; + + const struct yuvAttrib *attrib; + for (attrib = yuvAttributes; attrib < yuvAttributes + NUMA(yuvAttributes); + attrib++) { + if (attrib->format == gBuf->getPixelFormat()) { break; } + } + if (attrib >= yuvAttributes + NUMA(yuvAttributes)) { + testPrintE("fillColor yuv unsupported format of: %u", + gBuf->getPixelFormat()); + exit(60); + } + + assert(attrib->planar == true); // So far, only know how to handle planar + + // If needed round width up to pad size + if (width % attrib->padWidth) { + width += attrib->padWidth - (width % attrib->padWidth); + } + assert((width % attrib->padWidth) == 0); + + err = gBuf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&buf)); + if (err != 0) { + testPrintE("fillColor lock failed: %d", err); + exit(61); + } + + // Fill in Y component + for (unsigned int x = 0; x < width; x++) { + for (unsigned int y = 0; y < height; y++) { + *buf++ = (x < gBuf->getWidth()) ? (255 * color.y()) : 0; + } + } + + // Fill in U component + for (unsigned int x = 0; x < width; x += attrib->uSubSampX) { + for (unsigned int y = 0; y < height; y += attrib->uSubSampY) { + *buf++ = (x < gBuf->getWidth()) ? (255 * color.u()) : 0; + } + } + + // Fill in V component + for (unsigned int x = 0; x < width; x += attrib->vSubSampX) { + for (unsigned int y = 0; y < height; y += attrib->vSubSampY) { + *buf++ = (x < gBuf->getWidth()) ? (255 * color.v()) : 0; + } + } + + err = gBuf->unlock(); + if (err != 0) { + testPrintE("fillColor unlock failed: %d", err); + exit(62); + } +} + +void init(void) +{ + int rv; + + EGLBoolean returnValue; + EGLConfig myConfig = {0}; + EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; + EGLint sConfigAttribs[] = { + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_NONE }; + EGLint majorVersion, minorVersion; + + checkEglError("<init>"); + dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); + checkEglError("eglGetDisplay"); + if (dpy == EGL_NO_DISPLAY) { + testPrintE("eglGetDisplay returned EGL_NO_DISPLAY"); + exit(70); + } + + returnValue = eglInitialize(dpy, &majorVersion, &minorVersion); + checkEglError("eglInitialize", returnValue); + testPrintI("EGL version %d.%d", majorVersion, minorVersion); + if (returnValue != EGL_TRUE) { + testPrintE("eglInitialize failed"); + exit(71); + } + + EGLNativeWindowType window = android_createDisplaySurface(); + if (window == NULL) { + testPrintE("android_createDisplaySurface failed"); + exit(72); + } + returnValue = EGLUtils::selectConfigForNativeWindow(dpy, + sConfigAttribs, window, &myConfig); + if (returnValue) { + testPrintE("EGLUtils::selectConfigForNativeWindow() returned %d", + returnValue); + exit(73); + } + checkEglError("EGLUtils::selectConfigForNativeWindow"); + + testPrintI("Chose this configuration:"); + printEGLConfiguration(dpy, myConfig); + + surface = eglCreateWindowSurface(dpy, myConfig, window, NULL); + checkEglError("eglCreateWindowSurface"); + if (surface == EGL_NO_SURFACE) { + testPrintE("gelCreateWindowSurface failed."); + exit(74); + } + + context = eglCreateContext(dpy, myConfig, EGL_NO_CONTEXT, contextAttribs); + checkEglError("eglCreateContext"); + if (context == EGL_NO_CONTEXT) { + testPrintE("eglCreateContext failed"); + exit(75); + } + returnValue = eglMakeCurrent(dpy, surface, surface, context); + checkEglError("eglMakeCurrent", returnValue); + if (returnValue != EGL_TRUE) { + testPrintE("eglMakeCurrent failed"); + exit(76); + } + eglQuerySurface(dpy, surface, EGL_WIDTH, &width); + checkEglError("eglQuerySurface"); + eglQuerySurface(dpy, surface, EGL_HEIGHT, &height); + checkEglError("eglQuerySurface"); + + fprintf(stderr, "Window dimensions: %d x %d", width, height); + + printGLString("Version", GL_VERSION); + printGLString("Vendor", GL_VENDOR); + printGLString("Renderer", GL_RENDERER); + printGLString("Extensions", GL_EXTENSIONS); + + if ((rv = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwcModule)) != 0) { + testPrintE("hw_get_module failed, rv: %i", rv); + errno = -rv; + perror(NULL); + exit(77); + } + if ((rv = hwc_open(hwcModule, &hwcDevice)) != 0) { + testPrintE("hwc_open failed, rv: %i", rv); + errno = -rv; + perror(NULL); + exit(78); + } + + testPrintI(""); +} + +/* + * Initialize Frames + * + * Creates an array of graphic buffers, within the global variable + * named frames. The graphic buffers are contained within a vector of + * verctors. All the graphic buffers in a particular row are of the same + * format and dimension. Each graphic buffer is uniformly filled with a + * prandomly selected color. It is likely that each buffer, even + * in the same row, will be filled with a unique color. + */ +void initFrames(unsigned int seed) +{ + const size_t maxRows = 5; + const size_t minCols = 2; // Need at least double buffering + const size_t maxCols = 4; // One more than triple buffering + + if (verbose) { testPrintI("initFrames seed: %u", seed); } + srand48(seed); + size_t rows = testRandMod(maxRows) + 1; + + frames.clear(); + frames.resize(rows); + + for (unsigned int row = 0; row < rows; row++) { + // All frames within a row have to have the same format and + // dimensions. Width and height need to be >= 1. + int format = graphicFormat[testRandMod(NUMA(graphicFormat))].format; + size_t w = (width * maxSizeRatio) * testRandFract(); + size_t h = (height * maxSizeRatio) * testRandFract(); + w = max(1u, w); + h = max(1u, h); + if (verbose) { + testPrintI(" frame %u width: %u height: %u format: %u %s", + row, w, h, format, graphicFormat2str(format)); + } + + size_t cols = testRandMod((maxCols + 1) - minCols) + minCols; + frames[row].resize(cols); + for (unsigned int col = 0; col < cols; col++) { + RGBColor color(testRandFract(), testRandFract(), testRandFract()); + float transp = testRandFract(); + + frames[row][col] = new GraphicBuffer(w, h, format, texUsage); + fillColor(frames[row][col].get(), color, transp); + if (verbose) { + testPrintI(" buf: %p handle: %p color: <%f, %f, %f> " + "transp: %f", + frames[row][col].get(), frames[row][col]->handle, + color.r(), color.g(), color.b(), transp); + } + } + } +} + +void displayList(hwc_layer_list_t *list) +{ + testPrintI(" flags: %#x%s", list->flags, + (list->flags & HWC_GEOMETRY_CHANGED) ? " GEOMETRY_CHANGED" : ""); + testPrintI(" numHwLayers: %u", list->numHwLayers); + + for (unsigned int layer = 0; layer < list->numHwLayers; layer++) { + testPrintI(" layer %u compositionType: %#x%s%s", layer, + list->hwLayers[layer].compositionType, + (list->hwLayers[layer].compositionType == HWC_FRAMEBUFFER) + ? " FRAMEBUFFER" : "", + (list->hwLayers[layer].compositionType == HWC_OVERLAY) + ? " OVERLAY" : ""); + + testPrintI(" hints: %#x", + list->hwLayers[layer].hints, + (list->hwLayers[layer].hints & HWC_HINT_TRIPLE_BUFFER) + ? " TRIPLE_BUFFER" : "", + (list->hwLayers[layer].hints & HWC_HINT_CLEAR_FB) + ? " CLEAR_FB" : ""); + + testPrintI(" flags: %#x%s", + list->hwLayers[layer].flags, + (list->hwLayers[layer].flags & HWC_SKIP_LAYER) + ? " SKIP_LAYER" : ""); + + testPrintI(" handle: %p", + list->hwLayers[layer].handle); + + // Intentionally skipped display of ROT_180 & ROT_270, + // which are formed from combinations of the other flags. + testPrintI(" transform: %#x%s%s%s", + list->hwLayers[layer].transform, + (list->hwLayers[layer].transform & HWC_TRANSFORM_FLIP_H) + ? " FLIP_H" : "", + (list->hwLayers[layer].transform & HWC_TRANSFORM_FLIP_V) + ? " FLIP_V" : "", + (list->hwLayers[layer].transform & HWC_TRANSFORM_ROT_90) + ? " ROT_90" : ""); + + testPrintI(" blending: %#x", + list->hwLayers[layer].blending, + (list->hwLayers[layer].blending == HWC_BLENDING_NONE) + ? " NONE" : "", + (list->hwLayers[layer].blending == HWC_BLENDING_PREMULT) + ? " PREMULT" : "", + (list->hwLayers[layer].blending == HWC_BLENDING_COVERAGE) + ? " COVERAGE" : ""); + + testPrintI(" sourceCrop: [%i, %i, %i, %i]", + list->hwLayers[layer].sourceCrop.left, + list->hwLayers[layer].sourceCrop.top, + list->hwLayers[layer].sourceCrop.right, + list->hwLayers[layer].sourceCrop.bottom); + + testPrintI(" displayFrame: [%i, %i, %i, %i]", + list->hwLayers[layer].displayFrame.left, + list->hwLayers[layer].displayFrame.top, + list->hwLayers[layer].displayFrame.right, + list->hwLayers[layer].displayFrame.bottom); + } +} + +/* + * Display List Prepare Modifiable + * + * Displays the portions of a list that are meant to be modified by + * a prepare call. + */ +void displayListPrepareModifiable(hwc_layer_list_t *list) +{ + for (unsigned int layer = 0; layer < list->numHwLayers; layer++) { + testPrintI(" layer %u compositionType: %#x%s%s", layer, + list->hwLayers[layer].compositionType, + (list->hwLayers[layer].compositionType == HWC_FRAMEBUFFER) + ? " FRAMEBUFFER" : "", + (list->hwLayers[layer].compositionType == HWC_OVERLAY) + ? " OVERLAY" : ""); + testPrintI(" hints: %#x%s%s", + list->hwLayers[layer].hints, + (list->hwLayers[layer].hints & HWC_HINT_TRIPLE_BUFFER) + ? " TRIPLE_BUFFER" : "", + (list->hwLayers[layer].hints & HWC_HINT_CLEAR_FB) + ? " CLEAR_FB" : ""); + } +} + +/* + * Display List Handles + * + * Displays the handles of all the graphic buffers in the list. + */ +void displayListHandles(hwc_layer_list_t *list) +{ + const unsigned int maxLayersPerLine = 6; + + ostringstream str(" layers:"); + for (unsigned int layer = 0; layer < list->numHwLayers; layer++) { + str << ' ' << list->hwLayers[layer].handle; + if (((layer % maxLayersPerLine) == (maxLayersPerLine - 1)) + && (layer != list->numHwLayers - 1)) { + testPrintI("%s", str.str().c_str()); + str.str(" "); + } + } + testPrintI("%s", str.str().c_str()); +} + +const char *graphicFormat2str(unsigned int format) +{ + const static char *unknown = "unknown"; + + for (unsigned int n1 = 0; n1 < NUMA(graphicFormat); n1++) { + if (format == graphicFormat[n1].format) { + return graphicFormat[n1].desc; + } + } + + return unknown; +} + +/* + * Vector Random Select + * + * Prandomly selects and returns num elements from vec. + */ +template <class T> +vector<T> vectorRandSelect(const vector<T>& vec, size_t num) +{ + vector<T> rv = vec; + + while (rv.size() > num) { + rv.erase(rv.begin() + testRandMod(rv.size())); + } + + return rv; +} + +/* + * Vector Or + * + * Or's togethen the values of each element of vec and returns the result. + */ +template <class T> +T vectorOr(const vector<T>& vec) +{ + T rv = 0; + + for (size_t n1 = 0; n1 < vec.size(); n1++) { + rv |= vec[n1]; + } + + return rv; +} diff --git a/packages/SystemUI/res/layout-xlarge/status_bar.xml b/packages/SystemUI/res/layout-xlarge/status_bar.xml index d4e9c53..758377b 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar.xml @@ -82,14 +82,24 @@ android:orientation="horizontal" android:gravity="center" > - <ImageView - android:id="@+id/network" + <FrameLayout android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="top" android:layout_marginTop="19dp" android:layout_marginRight="4dp" - /> + > + <ImageView + android:id="@+id/network_signal" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + /> + <ImageView + android:id="@+id/network_type" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + /> + </FrameLayout> <ImageView android:id="@+id/battery" android:layout_height="wrap_content" diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_notification_panel.xml b/packages/SystemUI/res/layout-xlarge/status_bar_notification_panel.xml index c0612c8..1d98458 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar_notification_panel.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar_notification_panel.xml @@ -95,7 +95,17 @@ /> <ImageView - android:id="@+id/network" + android:id="@+id/network_signal" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:layout_toRightOf="@id/battery_text" + android:layout_alignBaseline="@id/battery" + android:layout_marginRight="8dp" + android:baseline="15dp" + /> + + <ImageView + android:id="@+id/network_type" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_toRightOf="@id/battery_text" @@ -109,7 +119,7 @@ style="@style/StatusBarNotificationText" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_toRightOf="@id/network" + android:layout_toRightOf="@id/network_signal" android:layout_alignBaseline="@id/battery" android:singleLine="true" android:text="@string/status_bar_settings_settings_button" diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 1a32aa7..8a18d55 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"التنبيهات"</string> <string name="battery_low_title" msgid="7923774589611311406">"الرجاء توصيل الشاحن"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"البطارية منخفضة:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"يتبقى <xliff:g id="NUMBER">%d%%</xliff:g> أو أقل."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"استخدام البطارية"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"حديثة"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index a9c8ba0..9270997 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Известия"</string> <string name="battery_low_title" msgid="7923774589611311406">"Моля, включете зарядно устройство"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Батерията се изтощава:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"Остава <xliff:g id="NUMBER">%d%%</xliff:g> или по-малко."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Използване на батерията"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Скорошни"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index eea01e1..70f3ee1 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificacions"</string> <string name="battery_low_title" msgid="7923774589611311406">"Connecteu el carregador"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Comença a quedar poca bateria:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"En queda un <xliff:g id="NUMBER">%d%%</xliff:g> o menys."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Ús de la bateria"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Recents"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-cs-xlarge/strings.xml b/packages/SystemUI/res/values-cs-xlarge/strings.xml deleted file mode 100644 index d432a8b..0000000 --- a/packages/SystemUI/res/values-cs-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"žádné připojení k internetu"</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: připojeno"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: připojování"</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"Mob. data: připojeno"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"Mob. data: připojování"</string> -</resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 5eac747..cfdf0dd 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Oznámení"</string> <string name="battery_low_title" msgid="7923774589611311406">"Prosím připojte dobíjecí zařízení"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Baterie je vybitá:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"Zbývá <xliff:g id="NUMBER">%d%%</xliff:g> nebo méně."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Využití baterie"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Nejnovější"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-da-xlarge/strings.xml b/packages/SystemUI/res/values-da-xlarge/strings.xml deleted file mode 100644 index 9d587a8..0000000 --- a/packages/SystemUI/res/values-da-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"ingen forbindelse"</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi forbundet"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: forbinder..."</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"Mobildata tilsluttet"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"Mobildata tilsluttes"</string> -</resources> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 7b49070..e4fc728 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Meddelelser"</string> <string name="battery_low_title" msgid="7923774589611311406">"Forbind oplader"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Batteriet er ved at være fladt:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> eller mindre tilbage."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Batteriforbrug"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Seneste"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-de-xlarge/strings.xml b/packages/SystemUI/res/values-de-xlarge/strings.xml deleted file mode 100644 index fd1a976..0000000 --- a/packages/SystemUI/res/values-de-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"Keine Verbindung"</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"WLAN: verbunden"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"WLAN: verbindet..."</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"Mobile Daten: aktiv"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"Mobile Daten: verbindet"</string> -</resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 1535e78..edb1bef 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Benachrichtigungen"</string> <string name="battery_low_title" msgid="7923774589611311406">"Ladegerät anschließen"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Akku ist fast leer."</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> oder weniger verbleiben."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Akkuverbrauch"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Zuletzt verwendet"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-el-xlarge/strings.xml b/packages/SystemUI/res/values-el-xlarge/strings.xml deleted file mode 100644 index c52d6daf..0000000 --- a/packages/SystemUI/res/values-el-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"χωρίς σύνδ. σε Διαδ."</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: συνδέθηκε"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: σύνδεση..."</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"Δεδ. κιν.: συνδέθηκε"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"Δεδ.κιν.: σύνδεση..."</string> -</resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 369b16f..21ea803 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ειδοποιήσεις"</string> <string name="battery_low_title" msgid="7923774589611311406">"Συνδέστε τον φορτιστή"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Η στάθμη της μπαταρίας είναι χαμηλή:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"Απομένει <xliff:g id="NUMBER">%d%%</xliff:g> ή λιγότερο."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Χρήση μπαταρίας"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Πρόσφατα"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index db4f9ba..c9d4b76 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string> <string name="battery_low_title" msgid="7923774589611311406">"Please connect charger"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"The battery is getting low:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> or less remaining."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Battery use"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Recent"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-es-rUS-xlarge/strings.xml b/packages/SystemUI/res/values-es-rUS-xlarge/strings.xml deleted file mode 100644 index 6530edf..0000000 --- a/packages/SystemUI/res/values-es-rUS-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"no hay conexión a Internet"</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: conectado"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: conectando…"</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"Datos para cel: conectado"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"Datos para cel: conectando"</string> -</resources> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 2312be7..b6d3618 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -31,11 +31,19 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificaciones"</string> <string name="battery_low_title" msgid="7923774589611311406">"Conecta el cargador"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Hay poca batería:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"Restan <xliff:g id="NUMBER">%d%%</xliff:g> o menos."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Uso de la batería"</string> - <string name="status_bar_settings_settings_button" msgid="7832600575390861653">"Configuración"</string> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> + <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Reciente"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> <skip /> diff --git a/packages/SystemUI/res/values-es-xlarge/strings.xml b/packages/SystemUI/res/values-es-xlarge/strings.xml deleted file mode 100644 index adcda91..0000000 --- a/packages/SystemUI/res/values-es-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"sin conexión"</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"WiFi: conectado"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"WiFi: conectando..."</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"Datos móviles: conectados"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"Datos móviles: conectando..."</string> -</resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 64b60b4..77773af 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificaciones"</string> <string name="battery_low_title" msgid="7923774589611311406">"Conecta el cargador"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Se está agotando la batería:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> o menos disponible"</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Uso de la batería"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Reciente"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 8e2b348..015b87c 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"اعلان ها"</string> <string name="battery_low_title" msgid="7923774589611311406">"لطفاً شارژر را وصل کنید"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"باتری در حال کم شدن است:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> یا کمتر باقیمانده است."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"استفاده از باتری"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"اخیر"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 8fcc7d6..d677afc 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ilmoitukset"</string> <string name="battery_low_title" msgid="7923774589611311406">"Kytke laturi"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Akun virta on vähissä:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"jäljellä <xliff:g id="NUMBER">%d%%</xliff:g> tai vähemmän."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Akun käyttö"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Viimeisimmät"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-fr-xlarge/strings.xml b/packages/SystemUI/res/values-fr-xlarge/strings.xml deleted file mode 100644 index f8036ad..0000000 --- a/packages/SystemUI/res/values-fr-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"Internet indisponible"</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi : connecté"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi : connexion..."</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"Données mobiles connectées"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"Connexion données mobiles..."</string> -</resources> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 7df4d74..8877329 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string> <string name="battery_low_title" msgid="7923774589611311406">"Branchez le chargeur"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Le niveau de la batterie est bas :"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"Maximum <xliff:g id="NUMBER">%d%%</xliff:g> restants."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Utilisation de la batterie"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Récentes"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-he/strings.xml b/packages/SystemUI/res/values-he/strings.xml index 0e3479b..ad1f755 100644 --- a/packages/SystemUI/res/values-he/strings.xml +++ b/packages/SystemUI/res/values-he/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"התראות"</string> <string name="battery_low_title" msgid="7923774589611311406">"חבר מטען"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"הסוללה נחלשת:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"נותרו עוד <xliff:g id="NUMBER">%d%%</xliff:g> או פחות."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"צריכת סוללה"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"אחרונות"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 0fea021..d601eb0 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Obavijesti"</string> <string name="battery_low_title" msgid="7923774589611311406">"Priključite punjač"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Baterija će uskoro biti potrošena:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"Preostaje <xliff:g id="NUMBER">%d%%</xliff:g> ili manje."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Iskorištenost baterije"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Nedavni"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 788e96f..4188b6f 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Értesítések"</string> <string name="battery_low_title" msgid="7923774589611311406">"Kérjük, csatlakoztassa a töltőt"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Akkufeszültség alacsony:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> vagy kevesebb maradt."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Akkumulátorhasználat"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Legutóbbiak"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-id/strings.xml b/packages/SystemUI/res/values-id/strings.xml index cde575f..974498a 100644 --- a/packages/SystemUI/res/values-id/strings.xml +++ b/packages/SystemUI/res/values-id/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Pemberitahuan"</string> <string name="battery_low_title" msgid="7923774589611311406">"Harap hubungkan ke pengisi daya"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Baterai kekurangan daya:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> atau kurang yang tersisa."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Penggunaan baterai"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Terbaru"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-it-xlarge/strings.xml b/packages/SystemUI/res/values-it-xlarge/strings.xml deleted file mode 100644 index 3909bd5..0000000 --- a/packages/SystemUI/res/values-it-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"no conness. Internet"</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: connesso"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: connessione…"</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"Dati cell.: connesso"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"Dati cell.: connessione…"</string> -</resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index ee91a16..0507cf9 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifiche"</string> <string name="battery_low_title" msgid="7923774589611311406">"Collegare il caricabatterie"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Batteria quasi scarica:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> rimanente o meno."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Utilizzo batteria"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Recenti"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-ja-xlarge/strings.xml b/packages/SystemUI/res/values-ja-xlarge/strings.xml deleted file mode 100644 index df512b7..0000000 --- a/packages/SystemUI/res/values-ja-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"インターネット接続なし"</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: 接続されました"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: 接続中..."</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"データ通信: 接続されました"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"データ通信: 接続中..."</string> -</resources> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 817f656..782d03b 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string> <string name="battery_low_title" msgid="7923774589611311406">"充電してください"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"電池が残り少なくなっています:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"残り<xliff:g id="NUMBER">%d%%</xliff:g>未満です。"</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"電池使用量"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"新着"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-ko-xlarge/strings.xml b/packages/SystemUI/res/values-ko-xlarge/strings.xml deleted file mode 100644 index 42f798c..0000000 --- a/packages/SystemUI/res/values-ko-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"인터넷에 연결되지 않음"</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: 연결됨"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: 연결 중…"</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"모바일 데이터: 연결됨"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"모바일 데이터: 연결 중…"</string> -</resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index be94258..5e9b9d5 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"알림"</string> <string name="battery_low_title" msgid="7923774589611311406">"충전기를 연결하세요."</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"배터리 전원이 부족합니다."</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"잔여 배터리가 <xliff:g id="NUMBER">%d%%</xliff:g> 이하입니다."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"배터리 사용량"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"최근 사용한 앱"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index ccfc800..3d6d099 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Įspėjimai"</string> <string name="battery_low_title" msgid="7923774589611311406">"Prijunkite kroviklį"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Akumuliatorius senka:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"Liko <xliff:g id="NUMBER">%d%%</xliff:g> ar mažiau."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Akumuliatoriaus naudojimas"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Naujos"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index dd6cdcf..74a7890 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Paziņojumi"</string> <string name="battery_low_title" msgid="7923774589611311406">"Lūdzu, pievienojiet uzlādes ierīci."</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Akumulatora uzlādes līmenis kļūst zems:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"Atlicis <xliff:g id="NUMBER">%d%%</xliff:g> vai mazāk."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Akumulatora lietojums"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Nesens"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-nb-xlarge/strings.xml b/packages/SystemUI/res/values-nb-xlarge/strings.xml deleted file mode 100644 index b07d70c..0000000 --- a/packages/SystemUI/res/values-nb-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"ingen Int.-tilkobl."</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: tilkoblet"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: kobler til"</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"Mob.data: tilkoblet"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"Mob.data: kobler til"</string> -</resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 5da4f01..147242f 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Varslinger"</string> <string name="battery_low_title" msgid="7923774589611311406">"Koble til en lader"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Batteriet er nesten tomt:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"mindre enn <xliff:g id="NUMBER">%d%%</xliff:g> igjen."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Batteribruk"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Nylig"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-nl-xlarge/strings.xml b/packages/SystemUI/res/values-nl-xlarge/strings.xml deleted file mode 100644 index 6298908..0000000 --- a/packages/SystemUI/res/values-nl-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"geen internet"</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: verbonden"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: verbinden…"</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"Mobiel: verbonden"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"Mobiel: verbinden..."</string> -</resources> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 3492652..6067cca 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Meldingen"</string> <string name="battery_low_title" msgid="7923774589611311406">"Sluit de oplader aan"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"De accu raakt op:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> of minder resterend."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Accugebruik"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Recent"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-pl-xlarge/strings.xml b/packages/SystemUI/res/values-pl-xlarge/strings.xml deleted file mode 100644 index e2cefc6..0000000 --- a/packages/SystemUI/res/values-pl-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"brak połączenia internetowego"</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: połączono"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: łączenie…"</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"Sieć komórkowa: połączono"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"Sieć komórkowa: łączenie…"</string> -</resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index f6a6d79..6b19a34 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Powiadomienia"</string> <string name="battery_low_title" msgid="7923774589611311406">"Podłącz ładowarkę"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Bateria się rozładowuje:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"Pozostało: <xliff:g id="NUMBER">%d%%</xliff:g> lub mniej."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Użycie baterii"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Najnowsze"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-pt-rPT-xlarge/strings.xml b/packages/SystemUI/res/values-pt-rPT-xlarge/strings.xml deleted file mode 100644 index 550c11c..0000000 --- a/packages/SystemUI/res/values-pt-rPT-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"Sem ligação à internet"</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: ligado"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: a ligar…"</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"Dados móveis: ligado"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"Dados móveis: a ligar..."</string> -</resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 2c03a18..7bf6eb4 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificações"</string> <string name="battery_low_title" msgid="7923774589611311406">"Ligue o carregador"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"A bateria está a ficar fraca:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"Restam <xliff:g id="NUMBER">%d%%</xliff:g> ou menos."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Utilização da bateria"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Recente"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-pt-xlarge/strings.xml b/packages/SystemUI/res/values-pt-xlarge/strings.xml deleted file mode 100644 index 9f2d033..0000000 --- a/packages/SystemUI/res/values-pt-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"Sem conex. à intern."</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: conectado"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: conectando…"</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"Dados móv: conectado"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"Dados: conectando..."</string> -</resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index a7a43a8..14b4b1f 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificações"</string> <string name="battery_low_title" msgid="7923774589611311406">"Conecte o carregador"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"A bateria está ficando baixa:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> ou menos restante(s)."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Uso da bateria"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Recente"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-rm/strings.xml b/packages/SystemUI/res/values-rm/strings.xml index a8625a9..95520db 100644 --- a/packages/SystemUI/res/values-rm/strings.xml +++ b/packages/SystemUI/res/values-rm/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Avis"</string> <string name="battery_low_title" msgid="7923774589611311406">"Connectar il chargiabattarias"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"L\'accu è prest vid."</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> u pli pauc restant."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Consum dad accu"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Utilisà sco ultim"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 7b4ad47..b6cfe73 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificări"</string> <string name="battery_low_title" msgid="7923774589611311406">"Conectaţi încărcătorul"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Bateria se termină:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"A rămas <xliff:g id="NUMBER">%d%%</xliff:g> sau mai puţin."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Utilizarea bateriei"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Recente"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-ru-xlarge/strings.xml b/packages/SystemUI/res/values-ru-xlarge/strings.xml deleted file mode 100644 index 68b2b9a..0000000 --- a/packages/SystemUI/res/values-ru-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"связь отсутствует"</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: подключено"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: подключение..."</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"Моб. данные: подключено"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"Моб. данные: подключение..."</string> -</resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index d597315..0a15bcd 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Уведомления"</string> <string name="battery_low_title" msgid="7923774589611311406">"Подключите зарядное устройство"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Батарея разряжена:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"Осталось <xliff:g id="NUMBER">%d%%</xliff:g> или меньше."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Расход заряда батареи"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Недавние"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index b4a3221..a55d3b7 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Upozornenia"</string> <string name="battery_low_title" msgid="7923774589611311406">"Pripojte nabíjačku"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Batéria je skoro vybitá:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"Zostáva <xliff:g id="NUMBER">%d%%</xliff:g> alebo menej."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Využitie batérie"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Najnovšie"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 8783529..a9e5c30 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Obvestila"</string> <string name="battery_low_title" msgid="7923774589611311406">"Priključite napajalnik"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Baterija je skoraj prazna:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"Preostalo <xliff:g id="NUMBER">%d%%</xliff:g> ali manj."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Uporaba baterije"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Nedavno"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index a4d2bf0..f7dca2a 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Обавештења"</string> <string name="battery_low_title" msgid="7923774589611311406">"Прикључите пуњач"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Ниво напуњености батерије је низак:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"Преостало је <xliff:g id="NUMBER">%d%%</xliff:g> или мање."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Коришћење батерије"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Недавно"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-sv-xlarge/strings.xml b/packages/SystemUI/res/values-sv-xlarge/strings.xml deleted file mode 100644 index c1147c7..0000000 --- a/packages/SystemUI/res/values-sv-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"ingen Internetanslutn."</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: ansluten"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: ansluter..."</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"Mobildata: ansluten"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"Mobildata: ansluter…"</string> -</resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index f2dc7f1..06188ab 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Meddelanden"</string> <string name="battery_low_title" msgid="7923774589611311406">"Anslut laddaren"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Batteriet håller på att ta slut:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> eller mindre kvar."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Batteriförbrukning"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Senaste"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index fb25fdf..59b869d 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"การแจ้งเตือน"</string> <string name="battery_low_title" msgid="7923774589611311406">"โปรดเสียบอุปกรณ์ชาร์จ"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"แบตเตอรี่เหลือน้อย"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"เหลือ <xliff:g id="NUMBER">%d%%</xliff:g> หรือน้อยกว่า"</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"การใช้แบตเตอรี่"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"เมื่อเร็วๆ นี้"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 900de9f..2a075a7 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Mga Notification"</string> <string name="battery_low_title" msgid="7923774589611311406">"Pakikonekta ang charger"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Humihina ang baterya:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> o mas kaunti ang natitira."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Paggamit ng baterya"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Kamakailan"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-tr-xlarge/strings.xml b/packages/SystemUI/res/values-tr-xlarge/strings.xml deleted file mode 100644 index cc36b93..0000000 --- a/packages/SystemUI/res/values-tr-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"internet bağlantısı yok"</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"Kablosuz: bağlı"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"Kablosuz: bağlanıyor..."</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"Mobil veri: bağlı"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"Mob veri: bağlnyr..."</string> -</resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 31451e1..253fbe0 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Bildirimler"</string> <string name="battery_low_title" msgid="7923774589611311406">"Lütfen şarj cihazını takın"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Pil tükeniyor:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> veya daha az kaldı."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Pil kullanımı"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"En Son Görevler"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index e7b9f19..63088d9 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Сповіщення"</string> <string name="battery_low_title" msgid="7923774589611311406">"Підключ. заряд. пристрій"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Батарея виснажується:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"Залиш-ся <xliff:g id="NUMBER">%d%%</xliff:g> або менше."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Викор. батареї"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Останні"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index fe11324..8f4927f 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Thông báo"</string> <string name="battery_low_title" msgid="7923774589611311406">"Vui lòng kết nối bộ sạc"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Pin đang yếu:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"còn <xliff:g id="NUMBER">%d%%</xliff:g> hoặc ít hơn."</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Sử dụng pin"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"Gần đây"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-zh-rCN-xlarge/strings.xml b/packages/SystemUI/res/values-zh-rCN-xlarge/strings.xml deleted file mode 100644 index 072bcb0..0000000 --- a/packages/SystemUI/res/values-zh-rCN-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"无互联网连接"</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi:已连接"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi:正在连接..."</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"移动数据:已连接"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"移动数据:正在连接..."</string> -</resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 48218c0..161a085 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string> <string name="battery_low_title" msgid="7923774589611311406">"请连接充电器"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"电量所剩不多:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"电量剩余 <xliff:g id="NUMBER">%d%%</xliff:g> 或更少。"</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"电量使用情况"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"近期任务"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml b/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml deleted file mode 100644 index 0d06aad..0000000 --- a/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright (c) 2010, 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> - <string name="status_bar_settings_signal_meter_disconnected" msgid="2123001074951934237">"沒有網際網路連線"</string> - <!-- no translation found for status_bar_settings_signal_meter_wifi_ssid_format (6261810256542749384) --> - <skip /> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-F:已連線"</string> - <string name="status_bar_settings_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi:連線中..."</string> - <string name="status_bar_settings_signal_meter_data_connected" msgid="2171100321540926054">"行動數據:已連線"</string> - <string name="status_bar_settings_signal_meter_data_connecting" msgid="7183001278053801143">"行動數據:連線中..."</string> -</resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 10c08d0..eb9108d 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -31,11 +31,18 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string> <string name="battery_low_title" msgid="7923774589611311406">"請連接充電器"</string> <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"電池電量即將不足:"</string> - <!-- outdated translation 696154104579022959 --> <string name="battery_low_percent_format" msgid="1077244949318261761">"還剩 <xliff:g id="NUMBER">%d%%</xliff:g> 以下。"</string> + <!-- no translation found for battery_low_percent_format (1077244949318261761) --> + <skip /> <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"電池使用狀況"</string> - <!-- no translation found for status_bar_settings_settings_button (7832600575390861653) --> + <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) --> + <skip /> + <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> + <skip /> + <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) --> + <skip /> + <!-- no translation found for status_bar_settings_notifications (397146176280905137) --> <skip /> <string name="recent_tasks_title" msgid="3691764623638127888">"最新的"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DoNotDisturb.java b/packages/SystemUI/src/com/android/systemui/statusbar/DoNotDisturb.java new file mode 100644 index 0000000..9e44e71 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/DoNotDisturb.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2010 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.systemui.statusbar; + +import android.app.StatusBarManager; +import android.content.ContentResolver; +import android.content.Context; +import android.content.SharedPreferences; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.util.Slog; + +import com.android.systemui.statusbar.policy.Prefs; + +public class DoNotDisturb implements SharedPreferences.OnSharedPreferenceChangeListener { + private Context mContext; + private StatusBarManager mStatusBar; + SharedPreferences mPrefs; + private boolean mDoNotDisturb; + + public DoNotDisturb(Context context) { + mContext = context; + mStatusBar = (StatusBarManager)context.getSystemService(Context.STATUS_BAR_SERVICE); + mPrefs = Prefs.read(context); + mPrefs.registerOnSharedPreferenceChangeListener(this); + mDoNotDisturb = mPrefs.getBoolean(Prefs.DO_NOT_DISTURB_PREF, Prefs.DO_NOT_DISTURB_DEFAULT); + updateDisableRecord(); + } + + public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { + final boolean val = prefs.getBoolean(Prefs.DO_NOT_DISTURB_PREF, + Prefs.DO_NOT_DISTURB_DEFAULT); + if (val != mDoNotDisturb) { + mDoNotDisturb = val; + updateDisableRecord(); + } + } + + private void updateDisableRecord() { + final int disabled = StatusBarManager.DISABLE_NOTIFICATION_ICONS + | StatusBarManager.DISABLE_NOTIFICATION_ALERTS + | StatusBarManager.DISABLE_NOTIFICATION_TICKER; + mStatusBar.disable(mDoNotDisturb ? disabled : 0); + } +} + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java index d7f3730..472a225 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java @@ -53,6 +53,8 @@ public abstract class StatusBar extends SystemUI implements CommandQueue.Callbac protected abstract View makeStatusBarView(); protected abstract int getStatusBarGravity(); + private DoNotDisturb mDoNotDisturb; + public void start() { // First set up our views and stuff. View sb = makeStatusBarView(); @@ -127,5 +129,7 @@ public abstract class StatusBar extends SystemUI implements CommandQueue.Callbac + " imeButton=" + switches[3] ); } + + mDoNotDisturb = new DoNotDisturb(mContext); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DoNotDisturbController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DoNotDisturbController.java new file mode 100644 index 0000000..94c8aa5 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DoNotDisturbController.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2010 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.systemui.statusbar.policy; + +import android.content.ContentResolver; +import android.content.Context; +import android.content.SharedPreferences; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.provider.Settings; +import android.util.Slog; +import android.view.IWindowManager; +import android.widget.CompoundButton; + +public class DoNotDisturbController implements CompoundButton.OnCheckedChangeListener, + SharedPreferences.OnSharedPreferenceChangeListener { + private static final String TAG = "StatusBar.DoNotDisturbController"; + + SharedPreferences mPrefs; + private Context mContext; + private CompoundButton mCheckBox; + + private boolean mDoNotDisturb; + + public DoNotDisturbController(Context context, CompoundButton checkbox) { + mContext = context; + + mPrefs = Prefs.read(context); + mPrefs.registerOnSharedPreferenceChangeListener(this); + mDoNotDisturb = mPrefs.getBoolean(Prefs.DO_NOT_DISTURB_PREF, Prefs.DO_NOT_DISTURB_DEFAULT); + + mCheckBox = checkbox; + checkbox.setOnCheckedChangeListener(this); + + checkbox.setChecked(!mDoNotDisturb); + } + + // The checkbox is ON for notifications coming in and OFF for Do not disturb, so we + // don't have a double negative. + public void onCheckedChanged(CompoundButton view, boolean checked) { + //Slog.d(TAG, "onCheckedChanged checked=" + checked + " mDoNotDisturb=" + mDoNotDisturb); + final boolean value = !checked; + if (value != mDoNotDisturb) { + SharedPreferences.Editor editor = Prefs.edit(mContext); + editor.putBoolean(Prefs.DO_NOT_DISTURB_PREF, value); + editor.apply(); + } + } + + public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { + final boolean val = prefs.getBoolean(Prefs.DO_NOT_DISTURB_PREF, + Prefs.DO_NOT_DISTURB_DEFAULT); + if (val != mDoNotDisturb) { + mDoNotDisturb = val; + mCheckBox.setChecked(!val); + } + } + + public void release() { + mPrefs.unregisterOnSharedPreferenceChangeListener(this); + } +} + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java new file mode 100644 index 0000000..05eafe8 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2010 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.systemui.statusbar.policy; + +import android.content.Context; +import android.content.SharedPreferences; + +public class Prefs { + private static final String SHARED_PREFS_NAME = "status_bar"; + + // a boolean + public static final String DO_NOT_DISTURB_PREF = "do_not_disturb"; + public static final boolean DO_NOT_DISTURB_DEFAULT = false; + + public static SharedPreferences read(Context context) { + return context.getSharedPreferences(Prefs.SHARED_PREFS_NAME, Context.MODE_PRIVATE); + } + + public static SharedPreferences.Editor edit(Context context) { + return context.getSharedPreferences(Prefs.SHARED_PREFS_NAME, Context.MODE_PRIVATE).edit(); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java index f9ba908..d1f8dd0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java @@ -31,12 +31,14 @@ import android.widget.TextView; import com.android.systemui.R; import com.android.systemui.statusbar.policy.AirplaneModeController; import com.android.systemui.statusbar.policy.AutoRotateController; +import com.android.systemui.statusbar.policy.DoNotDisturbController; public class SettingsView extends LinearLayout implements View.OnClickListener { static final String TAG = "SettingsView"; AirplaneModeController mAirplane; AutoRotateController mRotate; + DoNotDisturbController mDoNotDisturb; public SettingsView(Context context, AttributeSet attrs) { this(context, attrs, 0); @@ -57,6 +59,8 @@ public class SettingsView extends LinearLayout implements View.OnClickListener { findViewById(R.id.network).setOnClickListener(this); mRotate = new AutoRotateController(context, (CompoundButton)findViewById(R.id.rotate_checkbox)); + mDoNotDisturb = new DoNotDisturbController(context, + (CompoundButton)findViewById(R.id.do_not_disturb_checkbox)); findViewById(R.id.settings).setOnClickListener(this); } @@ -64,6 +68,7 @@ public class SettingsView extends LinearLayout implements View.OnClickListener { protected void onDetachedFromWindow() { super.onDetachedFromWindow(); mAirplane.release(); + mDoNotDisturb.release(); } public void onClick(View v) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java index 3cae088..c55c87e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java @@ -159,7 +159,9 @@ public class TabletStatusBar extends StatusBar { mBatteryController.addLabelView( (TextView)mNotificationPanel.findViewById(R.id.battery_text)); mNetworkController.addCombinedSignalIconView( - (ImageView)mNotificationPanel.findViewById(R.id.network)); + (ImageView)mNotificationPanel.findViewById(R.id.network_signal)); + mNetworkController.addDataTypeIconView( + (ImageView)mNotificationPanel.findViewById(R.id.network_type)); mNetworkController.addLabelView( (TextView)mNotificationPanel.findViewById(R.id.network_text)); @@ -283,7 +285,10 @@ public class TabletStatusBar extends StatusBar { mBatteryController = new BatteryController(mContext); mBatteryController.addIconView((ImageView)sb.findViewById(R.id.battery)); mNetworkController = new NetworkController(mContext); - mNetworkController.addCombinedSignalIconView((ImageView)sb.findViewById(R.id.network)); + mNetworkController.addCombinedSignalIconView( + (ImageView)sb.findViewById(R.id.network_signal)); + mNetworkController.addDataTypeIconView( + (ImageView)sb.findViewById(R.id.network_type)); // The navigation buttons mNavigationArea = sb.findViewById(R.id.navigationArea); @@ -580,12 +585,12 @@ public class TabletStatusBar extends StatusBar { if ((state & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) { Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: yes"); // synchronize with current shadow state - mShadowController.hideElement(mNotificationArea); + mShadowController.hideElement(mNotificationIconArea); mTicker.halt(); } else { Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: no"); // synchronize with current shadow state - mShadowController.showElement(mNotificationArea); + mShadowController.showElement(mNotificationIconArea); } } else if ((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) { if ((state & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) { diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java b/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java index 42b73b9..72af34d 100644 --- a/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java +++ b/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java @@ -281,7 +281,7 @@ public class KeyguardViewMediator implements KeyguardViewCallback, mUpdateMonitor.registerSimStateCallback(this); mLockPatternUtils = new LockPatternUtils(mContext); - mKeyguardViewProperties + mKeyguardViewProperties = new LockPatternKeyguardViewProperties(mLockPatternUtils, mUpdateMonitor); mKeyguardViewManager = new KeyguardViewManager( @@ -589,6 +589,11 @@ public class KeyguardViewMediator implements KeyguardViewCallback, return; } + if (mLockPatternUtils.isLockScreenDisabled()) { + if (DEBUG) Log.d(TAG, "doKeyguard: not showing because lockscreen is off"); + return; + } + if (DEBUG) Log.d(TAG, "doKeyguard: showing the lock screen"); showLocked(); } @@ -1005,7 +1010,7 @@ public class KeyguardViewMediator implements KeyguardViewCallback, Log.d(TAG, "playSounds: whichSound = " + whichSound + "; soundPath was null"); } } - } + } /** * Handle message sent by {@link #showLocked}. diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java index bebd013..2651fd3 100644 --- a/services/java/com/android/server/BackupManagerService.java +++ b/services/java/com/android/server/BackupManagerService.java @@ -198,22 +198,26 @@ class BackupManagerService extends IBackupManager.Stub { public long token; public PackageInfo pkgInfo; public int pmToken; // in post-install restore, the PM's token for this transaction + public boolean needFullBackup; RestoreParams(IBackupTransport _transport, IRestoreObserver _obs, - long _token, PackageInfo _pkg, int _pmToken) { + long _token, PackageInfo _pkg, int _pmToken, boolean _needFullBackup) { transport = _transport; observer = _obs; token = _token; pkgInfo = _pkg; pmToken = _pmToken; + needFullBackup = _needFullBackup; } - RestoreParams(IBackupTransport _transport, IRestoreObserver _obs, long _token) { + RestoreParams(IBackupTransport _transport, IRestoreObserver _obs, long _token, + boolean _needFullBackup) { transport = _transport; observer = _obs; token = _token; pkgInfo = null; pmToken = 0; + needFullBackup = _needFullBackup; } } @@ -323,7 +327,8 @@ class BackupManagerService extends IBackupManager.Stub { RestoreParams params = (RestoreParams)msg.obj; Slog.d(TAG, "MSG_RUN_RESTORE observer=" + params.observer); (new PerformRestoreTask(params.transport, params.observer, - params.token, params.pkgInfo, params.pmToken)).run(); + params.token, params.pkgInfo, params.pmToken, + params.needFullBackup)).run(); break; } @@ -1560,6 +1565,7 @@ class BackupManagerService extends IBackupManager.Stub { private PackageInfo mTargetPackage; private File mStateDir; private int mPmToken; + private boolean mNeedFullBackup; class RestoreRequest { public PackageInfo app; @@ -1572,12 +1578,14 @@ class BackupManagerService extends IBackupManager.Stub { } PerformRestoreTask(IBackupTransport transport, IRestoreObserver observer, - long restoreSetToken, PackageInfo targetPackage, int pmToken) { + long restoreSetToken, PackageInfo targetPackage, int pmToken, + boolean needFullBackup) { mTransport = transport; mObserver = observer; mToken = restoreSetToken; mTargetPackage = targetPackage; mPmToken = pmToken; + mNeedFullBackup = needFullBackup; try { mStateDir = new File(mBaseStateDir, transport.transportDirName()); @@ -1655,7 +1663,8 @@ class BackupManagerService extends IBackupManager.Stub { // Pull the Package Manager metadata from the restore set first pmAgent = new PackageManagerBackupAgent( mPackageManager, agentPackages); - processOneRestore(omPackage, 0, IBackupAgent.Stub.asInterface(pmAgent.onBind())); + processOneRestore(omPackage, 0, IBackupAgent.Stub.asInterface(pmAgent.onBind()), + mNeedFullBackup); // Verify that the backup set includes metadata. If not, we can't do // signature/version verification etc, so we simply do not proceed with @@ -1752,7 +1761,8 @@ class BackupManagerService extends IBackupManager.Stub { // And then finally run the restore on this agent try { - processOneRestore(packageInfo, metaInfo.versionCode, agent); + processOneRestore(packageInfo, metaInfo.versionCode, agent, + mNeedFullBackup); ++count; } finally { // unbind and tidy up even on timeout or failure, just in case @@ -1822,7 +1832,8 @@ class BackupManagerService extends IBackupManager.Stub { } // Do the guts of a restore of one application, using mTransport.getRestoreData(). - void processOneRestore(PackageInfo app, int appVersionCode, IBackupAgent agent) { + void processOneRestore(PackageInfo app, int appVersionCode, IBackupAgent agent, + boolean needFullBackup) { // !!! TODO: actually run the restore through mTransport final String packageName = app.packageName; @@ -1901,6 +1912,14 @@ class BackupManagerService extends IBackupManager.Stub { try { if (newState != null) newState.close(); } catch (IOException e) {} backupData = newState = null; mCurrentOperations.delete(token); + + // If we know a priori that we'll need to perform a full post-restore backup + // pass, clear the new state file data. This means we're discarding work that + // was just done by the app's agent, but this way the agent doesn't need to + // take any special action based on global device state. + if (needFullBackup) { + newStateName.delete(); + } } } } @@ -2386,7 +2405,7 @@ class BackupManagerService extends IBackupManager.Stub { mWakelock.acquire(); Message msg = mBackupHandler.obtainMessage(MSG_RUN_RESTORE); msg.obj = new RestoreParams(getTransport(mCurrentTransport), null, - restoreSet, pkg, token); + restoreSet, pkg, token, true); mBackupHandler.sendMessage(msg); } else { // Auto-restore disabled or no way to attempt a restore; just tell the Package @@ -2517,7 +2536,7 @@ class BackupManagerService extends IBackupManager.Stub { long oldId = Binder.clearCallingIdentity(); mWakelock.acquire(); Message msg = mBackupHandler.obtainMessage(MSG_RUN_RESTORE); - msg.obj = new RestoreParams(mRestoreTransport, observer, token); + msg.obj = new RestoreParams(mRestoreTransport, observer, token, true); mBackupHandler.sendMessage(msg); Binder.restoreCallingIdentity(oldId); return 0; @@ -2582,7 +2601,7 @@ class BackupManagerService extends IBackupManager.Stub { long oldId = Binder.clearCallingIdentity(); mWakelock.acquire(); Message msg = mBackupHandler.obtainMessage(MSG_RUN_RESTORE); - msg.obj = new RestoreParams(mRestoreTransport, observer, token, app, 0); + msg.obj = new RestoreParams(mRestoreTransport, observer, token, app, 0, false); mBackupHandler.sendMessage(msg); Binder.restoreCallingIdentity(oldId); return 0; diff --git a/services/java/com/android/server/DevicePolicyManagerService.java b/services/java/com/android/server/DevicePolicyManagerService.java index 53a19f5..0dead1c 100644 --- a/services/java/com/android/server/DevicePolicyManagerService.java +++ b/services/java/com/android/server/DevicePolicyManagerService.java @@ -407,17 +407,29 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { context.registerReceiver(mReceiver, filter); } + /** + * Set an alarm for an upcoming event - expiration warning, expiration, or post-expiration + * reminders. Clears alarm if no expirations are configured. + */ protected void setExpirationAlarmCheckLocked(Context context) { final long expiration = getPasswordExpirationLocked(null); final long now = System.currentTimeMillis(); final long timeToExpire = expiration - now; final long alarmTime; - if (timeToExpire > 0L && timeToExpire < MS_PER_DAY) { - // Next expiration is less than a day, set alarm for exact expiration time - alarmTime = now + timeToExpire; - } else { - // Check again in 24 hours... + if (expiration == 0) { + // No expirations are currently configured: Cancel alarm. + alarmTime = 0; + } else if (timeToExpire <= 0) { + // The password has already expired: Repeat every 24 hours. alarmTime = now + MS_PER_DAY; + } else { + // Selecting the next alarm time: Roll forward to the next 24 hour multiple before + // the expiration time. + long alarmInterval = timeToExpire % MS_PER_DAY; + if (alarmInterval == 0) { + alarmInterval = MS_PER_DAY; + } + alarmTime = now + alarmInterval; } long token = Binder.clearCallingIdentity(); @@ -427,7 +439,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { new Intent(ACTION_EXPIRED_PASSWORD_NOTIFICATION), PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT); am.cancel(pi); - am.set(AlarmManager.RTC, alarmTime, pi); + if (alarmTime != 0) { + am.set(AlarmManager.RTC, alarmTime, pi); + } } finally { Binder.restoreCallingIdentity(token); } @@ -794,7 +808,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (admin.info.usesPolicy(DeviceAdminInfo.USES_POLICY_EXPIRE_PASSWORD) && admin.passwordExpirationTimeout > 0L && admin.passwordExpirationDate > 0L - && now > admin.passwordExpirationDate - EXPIRATION_GRACE_PERIOD_MS) { + && now >= admin.passwordExpirationDate - EXPIRATION_GRACE_PERIOD_MS) { sendAdminCommandLocked(admin, DeviceAdminReceiver.ACTION_PASSWORD_EXPIRING); } } @@ -1007,14 +1021,18 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } + /** + * Return a single admin's expiration cycle time, or the min of all cycle times. + * Returns 0 if not configured. + */ public long getPasswordExpirationTimeout(ComponentName who) { synchronized (this) { - long timeout = 0L; if (who != null) { ActiveAdmin admin = getActiveAdminUncheckedLocked(who); - return admin != null ? admin.passwordExpirationTimeout : timeout; + return admin != null ? admin.passwordExpirationTimeout : 0L; } + long timeout = 0L; final int N = mAdminList.size(); for (int i = 0; i < N; i++) { ActiveAdmin admin = mAdminList.get(i); @@ -1027,13 +1045,17 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } + /** + * Return a single admin's expiration date/time, or the min (soonest) for all admins. + * Returns 0 if not configured. + */ private long getPasswordExpirationLocked(ComponentName who) { - long timeout = 0L; if (who != null) { ActiveAdmin admin = getActiveAdminUncheckedLocked(who); - return admin != null ? admin.passwordExpirationDate : timeout; + return admin != null ? admin.passwordExpirationDate : 0L; } + long timeout = 0L; final int N = mAdminList.size(); for (int i = 0; i < N; i++) { ActiveAdmin admin = mAdminList.get(i); @@ -1606,6 +1628,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { mFailedPasswordAttempts = 0; saveSettingsLocked(); updatePasswordExpirationsLocked(); + setExpirationAlarmCheckLocked(mContext); sendAdminCommandLocked(DeviceAdminReceiver.ACTION_PASSWORD_CHANGED, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD); } finally { @@ -1615,14 +1638,18 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } + /** + * Called any time the device password is updated. Resets all password expiration clocks. + */ private void updatePasswordExpirationsLocked() { final int N = mAdminList.size(); if (N > 0) { for (int i=0; i<N; i++) { ActiveAdmin admin = mAdminList.get(i); if (admin.info.usesPolicy(DeviceAdminInfo.USES_POLICY_EXPIRE_PASSWORD)) { - admin.passwordExpirationDate = System.currentTimeMillis() - + admin.passwordExpirationTimeout; + long timeout = admin.passwordExpirationTimeout; + long expiration = timeout > 0L ? (timeout + System.currentTimeMillis()) : 0L; + admin.passwordExpirationDate = expiration; } } saveSettingsLocked(); diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java index c7bfdc8..95200fa 100644 --- a/services/java/com/android/server/InputMethodManagerService.java +++ b/services/java/com/android/server/InputMethodManagerService.java @@ -55,7 +55,6 @@ import android.os.IBinder; import android.os.IInterface; import android.os.Message; import android.os.Parcel; -import android.os.Parcelable; import android.os.RemoteException; import android.os.ResultReceiver; import android.os.ServiceManager; @@ -125,6 +124,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub private static final String SUBTYPE_MODE_VOICE = "voice"; final Context mContext; + final Resources mRes; final Handler mHandler; final InputMethodSettings mSettings; final SettingsObserver mSettingsObserver; @@ -468,6 +468,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub public InputMethodManagerService(Context context, StatusBarManagerService statusBar) { mContext = context; + mRes = context.getResources(); mHandler = new Handler(this); mIWindowManager = IWindowManager.Stub.asInterface( ServiceManager.getService(Context.WINDOW_SERVICE)); @@ -1214,11 +1215,22 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } mCurFocusedWindow = windowToken; + // Should we auto-show the IME even if the caller has not + // specified what should be done with it? + // We only do this automatically if the window can resize + // to accommodate the IME (so what the user sees will give + // them good context without input information being obscured + // by the IME) or if running on a large screen where there + // is more room for the target window + IME. + final boolean doAutoShow = + (softInputMode & WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST) + == WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE + || mRes.getConfiguration().isLayoutSizeAtLeast( + Configuration.SCREENLAYOUT_SIZE_LARGE); + switch (softInputMode&WindowManager.LayoutParams.SOFT_INPUT_MASK_STATE) { case WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED: - if (!isTextEditor || (softInputMode & - WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST) - != WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) { + if (!isTextEditor || !doAutoShow) { if (WindowManager.LayoutParams.mayUseInputMethod(windowFlags)) { // There is no focus view, and this window will // be behind any soft input window, so hide the @@ -1226,13 +1238,15 @@ public class InputMethodManagerService extends IInputMethodManager.Stub if (DEBUG) Slog.v(TAG, "Unspecified window will hide input"); hideCurrentInputLocked(InputMethodManager.HIDE_NOT_ALWAYS, null); } - } else if (isTextEditor && (softInputMode & - WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST) - == WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE - && (softInputMode & - WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0) { + } else if (isTextEditor && doAutoShow && (softInputMode & + WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0) { // There is a focus view, and we are navigating forward // into the window, so show the input window for the user. + // We only do this automatically if the window an resize + // to accomodate the IME (so what the user sees will give + // them good context without input information being obscured + // by the IME) or if running on a large screen where there + // is more room for the target window + IME. if (DEBUG) Slog.v(TAG, "Unspecified window will show input"); showCurrentInputLocked(InputMethodManager.SHOW_IMPLICIT, null); } @@ -1544,7 +1558,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub map.clear(); PackageManager pm = mContext.getPackageManager(); - final Configuration config = mContext.getResources().getConfiguration(); + final Configuration config = mRes.getConfiguration(); final boolean haveHardKeyboard = config.keyboard == Configuration.KEYBOARD_QWERTY; String disabledSysImes = Settings.Secure.getString(mContext.getContentResolver(), Secure.DISABLED_SYSTEM_INPUT_METHODS); @@ -1944,7 +1958,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub return null; } if (TextUtils.isEmpty(locale)) { - locale = mContext.getResources().getConfiguration().locale.toString(); + locale = mRes.getConfiguration().locale.toString(); } final String language = locale.substring(0, 2); boolean partialMatchFound = false; diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java index a79aead..d1aba43 100644 --- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java +++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java @@ -39,9 +39,12 @@ import org.apache.http.params.HttpParams; import org.apache.http.util.EntityUtils; import java.io.BufferedReader; +import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -49,6 +52,7 @@ import java.io.OutputStream; import java.net.MalformedURLException; import java.net.SocketTimeoutException; import java.net.URL; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; @@ -274,4 +278,37 @@ public class FsUtils { Log.e(LOG_TAG, "Couldn't close stream!", e); } } + + public static List<String> loadTestListFromStorage(String path) { + List<String> list = new ArrayList<String>(); + if (path != null && !path.isEmpty()) { + try { + File file = new File(path); + Log.d(LOG_TAG, "test list loaded from " + path); + BufferedReader reader = new BufferedReader(new FileReader(file)); + String line = null; + while ((line = reader.readLine()) != null) { + list.add(line); + } + reader.close(); + } catch (IOException ioe) { + Log.e(LOG_TAG, "failed to load test list", ioe); + } + } + return list; + } + + public static void saveTestListToStorage(File file, int start, List<String> testList) { + try { + BufferedWriter writer = new BufferedWriter( + new FileWriter(file)); + for (String line : testList.subList(start, testList.size())) { + writer.write(line + '\n'); + } + writer.flush(); + writer.close(); + } catch (IOException e) { + Log.e(LOG_TAG, "failed to write test list", e); + } + } } diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java index 7efb03f..ce546ec 100644 --- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java +++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java @@ -21,17 +21,15 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; -import android.net.Uri; import android.net.http.SslError; import android.os.Bundle; -import android.os.Environment; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.Messenger; import android.os.PowerManager; -import android.os.Process; import android.os.PowerManager.WakeLock; +import android.os.Process; import android.os.RemoteException; import android.util.Log; import android.view.Window; @@ -48,10 +46,7 @@ import android.webkit.WebStorage.QuotaUpdater; import android.webkit.WebView; import android.webkit.WebViewClient; -import java.io.File; import java.lang.Thread.UncaughtExceptionHandler; -import java.net.MalformedURLException; -import java.net.URL; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -79,7 +74,7 @@ public class LayoutTestsExecutor extends Activity { private static final String LOG_TAG = "LayoutTestsExecutor"; - public static final String EXTRA_TESTS_LIST = "TestsList"; + public static final String EXTRA_TESTS_FILE = "TestsList"; public static final String EXTRA_TEST_INDEX = "TestIndex"; private static final int MSG_ACTUAL_RESULT_OBTAINED = 0; @@ -305,7 +300,7 @@ public class LayoutTestsExecutor extends Activity { requestWindowFeature(Window.FEATURE_PROGRESS); Intent intent = getIntent(); - mTestsList = intent.getStringArrayListExtra(EXTRA_TESTS_LIST); + mTestsList = FsUtils.loadTestListFromStorage(intent.getStringExtra(EXTRA_TESTS_FILE)); mCurrentTestIndex = intent.getIntExtra(EXTRA_TEST_INDEX, -1); mTotalTestCount = mCurrentTestIndex + mTestsList.size(); @@ -735,4 +730,5 @@ public class LayoutTestsExecutor extends Activity { Log.i(LOG_TAG, mCurrentTestRelativePath + ": waitUntilDone() called"); mLayoutTestControllerHandler.sendEmptyMessage(MSG_WAIT_UNTIL_DONE); } + } diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListActivity.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListActivity.java index 9db4d2b..e374c1b 100644 --- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListActivity.java +++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListActivity.java @@ -16,6 +16,8 @@ package com.android.dumprendertree2; +import com.android.dumprendertree2.scriptsupport.OnEverythingFinishedCallback; + import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; @@ -28,8 +30,7 @@ import android.view.Window; import android.webkit.WebView; import android.widget.Toast; -import com.android.dumprendertree2.scriptsupport.OnEverythingFinishedCallback; - +import java.io.File; import java.util.ArrayList; /** @@ -189,12 +190,12 @@ public class TestsListActivity extends Activity { intent.setAction(Intent.ACTION_RUN); if (startFrom < mTotalTestCount) { - intent.putStringArrayListExtra(LayoutTestsExecutor.EXTRA_TESTS_LIST, - new ArrayList<String>(mTestsList.subList(startFrom, mTotalTestCount))); + File testListFile = new File(getExternalFilesDir(null), "test_list.txt"); + FsUtils.saveTestListToStorage(testListFile, startFrom, mTestsList); + intent.putExtra(LayoutTestsExecutor.EXTRA_TESTS_FILE, testListFile.getAbsolutePath()); intent.putExtra(LayoutTestsExecutor.EXTRA_TEST_INDEX, startFrom); } else { - intent.putStringArrayListExtra(LayoutTestsExecutor.EXTRA_TESTS_LIST, - new ArrayList<String>()); + intent.putExtra(LayoutTestsExecutor.EXTRA_TESTS_FILE, ""); } startActivity(intent); |